prjct-cli 1.32.0 → 1.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,11 @@ import { dirname as __pathDirname } from 'path';
5
5
  var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
- var Cr=Object.defineProperty;var ef=Object.getOwnPropertyDescriptor;var tf=Object.getOwnPropertyNames;var nf=Object.prototype.hasOwnProperty;var l=(r,e)=>Cr(r,"name",{value:e,configurable:!0}),Is=(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')});var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var Hn=(r,e)=>{for(var t in e)Cr(r,t,{get:e[t],enumerable:!0})},sf=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of tf(e))!nf.call(r,s)&&s!==t&&Cr(r,s,{get:()=>e[s],enumerable:!(n=ef(e,s))||n.enumerable});return r};var pt=r=>sf(Cr({},"__esModule",{value:!0}),r);var Il=w(()=>{"use strict"});var xr,Dl=w(()=>{"use strict";xr={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 Ds,vr=w(()=>{"use strict";Ds={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 jl(r){return r instanceof Error&&"code"in r}function C(r){return jl(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=w(()=>{"use strict";l(jl,"isNodeError");l(C,"isNotFoundError");l(y,"getErrorMessage")});var Rl=w(()=>{"use strict"});var $l=w(()=>{"use strict";Rl()});function Tr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var j,Ml,Gn=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"},Ml=["frontend","backend","devops","docs","testing","database","general"];l(Tr,"calculateConfidence")});var xi=w(()=>{"use strict"});var vi=w(()=>{"use strict";Il();Dl();vr();F();$l();Gn();xi()});var L={};Hn(L,{calculateDuration:()=>hf,formatDate:()=>Er,formatDuration:()=>Gt,formatMonth:()=>lf,getDateKey:()=>uf,getDateRange:()=>mf,getDaysAgo:()=>Kt,getDaysFromNow:()=>pf,getEndOfDay:()=>wf,getStartOfDay:()=>yf,getTimestamp:()=>k,getTodayKey:()=>Ol,getYearMonthDay:()=>Ti,isToday:()=>gf,isWithinLastDays:()=>ff,parseDate:()=>df,toRelative:()=>Sf});import{formatDistanceToNowStrict as cf}from"date-fns";function Er(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 lf(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Ol(){return Er(new Date)}function uf(r){return Er(r)}function Ti(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function df(r){return new Date(r)}function k(){return new Date().toISOString()}function Kt(r){let e=new Date;return e.setDate(e.getDate()-r),e}function pf(r){let e=new Date;return e.setDate(e.getDate()+r),e}function mf(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 gf(r){return Er(r)===Ol()}function ff(r,e){let t=Kt(e);return r>=t}function Gt(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 hf(r,e=new Date){let t=e.getTime()-r.getTime();return Gt(t)}function yf(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function wf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Sf(r){let e=typeof r=="string"?new Date(r):r;return cf(e,{addSuffix:!0})}var ne=w(()=>{"use strict";l(Er,"formatDate");l(lf,"formatMonth");l(Ol,"getTodayKey");l(uf,"getDateKey");l(Ti,"getYearMonthDay");l(df,"parseDate");l(k,"getTimestamp");l(Kt,"getDaysAgo");l(pf,"getDaysFromNow");l(mf,"getDateRange");l(gf,"isToday");l(ff,"isWithinLastDays");l(Gt,"formatDuration");l(hf,"calculateDuration");l(yf,"getStartOfDay");l(wf,"getEndOfDay");l(Sf,"toRelative")});import Nl from"node:fs/promises";async function Ll(r,e){let t;try{t=await Nl.readFile(r,"utf-8")}catch(o){if(C(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Fl(r,t),_l(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Fl(r,t),_l(r,kf(s.error)),null)}async function Fl(r,e){let t=`${r}.backup`;try{await Nl.writeFile(t,e,"utf-8")}catch{}}function _l(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 kf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ul=w(()=>{"use strict";F();l(Ll,"safeRead");l(Fl,"createBackup");l(_l,"logCorruption");l(kf,"formatZodError")});var se={};Hn(se,{appendLine:()=>Ei,appendToFile:()=>Pf,atomicWrite:()=>bf,copyFile:()=>Af,deleteDir:()=>vf,deleteFile:()=>xf,dirExists:()=>Ar,ensureDir:()=>St,fileExists:()=>M,getFileExtension:()=>Rf,getFileModifiedTime:()=>Ef,getFileNameWithoutExtension:()=>$f,getFileSize:()=>Tf,listFiles:()=>Bn,moveFile:()=>If,prependToFile:()=>Cf,readFile:()=>Wn,readJson:()=>pn,readLines:()=>Df,writeFile:()=>Hl,writeJson:()=>js,writeLines:()=>jf});import ae from"node:fs/promises";import zn from"node:path";async function pn(r,e=null,t){if(t)return await Ll(r,t)??e;try{let n=await ae.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(C(n))return e;throw n}}async function js(r,e,t=2){let n=JSON.stringify(e,null,t);await ae.writeFile(r,n,"utf-8")}async function Wn(r,e=""){try{return await ae.readFile(r,"utf-8")}catch(t){if(C(t))return e;throw t}}async function Hl(r,e){let t=zn.dirname(r);await ae.mkdir(t,{recursive:!0}),await ae.writeFile(r,e,"utf-8")}async function bf(r,e){let t=zn.dirname(r);await ae.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ae.writeFile(n,e,"utf-8"),await ae.rename(n,r)}async function Pf(r,e){await ae.appendFile(r,e,"utf-8")}async function Ei(r,e){let t=zn.dirname(r);await ae.mkdir(t,{recursive:!0}),await ae.appendFile(r,`${e}
9
- `,"utf-8")}async function Cf(r,e){try{let t=await ae.readFile(r,"utf-8");await ae.writeFile(r,e+t,"utf-8")}catch(t){if(C(t))await ae.writeFile(r,e,"utf-8");else throw t}}async function M(r){try{return await ae.access(r),!0}catch(e){if(C(e))return!1;throw e}}async function Ar(r){try{return(await ae.stat(r)).isDirectory()}catch(e){if(C(e))return!1;throw e}}async function St(r){await ae.mkdir(r,{recursive:!0})}async function xf(r){try{return await ae.unlink(r),!0}catch(e){if(C(e))return!1;throw e}}async function vf(r){try{return await ae.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(C(e))return!1;throw e}}async function Bn(r,e={}){try{let n=await ae.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(C(t))return[];throw t}}async function Tf(r){return(await ae.stat(r)).size}async function Ef(r){return(await ae.stat(r)).mtime}async function Af(r,e){await ae.copyFile(r,e)}async function If(r,e){await ae.rename(r,e)}async function Df(r){return(await Wn(r,"")).split(`
10
- `)}async function jf(r,e){let t=e.join(`
11
- `);await Hl(r,t)}function Rf(r){return zn.extname(r)}function $f(r){return zn.basename(r,zn.extname(r))}var Fe=w(()=>{"use strict";Ul();F();l(pn,"readJson");l(js,"writeJson");l(Wn,"readFile");l(Hl,"writeFile");l(bf,"atomicWrite");l(Pf,"appendToFile");l(Ei,"appendLine");l(Cf,"prependToFile");l(M,"fileExists");l(Ar,"dirExists");l(St,"ensureDir");l(xf,"deleteFile");l(vf,"deleteDir");l(Bn,"listFiles");l(Tf,"getFileSize");l(Ef,"getFileModifiedTime");l(Af,"copyFile");l(If,"moveFile");l(Df,"readLines");l(jf,"writeLines");l(Rf,"getFileExtension");l($f,"getFileNameWithoutExtension")});import{z as Rt}from"zod";function Gl(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 Gx,zx,Wx,Rs,Bx,$s=w(()=>{"use strict";Gx=Rt.enum(["opus","sonnet","haiku"]),zx=Rt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Wx=Rt.string().min(1),Rs=Rt.object({provider:Rt.string(),model:Rt.string(),cliVersion:Rt.string().optional(),recordedAt:Rt.string()}),Bx=Rt.object({preferredModel:Rt.string().optional(),lastAnalysisModel:Rs.optional()});l(Gl,"compareSemver")});import Ai from"node:fs/promises";import Mf from"node:os";import zl from"node:path";async function Vl(){try{let r=await Ai.readFile(Bl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Of?null:e.detection}catch{return null}}async function Jl(r){let e={timestamp:new Date().toISOString(),detection:r};await Ai.mkdir(Wl,{recursive:!0}),await Ai.writeFile(Bl,JSON.stringify(e,null,2))}var Wl,Bl,Of,ql=w(()=>{"use strict";Wl=zl.join(Mf.homedir(),".prjct-cli","cache"),Bl=zl.join(Wl,"providers.json"),Of=600*1e3;l(Vl,"readProviderCache");l(Jl,"writeProviderCache")});var st={};Hn(st,{AntigravityProvider:()=>ji,ClaudeProvider:()=>Ir,CodexProvider:()=>Ri,CursorProvider:()=>Xl,GeminiProvider:()=>Di,Providers:()=>kt,WindsurfProvider:()=>Ql,detectAllProviders:()=>$i,detectAntigravity:()=>zf,detectCodex:()=>Wf,detectCursorProject:()=>tu,detectProvider:()=>Ii,detectWindsurfProject:()=>nu,getActiveProvider:()=>Lf,getCommandsDir:()=>qf,getGlobalContextPath:()=>Bf,getGlobalSettingsPath:()=>Vf,getProjectCommandsPath:()=>Kf,getProviderBranding:()=>Dr,getSkillsPath:()=>Jf,hasProviderConfig:()=>Uf,needsCursorRouterRegeneration:()=>Hf,needsWindsurfRouterRegeneration:()=>Gf,selectProvider:()=>Yf,validateCliVersion:()=>eu});import{exec as Ff}from"node:child_process";import Yt from"node:os";import Ee from"node:path";import{promisify as _f}from"node:util";async function Zl(r){try{let{stdout:e}=await Kl(`which ${r}`,{timeout:Yl});return e.trim()}catch{return null}}async function Nf(r){try{let{stdout:e}=await Kl(`${r} --version`,{timeout:Yl}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ii(r){let e=kt[r];if(!e.cliCommand)return{installed:!1};let t=await Zl(e.cliCommand);if(!t)return{installed:!1};let n=await Nf(e.cliCommand),s=eu(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function eu(r,e){let t=kt[r];return!t.minCliVersion||!e?null:Gl(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 $i(r=!1){if(!r){let s=await Vl();if(s)return s}let[e,t]=await Promise.all([Ii("claude"),Ii("gemini")]),n={claude:e,gemini:t};return await Jl(n).catch(()=>{}),n}async function Lf(r){if(r&&kt[r])return kt[r];let e=await $i();return e.claude.installed&&!e.gemini.installed?Ir:e.gemini.installed&&!e.claude.installed?Di:Ir}async function Uf(r){let e=kt[r];return e.configDir?M(e.configDir):!1}function Dr(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",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function tu(r){let e=Ee.join(r,".cursor"),t=Ee.join(e,"rules"),n=Ee.join(t,"prjct.mdc"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Hf(r){let e=await tu(r);return e.detected&&!e.routerInstalled}async function nu(r){let e=Ee.join(r,".windsurf"),t=Ee.join(e,"rules"),n=Ee.join(t,"prjct.md"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Gf(r){let e=await nu(r);return e.detected&&!e.routerInstalled}async function zf(){let r=ji.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ee.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([M(r),M(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Wf(){let r=Ri.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Zl("codex"),t=Ee.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([M(r),M(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Bf(r){let e=kt[r];return e.configDir?Ee.join(e.configDir,e.contextFile):null}function Vf(r){let e=kt[r];return!e.configDir||!e.settingsFile?null:Ee.join(e.configDir,e.settingsFile)}function Jf(r){return kt[r].skillsDir}function qf(r){return kt[r].commandsDir}function Kf(r,e){let t=kt[r];return Ee.join(e,t.commandsDir)}async function Yf(){let r=await $i(),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 Kl,Yl,Ir,Di,ji,Xl,Ql,Ri,kt,Ke=w(()=>{"use strict";$s();Fe();ql();Kl=_f(Ff),Yl=2e3,Ir={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ee.join(Yt.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ee.join(Yt.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"},Di={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ee.join(Yt.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ee.join(Yt.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"},ji={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ee.join(Yt.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ee.join(Yt.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},Xl={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},Ql={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},Ri={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ee.join(Yt.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ee.join(Yt.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null},kt={claude:Ir,gemini:Di,cursor:Xl,antigravity:ji,windsurf:Ql,codex:Ri};l(Zl,"whichCommand");l(Nf,"getCliVersion");l(Ii,"detectProvider");l(eu,"validateCliVersion");l($i,"detectAllProviders");l(Lf,"getActiveProvider");l(Uf,"hasProviderConfig");l(Dr,"getProviderBranding");l(tu,"detectCursorProject");l(Hf,"needsCursorRouterRegeneration");l(nu,"detectWindsurfProject");l(Gf,"needsWindsurfRouterRegeneration");l(zf,"detectAntigravity");l(Wf,"detectCodex");l(Bf,"getGlobalContextPath");l(Vf,"getGlobalSettingsPath");l(Jf,"getSkillsPath");l(qf,"getCommandsDir");l(Kf,"getProjectCommandsPath");l(Yf,"selectProvider")});import Xf from"node:crypto";import $t from"node:fs/promises";import Mi from"node:os";import N from"node:path";import{globSync as Qf}from"glob";var Oi,Zf,v,ce=w(()=>{"use strict";ne();Fe();Oi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?N.resolve(e):N.join(Mi.homedir(),".prjct-cli"),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=N.resolve(e),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}generateProjectId(e){return Xf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return N.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return N.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return N.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return N.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Ar(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await St(this.globalBaseDir),await St(this.globalProjectsDir),await St(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 St(N.join(t,s));return await St(N.join(t,"planning","tasks")),await St(N.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Ti(t);return N.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 St(n),n}async listSessions(e,t=null,n=null){let s=N.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await $t.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=N.join(s,a.name),u=await $t.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=N.join(c,d.name),p=await $t.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:N.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return N.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await $t.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 Ar(t)}getDisplayPath(e){let t=Mi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return N.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return N.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return N.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return N.join(this.globalBaseDir,".running")}getDocsPath(){return N.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Ke(),pt(st)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ke(),pt(st)).getActiveProvider();return(Ke(),pt(st)).getGlobalSettingsPath(e.name)}getClaudeDir(){return N.join(Mi.homedir(),".claude")}getClaudeSettingsPath(){return N.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?N.join(this.getGlobalProjectPath(e),"agents"):N.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return N.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return N.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=N.join(e,s.file);if(await M(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=N.join(e,"package.json");if(await M(s))try{let o=await $t.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 $t.readFile(N.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
12
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=N.join(e,"package.json"),i=await $t.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=N.join(e,"lerna.json");if(await M(c)){let u=await $t.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=N.join(e,"package.json"),i=await $t.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=Qf(o,{cwd:e,absolute:!1});for(let a of i){let c=N.join(e,a),u=N.join(c,"package.json");if(await M(u))try{let d=await $t.readFile(u,"utf-8"),m=JSON.parse(d),p=N.join(c,"PRJCT.md");n.push({name:m.name||N.basename(a),path:c,relativePath:a,hasPrjctMd:await M(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=N.resolve(e);for(let s of t.packages){let o=N.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=N.resolve(e),n=N.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=N.dirname(t)}return null}},Zf=new Oi,v=Zf});function eh(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ms(){return eh()==="bun"}var Fi=w(()=>{"use strict";l(eh,"detectRuntime");l(Ms,"isBun")});import _i from"node:fs";import su from"node:path";function th(r){if(Ms()){let{Database:s}=Is("bun:sqlite");return new s(r,{create:!0})}let e=Is("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var nh,jr,D,G,le=w(()=>{"use strict";ce();Fi();l(th,"openDatabase");nh=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
8
+ var Cr=Object.defineProperty;var nf=Object.getOwnPropertyDescriptor;var sf=Object.getOwnPropertyNames;var rf=Object.prototype.hasOwnProperty;var l=(r,e)=>Cr(r,"name",{value:e,configurable:!0}),Is=(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')});var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var Gn=(r,e)=>{for(var t in e)Cr(r,t,{get:e[t],enumerable:!0})},of=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of sf(e))!rf.call(r,s)&&s!==t&&Cr(r,s,{get:()=>e[s],enumerable:!(n=nf(e,s))||n.enumerable});return r};var gt=r=>of(Cr({},"__esModule",{value:!0}),r);var Al=w(()=>{"use strict"});var Pr,Il=w(()=>{"use strict";Pr={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 Ds,xr=w(()=>{"use strict";Ds={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 Dl(r){return r instanceof Error&&"code"in r}function P(r){return Dl(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=w(()=>{"use strict";l(Dl,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var Rl=w(()=>{"use strict"});var jl=w(()=>{"use strict";Rl()});function vr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var j,$l,zn=w(()=>{"use strict";j={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},$l=["frontend","backend","devops","docs","testing","database","general"];l(vr,"calculateConfidence")});var Pi=w(()=>{"use strict"});var xi=w(()=>{"use strict";Al();Il();xr();F();jl();zn();Pi()});var U={};Gn(U,{calculateDuration:()=>wf,formatDate:()=>Tr,formatDuration:()=>zt,formatMonth:()=>df,getDateKey:()=>pf,getDateRange:()=>ff,getDaysAgo:()=>Yt,getDaysFromNow:()=>gf,getEndOfDay:()=>Sf,getStartOfDay:()=>kf,getTimestamp:()=>b,getTodayKey:()=>Ml,getYearMonthDay:()=>vi,isToday:()=>hf,isWithinLastDays:()=>yf,parseDate:()=>mf,toRelative:()=>bf});import{formatDistanceToNowStrict as uf}from"date-fns";function Tr(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 df(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Ml(){return Tr(new Date)}function pf(r){return Tr(r)}function vi(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 b(){return new Date().toISOString()}function Yt(r){let e=new Date;return e.setDate(e.getDate()-r),e}function gf(r){let e=new Date;return e.setDate(e.getDate()+r),e}function ff(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 hf(r){return Tr(r)===Ml()}function yf(r,e){let t=Yt(e);return r>=t}function zt(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 wf(r,e=new Date){let t=e.getTime()-r.getTime();return zt(t)}function kf(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Sf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function bf(r){let e=typeof r=="string"?new Date(r):r;return uf(e,{addSuffix:!0})}var se=w(()=>{"use strict";l(Tr,"formatDate");l(df,"formatMonth");l(Ml,"getTodayKey");l(pf,"getDateKey");l(vi,"getYearMonthDay");l(mf,"parseDate");l(b,"getTimestamp");l(Yt,"getDaysAgo");l(gf,"getDaysFromNow");l(ff,"getDateRange");l(hf,"isToday");l(yf,"isWithinLastDays");l(zt,"formatDuration");l(wf,"calculateDuration");l(kf,"getStartOfDay");l(Sf,"getEndOfDay");l(bf,"toRelative")});import _l from"node:fs/promises";async function Nl(r,e){let t;try{t=await _l.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Ol(r,t),Fl(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Ol(r,t),Fl(r,Cf(s.error)),null)}async function Ol(r,e){let t=`${r}.backup`;try{await _l.writeFile(t,e,"utf-8")}catch{}}function Fl(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 Cf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ll=w(()=>{"use strict";F();l(Nl,"safeRead");l(Ol,"createBackup");l(Fl,"logCorruption");l(Cf,"formatZodError")});var re={};Gn(re,{appendLine:()=>Ti,appendToFile:()=>xf,atomicWrite:()=>Pf,copyFile:()=>Df,deleteDir:()=>Ef,deleteFile:()=>Tf,dirExists:()=>Er,ensureDir:()=>Ct,fileExists:()=>M,getFileExtension:()=>Mf,getFileModifiedTime:()=>If,getFileNameWithoutExtension:()=>Of,getFileSize:()=>Af,listFiles:()=>Vn,moveFile:()=>Rf,prependToFile:()=>vf,readFile:()=>Bn,readJson:()=>mn,readLines:()=>jf,writeFile:()=>Ul,writeJson:()=>Rs,writeLines:()=>$f});import ce from"node:fs/promises";import Wn from"node:path";async function mn(r,e=null,t){if(t)return await Nl(r,t)??e;try{let n=await ce.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function Rs(r,e,t=2){let n=JSON.stringify(e,null,t);await ce.writeFile(r,n,"utf-8")}async function Bn(r,e=""){try{return await ce.readFile(r,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Ul(r,e){let t=Wn.dirname(r);await ce.mkdir(t,{recursive:!0}),await ce.writeFile(r,e,"utf-8")}async function Pf(r,e){let t=Wn.dirname(r);await ce.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ce.writeFile(n,e,"utf-8"),await ce.rename(n,r)}async function xf(r,e){await ce.appendFile(r,e,"utf-8")}async function Ti(r,e){let t=Wn.dirname(r);await ce.mkdir(t,{recursive:!0}),await ce.appendFile(r,`${e}
9
+ `,"utf-8")}async function vf(r,e){try{let t=await ce.readFile(r,"utf-8");await ce.writeFile(r,e+t,"utf-8")}catch(t){if(P(t))await ce.writeFile(r,e,"utf-8");else throw t}}async function M(r){try{return await ce.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function Er(r){try{return(await ce.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Ct(r){await ce.mkdir(r,{recursive:!0})}async function Tf(r){try{return await ce.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function Ef(r){try{return await ce.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function Vn(r,e={}){try{let n=await ce.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(P(t))return[];throw t}}async function Af(r){return(await ce.stat(r)).size}async function If(r){return(await ce.stat(r)).mtime}async function Df(r,e){await ce.copyFile(r,e)}async function Rf(r,e){await ce.rename(r,e)}async function jf(r){return(await Bn(r,"")).split(`
10
+ `)}async function $f(r,e){let t=e.join(`
11
+ `);await Ul(r,t)}function Mf(r){return Wn.extname(r)}function Of(r){return Wn.basename(r,Wn.extname(r))}var _e=w(()=>{"use strict";Ll();F();l(mn,"readJson");l(Rs,"writeJson");l(Bn,"readFile");l(Ul,"writeFile");l(Pf,"atomicWrite");l(xf,"appendToFile");l(Ti,"appendLine");l(vf,"prependToFile");l(M,"fileExists");l(Er,"dirExists");l(Ct,"ensureDir");l(Tf,"deleteFile");l(Ef,"deleteDir");l(Vn,"listFiles");l(Af,"getFileSize");l(If,"getFileModifiedTime");l(Df,"copyFile");l(Rf,"moveFile");l(jf,"readLines");l($f,"writeLines");l(Mf,"getFileExtension");l(Of,"getFileNameWithoutExtension")});import{z as $t}from"zod";function Hl(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 Wx,Bx,Vx,js,Jx,$s=w(()=>{"use strict";Wx=$t.enum(["opus","sonnet","haiku"]),Bx=$t.enum(["2.5-pro","2.5-flash","2.0-flash"]),Vx=$t.string().min(1),js=$t.object({provider:$t.string(),model:$t.string(),cliVersion:$t.string().optional(),recordedAt:$t.string()}),Jx=$t.object({preferredModel:$t.string().optional(),lastAnalysisModel:js.optional()});l(Hl,"compareSemver")});import Ei from"node:fs/promises";import Ff from"node:os";import Gl from"node:path";async function Bl(){try{let r=await Ei.readFile(Wl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>_f?null:e.detection}catch{return null}}async function Vl(r){let e={timestamp:new Date().toISOString(),detection:r};await Ei.mkdir(zl,{recursive:!0}),await Ei.writeFile(Wl,JSON.stringify(e,null,2))}var zl,Wl,_f,Jl=w(()=>{"use strict";zl=Gl.join(Ff.homedir(),".prjct-cli","cache"),Wl=Gl.join(zl,"providers.json"),_f=600*1e3;l(Bl,"readProviderCache");l(Vl,"writeProviderCache")});var it={};Gn(it,{AntigravityProvider:()=>Di,ClaudeProvider:()=>Ar,CodexProvider:()=>Ri,CursorProvider:()=>Yl,GeminiProvider:()=>Ii,Providers:()=>Pt,WindsurfProvider:()=>Xl,detectAllProviders:()=>ji,detectAntigravity:()=>Bf,detectCodex:()=>Vf,detectCursorProject:()=>eu,detectProvider:()=>Ai,detectWindsurfProject:()=>tu,getActiveProvider:()=>Hf,getCommandsDir:()=>Yf,getGlobalContextPath:()=>Jf,getGlobalSettingsPath:()=>qf,getProjectCommandsPath:()=>Xf,getProviderBranding:()=>Ir,getSkillsPath:()=>Kf,hasProviderConfig:()=>Gf,needsCursorRouterRegeneration:()=>zf,needsWindsurfRouterRegeneration:()=>Wf,selectProvider:()=>Qf,validateCliVersion:()=>Zl});import{exec as Nf}from"node:child_process";import Xt from"node:os";import Ae from"node:path";import{promisify as Lf}from"node:util";async function Ql(r){try{let{stdout:e}=await ql(`which ${r}`,{timeout:Kl});return e.trim()}catch{return null}}async function Uf(r){try{let{stdout:e}=await ql(`${r} --version`,{timeout:Kl}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ai(r){let e=Pt[r];if(!e.cliCommand)return{installed:!1};let t=await Ql(e.cliCommand);if(!t)return{installed:!1};let n=await Uf(e.cliCommand),s=Zl(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Zl(r,e){let t=Pt[r];return!t.minCliVersion||!e?null:Hl(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 ji(r=!1){if(!r){let s=await Bl();if(s)return s}let[e,t]=await Promise.all([Ai("claude"),Ai("gemini")]),n={claude:e,gemini:t};return await Vl(n).catch(()=>{}),n}async function Hf(r){if(r&&Pt[r])return Pt[r];let e=await ji();return e.claude.installed&&!e.gemini.installed?Ar:e.gemini.installed&&!e.claude.installed?Ii:Ar}async function Gf(r){let e=Pt[r];return e.configDir?M(e.configDir):!1}function Ir(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",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function eu(r){let e=Ae.join(r,".cursor"),t=Ae.join(e,"rules"),n=Ae.join(t,"prjct.mdc"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function zf(r){let e=await eu(r);return e.detected&&!e.routerInstalled}async function tu(r){let e=Ae.join(r,".windsurf"),t=Ae.join(e,"rules"),n=Ae.join(t,"prjct.md"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Wf(r){let e=await tu(r);return e.detected&&!e.routerInstalled}async function Bf(){let r=Di.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ae.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([M(r),M(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Vf(){let r=Ri.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Ql("codex"),t=Ae.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([M(r),M(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Jf(r){let e=Pt[r];return e.configDir?Ae.join(e.configDir,e.contextFile):null}function qf(r){let e=Pt[r];return!e.configDir||!e.settingsFile?null:Ae.join(e.configDir,e.settingsFile)}function Kf(r){return Pt[r].skillsDir}function Yf(r){return Pt[r].commandsDir}function Xf(r,e){let t=Pt[r];return Ae.join(e,t.commandsDir)}async function Qf(){let r=await ji(),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 ql,Kl,Ar,Ii,Di,Yl,Xl,Ri,Pt,Xe=w(()=>{"use strict";$s();_e();Jl();ql=Lf(Nf),Kl=2e3,Ar={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ae.join(Xt.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ae.join(Xt.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"},Ii={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ae.join(Xt.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ae.join(Xt.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"},Di={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ae.join(Xt.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ae.join(Xt.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},Yl={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},Xl={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},Ri={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ae.join(Xt.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ae.join(Xt.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null},Pt={claude:Ar,gemini:Ii,cursor:Yl,antigravity:Di,windsurf:Xl,codex:Ri};l(Ql,"whichCommand");l(Uf,"getCliVersion");l(Ai,"detectProvider");l(Zl,"validateCliVersion");l(ji,"detectAllProviders");l(Hf,"getActiveProvider");l(Gf,"hasProviderConfig");l(Ir,"getProviderBranding");l(eu,"detectCursorProject");l(zf,"needsCursorRouterRegeneration");l(tu,"detectWindsurfProject");l(Wf,"needsWindsurfRouterRegeneration");l(Bf,"detectAntigravity");l(Vf,"detectCodex");l(Jf,"getGlobalContextPath");l(qf,"getGlobalSettingsPath");l(Kf,"getSkillsPath");l(Yf,"getCommandsDir");l(Xf,"getProjectCommandsPath");l(Qf,"selectProvider")});import Zf from"node:crypto";import Mt from"node:fs/promises";import $i from"node:os";import N from"node:path";import{globSync as eh}from"glob";var Mi,th,v,le=w(()=>{"use strict";se();_e();Mi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?N.resolve(e):N.join($i.homedir(),".prjct-cli"),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=N.resolve(e),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}generateProjectId(e){return Zf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return N.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return N.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return N.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return N.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Er(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await Ct(this.globalBaseDir),await Ct(this.globalProjectsDir),await Ct(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 Ct(N.join(t,s));return await Ct(N.join(t,"planning","tasks")),await Ct(N.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=vi(t);return N.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 Ct(n),n}async listSessions(e,t=null,n=null){let s=N.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Mt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=N.join(s,a.name),u=await Mt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=N.join(c,d.name),p=await Mt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:N.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return N.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Mt.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 Er(t)}getDisplayPath(e){let t=$i.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return N.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return N.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return N.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return N.join(this.globalBaseDir,".running")}getDocsPath(){return N.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Xe(),gt(it)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Xe(),gt(it)).getActiveProvider();return(Xe(),gt(it)).getGlobalSettingsPath(e.name)}getClaudeDir(){return N.join($i.homedir(),".claude")}getClaudeSettingsPath(){return N.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?N.join(this.getGlobalProjectPath(e),"agents"):N.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return N.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return N.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=N.join(e,s.file);if(await M(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=N.join(e,"package.json");if(await M(s))try{let o=await Mt.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 Mt.readFile(N.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
12
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=N.join(e,"package.json"),i=await Mt.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=N.join(e,"lerna.json");if(await M(c)){let u=await Mt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=N.join(e,"package.json"),i=await Mt.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=eh(o,{cwd:e,absolute:!1});for(let a of i){let c=N.join(e,a),u=N.join(c,"package.json");if(await M(u))try{let d=await Mt.readFile(u,"utf-8"),m=JSON.parse(d),p=N.join(c,"PRJCT.md");n.push({name:m.name||N.basename(a),path:c,relativePath:a,hasPrjctMd:await M(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=N.resolve(e);for(let s of t.packages){let o=N.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=N.resolve(e),n=N.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=N.dirname(t)}return null}},th=new Mi,v=th});function nh(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ms(){return nh()==="bun"}var Oi=w(()=>{"use strict";l(nh,"detectRuntime");l(Ms,"isBun")});import Fi from"node:fs";import nu from"node:path";function sh(r){if(Ms()){let{Database:s}=Is("bun:sqlite");return new s(r,{create:!0})}let e=Is("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var rh,Dr,A,G,ae=w(()=>{"use strict";le();Oi();l(sh,"openDatabase");rh=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
13
13
  -- =======================================================================
14
14
  -- Document storage (backward-compatible with JSON file pattern)
15
15
  -- =======================================================================
@@ -240,13 +240,31 @@ var Cr=Object.defineProperty;var ef=Object.getOwnPropertyDescriptor;var tf=Objec
240
240
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
241
241
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
242
242
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
243
- `)},"up")}],jr=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return su.join(v.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=su.dirname(n);_i.existsSync(s)||_i.mkdirSync(s,{recursive:!0});let o=th(n);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return _i.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
+ `)},"up")},{version:3,name:"workflow-rules-table",up:l(r=>{r.run(`
244
+ -- =======================================================================
245
+ -- Workflow Rules: hooks, gates, and custom steps (Phase 2)
246
+ -- =======================================================================
247
+ CREATE TABLE workflow_rules (
248
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
249
+ type TEXT NOT NULL,
250
+ command TEXT NOT NULL,
251
+ position TEXT NOT NULL,
252
+ action TEXT NOT NULL,
253
+ description TEXT,
254
+ enabled INTEGER NOT NULL DEFAULT 1,
255
+ timeout_ms INTEGER NOT NULL DEFAULT 60000,
256
+ created_at TEXT NOT NULL,
257
+ sort_order INTEGER NOT NULL DEFAULT 0
258
+ );
259
+
260
+ CREATE INDEX idx_workflow_rules_command ON workflow_rules(command);
261
+ `)},"up")}],Dr=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return nu.join(v.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=nu.dirname(n);Fi.existsSync(s)||Fi.mkdirSync(s,{recursive:!0});let o=sh(n);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return Fi.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(`
244
262
  CREATE TABLE IF NOT EXISTS _migrations (
245
263
  version INTEGER PRIMARY KEY,
246
264
  name TEXT NOT NULL,
247
265
  applied_at TEXT NOT NULL
248
266
  )
249
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of nh)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}},D=new jr,G=D});function Li(r){if(Ml.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Rr))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 Ni,Rr,mn,Os,Fs,_s=w(()=>{"use strict";le();Gn();ne();Ni={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)},Rr={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(Li,"resolveCanonicalDomains");mn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=G.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();G.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Os=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()}},Fs=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:k(),...t,type:t.type};G.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return G.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Ns,Ui=w(()=>{"use strict";le();Gn();ne();_s();Ns=class r extends mn{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=Tr(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=Tr(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:Tr(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}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=G.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return G.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var ru=w(()=>{"use strict"});import Ls from"node:fs/promises";import Xt from"node:path";import{z as te}from"zod";async function ah(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=Xt.join(e,"package.json"),s=await Ls.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return C(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 ch(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 ph(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=ih[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function lh(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=Xt.join(e,a);try{await Ls.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 uh(r,e){let t=Date.now();try{let n=await mh(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 dh(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=Xt.join(e,o.file);try{await Ls.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 ou(r,e){let t=Date.now(),n=await Promise.all([ah(r,e),ch(r,e),lh(r,e),uh(r,e),dh(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 ph(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Xt.join(s,i.name),c=Xt.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Xt.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function mh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Xt.join(s,i.name),c=Xt.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var sh,rh,oh,Hi,Lv,ih,Gi=w(()=>{"use strict";F();$s();sh=te.enum(["draft","verified","sealed"]),rh=te.object({name:te.string(),description:te.string(),location:te.string().optional()}),oh=te.object({issue:te.string(),file:te.string(),suggestion:te.string()}),Hi=te.object({projectId:te.string(),languages:te.array(te.string()),frameworks:te.array(te.string()),packageManager:te.string().optional(),sourceDir:te.string().optional(),testDir:te.string().optional(),configFiles:te.array(te.string()),fileCount:te.number(),patterns:te.array(rh),antiPatterns:te.array(oh),analyzedAt:te.string(),modelMetadata:Rs.optional(),status:sh.default("draft"),commitHash:te.string().optional(),signature:te.string().optional(),sealedAt:te.string().optional(),verifiedAt:te.string().optional()}),Lv={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},ih={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(ah,"verifyFrameworks");l(ch,"verifyLanguages");l(lh,"verifyPatternLocations");l(uh,"verifyFileCount");l(dh,"verifyAntiPatternFiles");l(ou,"semanticVerify");l(ph,"getProjectExtensions");l(mh,"countProjectFiles")});import{z as be}from"zod";var $r,Qt,gh,zv,zi,iu,Us=w(()=>{"use strict";$r=be.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Qt=be.object({primaryDomain:$r,secondaryDomains:be.array($r),confidence:be.number().min(0).max(1),filePatterns:be.array(be.string()),relevantAgents:be.array(be.string())}),gh=be.object({classification:Qt,classifiedAt:be.string(),source:be.enum(["cache","history","llm","heuristic"]),descriptionHash:be.string(),projectId:be.string()}),zv=be.object({entries:be.record(be.string(),gh),confirmedPatterns:be.array(be.object({descriptionHash:be.string(),classification:Qt,confirmedAt:be.string(),taskDescription:be.string()}))}),zi={entries:{},confirmedPatterns:[]},iu={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as U}from"zod";var fh,hh,au,yh,wh,Sh,kh,bh,cu,Vv,Wi=w(()=>{"use strict";fh=U.enum(["low","medium","high"]),hh=U.enum(["pending","converted","completed","archived","dormant"]),au=U.enum(["high","medium","low"]),yh=U.object({impact:au,effort:au}),wh=U.object({frontend:U.string().optional(),backend:U.string().optional(),payments:U.string().optional(),ai:U.string().optional(),deploy:U.string().optional(),other:U.array(U.string()).optional()}),Sh=U.object({name:U.string(),description:U.string()}),kh=U.object({name:U.string(),description:U.string().optional()}),bh=U.object({id:U.string(),text:U.string(),details:U.string().optional(),priority:fh,status:hh,tags:U.array(U.string()),addedAt:U.string(),completedAt:U.string().optional(),convertedTo:U.string().optional(),source:U.string().optional(),sourceFiles:U.array(U.string()).optional(),painPoints:U.array(U.string()).optional(),solutions:U.array(U.string()).optional(),filesAffected:U.array(U.string()).optional(),impactEffort:yh.optional(),implementationNotes:U.string().optional(),stack:wh.optional(),modules:U.array(Sh).optional(),roles:U.array(kh).optional(),risks:U.array(U.string()).optional(),risksCount:U.number().optional()}),cu=U.object({ideas:U.array(bh),lastUpdated:U.string()}),Vv={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z}from"zod";function uu(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var lu,Ph,Ch,xh,vh,Yv,Xv,Bi=w(()=>{"use strict";lu=z.enum(["linear","jira","github","monday","asana","none"]),Ph=z.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Ch=z.enum(["none","urgent","high","medium","low"]),xh=z.enum(["feature","bug","improvement","task","chore","epic"]),vh=z.object({id:z.string(),identifier:z.string(),title:z.string(),description:z.string().optional(),status:Ph,priority:Ch,type:xh.optional(),assignee:z.object({id:z.string(),name:z.string(),email:z.string().optional()}).optional(),labels:z.array(z.string()).default([]),team:z.object({id:z.string(),name:z.string(),key:z.string().optional()}).optional(),project:z.object({id:z.string(),name:z.string()}).optional(),url:z.string(),createdAt:z.string(),updatedAt:z.string(),fetchedAt:z.string()}),Yv=z.object({provider:lu,lastSync:z.string(),staleAfter:z.number().default(18e5),issues:z.record(z.string(),vh)}),Xv=z.object({provider:lu,fetched:z.number(),updated:z.number(),errors:z.array(z.object({issueId:z.string(),error:z.string()})),timestamp:z.string()});l(uu,"createEmptyIssues")});var fu={};Hn(fu,{AgentAssignmentSchema:()=>du,OUTPUT_SCHEMAS:()=>mu,SubtaskBreakdownSchema:()=>pu,TaskClassificationSchema:()=>Qt,renderSchemaForPrompt:()=>Vi});import{z as Re}from"zod";function Vi(r){let e=mu[r];return e?`## OUTPUT FORMAT
267
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of rh)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}},A=new Dr,G=A});function Ni(r){if($l.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Rr))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 _i,Rr,gn,Os,Fs,_s=w(()=>{"use strict";ae();zn();se();_i={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)},Rr={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(Ni,"resolveCanonicalDomains");gn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=G.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();G.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Os=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()}},Fs=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};G.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return G.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Ns,Li=w(()=>{"use strict";ae();zn();se();_s();Ns=class r extends gn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=vr(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=b();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=vr(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:b(),confidence:vr(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=G.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return G.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var su=w(()=>{"use strict"});import Ls from"node:fs/promises";import Qt from"node:path";import{z as ne}from"zod";async function lh(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=Qt.join(e,"package.json"),s=await Ls.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function uh(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 gh(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=ch[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function dh(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=Qt.join(e,a);try{await Ls.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 ph(r,e){let t=Date.now();try{let n=await fh(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 mh(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=Qt.join(e,o.file);try{await Ls.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 ru(r,e){let t=Date.now(),n=await Promise.all([lh(r,e),uh(r,e),dh(r,e),ph(r,e),mh(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 gh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qt.join(s,i.name),c=Qt.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Qt.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function fh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qt.join(s,i.name),c=Qt.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 oh,ih,ah,Ui,Hv,ch,Hi=w(()=>{"use strict";F();$s();oh=ne.enum(["draft","verified","sealed"]),ih=ne.object({name:ne.string(),description:ne.string(),location:ne.string().optional()}),ah=ne.object({issue:ne.string(),file:ne.string(),suggestion:ne.string()}),Ui=ne.object({projectId:ne.string(),languages:ne.array(ne.string()),frameworks:ne.array(ne.string()),packageManager:ne.string().optional(),sourceDir:ne.string().optional(),testDir:ne.string().optional(),configFiles:ne.array(ne.string()),fileCount:ne.number(),patterns:ne.array(ih),antiPatterns:ne.array(ah),analyzedAt:ne.string(),modelMetadata:js.optional(),status:oh.default("draft"),commitHash:ne.string().optional(),signature:ne.string().optional(),sealedAt:ne.string().optional(),verifiedAt:ne.string().optional()}),Hv={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},ch={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(lh,"verifyFrameworks");l(uh,"verifyLanguages");l(dh,"verifyPatternLocations");l(ph,"verifyFileCount");l(mh,"verifyAntiPatternFiles");l(ru,"semanticVerify");l(gh,"getProjectExtensions");l(fh,"countProjectFiles")});import{z as Ce}from"zod";var jr,Zt,hh,Bv,Gi,ou,Us=w(()=>{"use strict";jr=Ce.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Zt=Ce.object({primaryDomain:jr,secondaryDomains:Ce.array(jr),confidence:Ce.number().min(0).max(1),filePatterns:Ce.array(Ce.string()),relevantAgents:Ce.array(Ce.string())}),hh=Ce.object({classification:Zt,classifiedAt:Ce.string(),source:Ce.enum(["cache","history","llm","heuristic"]),descriptionHash:Ce.string(),projectId:Ce.string()}),Bv=Ce.object({entries:Ce.record(Ce.string(),hh),confirmedPatterns:Ce.array(Ce.object({descriptionHash:Ce.string(),classification:Zt,confirmedAt:Ce.string(),taskDescription:Ce.string()}))}),Gi={entries:{},confirmedPatterns:[]},ou={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as L}from"zod";var yh,wh,iu,kh,Sh,bh,Ch,Ph,au,qv,zi=w(()=>{"use strict";yh=L.enum(["low","medium","high"]),wh=L.enum(["pending","converted","completed","archived","dormant"]),iu=L.enum(["high","medium","low"]),kh=L.object({impact:iu,effort:iu}),Sh=L.object({frontend:L.string().optional(),backend:L.string().optional(),payments:L.string().optional(),ai:L.string().optional(),deploy:L.string().optional(),other:L.array(L.string()).optional()}),bh=L.object({name:L.string(),description:L.string()}),Ch=L.object({name:L.string(),description:L.string().optional()}),Ph=L.object({id:L.string(),text:L.string(),details:L.string().optional(),priority:yh,status:wh,tags:L.array(L.string()),addedAt:L.string(),completedAt:L.string().optional(),convertedTo:L.string().optional(),source:L.string().optional(),sourceFiles:L.array(L.string()).optional(),painPoints:L.array(L.string()).optional(),solutions:L.array(L.string()).optional(),filesAffected:L.array(L.string()).optional(),impactEffort:kh.optional(),implementationNotes:L.string().optional(),stack:Sh.optional(),modules:L.array(bh).optional(),roles:L.array(Ch).optional(),risks:L.array(L.string()).optional(),risksCount:L.number().optional()}),au=L.object({ideas:L.array(Ph),lastUpdated:L.string()}),qv={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z}from"zod";function lu(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var cu,xh,vh,Th,Eh,Qv,Zv,Wi=w(()=>{"use strict";cu=z.enum(["linear","jira","github","monday","asana","none"]),xh=z.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),vh=z.enum(["none","urgent","high","medium","low"]),Th=z.enum(["feature","bug","improvement","task","chore","epic"]),Eh=z.object({id:z.string(),identifier:z.string(),title:z.string(),description:z.string().optional(),status:xh,priority:vh,type:Th.optional(),assignee:z.object({id:z.string(),name:z.string(),email:z.string().optional()}).optional(),labels:z.array(z.string()).default([]),team:z.object({id:z.string(),name:z.string(),key:z.string().optional()}).optional(),project:z.object({id:z.string(),name:z.string()}).optional(),url:z.string(),createdAt:z.string(),updatedAt:z.string(),fetchedAt:z.string()}),Qv=z.object({provider:cu,lastSync:z.string(),staleAfter:z.number().default(18e5),issues:z.record(z.string(),Eh)}),Zv=z.object({provider:cu,fetched:z.number(),updated:z.number(),errors:z.array(z.object({issueId:z.string(),error:z.string()})),timestamp:z.string()});l(lu,"createEmptyIssues")});var gu={};Gn(gu,{AgentAssignmentSchema:()=>uu,OUTPUT_SCHEMAS:()=>pu,SubtaskBreakdownSchema:()=>du,TaskClassificationSchema:()=>Zt,renderSchemaForPrompt:()=>Bi});import{z as Me}from"zod";function Bi(r){let e=pu[r];return e?`## OUTPUT FORMAT
250
268
 
251
269
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
252
270
 
@@ -255,15 +273,15 @@ ${e.example}
255
273
  \`\`\`
256
274
 
257
275
  Fields:
258
- ${Th(e.schema)}`:null}function Th(r){if(r instanceof Re.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${gu(n)}`).join(`
259
- `)}return"(see example above)"}function gu(r){return r instanceof Re.ZodString?"string":r instanceof Re.ZodNumber?"number":r instanceof Re.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Re.ZodArray?`array of ${gu(r.element)}`:r instanceof Re.ZodObject?"object":"any"}var du,pu,mu,Mr=w(()=>{"use strict";Us();Us();du=Re.object({agentName:Re.string(),reasoning:Re.string(),confidence:Re.number().min(0).max(1)}),pu=Re.object({subtasks:Re.array(Re.object({description:Re.string(),domain:$r,agent:Re.string(),dependsOn:Re.array(Re.number())})),effort:Re.enum(["low","medium","high"])}),mu={classification:{schema:Qt,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:du,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:pu,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(Vi,"renderSchemaForPrompt");l(Th,"describeSchema");l(gu,"describeField")});import{z as T}from"zod";var hu,Eh,Ah,yu,Ih,Dh,jh,Rh,$h,Mh,Oh,wu,Fh,_h,oT,Su,ku,bu,Pu,Nh,Or,Ji=w(()=>{"use strict";hu=T.number().min(1).max(5),Eh=T.enum(["exceeded","met","partial","failed"]),Ah=T.enum(["definitely","probably","maybe","no"]),yu=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Ih=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:yu.optional(),explanation:T.string().optional()})}),Dh=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),jh=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Rh=T.object({metrics:T.array(Dh),acceptanceCriteria:T.array(jh),overallSuccess:Eh,successScore:T.number().min(0).max(100)}),$h=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Mh=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array($h)}),Oh=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:Ah,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:hu,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),Fh=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:Ih,success:Rh.optional(),learnings:Mh,roi:Oh,rating:hu,taskOutcomes:T.array(wu).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),_h=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:yu,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),oT=T.object({outcomes:T.array(Fh),taskOutcomes:T.array(wu).optional(),aggregates:_h.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),Su={outcomes:[],taskOutcomes:[],lastUpdated:""},ku=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),bu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Pu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Nh=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Or=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Nh(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ae}from"zod";function Wh(){let r={};for(let e of Hh)r[e]="allow";for(let e of Gh)r[e]="ask";for(let e of zh)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Fr,lT,Lh,qi,Uh,uT,Hh,Gh,zh,dT,Cu=w(()=>{"use strict";Fr=Ae.enum(["allow","deny","ask"]),lT=Ae.enum(["read","write","delete","create"]),Lh=Ae.record(Ae.string(),Fr),qi=Ae.record(Ae.string(),Fr),Uh=Ae.object({enabled:Ae.boolean().default(!0),allowedDomains:Ae.array(Ae.string()).optional(),blockedDomains:Ae.array(Ae.string()).optional()}),uT=Ae.object({bash:Lh.optional(),files:Ae.object({read:qi.optional(),write:qi.optional(),delete:qi.optional()}).optional(),web:Uh.optional(),skills:Ae.record(Ae.string(),Fr).optional(),doomLoop:Ae.object({enabled:Ae.boolean().default(!0),maxRetries:Ae.number().default(3)}).optional(),externalDirectories:Fr.default("ask")}),Hh=["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*"],Gh=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],zh=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Wh,"buildDefaultPermissions");dT=Wh()});import{z as Je}from"zod";var fT,hT,xu=w(()=>{"use strict";fT=Je.object({projectId:Je.string(),name:Je.string(),repoPath:Je.string(),description:Je.string().optional(),version:Je.string().optional(),cliVersion:Je.string().optional(),techStack:Je.array(Je.string()),fileCount:Je.number(),commitCount:Je.number(),createdAt:Je.string(),lastSync:Je.string(),lastSyncCommit:Je.string().optional(),lastSyncBranch:Je.string().optional()}),hT={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Bh,Vh,Jh,qh,Kh,Yh,Xh,Qh,Zh,ey,ty,ny,sy,ry,oy,iy,ay,cy,kT,bT,vu=w(()=>{"use strict";Bh=E.enum(["planned","active","completed","shipped"]),Vh=E.enum(["low","medium","high"]),Jh=E.enum(["feature","breaking_change","refactor","infrastructure"]),qh=E.enum(["completed","active","planned"]),Kh=E.enum(["planned","active","completed"]),Yh=E.enum(["git","git-branch","manual","prd"]),Xh=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),Qh=E.object({id:E.string(),name:E.string(),status:qh,completedAt:E.string().optional()}),Zh=E.object({goal:E.string(),phases:E.array(Qh),successMetrics:E.array(E.string()).optional()}),ey=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),ty=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),ny=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),sy=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),ry=E.object({estimated:ny.nullable(),actual:sy.nullable()}),oy=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),iy=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:oy.optional(),status:Kh,startDate:E.string().optional(),endDate:E.string().optional()}),ay=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Bh,impact:Vh,effort:E.string().optional(),progress:E.number(),type:Jh.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(Xh),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:ey.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:Yh.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:ry.optional(),valueScore:E.number().optional(),commits:E.array(ty).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),cy=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),kT=E.object({strategy:Zh.nullable().optional(),features:E.array(ay),backlog:E.array(E.union([E.string(),cy])),lastUpdated:E.string(),quarters:E.array(iy).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),bT={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 ly from"node:crypto";import{homedir as uy}from"node:os";import{join as dy}from"node:path";function oe(){return ly.randomUUID()}var py,Tu=w(()=>{"use strict";l(oe,"generateUUID");py=dy(uy(),".prjct-cli","projects")});import{z as ze}from"zod";var DT,Eu=w(()=>{"use strict";DT=ze.object({sessionId:ze.string(),projectId:ze.string(),projectPath:ze.string(),projectName:ze.string().optional(),taskDescription:ze.string(),taskStatus:ze.enum(["active","paused"]),activeSubtaskIndex:ze.number().optional(),subtaskCount:ze.number().optional(),branch:ze.string().optional(),linearId:ze.string().optional(),filesModified:ze.array(ze.string()).optional(),durationWorkedSec:ze.number().optional(),timestamp:ze.string(),resumeHint:ze.string()})});import{z as J}from"zod";var my,Au,gy,fy,hy,yy,wy,Sy,ky,Iu,Ki=w(()=>{"use strict";my=J.enum(["feature","fix","improvement","refactor"]),Au=J.enum(["pass","warning","fail","skipped"]),gy=J.enum(["added","changed","fixed","removed"]),fy=J.object({hours:J.number(),minutes:J.number(),totalMinutes:J.number()}),hy=J.object({filesChanged:J.number().nullable().optional(),linesAdded:J.number().nullable().optional(),linesRemoved:J.number().nullable().optional(),commits:J.number().nullable().optional()}),yy=J.object({description:J.string(),type:gy.optional()}),wy=J.object({lintStatus:Au.nullable().optional(),lintDetails:J.string().optional(),testStatus:Au.nullable().optional(),testDetails:J.string().optional()}),Sy=J.object({hash:J.string().optional(),message:J.string().optional(),branch:J.string().optional()}),ky=J.object({id:J.string(),name:J.string(),version:J.string().nullable().optional(),type:my,agent:J.string().optional(),description:J.string().optional(),changes:J.array(yy).optional(),codeSnippets:J.array(J.string()).optional(),commit:Sy.optional(),codeMetrics:hy.optional(),qualityMetrics:wy.optional(),quantitativeImpact:J.string().optional(),duration:fy.optional(),tasksCompleted:J.number().nullable().optional(),shippedAt:J.string(),featureId:J.string().optional()}),Iu=J.object({shipped:J.array(ky),lastUpdated:J.string()})});import{z as x}from"zod";var by,ju,Py,Cy,xy,Yi,Ru,vy,Ty,$u,Du,Ey,Ay,Mu,Ou,Fu,Iy,Dy,_T,_r=w(()=>{"use strict";$s();by=x.enum(["low","medium","high","critical"]),ju=x.enum(["feature","bug","improvement","chore"]),Py=x.enum(["active","backlog","previously_active"]),Cy=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),xy=x.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Yi=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()}),Ru=x.object({output:x.string().min(1,"Subtask output is required"),summary:Yi}),vy=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:Cy,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:Yi.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),Ty=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),$u=x.object({id:x.string(),description:x.string(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(vy).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:Ty.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:Rs.optional()}),Du=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional()}),Ey=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()}),Ay=x.object({taskId:x.string(),title:x.string(),classification:ju,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(Yi),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:Ey.optional()}),Mu=x.object({currentTask:$u.nullable(),previousTask:Du.nullable().optional(),pausedTasks:x.array(Du).optional(),taskHistory:x.array(Ay).optional(),lastUpdated:x.string()}),Ou=x.object({id:x.string(),description:x.string(),priority:by,type:ju,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:Py,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),Fu=x.object({tasks:x.array(Ou),lastUpdated:x.string()}),Iy=x.object({tasksToday:x.number(),tasksThisWeek:x.number(),streak:x.number(),velocity:x.string(),avgDuration:x.string()}),Dy=x.object({type:xy,description:x.string(),timestamp:x.string(),duration:x.string().optional()}),_T=x.object({projectId:x.string(),currentTask:$u.nullable(),queue:x.array(Ou),stats:Iy,recentActivity:x.array(Dy),lastSync:x.string()})});import{z as Z}from"zod";var jy,Ry,_u,HT,GT,zT,Zt,Nu,Vn=w(()=>{"use strict";jy=Z.enum(["improving","stable","declining"]),Ry=Z.object({sprintNumber:Z.number(),startDate:Z.string(),endDate:Z.string(),pointsCompleted:Z.number(),tasksCompleted:Z.number(),avgVariance:Z.number(),estimationAccuracy:Z.number()}),_u=Z.object({category:Z.string(),avgVariance:Z.number(),taskCount:Z.number()}),HT=Z.object({totalPoints:Z.number(),sprints:Z.number(),estimatedDate:Z.string()}),GT=Z.object({sprints:Z.array(Ry),averageVelocity:Z.number(),velocityTrend:jy,estimationAccuracy:Z.number(),overEstimated:Z.array(_u),underEstimated:Z.array(_u),lastUpdated:Z.string()}),zT=Z.object({sprintLengthDays:Z.number().min(1).max(90).default(7),startDay:Z.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:Z.number().min(1).max(52).default(6),accuracyTolerance:Z.number().min(0).max(100).default(20)}),Zt={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Nu={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var bt=w(()=>{"use strict";ru();Gi();Us();Wi();Bi();Mr();$s();Ji();Cu();xu();vu();Tu();Eu();Ki();_r();Vn()});var gn,Xi=w(()=>{"use strict";bt();Gn();ne();_s();gn=class extends mn{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 d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=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 p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let I=this._getCommandTags(t.commandName),R=(p.tags||[]).filter(V=>I.includes(V));g.tagMatch=Math.min(20,R.length*8)}let S=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-S*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),R=0;for(let V of I)p.content.toLowerCase().includes(V)&&(R+=2),p.title.toLowerCase().includes(V)&&(R+=3);g.keywords=Math.min(15,R)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=Ni[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Rr[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 Li(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?`
260
- 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 Qi,$y,ge,Jn=w(()=>{"use strict";_s();Ui();Xi();_s();Ui();Xi();Qi=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new gn,this._patternStore=new Ns,this._historyStore=new Fs,this._sessionStore=new Os}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()}},$y=new Qi,ge=$y});import{exec as My}from"node:child_process";import rt from"node:fs/promises";import Pt from"node:path";import{promisify as Oy}from"node:util";var fn,Zi,Fy,$e,Lu=w(()=>{"use strict";F();fn=Oy(My),Zi=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Pt.join(this.projectPath,"package.json"),t=await rt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Pt.join(this.projectPath,"Cargo.toml");return await rt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readRequirements(){try{let e=Pt.join(this.projectPath,"requirements.txt");return await rt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGoMod(){try{let e=Pt.join(this.projectPath,"go.mod");return await rt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGemfile(){try{let e=Pt.join(this.projectPath,"Gemfile");return await rt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readMixExs(){try{let e=Pt.join(this.projectPath,"mix.exs");return await rt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readPomXml(){try{let e=Pt.join(this.projectPath,"pom.xml");return await rt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readComposerJson(){try{let e=Pt.join(this.projectPath,"composer.json"),t=await rt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Pt.join(this.projectPath,"pyproject.toml");return await rt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await fn('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(`
261
- `).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 rt.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(C(e))return[];throw e}}async listDirectories(){try{return(await rt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(C(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await fn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await fn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await fn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await fn('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 fn('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 rt.access(Pt.join(this.projectPath,e)),!0}catch(t){if(C(t))return!1;throw t}}async readFile(e){try{let t=Pt.join(this.projectPath,e);return await rt.readFile(t,"utf-8")}catch(t){if(C(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await fn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
262
- `).filter(Boolean)}catch{return[]}}},Fy=new Zi,$e=Fy});import{z as ue}from"zod";function _y(r){return r instanceof qn}function K(r){return _y(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Kn,_E,NE,LE,UE,HE,GE,qn,Nr,Lr,Hs,zt=w(()=>{"use strict";Kn={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},_E=Kn.create("FileError",ue.object({path:ue.string(),operation:ue.enum(["read","write","delete","create","copy"]),reason:ue.string().optional()})),NE=Kn.create("ValidationError",ue.object({field:ue.string(),expected:ue.string(),received:ue.string().optional(),message:ue.string().optional()})),LE=Kn.create("PermissionError",ue.object({action:ue.string(),resource:ue.string(),reason:ue.string().optional()})),UE=Kn.create("TaskError",ue.object({taskId:ue.string().optional(),operation:ue.enum(["create","update","complete","pause","resume","delete"]),reason:ue.string()})),HE=Kn.create("SessionError",ue.object({sessionId:ue.string().optional(),reason:ue.string()})),GE=Kn.create("SyncError",ue.object({projectId:ue.string().optional(),operation:ue.enum(["push","pull","auth","connect"]),reason:ue.string()})),qn=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Nr=class r extends qn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Lr=class r extends qn{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Hs=class r extends qn{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(_y,"isPrjctError");l(K,"getErrorMessage")});import ea from"node:fs";import Hr from"node:path";function Uu(){if(Gs)return Gs;let r=__dirname;for(let e=0;e<5;e++){let t=Hr.join(r,"package.json");if(ea.existsSync(t))try{if(JSON.parse(ea.readFileSync(t,"utf-8")).name==="prjct-cli")return Gs=r,r}catch{}r=Hr.dirname(r)}return Gs=Hr.join(__dirname,"..","..",".."),Gs}function ta(){if(Ur)return Ur;try{let r=Hr.join(Uu(),"package.json"),e=JSON.parse(ea.readFileSync(r,"utf-8"));return Ur=e.version,Ny=e,Ur}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var Ur,Ny,Gs,Yn,xe,en=w(()=>{"use strict";F();Ur=null,Ny=null,Gs=null;l(Uu,"getPackageRoot");l(ta,"getVersion");Yn=ta(),xe=Uu()});import sa from"node:fs";import Ly from"node:fs/promises";import Gr from"node:path";function ra(){if(Hu)return na;Hu=!0;let r=Gr.join(xe,"dist","templates.json");try{let e=sa.readFileSync(r,"utf-8");return na=JSON.parse(e),na}catch{return null}}function Hy(r){let e=hn.indexOf(r);e>-1&&hn.splice(e,1),hn.push(r)}function Gy(){for(;Xn.size>=Uy&&hn.length>0;){let r=hn.shift();r&&Xn.delete(r)}}function zr(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(`
263
- `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function Gu(r){if(Xn.has(r))return Hy(r),Xn.get(r);let e,t=ra();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=Gr.join(xe,"templates","commands",`${r}.md`);try{e=await Ly.readFile(s,"utf-8")}catch{throw Lr.notFound(r)}}let n=zr(e);return Gy(),Xn.set(r,n),hn.push(r),n}async function zy(r){return(await Gu(r)).frontmatter["allowed-tools"]||[]}function Wy(){Xn.clear(),hn.length=0}function Ie(r){let e=ra();if(e?.[r])return e[r];let t=Gr.join(xe,"templates",r);try{return sa.readFileSync(t,"utf-8")}catch{return null}}function Qn(r){let e=ra();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=Gr.join(xe,"templates",r);try{return sa.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Uy,Xn,hn,na,Hu,By,oa,Zn=w(()=>{"use strict";zt();en();Uy=50,Xn=new Map,hn=[],na=null,Hu=!1;l(ra,"loadBundle");l(Hy,"updateLruOrder");l(Gy,"evictLru");l(zr,"parseFrontmatter");l(Gu,"load");l(zy,"getAllowedTools");l(Wy,"clearCache");l(Ie,"getTemplateContent");l(Qn,"listTemplates");By={load:Gu,parseFrontmatter:zr,getAllowedTools:zy,clearCache:Wy,getTemplateContent:Ie,listTemplates:Qn},oa=By});import W from"node:fs/promises";import aa from"node:os";import q from"node:path";async function Vy(){try{let r=Ie("global/modules/module-config.json");if(r)return JSON.parse(r);let e=q.join(xe,"templates/global/modules/module-config.json"),t=await W.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Jy(r){let e=await Vy();if(!e){let i=Ie("global/CLAUDE.md");if(i)return i;let a=q.join(xe,"templates/global/CLAUDE.md");return W.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=Ie("global/CLAUDE.md");if(a)return a;let c=q.join(xe,"templates/global/CLAUDE.md");return W.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=Ie(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=q.join(xe,"templates/global/modules",i),u=await W.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(`
264
- `)}async function qy(){try{let r=q.join(aa.homedir(),".prjct-cli","docs");await W.mkdir(r,{recursive:!0});let e=Qn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Ie(s);if(o){let i=q.basename(s);await W.writeFile(q.join(r,i),o,"utf-8")}}return{success:!0}}let t=q.join(xe,"templates/global/docs"),n=await W.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=q.join(t,s),i=q.join(r,s),a=await W.readFile(o,"utf-8");await W.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Ky(){let r=(Ke(),pt(st)),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 W.mkdir(e.configDir,{recursive:!0});let s=q.join(e.configDir,e.contextFile),o=q.join(xe,"templates","global",e.contextFile),i="";try{let u=Ie(`global/${e.contextFile}`);u?i=u:i=await W.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Jy()}catch{let d=Ie("global/CLAUDE.md");if(d)i=d;else{let m=q.join(xe,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}}else{let d=Ie("global/CLAUDE.md");if(d)i=d;else{let m=q.join(xe,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await W.readFile(s,"utf-8"),c=!0}catch(u){if(C(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),S=p+f+g;return await W.writeFile(s,S,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
276
+ ${Ah(e.schema)}`:null}function Ah(r){if(r instanceof Me.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${mu(n)}`).join(`
277
+ `)}return"(see example above)"}function mu(r){return r instanceof Me.ZodString?"string":r instanceof Me.ZodNumber?"number":r instanceof Me.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Me.ZodArray?`array of ${mu(r.element)}`:r instanceof Me.ZodObject?"object":"any"}var uu,du,pu,$r=w(()=>{"use strict";Us();Us();uu=Me.object({agentName:Me.string(),reasoning:Me.string(),confidence:Me.number().min(0).max(1)}),du=Me.object({subtasks:Me.array(Me.object({description:Me.string(),domain:jr,agent:Me.string(),dependsOn:Me.array(Me.number())})),effort:Me.enum(["low","medium","high"])}),pu={classification:{schema:Zt,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:uu,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:du,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(Bi,"renderSchemaForPrompt");l(Ah,"describeSchema");l(mu,"describeField")});import{z as T}from"zod";var fu,Ih,Dh,hu,Rh,jh,$h,Mh,Oh,Fh,_h,yu,Nh,Lh,aT,wu,ku,Su,bu,Uh,Mr,Vi=w(()=>{"use strict";fu=T.number().min(1).max(5),Ih=T.enum(["exceeded","met","partial","failed"]),Dh=T.enum(["definitely","probably","maybe","no"]),hu=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Rh=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:hu.optional(),explanation:T.string().optional()})}),jh=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),$h=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Mh=T.object({metrics:T.array(jh),acceptanceCriteria:T.array($h),overallSuccess:Ih,successScore:T.number().min(0).max(100)}),Oh=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Fh=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Oh)}),_h=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:Dh,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),yu=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:fu,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),Nh=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:Rh,success:Mh.optional(),learnings:Fh,roi:_h,rating:fu,taskOutcomes:T.array(yu).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),Lh=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:hu,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),aT=T.object({outcomes:T.array(Nh),taskOutcomes:T.array(yu).optional(),aggregates:Lh.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),wu={outcomes:[],taskOutcomes:[],lastUpdated:""},ku=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"),Su=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),bu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Uh=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Mr=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Uh(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ie}from"zod";function Vh(){let r={};for(let e of zh)r[e]="allow";for(let e of Wh)r[e]="ask";for(let e of Bh)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Or,dT,Hh,Ji,Gh,pT,zh,Wh,Bh,mT,Cu=w(()=>{"use strict";Or=Ie.enum(["allow","deny","ask"]),dT=Ie.enum(["read","write","delete","create"]),Hh=Ie.record(Ie.string(),Or),Ji=Ie.record(Ie.string(),Or),Gh=Ie.object({enabled:Ie.boolean().default(!0),allowedDomains:Ie.array(Ie.string()).optional(),blockedDomains:Ie.array(Ie.string()).optional()}),pT=Ie.object({bash:Hh.optional(),files:Ie.object({read:Ji.optional(),write:Ji.optional(),delete:Ji.optional()}).optional(),web:Gh.optional(),skills:Ie.record(Ie.string(),Or).optional(),doomLoop:Ie.object({enabled:Ie.boolean().default(!0),maxRetries:Ie.number().default(3)}).optional(),externalDirectories:Or.default("ask")}),zh=["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*"],Wh=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Bh=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Vh,"buildDefaultPermissions");mT=Vh()});import{z as qe}from"zod";var yT,wT,Pu=w(()=>{"use strict";yT=qe.object({projectId:qe.string(),name:qe.string(),repoPath:qe.string(),description:qe.string().optional(),version:qe.string().optional(),cliVersion:qe.string().optional(),techStack:qe.array(qe.string()),fileCount:qe.number(),commitCount:qe.number(),createdAt:qe.string(),lastSync:qe.string(),lastSyncCommit:qe.string().optional(),lastSyncBranch:qe.string().optional()}),wT={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Jh,qh,Kh,Yh,Xh,Qh,Zh,ey,ty,ny,sy,ry,oy,iy,ay,cy,ly,uy,CT,PT,xu=w(()=>{"use strict";Jh=E.enum(["planned","active","completed","shipped"]),qh=E.enum(["low","medium","high"]),Kh=E.enum(["feature","breaking_change","refactor","infrastructure"]),Yh=E.enum(["completed","active","planned"]),Xh=E.enum(["planned","active","completed"]),Qh=E.enum(["git","git-branch","manual","prd"]),Zh=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),ey=E.object({id:E.string(),name:E.string(),status:Yh,completedAt:E.string().optional()}),ty=E.object({goal:E.string(),phases:E.array(ey),successMetrics:E.array(E.string()).optional()}),ny=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),sy=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),ry=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),oy=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),iy=E.object({estimated:ry.nullable(),actual:oy.nullable()}),ay=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),cy=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:ay.optional(),status:Xh,startDate:E.string().optional(),endDate:E.string().optional()}),ly=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Jh,impact:qh,effort:E.string().optional(),progress:E.number(),type:Kh.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(Zh),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:ny.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:Qh.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:iy.optional(),valueScore:E.number().optional(),commits:E.array(sy).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),uy=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),CT=E.object({strategy:ty.nullable().optional(),features:E.array(ly),backlog:E.array(E.union([E.string(),uy])),lastUpdated:E.string(),quarters:E.array(cy).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),PT={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 dy from"node:crypto";import{homedir as py}from"node:os";import{join as my}from"node:path";function ie(){return dy.randomUUID()}var gy,vu=w(()=>{"use strict";l(ie,"generateUUID");gy=my(py(),".prjct-cli","projects")});import{z as ze}from"zod";var jT,Tu=w(()=>{"use strict";jT=ze.object({sessionId:ze.string(),projectId:ze.string(),projectPath:ze.string(),projectName:ze.string().optional(),taskDescription:ze.string(),taskStatus:ze.enum(["active","paused"]),activeSubtaskIndex:ze.number().optional(),subtaskCount:ze.number().optional(),branch:ze.string().optional(),linearId:ze.string().optional(),filesModified:ze.array(ze.string()).optional(),durationWorkedSec:ze.number().optional(),timestamp:ze.string(),resumeHint:ze.string()})});import{z as J}from"zod";var fy,Eu,hy,yy,wy,ky,Sy,by,Cy,Au,qi=w(()=>{"use strict";fy=J.enum(["feature","fix","improvement","refactor"]),Eu=J.enum(["pass","warning","fail","skipped"]),hy=J.enum(["added","changed","fixed","removed"]),yy=J.object({hours:J.number(),minutes:J.number(),totalMinutes:J.number()}),wy=J.object({filesChanged:J.number().nullable().optional(),linesAdded:J.number().nullable().optional(),linesRemoved:J.number().nullable().optional(),commits:J.number().nullable().optional()}),ky=J.object({description:J.string(),type:hy.optional()}),Sy=J.object({lintStatus:Eu.nullable().optional(),lintDetails:J.string().optional(),testStatus:Eu.nullable().optional(),testDetails:J.string().optional()}),by=J.object({hash:J.string().optional(),message:J.string().optional(),branch:J.string().optional()}),Cy=J.object({id:J.string(),name:J.string(),version:J.string().nullable().optional(),type:fy,agent:J.string().optional(),description:J.string().optional(),changes:J.array(ky).optional(),codeSnippets:J.array(J.string()).optional(),commit:by.optional(),codeMetrics:wy.optional(),qualityMetrics:Sy.optional(),quantitativeImpact:J.string().optional(),duration:yy.optional(),tasksCompleted:J.number().nullable().optional(),shippedAt:J.string(),featureId:J.string().optional()}),Au=J.object({shipped:J.array(Cy),lastUpdated:J.string()})});import{z as x}from"zod";var Py,Du,xy,vy,Ty,Ki,Ru,Ey,Ay,ju,Iu,Iy,Dy,$u,Mu,Ou,Ry,jy,LT,Fr=w(()=>{"use strict";$s();Py=x.enum(["low","medium","high","critical"]),Du=x.enum(["feature","bug","improvement","chore"]),xy=x.enum(["active","backlog","previously_active"]),vy=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ty=x.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ki=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()}),Ru=x.object({output:x.string().min(1,"Subtask output is required"),summary:Ki}),Ey=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:vy,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:Ki.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),Ay=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),ju=x.object({id:x.string(),description:x.string(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(Ey).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:Ay.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:js.optional()}),Iu=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional()}),Iy=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()}),Dy=x.object({taskId:x.string(),title:x.string(),classification:Du,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(Ki),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:Iy.optional()}),$u=x.object({currentTask:ju.nullable(),previousTask:Iu.nullable().optional(),pausedTasks:x.array(Iu).optional(),taskHistory:x.array(Dy).optional(),lastUpdated:x.string()}),Mu=x.object({id:x.string(),description:x.string(),priority:Py,type:Du,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:xy,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),Ou=x.object({tasks:x.array(Mu),lastUpdated:x.string()}),Ry=x.object({tasksToday:x.number(),tasksThisWeek:x.number(),streak:x.number(),velocity:x.string(),avgDuration:x.string()}),jy=x.object({type:Ty,description:x.string(),timestamp:x.string(),duration:x.string().optional()}),LT=x.object({projectId:x.string(),currentTask:ju.nullable(),queue:x.array(Mu),stats:Ry,recentActivity:x.array(jy),lastSync:x.string()})});import{z as ee}from"zod";var $y,My,Fu,zT,WT,BT,en,_u,Jn=w(()=>{"use strict";$y=ee.enum(["improving","stable","declining"]),My=ee.object({sprintNumber:ee.number(),startDate:ee.string(),endDate:ee.string(),pointsCompleted:ee.number(),tasksCompleted:ee.number(),avgVariance:ee.number(),estimationAccuracy:ee.number()}),Fu=ee.object({category:ee.string(),avgVariance:ee.number(),taskCount:ee.number()}),zT=ee.object({totalPoints:ee.number(),sprints:ee.number(),estimatedDate:ee.string()}),WT=ee.object({sprints:ee.array(My),averageVelocity:ee.number(),velocityTrend:$y,estimationAccuracy:ee.number(),overEstimated:ee.array(Fu),underEstimated:ee.array(Fu),lastUpdated:ee.string()}),BT=ee.object({sprintLengthDays:ee.number().min(1).max(90).default(7),startDay:ee.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ee.number().min(1).max(52).default(6),accuracyTolerance:ee.number().min(0).max(100).default(20)}),en={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},_u={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var xt=w(()=>{"use strict";su();Hi();Us();zi();Wi();$r();$s();Vi();Cu();Pu();xu();vu();Tu();qi();Fr();Jn()});var fn,Yi=w(()=>{"use strict";xt();zn();se();_s();fn=class extends gn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(j),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(j);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(j));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=b(),u={id:ie(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let I=this._getCommandTags(t.commandName),D=(p.tags||[]).filter(V=>I.includes(V));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),D=0;for(let V of I)p.content.toLowerCase().includes(V)&&(D+=2),p.title.toLowerCase().includes(V)&&(D+=3);g.keywords=Math.min(15,D)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=_i[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Rr[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 Ni(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?`
278
+ 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 Xi,Oy,xe,qn=w(()=>{"use strict";_s();Li();Yi();_s();Li();Yi();Xi=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new fn,this._patternStore=new Ns,this._historyStore=new Fs,this._sessionStore=new Os}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()}},Oy=new Xi,xe=Oy});import{exec as Fy}from"node:child_process";import at from"node:fs/promises";import vt from"node:path";import{promisify as _y}from"node:util";var hn,Qi,Ny,Oe,Nu=w(()=>{"use strict";F();hn=_y(Fy),Qi=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=vt.join(this.projectPath,"package.json"),t=await at.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=vt.join(this.projectPath,"Cargo.toml");return await at.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=vt.join(this.projectPath,"requirements.txt");return await at.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=vt.join(this.projectPath,"go.mod");return await at.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=vt.join(this.projectPath,"Gemfile");return await at.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=vt.join(this.projectPath,"mix.exs");return await at.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=vt.join(this.projectPath,"pom.xml");return await at.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=vt.join(this.projectPath,"composer.json"),t=await at.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=vt.join(this.projectPath,"pyproject.toml");return await at.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await hn('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(`
279
+ `).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 at.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(P(e))return[];throw e}}async listDirectories(){try{return(await at.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(P(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await hn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await hn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await hn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await hn('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 hn('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 at.access(vt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=vt.join(this.projectPath,e);return await at.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await hn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
280
+ `).filter(Boolean)}catch{return[]}}},Ny=new Qi,Oe=Ny});import{z as ue}from"zod";function Ly(r){return r instanceof Kn}function K(r){return Ly(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Yn,LE,UE,HE,GE,zE,WE,Kn,_r,Nr,Hs,Wt=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}},LE=Yn.create("FileError",ue.object({path:ue.string(),operation:ue.enum(["read","write","delete","create","copy"]),reason:ue.string().optional()})),UE=Yn.create("ValidationError",ue.object({field:ue.string(),expected:ue.string(),received:ue.string().optional(),message:ue.string().optional()})),HE=Yn.create("PermissionError",ue.object({action:ue.string(),resource:ue.string(),reason:ue.string().optional()})),GE=Yn.create("TaskError",ue.object({taskId:ue.string().optional(),operation:ue.enum(["create","update","complete","pause","resume","delete"]),reason:ue.string()})),zE=Yn.create("SessionError",ue.object({sessionId:ue.string().optional(),reason:ue.string()})),WE=Yn.create("SyncError",ue.object({projectId:ue.string().optional(),operation:ue.enum(["push","pull","auth","connect"]),reason:ue.string()})),Kn=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},_r=class r extends Kn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Nr=class r extends Kn{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 Kn{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(Ly,"isPrjctError");l(K,"getErrorMessage")});import Zi from"node:fs";import Ur from"node:path";function Lu(){if(Gs)return Gs;let r=__dirname;for(let e=0;e<5;e++){let t=Ur.join(r,"package.json");if(Zi.existsSync(t))try{if(JSON.parse(Zi.readFileSync(t,"utf-8")).name==="prjct-cli")return Gs=r,r}catch{}r=Ur.dirname(r)}return Gs=Ur.join(__dirname,"..","..",".."),Gs}function ea(){if(Lr)return Lr;try{let r=Ur.join(Lu(),"package.json"),e=JSON.parse(Zi.readFileSync(r,"utf-8"));return Lr=e.version,Uy=e,Lr}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var Lr,Uy,Gs,Xn,ve,tn=w(()=>{"use strict";F();Lr=null,Uy=null,Gs=null;l(Lu,"getPackageRoot");l(ea,"getVersion");Xn=ea(),ve=Lu()});import na from"node:fs";import Hy from"node:fs/promises";import Hr from"node:path";function sa(){if(Uu)return ta;Uu=!0;let r=Hr.join(ve,"dist","templates.json");try{let e=na.readFileSync(r,"utf-8");return ta=JSON.parse(e),ta}catch{return null}}function zy(r){let e=yn.indexOf(r);e>-1&&yn.splice(e,1),yn.push(r)}function Wy(){for(;Qn.size>=Gy&&yn.length>0;){let r=yn.shift();r&&Qn.delete(r)}}function Gr(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(`
281
+ `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function Hu(r){if(Qn.has(r))return zy(r),Qn.get(r);let e,t=sa();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=Hr.join(ve,"templates","commands",`${r}.md`);try{e=await Hy.readFile(s,"utf-8")}catch{throw Nr.notFound(r)}}let n=Gr(e);return Wy(),Qn.set(r,n),yn.push(r),n}async function By(r){return(await Hu(r)).frontmatter["allowed-tools"]||[]}function Vy(){Qn.clear(),yn.length=0}function De(r){let e=sa();if(e?.[r])return e[r];let t=Hr.join(ve,"templates",r);try{return na.readFileSync(t,"utf-8")}catch{return null}}function Zn(r){let e=sa();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=Hr.join(ve,"templates",r);try{return na.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Gy,Qn,yn,ta,Uu,Jy,ra,es=w(()=>{"use strict";Wt();tn();Gy=50,Qn=new Map,yn=[],ta=null,Uu=!1;l(sa,"loadBundle");l(zy,"updateLruOrder");l(Wy,"evictLru");l(Gr,"parseFrontmatter");l(Hu,"load");l(By,"getAllowedTools");l(Vy,"clearCache");l(De,"getTemplateContent");l(Zn,"listTemplates");Jy={load:Hu,parseFrontmatter:Gr,getAllowedTools:By,clearCache:Vy,getTemplateContent:De,listTemplates:Zn},ra=Jy});import W from"node:fs/promises";import ia from"node:os";import q from"node:path";async function qy(){try{let r=De("global/modules/module-config.json");if(r)return JSON.parse(r);let e=q.join(ve,"templates/global/modules/module-config.json"),t=await W.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Ky(r){let e=await qy();if(!e){let i=De("global/CLAUDE.md");if(i)return i;let a=q.join(ve,"templates/global/CLAUDE.md");return W.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=De("global/CLAUDE.md");if(a)return a;let c=q.join(ve,"templates/global/CLAUDE.md");return W.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=De(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=q.join(ve,"templates/global/modules",i),u=await W.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(`
282
+ `)}async function Yy(){try{let r=q.join(ia.homedir(),".prjct-cli","docs");await W.mkdir(r,{recursive:!0});let e=Zn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=De(s);if(o){let i=q.basename(s);await W.writeFile(q.join(r,i),o,"utf-8")}}return{success:!0}}let t=q.join(ve,"templates/global/docs"),n=await W.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=q.join(t,s),i=q.join(r,s),a=await W.readFile(o,"utf-8");await W.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Xy(){let r=(Xe(),gt(it)),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 W.mkdir(e.configDir,{recursive:!0});let s=q.join(e.configDir,e.contextFile),o=q.join(ve,"templates","global",e.contextFile),i="";try{let u=De(`global/${e.contextFile}`);u?i=u:i=await W.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Ky()}catch{let d=De("global/CLAUDE.md");if(d)i=d;else{let m=q.join(ve,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}}else{let d=De("global/CLAUDE.md");if(d)i=d;else{let m=q.join(ve,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await W.readFile(s,"utf-8"),c=!0}catch(u){if(P(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await W.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
265
283
 
266
- ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await W.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function zu(){let r=aa.homedir();return{claude:{commands:q.join(r,".claude","commands","p"),config:q.join(r,".claude"),router:q.join(r,".claude","commands","p.md")},gemini:{commands:q.join(r,".gemini","commands"),config:q.join(r,".gemini"),router:q.join(r,".gemini","commands","p.toml")}}}var ia,Yy,We,yn=w(()=>{"use strict";Zn();F();en();l(Vy,"loadModuleConfig");l(Jy,"composeGlobalTemplate");l(qy,"installDocs");l(Ky,"installGlobalConfig");ia=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=aa.homedir(),this.templatesDir=q.join(xe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ke(),pt(st)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=q.join(t.configDir,"commands"):this.claudeCommandsPath=q.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await W.access(this.claudeConfigPath),!0}catch(e){if(C(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=Qn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await W.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Ke(),pt(st)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await W.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=q.join(this.claudeCommandsPath,a),u=Ie(`commands/${a}`);if(u)await W.writeFile(c,u,"utf-8");else{let d=q.join(this.templatesDir,a),m=await W.readFile(d,"utf-8");await W.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=q.join(this.claudeCommandsPath,s);await W.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await W.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 W.access(this.claudeCommandsPath);let n=(await W.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(C(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(Ie(`commands/${e}.md`))return!0;try{let n=q.join(this.templatesDir,`${e}.md`);return await W.access(n),!0}catch(n){if(C(n))return!1;throw n}}async installRouter(){let t=await(Ke(),pt(st)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=q.join(t.configDir,"commands",n);await W.mkdir(q.dirname(s),{recursive:!0});let o=Ie(`commands/${n}`);if(o)return await W.writeFile(s,o,"utf-8"),!0;let i=q.join(this.templatesDir,n),a=await W.readFile(i,"utf-8");return await W.writeFile(s,a,"utf-8"),!0}catch(s){if(C(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Ke(),pt(st)).getActiveProvider(),n=q.join(t.configDir,"commands"),s=0;try{let i=(await W.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await W.unlink(q.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 W.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await W.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(C(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=q.join(this.claudeCommandsPath,o),a=n.includes(o),c=Ie(`commands/${o}`);if(c)await W.writeFile(i,c,"utf-8");else{let u=q.join(this.templatesDir,o),d=await W.readFile(u,"utf-8");await W.writeFile(i,d,"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 Ky()}async installDocs(){return qy()}};l(zu,"getProviderPaths");Yy=new ia,We=Yy});import{z as Pe}from"zod";function Ju(r,e="default"){let t=Wu[e]||Wu.default;return r/1e3*t}function Wr(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Xy,Qy,Bu,Vu,Wu,Br=w(()=>{"use strict";Xy=Pe.object({date:Pe.string(),tokensSaved:Pe.number(),syncs:Pe.number(),avgCompressionRate:Pe.number(),totalDuration:Pe.number()}),Qy=Pe.object({agentName:Pe.string(),usageCount:Pe.number(),tokensSaved:Pe.number()}),Bu=Pe.object({totalTokensSaved:Pe.number(),avgCompressionRate:Pe.number(),syncCount:Pe.number(),watchTriggers:Pe.number(),avgSyncDuration:Pe.number(),totalSyncDuration:Pe.number(),agentUsage:Pe.array(Qy),dailyStats:Pe.array(Xy),firstSync:Pe.string(),lastUpdated:Pe.string()}),Vu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Wu={"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(Ju,"estimateCostSaved");l(Wr,"formatCost")});function Zy(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function ew(r){let e=[],t=Zy(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(ca,o+i.length);if(c===-1)continue;let u=c+ca.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function la(r,e){let t=ew(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
284
+ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await W.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Gu(){let r=ia.homedir();return{claude:{commands:q.join(r,".claude","commands","p"),config:q.join(r,".claude"),router:q.join(r,".claude","commands","p.md")},gemini:{commands:q.join(r,".gemini","commands"),config:q.join(r,".gemini"),router:q.join(r,".gemini","commands","p.toml")}}}var oa,Qy,We,wn=w(()=>{"use strict";es();F();tn();l(qy,"loadModuleConfig");l(Ky,"composeGlobalTemplate");l(Yy,"installDocs");l(Xy,"installGlobalConfig");oa=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=ia.homedir(),this.templatesDir=q.join(ve,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Xe(),gt(it)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=q.join(t.configDir,"commands"):this.claudeCommandsPath=q.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await W.access(this.claudeConfigPath),!0}catch(e){if(P(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=Zn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await W.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Xe(),gt(it)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await W.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=q.join(this.claudeCommandsPath,a),u=De(`commands/${a}`);if(u)await W.writeFile(c,u,"utf-8");else{let d=q.join(this.templatesDir,a),m=await W.readFile(d,"utf-8");await W.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=q.join(this.claudeCommandsPath,s);await W.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await W.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 W.access(this.claudeCommandsPath);let n=(await W.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(P(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(De(`commands/${e}.md`))return!0;try{let n=q.join(this.templatesDir,`${e}.md`);return await W.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Xe(),gt(it)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=q.join(t.configDir,"commands",n);await W.mkdir(q.dirname(s),{recursive:!0});let o=De(`commands/${n}`);if(o)return await W.writeFile(s,o,"utf-8"),!0;let i=q.join(this.templatesDir,n),a=await W.readFile(i,"utf-8");return await W.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Xe(),gt(it)).getActiveProvider(),n=q.join(t.configDir,"commands"),s=0;try{let i=(await W.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await W.unlink(q.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 W.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await W.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(P(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=q.join(this.claudeCommandsPath,o),a=n.includes(o),c=De(`commands/${o}`);if(c)await W.writeFile(i,c,"utf-8");else{let u=q.join(this.templatesDir,o),d=await W.readFile(u,"utf-8");await W.writeFile(i,d,"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 Xy()}async installDocs(){return Yy()}};l(Gu,"getProviderPaths");Qy=new oa,We=Qy});import{z as Pe}from"zod";function Vu(r,e="default"){let t=zu[e]||zu.default;return r/1e3*t}function zr(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Zy,ew,Wu,Bu,zu,Wr=w(()=>{"use strict";Zy=Pe.object({date:Pe.string(),tokensSaved:Pe.number(),syncs:Pe.number(),avgCompressionRate:Pe.number(),totalDuration:Pe.number()}),ew=Pe.object({agentName:Pe.string(),usageCount:Pe.number(),tokensSaved:Pe.number()}),Wu=Pe.object({totalTokensSaved:Pe.number(),avgCompressionRate:Pe.number(),syncCount:Pe.number(),watchTriggers:Pe.number(),avgSyncDuration:Pe.number(),totalSyncDuration:Pe.number(),agentUsage:Pe.array(ew),dailyStats:Pe.array(Zy),firstSync:Pe.string(),lastUpdated:Pe.string()}),Bu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},zu={"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(Vu,"estimateCostSaved");l(zr,"formatCost")});function tw(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function nw(r){let e=[],t=tw(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(aa,o+i.length);if(c===-1)continue;let u=c+aa.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function ca(r,e){let t=nw(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
267
285
 
268
286
  ---
269
287
 
@@ -274,11 +292,11 @@ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
274
292
  `;for(let s of t)n+=s.content,n+=`
275
293
 
276
294
  `;return`${n.trimEnd()}
277
- `}function ua(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(`
278
- `);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(ca)&&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 ca,da=w(()=>{"use strict";ca="<!-- /prjct:preserve -->";l(Zy,"createPreserveStartRegex");l(ew,"extractPreservedSections");l(la,"mergePreservedSections");l(ua,"validatePreserveBlocks")});function zs(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&tw.has(e.code))return!0;if(e.code&&Ku.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 Jr(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Ku.has(e.code))}function qu(r,e,t){let n=tn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(tn.delete(r),!1):!0:!1}function pa(r,e){let t=tn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),tn.set(r,t)}function nw(r){tn.delete(r)}var tw,Ku,tn,Vr,Yu,Ws,qr=w(()=>{"use strict";tw=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Ku=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(zs,"isTransientError");l(Jr,"isPermanentError");tn=new Map;l(qu,"isCircuitOpen");l(pa,"recordFailure");l(nw,"recordSuccess");Vr=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(qu(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 nw(t),o}catch(o){if(n=o,s++,Jr(o))throw pa(t,this.options.circuitBreakerThreshold),o;if(!(zs(o)&&s<this.options.maxAttempts))throw pa(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 pa(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return zs(e)}isCircuitOpen(e){return qu(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return tn.get(e)}resetCircuit(e){tn.delete(e)}resetAllCircuits(){tn.clear()}},Yu=new Vr({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Ws=new Vr({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Xu=w(()=>{"use strict";da();qr()});import{exec as sw}from"node:child_process";import{promisify as rw}from"node:util";async function Kr(r){try{let{stdout:e}=await ow(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function iw(){let r=await Kr("gh api user --jq .login");return r.success&&r.output||(r=await Kr("git config --global github.user"),r.success&&r.output)?r.output:null}async function aw(){let r=await Kr("git config user.name");return r.success&&r.output?r.output:null}async function cw(){let r=await Kr("git config user.email");return r.success&&r.output?r.output:null}async function es(){let[r,e,t]=await Promise.all([iw(),aw(),cw()]);return{github:r,email:t,name:e||r||"Unknown"}}var ow,Yr=w(()=>{"use strict";ow=rw(sw);l(Kr,"execCommand");l(iw,"detectGitHubUsername");l(aw,"detectGitName");l(cw,"detectGitEmail");l(es,"detect")});import wn from"node:fs/promises";import lw from"node:path";import*as Xr from"jsonc-parser";function Qu(r){let e=[],t=Xr.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}: ${Xr.printParseErrorCode(n.error)}`)}return t}var ga,uw,$,ot=w(()=>{"use strict";zt();F();ne();en();Yr();ce();l(Qu,"parseJsonc");ga=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=v.getLocalConfigPath(e),n=await wn.readFile(t,"utf-8");return Qu(n)}catch(t){return C(t)||console.warn(`Warning: Could not read config at ${e}: ${K(t)}`),null}}async writeConfig(e,t){let n=v.getLocalConfigPath(e),s=v.getLegacyPrjctPath(e);await wn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await wn.writeFile(n,`${o}
279
- `,"utf-8")}async readGlobalConfig(e){try{let t=v.getGlobalProjectConfigPath(e),n=await wn.readFile(t,"utf-8");return Qu(n)}catch(t){return C(t)||console.warn(`Warning: Could not read global config for ${e}: ${K(t)}`),null}}async writeGlobalConfig(e,t){let n=v.getGlobalProjectConfigPath(e),s=v.getGlobalProjectPath(e);await wn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await wn.writeFile(n,`${o}
280
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=k();t={projectId:e,authors:[],version:Yn,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=v.generateProjectId(e),s=v.getGlobalProjectPath(n),o=v.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:Yn,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 v.hasLegacyStructure(e))return!1;if(!await v.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=v.getGlobalProjectPath(s.projectId);try{return(await wn.readdir(lw.join(o,"core"))).length===0}catch(i){return C(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:v.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 es(),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=v.generateProjectId(e);return{projectId:n,dataPath:v.getDisplayPath(v.getGlobalProjectPath(n))}}},uw=new ga,$=uw});import Qr from"node:fs/promises";import fa from"node:path";var ha,Zu,ed=w(()=>{"use strict";ot();ce();F();ha=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=v.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Qr.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Qr.readFile(fa.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return C(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=fa.join(this.agentsPath,`${e}.md`),n=await Qr.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return C(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=fa.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})}
281
- `;await Qr.appendFile(s,o)}catch(s){C(s)||console.error(`Agent usage log error: ${y(s)}`)}}},Zu=ha});import td from"node:path";async function mw(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await M(td.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await M(td.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function gw(){return{...dw}}function fw(){return{...pw}}async function nd(){return Zr||(Zr=await mw()?gw():fw(),Zr)}var Zr,dw,pw,sd=w(()=>{"use strict";Fe();Zr=null,dw={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}},pw={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(mw,"isClaudeEnvironment");l(gw,"getClaudeAgent");l(fw,"getTerminalAgent");l(nd,"detect")});import Bs from"node:fs/promises";var ya,rd,od=w(()=>{"use strict";F();ya=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await Bs.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${y(n)}`)}await Bs.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await Bs.readdir(e)}async fileExists(e){try{return await Bs.access(e),!0}catch(t){if(C(t))return!1;throw t}}async createDirectory(e){await Bs.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
295
+ `}function la(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(`
296
+ `);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(aa)&&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 aa,ua=w(()=>{"use strict";aa="<!-- /prjct:preserve -->";l(tw,"createPreserveStartRegex");l(nw,"extractPreservedSections");l(ca,"mergePreservedSections");l(la,"validatePreserveBlocks")});function zs(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&sw.has(e.code))return!0;if(e.code&&qu.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 Vr(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&qu.has(e.code))}function Ju(r,e,t){let n=nn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(nn.delete(r),!1):!0:!1}function da(r,e){let t=nn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),nn.set(r,t)}function rw(r){nn.delete(r)}var sw,qu,nn,Br,Ku,Ws,Jr=w(()=>{"use strict";sw=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),qu=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(zs,"isTransientError");l(Vr,"isPermanentError");nn=new Map;l(Ju,"isCircuitOpen");l(da,"recordFailure");l(rw,"recordSuccess");Br=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(Ju(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 rw(t),o}catch(o){if(n=o,s++,Vr(o))throw da(t,this.options.circuitBreakerThreshold),o;if(!(zs(o)&&s<this.options.maxAttempts))throw da(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 da(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return zs(e)}isCircuitOpen(e){return Ju(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return nn.get(e)}resetCircuit(e){nn.delete(e)}resetAllCircuits(){nn.clear()}},Ku=new Br({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Ws=new Br({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Yu=w(()=>{"use strict";ua();Jr()});import{exec as ow}from"node:child_process";import{promisify as iw}from"node:util";async function qr(r){try{let{stdout:e}=await aw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function cw(){let r=await qr("gh api user --jq .login");return r.success&&r.output||(r=await qr("git config --global github.user"),r.success&&r.output)?r.output:null}async function lw(){let r=await qr("git config user.name");return r.success&&r.output?r.output:null}async function uw(){let r=await qr("git config user.email");return r.success&&r.output?r.output:null}async function ts(){let[r,e,t]=await Promise.all([cw(),lw(),uw()]);return{github:r,email:t,name:e||r||"Unknown"}}var aw,Kr=w(()=>{"use strict";aw=iw(ow);l(qr,"execCommand");l(cw,"detectGitHubUsername");l(lw,"detectGitName");l(uw,"detectGitEmail");l(ts,"detect")});import kn from"node:fs/promises";import dw from"node:path";import*as Yr from"jsonc-parser";function Xu(r){let e=[],t=Yr.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}: ${Yr.printParseErrorCode(n.error)}`)}return t}var ma,pw,$,ct=w(()=>{"use strict";Wt();F();se();tn();Kr();le();l(Xu,"parseJsonc");ma=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=v.getLocalConfigPath(e),n=await kn.readFile(t,"utf-8");return Xu(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${K(t)}`),null}}async writeConfig(e,t){let n=v.getLocalConfigPath(e),s=v.getLegacyPrjctPath(e);await kn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await kn.writeFile(n,`${o}
297
+ `,"utf-8")}async readGlobalConfig(e){try{let t=v.getGlobalProjectConfigPath(e),n=await kn.readFile(t,"utf-8");return Xu(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${K(t)}`),null}}async writeGlobalConfig(e,t){let n=v.getGlobalProjectConfigPath(e),s=v.getGlobalProjectPath(e);await kn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await kn.writeFile(n,`${o}
298
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:Xn,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=v.generateProjectId(e),s=v.getGlobalProjectPath(n),o=v.getDisplayPath(s),i=b(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Xn,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=b(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await v.hasLegacyStructure(e))return!1;if(!await v.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=v.getGlobalProjectPath(s.projectId);try{return(await kn.readdir(dw.join(o,"core"))).length===0}catch(i){return P(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:v.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=b();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await ts(),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=v.generateProjectId(e);return{projectId:n,dataPath:v.getDisplayPath(v.getGlobalProjectPath(n))}}},pw=new ma,$=pw});import Xr from"node:fs/promises";import ga from"node:path";var fa,Qu,Zu=w(()=>{"use strict";ct();le();F();fa=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=v.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Xr.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Xr.readFile(ga.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return P(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=ga.join(this.agentsPath,`${e}.md`),n=await Xr.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(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=ga.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})}
299
+ `;await Xr.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},Qu=fa});import ed from"node:path";async function fw(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await M(ed.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await M(ed.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function hw(){return{...mw}}function yw(){return{...gw}}async function td(){return Qr||(Qr=await fw()?hw():yw(),Qr)}var Qr,mw,gw,nd=w(()=>{"use strict";_e();Qr=null,mw={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}},gw={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(fw,"isClaudeEnvironment");l(hw,"getClaudeAgent");l(yw,"getTerminalAgent");l(td,"detect")});import Bs from"node:fs/promises";var ha,sd,rd=w(()=>{"use strict";F();ha=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await Bs.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${y(n)}`)}await Bs.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await Bs.readdir(e)}async fileExists(e){try{return await Bs.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await Bs.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
282
300
  ${e.map((t,n)=>`${n+1}. ${t}`).join(`
283
301
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
284
302
 
@@ -323,7 +341,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
323
341
 
324
342
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
325
343
 
326
- Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},rd=ya});var yw,eo,ts,id=w(()=>{"use strict";ed();zt();sd();od();qr();yw=["claude"],eo=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Zu}async initialize(){return this.agent?this.agent:await Yu.execute(async()=>{if(this.agentInfo=await nd(),!this.agentInfo?.isSupported)throw Hs.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!yw.includes(e))throw Hs.notSupported(this.agentInfo?.type??"unknown");return this.agent=new rd,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:`
344
+ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},sd=ha});var kw,Zr,ns,od=w(()=>{"use strict";Zu();Wt();nd();rd();Jr();kw=["claude"],Zr=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Qu}async initialize(){return this.agent?this.agent:await Ku.execute(async()=>{if(this.agentInfo=await td(),!this.agentInfo?.isSupported)throw Hs.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!kw.includes(e))throw Hs.notSupported(this.agentInfo?.type??"unknown");return this.agent=new sd,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:`
327
345
  AGENTIC EXECUTION:
328
346
  - Read: templates/agentic/orchestrator.md
329
347
  - Analyze task: "${e}"
@@ -331,14 +349,14 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
331
349
  - Claude decides which agent(s) to use
332
350
  - Always prefer specialists over generalist
333
351
  - Fragment complex tasks into subtasks
334
- `}}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}},ts=new eo});var to,no,ad=w(()=>{"use strict";to=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"}},no=new to});import ww from"node:crypto";import so from"node:fs/promises";import cd from"node:path";function ld(){return{version:Ct,lastUpdated:"",checksums:{}}}var Ct,wa,_e,Vs=w(()=>{"use strict";ce();F();ne();le();Ct="1.0.0";l(ld,"getDefaultChecksums");wa=class{static{l(this,"IndexStorage")}getIndexPath(e){return cd.join(v.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await so.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Ct?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 ld()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await so.readFile(e);return ww.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:Ct,lastUpdated:k(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{D.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await so.readdir(t);await Promise.all(n.map(s=>so.unlink(cd.join(t,s))))}catch(n){if(!C(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!==Ct?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!==Ct?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=D.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=D.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)}},_e=new wa});var ud,Sw,ro,kw,dd=w(()=>{"use strict";Vs();ud=8e4,Sw={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"]},ro=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||ud,[c,u,d]=await Promise.all([_e.readIndex(t),_e.readDomains(t),_e.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let R of m){let V=d.domainIndex[R]||[];for(let me of V)p.add(me)}if(i&&d.domainIndex.general){let R=d.domainIndex.general.slice(0,10);for(let V of R)p.add(V)}let g=c.relevantFiles.filter(R=>p.has(R.path)&&R.score>=o);g.sort((R,V)=>V.score-R.score);let f=0,S=[];for(let R of g){let V=Math.ceil(R.size/this.CHARS_PER_TOKEN);if(f+V>a||S.length>=s)break;S.push(R),f+=V}let b=Math.ceil(c.relevantFiles.reduce((R,V)=>R+V.size,0)/this.CHARS_PER_TOKEN),I=b>0?(b-f)/b:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:I,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Sw))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 _e.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 _e.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return _e.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||ud,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},kw=new ro});import pd from"node:path";var Sa,oo,bw,md=w(()=>{"use strict";Vs();ne();Sa=[{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"}],oo=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 Sa)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=pd.dirname(i.path);n.get(u).add(`**/${pd.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Sa.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 p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Sa)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=k(),o={version:Ct,projectId:e,domains:t,discoveredAt:s};await _e.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:Ct,lastUpdate:s,fileCategories:n,domainIndex:i};await _e.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([_e.readDomains(e),_e.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 _e.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 _e.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Ct,lastUpdate:k(),fileCategories:u,domainIndex:d};await _e.writeCategories(e,m)}return o}},bw=new oo});import ka from"node:path";var ba,Pw,Cw,io,gd,Pa=w(()=>{"use strict";ba=30,Pw=[/^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$/],Cw=[/^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],io=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=ba){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=ka.basename(e.path);for(let n of Pw)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ka.basename(e.path);for(let s of Cw)if(s.test(t))return 15;let n=ka.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}},gd=new io});function co(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 xw[r]}var Y,Ca,xa,ao,xw,xt,fd,Js,nn=w(()=>{"use strict";Y={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Ca=["feature","spec","design","refactor","migrate"],xa=["ship","cleanup","git","migrate"],ao=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],xw={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(co,"getTimeout");xt={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},fd={HISTORY_MAX:100},Js={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 va(r,e){return{...Ds[r],...e}}function lo(r,e,t){return{message:r,hint:e,...t}}var uo=w(()=>{"use strict";vr();vr();l(va,"getError");l(lo,"createError")});import{execSync as Ta}from"node:child_process";var po,Ea,mo,go,Aa=w(()=>{"use strict";uo();po={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"}},Ea=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=po[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=po[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new mo(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=po[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
335
- `);throw new mo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
336
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(po),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=Ta(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:lo(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Ta(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Ta(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:lo(`${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())}},mo=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}},go=new Ea});import{exec as vw}from"node:child_process";import{promisify as Tw}from"node:util";var _I,hd=w(()=>{"use strict";nn();Aa();_I=Tw(vw)});var Mt,Ia,it,sn=w(()=>{"use strict";bt();ne();le();Mt={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 D.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 D.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?D.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):D.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=D.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=D.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(D.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);D.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return D.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},it=new Ia});var fo,Ye,Da=w(()=>{"use strict";ot();sn();le();fo=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;G.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?G.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?G.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;G.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return G.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Mt.MEMORY_MAX_ENTRIES)return 0;let s=n-Mt.MEMORY_MAX_ENTRIES,o=G.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);it.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&G.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Ye=new fo});var yd=w(()=>{"use strict";ce();Fe()});import{exec as Aw}from"node:child_process";import{promisify as Iw}from"node:util";var rD,wd=w(()=>{"use strict";Vs();ne();Pa();rD=Iw(Aw)});import Sn from"chalk";var Sd,Dw,jw,vt,kd=w(()=>{"use strict";Ke();Sd=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Dw=80,jw={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Sd,speed:Dw},cli:{header:l(()=>`${Sn.cyan.bold("\u26A1")} ${Sn.cyan("prjct")}`,"header"),footer:l(()=>Sn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Sn.cyan("\u26A1")} ${Sn.cyan("prjct")} ${Sn.cyan(Sd[r%10])} ${Sn.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")=>Dr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Dr(r).signature,"getSignature")},vt=jw});import X from"chalk";function Mw(){return Rw[$w]}var fD,ja,Rw,$w,kn,ns,Ra,at,rn,Ow,Fw,h,bn=w(()=>{"use strict";kd();nn();uo();uo();fD=vt.spinner.frames,ja=vt.spinner.speed,Rw={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}},$w="compact";l(Mw,"getTierConfig");kn={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")},ns=null,Ra=0,at=!1,rn=l((r,e)=>{let t=e??(Mw().maxCharsPerLine||xt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Ow=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(xt.CLEAR_WIDTH)}\r`):!0,"clear"),Fw={start(){return at||console.log(vt.cli.header()),this},end(){return at||console.log(vt.cli.footer()),this},spin(r){return at?this:(this.stop(),process.stdout.isTTY?(ns=setInterval(()=>{process.stdout.write(`\r${vt.cli.spin(Ra++,rn(r,xt.SPINNER_MSG))}`)},ja),this):(process.stdout.write(`${vt.cli.spin(0,rn(r,xt.SPINNER_MSG))}
337
- `),this))},done(r,e){if(this.stop(),!at){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(`${kn.success} ${rn(r,xt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${kn.fail} ${rn(r,xt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?va(r):r;return console.error(),console.error(`${kn.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(),at||console.log(`${kn.warn} ${rn(r,xt.WARN_MSG)}`),this},info(r){return this.stop(),at||console.log(`${kn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!at&&e&&console.log(`${kn.debug} ${X.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),at)return this;let t=e.bullet||kn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),at||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(),at)return this;let t=e.split(`
338
- `),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(),at?this:(console.log(`
339
- ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){return ns&&(clearInterval(ns),ns=null,Ow()),this},step(r,e,t){if(at)return this;this.stop();let n=X.dim(`[${r}/${e}]`);return process.stdout.isTTY?(ns=setInterval(()=>{process.stdout.write(`\r${vt.cli.spin(Ra++,`${n} ${rn(t,xt.STEP_MSG)}`)}`)},ja),this):(process.stdout.write(`${vt.cli.spin(0,`${n} ${rn(t,xt.STEP_MSG)}`)}
340
- `),this)},progress(r,e,t){if(at)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?` ${rn(t,xt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ns=setInterval(()=>{process.stdout.write(`\r${vt.cli.spin(Ra++,`[${i}] ${n}%${a}`)}`)},ja),this):(process.stdout.write(`${vt.cli.spin(0,`[${i}] ${n}%${a}`)}
341
- `),this)}},h=Fw});function Nw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(_w.has(r)||r.includes("prjct"))return{level:ss.debug,name:"debug"};let e=ss[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function ho(r,e,t){return bd>=r?(...n)=>console[t](e,...n):Uw}var ss,_w,bd,Lw,Uw,Hw,B,rs=w(()=>{"use strict";ss={error:0,warn:1,info:2,debug:3},_w=new Set(["1","true","*"]);l(Nw,"getLogLevel");({level:bd,name:Lw}=Nw()),Uw=l(()=>{},"noop");l(ho,"createLogMethod");Hw={error:ho(ss.error,"[prjct:error]","error"),warn:ho(ss.warn,"[prjct:warn]","warn"),info:ho(ss.info,"[prjct:info]","log"),debug:ho(ss.debug,"[prjct:debug]","log"),isEnabled:l(()=>bd>=0,"isEnabled"),level:l(()=>Lw,"level")},B=Hw});var yo,Gw,Pd=w(()=>{"use strict";zt();le();vi();nn();rs();yo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=fd.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"&&B.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(xr.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(xr.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 B.error("Event callback error:",n),n}}async logEvent(e){try{D.appendEvent(this.projectId,e.type,e)}catch(t){B.debug("Failed to log event:",K(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())}},Gw=new yo});var wo,So,Cd=w(()=>{"use strict";ce();ne();Fe();wo=class{static{l(this,"SyncEventBus")}async publish(e){let t=v.getSyncPendingPath(e.projectId),n=await pn(t,[])??[];n.push(e),await js(t,n)}async getPending(e){let t=v.getSyncPendingPath(e);return await pn(t,[])??[]}async clearPending(e){let t=v.getSyncPendingPath(e);await js(t,[])}async updateLastSync(e){let t=v.getLastSyncPath(e),n={timestamp:k(),success:!0};await js(t,n)}async getLastSync(e){let t=v.getLastSyncPath(e);return await pn(t,null)}},So=new wo});var $a=w(()=>{"use strict";Pd();Cd()});var Tt,ko=w(()=>{"use strict";Tt=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var De,Ot=w(()=>{"use strict";$a();ko();ne();le();De=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Tt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=D.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){D.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:k(),projectId:e};await So.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 D.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 Ww}from"node:crypto";var Ma,ct,bo=w(()=>{"use strict";Gi();ne();Ot();Ma=class extends De{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Hi.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 Hi.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 ou(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 Ww("sha256").update(JSON.stringify(t)).digest("hex")}},ct=new Ma});var Oa,Ne,qs=w(()=>{"use strict";bt();Wi();ne();sn();Ot();Oa=class extends De{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",cu)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id: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=Kt(Mt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;it.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}},Ne=new Oa});var Fa,Pn,Po=w(()=>{"use strict";Br();ne();Ot();Fa=class extends De{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Bu)}getDefault(){return{...Vu}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.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],S=m.filter(I=>I.date>=f),b=[...i.agentUsage];if(t.agents)for(let I of t.agents){let R=b.findIndex(V=>V.agentName===I);R>=0?b[R]={...b[R],usageCount:b[R].usageCount+1,tokensSaved:b[R].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:S,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:Ju(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)}},Pn=new Fa});import qe from"node:fs/promises";import re from"node:path";async function Ks(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(D.exists(r)&&D.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=v.getGlobalProjectPath(r),s=re.join(n,"storage"),o=re.join(n,"index"),i=re.join(n,"memory");t.backupDir=await Bw(s,o,i),D.getDb(r);for(let{filename:a,key:c}of La){let u=re.join(s,a),d=await Cn(u);if(d===null){t.skippedFiles.push(a);continue}try{D.setDoc(r,c,d),xd(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Na){let u=re.join(o,a),d=await Cn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{D.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),vd(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Zw(r,o,t),await eS(r,o,t),await tS(r,i,t),await nS(r,i,t),t.errors.length===0&&await sS(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 Bw(r,e,t){let n=re.join(r,"backup");return await qe.mkdir(n,{recursive:!0}),await qe.mkdir(re.join(n,"index"),{recursive:!0}),await qe.mkdir(re.join(n,"memory"),{recursive:!0}),await _a(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await _a(e,re.join(n,"index")),await _a(t,re.join(n,"memory")),n}async function _a(r,e,t){try{let n=await qe.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=re.join(r,s.name),i=re.join(e,s.name);await qe.copyFile(o,i)}}catch(n){if(!C(n))throw n}}function xd(r,e,t){switch(e){case"state":Vw(r,t);break;case"queue":Jw(r,t);break;case"ideas":qw(r,t);break;case"shipped":Kw(r,t);break;case"metrics":Yw(r,t);break;case"analysis":Xw(r,t);break}}function Vw(r,e){let t=D.getDb(r),n=t.prepare(`
352
+ `}}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}},ns=new Zr});var eo,to,id=w(()=>{"use strict";eo=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"}},to=new eo});import Sw from"node:crypto";import no from"node:fs/promises";import ad from"node:path";function cd(){return{version:Tt,lastUpdated:"",checksums:{}}}var Tt,ya,Ne,Vs=w(()=>{"use strict";le();F();se();ae();Tt="1.0.0";l(cd,"getDefaultChecksums");ya=class{static{l(this,"IndexStorage")}getIndexPath(e){return ad.join(v.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await no.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Tt?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 cd()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await no.readFile(e);return Sw.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:Tt,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{A.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await no.readdir(t);await Promise.all(n.map(s=>no.unlink(ad.join(t,s))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Tt?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!==Tt?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=A.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=A.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)}},Ne=new ya});var ld,bw,so,Cw,ud=w(()=>{"use strict";Vs();ld=8e4,bw={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"]},so=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||ld,[c,u,d]=await Promise.all([Ne.readIndex(t),Ne.readDomains(t),Ne.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let D of m){let V=d.domainIndex[D]||[];for(let me of V)p.add(me)}if(i&&d.domainIndex.general){let D=d.domainIndex.general.slice(0,10);for(let V of D)p.add(V)}let g=c.relevantFiles.filter(D=>p.has(D.path)&&D.score>=o);g.sort((D,V)=>V.score-D.score);let f=0,k=[];for(let D of g){let V=Math.ceil(D.size/this.CHARS_PER_TOKEN);if(f+V>a||k.length>=s)break;k.push(D),f+=V}let S=Math.ceil(c.relevantFiles.reduce((D,V)=>D+V.size,0)/this.CHARS_PER_TOKEN),I=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:I,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(bw))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 Ne.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 Ne.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ne.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||ld,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},Cw=new so});import dd from"node:path";var wa,ro,Pw,pd=w(()=>{"use strict";Vs();se();wa=[{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"}],ro=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 wa)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=dd.dirname(i.path);n.get(u).add(`**/${dd.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=wa.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=b();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of wa)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=b(),o={version:Tt,projectId:e,domains:t,discoveredAt:s};await Ne.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:Tt,lastUpdate:s,fileCategories:n,domainIndex:i};await Ne.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ne.readDomains(e),Ne.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 Ne.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 Ne.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Tt,lastUpdate:b(),fileCategories:u,domainIndex:d};await Ne.writeCategories(e,m)}return o}},Pw=new ro});import ka from"node:path";var Sa,xw,vw,oo,md,ba=w(()=>{"use strict";Sa=30,xw=[/^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$/],vw=[/^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],oo=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=Sa){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=ka.basename(e.path);for(let n of xw)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ka.basename(e.path);for(let s of vw)if(s.test(t))return 15;let n=ka.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}},md=new oo});function ao(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 Tw[r]}var Y,Ca,Pa,io,Tw,Et,gd,sn=w(()=>{"use strict";Y={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Ca=["feature","spec","design","refactor","migrate"],Pa=["ship","cleanup","git","migrate"],io=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Tw={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(ao,"getTimeout");Et={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},gd={HISTORY_MAX:100}});function xa(r,e){return{...Ds[r],...e}}function co(r,e,t){return{message:r,hint:e,...t}}var lo=w(()=>{"use strict";xr();xr();l(xa,"getError");l(co,"createError")});import{execSync as va}from"node:child_process";var uo,Ta,po,mo,Ea=w(()=>{"use strict";lo();uo={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"}},Ta=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=uo[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=uo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new po(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=uo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
353
+ `);throw new po({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
354
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(uo),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=va(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:co(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return va(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return va(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:co(`${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())}},po=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}},mo=new Ta});import{exec as Ew}from"node:child_process";import{promisify as Aw}from"node:util";var LI,fd=w(()=>{"use strict";sn();Ea();LI=Aw(Ew)});var Ot,Aa,lt,rn=w(()=>{"use strict";xt();se();ae();Ot={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Aa=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ie(),s=b();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=b();return A.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ie(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=A.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=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(A.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);A.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},lt=new Aa});var go,Qe,Ia=w(()=>{"use strict";ct();rn();ae();go=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;G.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?G.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?G.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;G.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return G.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Ot.MEMORY_MAX_ENTRIES)return 0;let s=n-Ot.MEMORY_MAX_ENTRIES,o=G.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);lt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&G.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Qe=new go});var hd=w(()=>{"use strict";le();_e()});import{exec as Dw}from"node:child_process";import{promisify as Rw}from"node:util";var iD,yd=w(()=>{"use strict";Vs();se();ba();iD=Rw(Dw)});import Sn from"chalk";var wd,jw,$w,At,kd=w(()=>{"use strict";Xe();wd=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],jw=80,$w={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:wd,speed:jw},cli:{header:l(()=>`${Sn.cyan.bold("\u26A1")} ${Sn.cyan("prjct")}`,"header"),footer:l(()=>Sn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Sn.cyan("\u26A1")} ${Sn.cyan("prjct")} ${Sn.cyan(wd[r%10])} ${Sn.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")=>Ir(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Ir(r).signature,"getSignature")},At=$w});import Q from"chalk";function Fw(){return Mw[Ow]}var yD,Da,Mw,Ow,bn,ss,Ra,ut,on,_w,Nw,h,Cn=w(()=>{"use strict";kd();sn();lo();lo();yD=At.spinner.frames,Da=At.spinner.speed,Mw={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}},Ow="compact";l(Fw,"getTierConfig");bn={success:Q.green("\u2713"),fail:Q.red("\u2717"),warn:Q.yellow("\u26A0"),info:Q.blue("\u2139"),debug:Q.dim("\u{1F527}"),bullet:Q.dim("\u2022"),arrow:Q.dim("\u2192"),check:Q.green("\u2713"),cross:Q.red("\u2717"),spinner:Q.cyan("\u25D0")},ss=null,Ra=0,ut=!1,on=l((r,e)=>{let t=e??(Fw().maxCharsPerLine||Et.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),_w=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Et.CLEAR_WIDTH)}\r`):!0,"clear"),Nw={start(){return ut||console.log(At.cli.header()),this},end(){return ut||console.log(At.cli.footer()),this},spin(r){return ut?this:(this.stop(),process.stdout.isTTY?(ss=setInterval(()=>{process.stdout.write(`\r${At.cli.spin(Ra++,on(r,Et.SPINNER_MSG))}`)},Da),this):(process.stdout.write(`${At.cli.spin(0,on(r,Et.SPINNER_MSG))}
355
+ `),this))},done(r,e){if(this.stop(),!ut){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=Q.dim(` [${n.join(" | ")}]`))}console.log(`${bn.success} ${on(r,Et.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${bn.fail} ${on(r,Et.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?xa(r):r;return console.error(),console.error(`${bn.fail} ${e.message}`),e.file&&console.error(Q.dim(` File: ${e.file}`)),e.hint&&console.error(Q.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(Q.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),ut||console.log(`${bn.warn} ${on(r,Et.WARN_MSG)}`),this},info(r){return this.stop(),ut||console.log(`${bn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ut&&e&&console.log(`${bn.debug} ${Q.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),ut)return this;let t=e.bullet||bn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),ut||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(Q.dim(s)),console.log(Q.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(),ut)return this;let t=e.split(`
356
+ `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(Q.dim(`\u250C${s}\u2510`)),console.log(`${Q.dim("\u2502")} ${Q.bold(r.padEnd(n))} ${Q.dim("\u2502")}`),console.log(Q.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${Q.dim("\u2502")} ${o.padEnd(n)} ${Q.dim("\u2502")}`);return console.log(Q.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),ut?this:(console.log(`
357
+ ${Q.bold(r)}`),console.log(Q.dim("\u2500".repeat(r.length))),this)},stop(){return ss&&(clearInterval(ss),ss=null,_w()),this},step(r,e,t){if(ut)return this;this.stop();let n=Q.dim(`[${r}/${e}]`);return process.stdout.isTTY?(ss=setInterval(()=>{process.stdout.write(`\r${At.cli.spin(Ra++,`${n} ${on(t,Et.STEP_MSG)}`)}`)},Da),this):(process.stdout.write(`${At.cli.spin(0,`${n} ${on(t,Et.STEP_MSG)}`)}
358
+ `),this)},progress(r,e,t){if(ut)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=Q.cyan("\u2588".repeat(s))+Q.dim("\u2591".repeat(o)),a=t?` ${on(t,Et.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ss=setInterval(()=>{process.stdout.write(`\r${At.cli.spin(Ra++,`[${i}] ${n}%${a}`)}`)},Da),this):(process.stdout.write(`${At.cli.spin(0,`[${i}] ${n}%${a}`)}
359
+ `),this)}},h=Nw});function Uw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Lw.has(r)||r.includes("prjct"))return{level:rs.debug,name:"debug"};let e=rs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function fo(r,e,t){return Sd>=r?(...n)=>console[t](e,...n):Gw}var rs,Lw,Sd,Hw,Gw,zw,B,os=w(()=>{"use strict";rs={error:0,warn:1,info:2,debug:3},Lw=new Set(["1","true","*"]);l(Uw,"getLogLevel");({level:Sd,name:Hw}=Uw()),Gw=l(()=>{},"noop");l(fo,"createLogMethod");zw={error:fo(rs.error,"[prjct:error]","error"),warn:fo(rs.warn,"[prjct:warn]","warn"),info:fo(rs.info,"[prjct:info]","log"),debug:fo(rs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Sd>=0,"isEnabled"),level:l(()=>Hw,"level")},B=zw});var ho,Ww,bd=w(()=>{"use strict";Wt();ae();xi();sn();os();ho=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=gd.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"&&B.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(Pr.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(Pr.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 B.error("Event callback error:",n),n}}async logEvent(e){try{A.appendEvent(this.projectId,e.type,e)}catch(t){B.debug("Failed to log event:",K(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())}},Ww=new ho});var yo,wo,Cd=w(()=>{"use strict";le();se();_e();yo=class{static{l(this,"SyncEventBus")}async publish(e){let t=v.getSyncPendingPath(e.projectId),n=await mn(t,[])??[];n.push(e),await Rs(t,n)}async getPending(e){let t=v.getSyncPendingPath(e);return await mn(t,[])??[]}async clearPending(e){let t=v.getSyncPendingPath(e);await Rs(t,[])}async updateLastSync(e){let t=v.getLastSyncPath(e),n={timestamp:b(),success:!0};await Rs(t,n)}async getLastSync(e){let t=v.getLastSyncPath(e);return await mn(t,null)}},wo=new yo});var ja=w(()=>{"use strict";bd();Cd()});var It,ko=w(()=>{"use strict";It=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Re,Ft=w(()=>{"use strict";ja();ko();se();ae();Re=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new It({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await wo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.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 Vw}from"node:crypto";var $a,dt,So=w(()=>{"use strict";Hi();se();Ft();$a=class extends Re{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ui.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=b(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ui.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 ru(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 Vw("sha256").update(JSON.stringify(t)).digest("hex")}},dt=new $a});var Ma,Le,Js=w(()=>{"use strict";xt();zi();se();rn();Ft();Ma=class extends Re{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",au)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:ie(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Yt(Ot.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;lt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Le=new Ma});var Oa,Pn,bo=w(()=>{"use strict";Wr();se();Ft();Oa=class extends Re{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Wu)}getDefault(){return{...Bu}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(I=>I.date>=f),S=[...i.agentUsage];if(t.agents)for(let I of t.agents){let D=S.findIndex(V=>V.agentName===I);D>=0?S[D]={...S[D],usageCount:S[D].usageCount+1,tokensSaved:S[D].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:S,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Vu(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)}},Pn=new Oa});import Ke from"node:fs/promises";import oe from"node:path";async function qs(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(r)&&A.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=v.getGlobalProjectPath(r),s=oe.join(n,"storage"),o=oe.join(n,"index"),i=oe.join(n,"memory");t.backupDir=await Jw(s,o,i),A.getDb(r);for(let{filename:a,key:c}of Na){let u=oe.join(s,a),d=await xn(u);if(d===null){t.skippedFiles.push(a);continue}try{A.setDoc(r,c,d),Pd(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of _a){let u=oe.join(o,a),d=await xn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),xd(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await tk(r,o,t),await nk(r,o,t),await sk(r,i,t),await rk(r,i,t),t.errors.length===0&&await ok(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 Jw(r,e,t){let n=oe.join(r,"backup");return await Ke.mkdir(n,{recursive:!0}),await Ke.mkdir(oe.join(n,"index"),{recursive:!0}),await Ke.mkdir(oe.join(n,"memory"),{recursive:!0}),await Fa(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Fa(e,oe.join(n,"index")),await Fa(t,oe.join(n,"memory")),n}async function Fa(r,e,t){try{let n=await Ke.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=oe.join(r,s.name),i=oe.join(e,s.name);await Ke.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Pd(r,e,t){switch(e){case"state":qw(r,t);break;case"queue":Kw(r,t);break;case"ideas":Yw(r,t);break;case"shipped":Xw(r,t);break;case"metrics":Qw(r,t);break;case"analysis":Zw(r,t);break}}function qw(r,e){let t=A.getDb(r),n=t.prepare(`
342
360
  INSERT OR REPLACE INTO tasks
343
361
  (id, description, type, status, parent_description, branch, linear_id,
344
362
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -349,79 +367,80 @@ ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){retur
349
367
  (id, task_id, description, status, domain, agent, sort_order,
350
368
  depends_on, started_at, completed_at, output, summary)
351
369
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
352
- `),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function Jw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
370
+ `),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function Kw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
353
371
  INSERT OR REPLACE INTO queue_tasks
354
372
  (id, description, type, priority, section, created_at, completed, completed_at,
355
373
  feature_id, feature_name)
356
374
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
357
- `);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 qw(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
375
+ `);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=A.getDb(r).prepare(`
358
376
  INSERT OR REPLACE INTO ideas
359
377
  (id, text, status, priority, tags, added_at, converted_to, details, data)
360
378
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
361
- `);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 Kw(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
379
+ `);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 Xw(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
362
380
  INSERT OR REPLACE INTO shipped_features
363
381
  (id, name, shipped_at, version, description, type, duration, data)
364
382
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
365
- `);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 Yw(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
383
+ `);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 Qw(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
366
384
  INSERT OR REPLACE INTO metrics_daily
367
385
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
368
386
  VALUES (?, ?, ?, ?, ?)
369
- `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Xw(r,e){let n=D.getDb(r).prepare(`
387
+ `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Zw(r,e){let n=A.getDb(r).prepare(`
370
388
  INSERT OR REPLACE INTO analysis
371
389
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
372
390
  VALUES (?, ?, ?, ?, ?, ?, ?)
373
- `),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 vd(r,e,t){e==="categories-cache"&&Qw(r,t)}function Qw(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
391
+ `),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 xd(r,e,t){e==="categories-cache"&&ek(r,t)}function ek(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
374
392
  INSERT OR REPLACE INTO index_files
375
393
  (path, categories, domain, score, size, mtime, language)
376
394
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
377
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Zw(r,e,t){let n=re.join(e,"checksums.json"),s=await Cn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=D.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 eS(r,e,t){let n=re.join(e,"file-scores.json"),s=await Cn(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=D.getDb(r),a=i.prepare(`
395
+ `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function tk(r,e,t){let n=oe.join(e,"checksums.json"),s=await xn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=A.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 nk(r,e,t){let n=oe.join(e,"file-scores.json"),s=await xn(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=A.getDb(r),a=i.prepare(`
378
396
  INSERT OR REPLACE INTO index_files
379
397
  (path, score, size, mtime, language, categories, domain)
380
398
  VALUES (?, ?, ?, ?, NULL,
381
399
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
382
400
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
383
- `);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 tS(r,e,t){let n=re.join(e,"events.jsonl");try{let o=(await qe.readFile(n,"utf-8")).split(`
384
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=D.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function nS(r,e,t){let n=re.join(e,"learnings.jsonl");try{let o=(await qe.readFile(n,"utf-8")).split(`
385
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=D.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function sS(r,e,t,n){let s=l(async(i,a)=>{try{await qe.unlink(i)}catch(c){C(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of La)await s(re.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(re.join(e,i),`cleanup:index/${i}`);await s(re.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(re.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Cn(r){try{let e=await qe.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function Co(r){let e=v.getGlobalProjectPath(r),t=re.join(e,"storage"),n=0;D.getDb(r);for(let{filename:u,key:d}of La){let m=re.join(t,u),p=await Cn(m);if(p!==null){D.setDoc(r,d,p),xd(r,d,p);try{await qe.unlink(m)}catch{}n++}}let s=re.join(e,"project.json"),o=await Cn(s);if(o!==null){D.setDoc(r,"project",o);try{await qe.unlink(s)}catch{}n++}let i=re.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=re.join(i,u);try{let p=(await qe.readFile(d,"utf-8")).split(`
386
- `).filter(f=>f.trim());if(p.length===0){await qe.unlink(d),n++;continue}let g=D.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,S,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S),I=`learning:${b.taskId??b.timestamp??Date.now()}`,R=b.tags;f.run(I,R?.[0]??null,S,1,b.timestamp??new Date().toISOString())}catch{}})()}await qe.unlink(d),n++}catch{}}let a=re.join(e,"index"),c=[...Na.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=re.join(a,u),m=await Cn(d);if(m===null)continue;let p=Na.find(g=>g.filename===u);p&&(D.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),vd(r,p.key,m));try{await qe.unlink(d)}catch{}n++}return n}var La,Na,xo=w(()=>{"use strict";ce();F();le();La=[{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"}],Na=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Ks,"migrateJsonToSqlite");l(Bw,"createBackup");l(_a,"copyFiles");l(xd,"populateNormalized");l(Vw,"populateTasksFromState");l(Jw,"populateQueueTasks");l(qw,"populateIdeas");l(Kw,"populateShippedFeatures");l(Yw,"populateMetricsDaily");l(Xw,"populateAnalysis");l(vd,"populateIndexTables");l(Qw,"populateCategoriesIndex");l(Zw,"migrateChecksums");l(eS,"migrateFileScores");l(tS,"migrateEventsJsonl");l(nS,"migrateLearningsJsonl");l(sS,"cleanupJsonFiles");l(Cn,"readJsonSafe");l(Co,"sweepLegacyJson")});var Ua,fe,Ys=w(()=>{"use strict";bt();_r();ne();sn();Ot();Ua=class extends De{static{l(this,"QueueStorage")}constructor(){super("queue.json",Fu)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id: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=Kt(Mt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;it.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()})}},fe=new Ua});var Ha,Xe,Xs=w(()=>{"use strict";bt();Ki();ne();sn();Ot();Ha=class extends De{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Iu)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id: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=Kt(Mt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;it.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}},Xe=new Ha});var Qs,Ga,xn,za=w(()=>{"use strict";Qs={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"}},Ga=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=Qs[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 Qs[e]}getPrompt(e){return Qs[e].prompt}getValidCommands(e){return Qs[e].transitions}formatNextSteps(e){return Qs[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}`}})}},xn=new Ga});var Wa,_,Zs=w(()=>{"use strict";bt();_r();ne();za();sn();Ot();Wa=class extends De{static{l(this,"StateStorage")}constructor(){super("state.json",Mu)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=xn.getCurrentState(e),s=xn.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,d)=>d!==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[];it.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(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?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=Ru.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
401
+ `);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 sk(r,e,t){let n=oe.join(e,"events.jsonl");try{let o=(await Ke.readFile(n,"utf-8")).split(`
402
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function rk(r,e,t){let n=oe.join(e,"learnings.jsonl");try{let o=(await Ke.readFile(n,"utf-8")).split(`
403
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function ok(r,e,t,n){let s=l(async(i,a)=>{try{await Ke.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Na)await s(oe.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(oe.join(e,i),`cleanup:index/${i}`);await s(oe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(oe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function xn(r){try{let e=await Ke.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Co(r){let e=v.getGlobalProjectPath(r),t=oe.join(e,"storage"),n=0;A.getDb(r);for(let{filename:u,key:d}of Na){let m=oe.join(t,u),p=await xn(m);if(p!==null){A.setDoc(r,d,p),Pd(r,d,p);try{await Ke.unlink(m)}catch{}n++}}let s=oe.join(e,"project.json"),o=await xn(s);if(o!==null){A.setDoc(r,"project",o);try{await Ke.unlink(s)}catch{}n++}let i=oe.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=oe.join(i,u);try{let p=(await Ke.readFile(d,"utf-8")).split(`
404
+ `).filter(f=>f.trim());if(p.length===0){await Ke.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,k,S.timestamp??S.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k),I=`learning:${S.taskId??S.timestamp??Date.now()}`,D=S.tags;f.run(I,D?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await Ke.unlink(d),n++}catch{}}let a=oe.join(e,"index"),c=[..._a.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=oe.join(a,u),m=await xn(d);if(m===null)continue;let p=_a.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),xd(r,p.key,m));try{await Ke.unlink(d)}catch{}n++}return n}var Na,_a,Po=w(()=>{"use strict";le();F();ae();Na=[{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"}],_a=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(qs,"migrateJsonToSqlite");l(Jw,"createBackup");l(Fa,"copyFiles");l(Pd,"populateNormalized");l(qw,"populateTasksFromState");l(Kw,"populateQueueTasks");l(Yw,"populateIdeas");l(Xw,"populateShippedFeatures");l(Qw,"populateMetricsDaily");l(Zw,"populateAnalysis");l(xd,"populateIndexTables");l(ek,"populateCategoriesIndex");l(tk,"migrateChecksums");l(nk,"migrateFileScores");l(sk,"migrateEventsJsonl");l(rk,"migrateLearningsJsonl");l(ok,"cleanupJsonFiles");l(xn,"readJsonSafe");l(Co,"sweepLegacyJson")});var La,ge,Ks=w(()=>{"use strict";xt();Fr();se();rn();Ft();La=class extends Re{static{l(this,"QueueStorage")}constructor(){super("queue.json",Ou)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ie(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:ie(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Yt(Ot.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;lt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},ge=new La});var Ua,Ze,Ys=w(()=>{"use strict";xt();qi();se();rn();Ft();Ua=class extends Re{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Au)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ie(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Yt(Ot.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;lt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},Ze=new Ua});var Xs,Ha,vn,Ga=w(()=>{"use strict";Xs={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"}},Ha=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=Xs[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 Xs[e]}getPrompt(e){return Xs[e].prompt}getValidCommands(e){return Xs[e].transitions}formatNextSteps(e){return Xs[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}`}})}},vn=new Ha});var za,_,Qs=w(()=>{"use strict";xt();Fr();se();Ga();rn();Ft();za=class extends Re{static{l(this,"StateStorage")}constructor(){super("state.json",$u)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=vn.getCurrentState(e),s=vn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:ie()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];lt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Ru.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
387
405
  ${f.join(`
388
- `)}`)}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 d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:k()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},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:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt: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,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated: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,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated: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}},_=new Wa});var Td=w(()=>{"use strict";$a();F()});var Ba,Va,Ja=w(()=>{"use strict";Vn();Ot();Ba=class extends De{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Nu,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},Va=new Ba});var Ft=w(()=>{"use strict";bo();sn();le();qs();Vs();Po();xo();Ys();Xs();Zs();Td();Ot();Ja()});function rS(){return`\u26A1 prjct
406
+ `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new za});var vd=w(()=>{"use strict";ja();F()});var Wa,Ba,Va=w(()=>{"use strict";Jn();Ft();Wa=class extends Re{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:_u,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},Ba=new Wa});function Td(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Ja,ft,Zs=w(()=>{"use strict";ae();l(Td,"rowToRule");Ja=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=A.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(n?.m??-1)+1;return A.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
407
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),A.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}getRulesForCommand(e,t){return A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Td)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Td)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},ft=new Ja});var _t=w(()=>{"use strict";So();rn();ae();Js();Vs();bo();Po();Ks();Ys();Qs();vd();Ft();Va();Zs()});function ik(){return`\u26A1 prjct
389
408
 
390
- ---`}function oS(){return`---
391
- \u26A1 prjct \xB7 v${ta()}`}function ie(...r){return iS(rS(),...r.filter(Boolean),oS())}function qa(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
392
- `)}function Le(r,e,t=3){return`### ${r}
393
- ${e}`}function lt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
409
+ ---`}function ak(){return`---
410
+ \u26A1 prjct \xB7 v${ea()}`}function X(...r){return ck(ik(),...r.filter(Boolean),ak())}function qa(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
411
+ `)}function je(r,e,t=3){return`### ${r}
412
+ ${e}`}function et(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
394
413
  `)}function Ka(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
395
414
  > ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Ed(r,e){let t=["#","Status","Description"],n=r.map((s,o)=>{let i=String(o+1),a;s.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${s.description}${c}`]});return`### Subtasks
396
415
  ${qa(t,n)}`}function Ad(r){return r.length===0?"":`### Relevant Files
397
416
  ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
398
417
  `)}`}function Id(r){return`### Rules
399
- ${lt(r)}`}function Me(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
400
- ${qa(e,t)}`}function mt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return qa(t,n)}function Et(r,e){return e?`## \u2705 ${r}
401
- > ${e}`:`## \u2705 ${r}`}function Dd(r){return`> \u26A0\uFE0F **${r}**`}function iS(...r){return r.filter(Boolean).join(`
402
-
403
- `)}function _t(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var os=w(()=>{"use strict";en();l(rS,"mdHeader");l(oS,"mdFooter");l(ie,"mdOutput");l(qa,"mdTable");l(Le,"mdSection");l(lt,"mdList");l(Ka,"mdTaskHeader");l(Ed,"mdSubtasks");l(Ad,"mdRelevantFiles");l(Id,"mdRules");l(Me,"mdNextSteps");l(mt,"mdStats");l(Et,"mdDone");l(Dd,"mdWarn");l(iS,"mdJoin");l(_t,"mdActionRequired")});import er from"chalk";function ut(r,e={}){if(e.quiet)return;let t=Rd[r]||"idle",n=xn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:jd[o]||o}));console.log(er.dim(`
404
- Next:`));for(let o of s){let i=er.cyan(o.cmd.padEnd(12));console.log(er.dim(` ${i} \u2192 ${o.desc}`))}}function vo(r){let e=Rd[r]||"idle";return xn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:jd[n]||n}))}function tr(r){let e=xn.getStateInfo(r);console.log(er.dim(`\u{1F4CD} State: ${er.white(r.toUpperCase())} - ${e.description}`))}var jd,Rd,is=w(()=>{"use strict";za();jd={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"},Rd={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(ut,"showNextSteps");l(vo,"getNextSteps");l(tr,"showStateInfo")});import*as Q from"@clack/prompts";import vn from"chalk";var To,$d,as,Md=w(()=>{"use strict";bn();To=[{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."}],$d=[{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"}],as=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}async run(){Q.intro(vn.cyan.bold("\u26A1 prjct-cli setup"));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++,!await t.run()||this.aborted)return this.buildResult(!0);return Q.outro(vn.green("Setup complete!")),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=To.findIndex(n=>n.value===this.detectedType),t=await Q.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:To.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?To[e].value:void 0});return Q.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Q.multiselect({message:"Which AI agents do you use?",options:$d.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return Q.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);Q.note(e,"Detected stack");let t=await Q.confirm({message:"Is this stack correct?",initialValue:!0});if(Q.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await Q.group({language:l(()=>Q.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>Q.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"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 Q.group({verbosity:l(()=>Q.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>Q.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${vn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${vn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${vn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${vn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${vn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
405
- `);Q.note(e,"Configuration Summary");let t=await Q.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Q.isCancel(t)||!t?(Q.isCancel(t)&&this.handleCancel(),!1):!0}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}}handleCancel(){this.aborted=!0,Q.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return To.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return $d.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 Ya from"node:path";var aS,cS,Eo,lS,Qe,Tn=w(()=>{"use strict";ce();bt();Fe();aS="outcomes",cS="outcomes.jsonl",Eo=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=v.getGlobalProjectPath(e);return Ya.join(t,aS)}getOutcomesPath(e){return Ya.join(this.getOutcomesDir(e),cS)}async record(e,t){let n={...t,id:oe()},s=this.getOutcomesPath(e);return await St(Ya.dirname(s)),await Ei(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await M(t))return[];let n=await Wn(t);return n.trim()?n.trim().split(`
406
- `).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}},lS=new Eo,Qe=lS});var Ao,uS,Xa,Od=w(()=>{"use strict";Tn();Ao=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await Qe.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await Qe.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await Qe.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(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,b)=>S+b.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let b=this.parseVariance(S.variance),I=this.parseDuration(S.estimatedDuration);return I===0?!1:Math.abs(b)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(b=>b.completedAsPlanned))for(let b of S.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((S,b)=>b[1]-S[1]).slice(0,3).map(([S])=>S);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await Qe.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 Qe.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}},uS=new Ao,Xa=uS});var nr,Io,Qa,Za=w(()=>{"use strict";Gn();ne();nr=3,Io=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>=nr){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}/${nr} 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>=nr){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}/${nr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=nr&&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(`
407
- `)}},Qa=new Io});var Do,Fd,ec=w(()=>{"use strict";Ji();Ot();ne();Do=class extends De{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Su,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Or([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?Or(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Or(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=ku(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=bu(5,s);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Pu(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}},Fd=new Do});var tc=w(()=>{"use strict";Md();Od();Za();Tn();ec()});import Nt from"chalk";function dS(r){return _d[r.toLowerCase()]||_d.default}var _d,nc,jo,Nd=w(()=>{"use strict";_d={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(dS,"getIcon");nc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Nt.cyan(`
418
+ ${et(r)}`}function fe(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
419
+ ${qa(e,t)}`}function ht(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return qa(t,n)}function Ye(r,e){return e?`## \u2705 ${r}
420
+ > ${e}`:`## \u2705 ${r}`}function Dd(r){return`> \u26A0\uFE0F **${r}**`}function ck(...r){return r.filter(Boolean).join(`
421
+
422
+ `)}function Nt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var is=w(()=>{"use strict";tn();l(ik,"mdHeader");l(ak,"mdFooter");l(X,"mdOutput");l(qa,"mdTable");l(je,"mdSection");l(et,"mdList");l(Ka,"mdTaskHeader");l(Ed,"mdSubtasks");l(Ad,"mdRelevantFiles");l(Id,"mdRules");l(fe,"mdNextSteps");l(ht,"mdStats");l(Ye,"mdDone");l(Dd,"mdWarn");l(ck,"mdJoin");l(Nt,"mdActionRequired")});import er from"chalk";function pt(r,e={}){if(e.quiet)return;let t=jd[r]||"idle",n=vn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Rd[o]||o}));console.log(er.dim(`
423
+ Next:`));for(let o of s){let i=er.cyan(o.cmd.padEnd(12));console.log(er.dim(` ${i} \u2192 ${o.desc}`))}}function xo(r){let e=jd[r]||"idle";return vn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Rd[n]||n}))}function tr(r){let e=vn.getStateInfo(r);console.log(er.dim(`\u{1F4CD} State: ${er.white(r.toUpperCase())} - ${e.description}`))}var Rd,jd,as=w(()=>{"use strict";Ga();Rd={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"},jd={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(pt,"showNextSteps");l(xo,"getNextSteps");l(tr,"showStateInfo")});import*as Z from"@clack/prompts";import Tn from"chalk";var vo,$d,cs,Md=w(()=>{"use strict";Cn();vo=[{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."}],$d=[{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"}],cs=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}async run(){Z.intro(Tn.cyan.bold("\u26A1 prjct-cli setup"));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++,!await t.run()||this.aborted)return this.buildResult(!0);return Z.outro(Tn.green("Setup complete!")),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=vo.findIndex(n=>n.value===this.detectedType),t=await Z.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:vo.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?vo[e].value:void 0});return Z.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Z.multiselect({message:"Which AI agents do you use?",options:$d.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return Z.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);Z.note(e,"Detected stack");let t=await Z.confirm({message:"Is this stack correct?",initialValue:!0});if(Z.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await Z.group({language:l(()=>Z.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>Z.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"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 Z.group({verbosity:l(()=>Z.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>Z.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Tn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Tn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Tn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Tn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Tn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
424
+ `);Z.note(e,"Configuration Summary");let t=await Z.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Z.isCancel(t)||!t?(Z.isCancel(t)&&this.handleCancel(),!1):!0}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}}handleCancel(){this.aborted=!0,Z.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return vo.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return $d.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 Ya from"node:path";var lk,uk,To,dk,tt,En=w(()=>{"use strict";le();xt();_e();lk="outcomes",uk="outcomes.jsonl",To=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=v.getGlobalProjectPath(e);return Ya.join(t,lk)}getOutcomesPath(e){return Ya.join(this.getOutcomesDir(e),uk)}async record(e,t){let n={...t,id:ie()},s=this.getOutcomesPath(e);return await Ct(Ya.dirname(s)),await Ti(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await M(t))return[];let n=await Bn(t);return n.trim()?n.trim().split(`
425
+ `).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}},dk=new To,tt=dk});var Eo,pk,Xa,Od=w(()=>{"use strict";En();Eo=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await tt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await tt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await tt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,S)=>k+S.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let S=this.parseVariance(k.variance),I=this.parseDuration(k.estimatedDuration);return I===0?!1:Math.abs(S)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(S=>S.completedAsPlanned))for(let S of k.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((k,S)=>S[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await tt.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 tt.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}},pk=new Eo,Xa=pk});var nr,Ao,Qa,Za=w(()=>{"use strict";zn();se();nr=3,Ao=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>=nr){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}/${nr} 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>=nr){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}/${nr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=nr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[j.FILE_STRUCTURE,j.ARCHITECTURE],tech_stack:[j.TECH_STACK],architecture:[j.ARCHITECTURE,j.CODE_STYLE],estimation:[j.SHIP_WORKFLOW],workflow:[j.SHIP_WORKFLOW,j.CODE_STYLE],gotcha:[j.TEST_BEHAVIOR,j.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
426
+ `)}},Qa=new Ao});var Io,Fd,ec=w(()=>{"use strict";Vi();Ft();se();Io=class extends Re{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...wu,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Mr([t,...n.outcomes]),lastUpdated:b()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Mr(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Mr(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=ku(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Su(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:bu(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}},Fd=new Io});var tc=w(()=>{"use strict";Md();Od();Za();En();ec()});import Lt from"chalk";function mk(r){return _d[r.toLowerCase()]||_d.default}var _d,nc,Do,Nd=w(()=>{"use strict";_d={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(mk,"getIcon");nc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Lt.cyan(`
408
427
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
409
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=dS(t);console.log(Nt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Nt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Nt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Nt.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?Nt.green("\u2713"):Nt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Nt.dim(`(${n})`)}
410
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Nt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Nt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},jo=new nc});import Ue from"chalk";function pS(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Ld.length;return Ld[t]}function mS(r,e,t="\u25B6"){let n=Ue.dim(String(r+1).padStart(2)),o=pS(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=Ue.green("\u2713 Complete");break;case"in_progress":a=Ue.yellow(`${t} Working...`);break;case"pending":a=Ue.gray("\u25CB Pending");break;case"failed":a=Ue.red("\u2717 Failed");break;case"blocked":a=Ue.gray("\u2298 Blocked");break;default:a=Ue.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function gS(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ue.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ue.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(mS(t,r[t]));return e.push(""),e.join(`
411
- `)}function Ud(r){console.log(gS(r))}var Ld,Hd=w(()=>{"use strict";Ld=[Ue.cyan,Ue.magenta,Ue.yellow,Ue.blue,Ue.green,Ue.redBright,Ue.magentaBright,Ue.cyanBright];l(pS,"getDomainColor");l(mS,"formatSubtaskLine");l(gS,"renderSubtaskProgress");l(Ud,"printSubtaskProgress")});function fS(r){return Gd.includes(r)}async function hS(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 yS(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(`
412
- `)}var Gd,wS,Ro,zd=w(()=>{"use strict";Gd=["ship","feature","spec","cleanup","migrate"];l(fS,"requiresReasoning");l(hS,"reason");l(yS,"formatPlan");wS={requiresReasoning:fS,reason:hS,formatPlan:yS,REASONING_REQUIRED_COMMANDS:Gd},Ro=wS});import sr from"node:fs/promises";var sc,SS,Ze,rc=w(()=>{"use strict";ot();ce();F();ko();sc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Tt({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=v.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:v.getFilePath(n,"core","now.md"),next:v.getFilePath(n,"core","next.md"),context:v.getFilePath(n,"core","context.md"),shipped:v.getFilePath(n,"progress","shipped.md"),metrics:v.getFilePath(n,"progress","metrics.md"),ideas:v.getFilePath(n,"planning","ideas.md"),roadmap:v.getFilePath(n,"planning","roadmap.md"),specs:v.getFilePath(n,"planning","specs"),memory:v.getFilePath(n,"memory","context.jsonl"),patterns:v.getFilePath(n,"memory","patterns.json"),analysis:v.getFilePath(n,"analysis","repo-summary.md"),codePatterns:v.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 sr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(C(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([sr.readFile(d,"utf-8"),sr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(C(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await sr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(C(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 sr.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},SS=new sc,Ze=SS});import{exec as kS}from"node:child_process";import he from"node:fs/promises";import Wd from"node:os";import on from"node:path";import{promisify as bS}from"node:util";function Bd(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 oc(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function CS(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
428
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=mk(t);console.log(Lt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Lt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Lt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Lt.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?Lt.green("\u2713"):Lt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Lt.dim(`(${n})`)}
429
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Lt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Lt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Do=new nc});import Ue from"chalk";function gk(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Ld.length;return Ld[t]}function fk(r,e,t="\u25B6"){let n=Ue.dim(String(r+1).padStart(2)),o=gk(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=Ue.green("\u2713 Complete");break;case"in_progress":a=Ue.yellow(`${t} Working...`);break;case"pending":a=Ue.gray("\u25CB Pending");break;case"failed":a=Ue.red("\u2717 Failed");break;case"blocked":a=Ue.gray("\u2298 Blocked");break;default:a=Ue.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function hk(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ue.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ue.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(fk(t,r[t]));return e.push(""),e.join(`
430
+ `)}function Ud(r){console.log(hk(r))}var Ld,Hd=w(()=>{"use strict";Ld=[Ue.cyan,Ue.magenta,Ue.yellow,Ue.blue,Ue.green,Ue.redBright,Ue.magentaBright,Ue.cyanBright];l(gk,"getDomainColor");l(fk,"formatSubtaskLine");l(hk,"renderSubtaskProgress");l(Ud,"printSubtaskProgress")});function yk(r){return Gd.includes(r)}async function wk(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 kk(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(`
431
+ `)}var Gd,Sk,Ro,zd=w(()=>{"use strict";Gd=["ship","feature","spec","cleanup","migrate"];l(yk,"requiresReasoning");l(wk,"reason");l(kk,"formatPlan");Sk={requiresReasoning:yk,reason:wk,formatPlan:kk,REASONING_REQUIRED_COMMANDS:Gd},Ro=Sk});import sr from"node:fs/promises";var sc,bk,nt,rc=w(()=>{"use strict";ct();le();F();ko();sc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new It({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=v.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:v.getFilePath(n,"core","now.md"),next:v.getFilePath(n,"core","next.md"),context:v.getFilePath(n,"core","context.md"),shipped:v.getFilePath(n,"progress","shipped.md"),metrics:v.getFilePath(n,"progress","metrics.md"),ideas:v.getFilePath(n,"planning","ideas.md"),roadmap:v.getFilePath(n,"planning","roadmap.md"),specs:v.getFilePath(n,"planning","specs"),memory:v.getFilePath(n,"memory","context.jsonl"),patterns:v.getFilePath(n,"memory","patterns.json"),analysis:v.getFilePath(n,"analysis","repo-summary.md"),codePatterns:v.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 sr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([sr.readFile(d,"utf-8"),sr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},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 sr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(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 sr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},bk=new sc,nt=bk});import{exec as Ck}from"node:child_process";import he from"node:fs/promises";import Wd from"node:os";import an from"node:path";import{promisify as Pk}from"node:util";function Bd(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 oc(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function vk(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
413
432
  `;return r.warnings.forEach(t=>{e+=` - ${t}
414
433
  `}),r.recommendations.length>0&&(e+=`
415
434
  Recommendations:
416
435
  `,r.recommendations.forEach(t=>{e+=` -> ${t}
417
- `})),e}async function Vd(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await he.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=Bd(n.durationMs))}}catch(a){if(C(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 he.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(C(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await he.access(on.dirname(i),he.constants.W_OK),n.metricsWritable=!0}catch(a){if(C(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 Jd(r){let e=[],t=[],n={};try{let{stdout:i}=await PS("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
418
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=on.join(r.projectPath,"package.json");try{let i=await he.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(C(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 he.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}.*${oc(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(C(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await he.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(C(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function qd(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await he.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(C(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await he.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(oc(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(C(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await he.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(C(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Kd(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await he.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(C(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await he.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(C(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Yd(r){let e=[],t=[],n={},s=on.join(r.projectPath,".prjct/prjct.config.json");try{let i=await he.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(C(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=on.join(Wd.homedir(),".prjct-cli");try{await he.access(o,he.constants.W_OK),n.globalPathWritable=!0}catch(i){if(C(i))try{await he.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 Xd(r){let e=[],t=[],n={},s=on.join(r.projectPath,".prjct/prjct.config.json");try{let a=await he.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(C(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=on.join(Wd.homedir(),".prjct-cli/projects",o||"");try{await he.access(i),n.globalStorageExists=!0}catch(a){if(C(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 Qd(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 he.access(on.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!C(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 he.stat(on.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!C(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Zd(r){let e=[],t=[],n={},s=r.paths.specs;try{await he.access(s),n.specsExists=!0;let i=await he.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(C(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 tp(r,e,t){let n=ep[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 xS(r,e,t){let n=await tp(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function vS(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var PS,ep,TS,$o,np=w(()=>{"use strict";F();PS=bS(kS);l(Bd,"formatDuration");l(oc,"escapeRegex");l(CS,"formatWarnings");l(Vd,"verifyDone");l(Jd,"verifyShip");l(qd,"verifyFeature");l(Kd,"verifyNow");l(Yd,"verifyInit");l(Xd,"verifySync");l(Qd,"verifyAnalyze");l(Zd,"verifySpec");ep={done:Vd,ship:Jd,feature:qd,now:Kd,init:Yd,sync:Xd,analyze:Qd,spec:Zd};l(tp,"verify");l(xS,"prepareCommand");l(vS,"requiresVerification");TS={verify:tp,prepareCommand:xS,requiresVerification:vS,verifiers:ep,formatWarnings:CS,formatDuration:Bd,escapeRegex:oc,verifyDone:Vd,verifyShip:Jd,verifyFeature:qd,verifyNow:Kd,verifyInit:Yd,verifySync:Xd,verifyAnalyze:Qd,verifySpec:Zd},$o=TS});function AS(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 IS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of ES)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:AS(t)};return{detected:!1}}function DS(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 jS(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 RS(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 $S(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 ES,ic,MS,cs,sp=w(()=>{"use strict";ES=[{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(AS,"getHallucinationSuggestion");l(IS,"detectHallucination");l(DS,"isSimilarError");l(jS,"analyzeErrorPattern");l(RS,"generateEscalationMessage");l($S,"generateSuggestion");ic=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=>DS(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=jS(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:RS(e,o,this.maxAttempts),suggestion:$S(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 IS(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}}},MS=new ic,cs=MS});function ac(r,e){let t=rr(e),n=OS[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 FS(r,e){let t=rr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function _S(r,e,t){let n=rr(t),s=ac(r,t),o=ac(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Mo(r,e=Zt){let t=rr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=NS(r,e),s=LS(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=GS(o),a=US(o),c=HS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=zS(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function op(r,e,t=Zt){let n=rr(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 NS(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=_S(i,s,e);if(!t.has(a)){let c=ac(i,e),u=FS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function LS(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+WS(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>lc(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function US(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function HS(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=lc(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function GS(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 zS(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=lc(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 lc(r){if(!r.variance)return 0;let e=cc(r.estimatedDuration),t=cc(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function cc(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 ip(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(`
419
- `)}function WS(r){if(!r.estimatedDuration)return 0;let e=cc(r.estimatedDuration);if(e<=0)return 0;let t=rp[0],n=Number.POSITIVE_INFINITY;for(let s of rp){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function rr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var OS,rp,uc=w(()=>{"use strict";Vn();OS={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(ac,"getSprintStart");l(FS,"getSprintEnd");l(_S,"getSprintNumber");l(Mo,"calculateVelocity");l(op,"projectCompletion");l(NS,"bucketBySprint");l(LS,"buildSprintVelocities");l(US,"detectTrend");l(HS,"calculateOverallAccuracy");l(GS,"calculateAverageVelocity");l(zS,"detectEstimationPatterns");l(lc,"parseVariancePercent");l(cc,"parseDurationMinutes");l(ip,"formatVelocityContext");rp=[{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(WS,"derivePoints");l(rr,"resolveConfig")});import{exec as BS}from"node:child_process";import VS from"node:fs/promises";import Oo from"node:path";import{promisify as JS}from"node:util";async function Fo(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=QS(r),c=await ZS(e),u=await ek(e),d=[];for(let p of c){if(!i&&nk(p))continue;let g=tk(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function QS(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 ZS(r){let e=[];async function t(n,s=""){try{let o=await VS.readdir(n,{withFileTypes:!0});for(let i of o){let a=Oo.join(n,i.name),c=Oo.join(s,i.name);if(i.isDirectory()){if(XS.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Oo.extname(i.name).toLowerCase();YS.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(r),e}async function ek(r){let e=new Map;try{let{stdout:t}=await qS(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
436
+ `})),e}async function Vd(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await he.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=Bd(n.durationMs))}}catch(a){if(P(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await he.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(P(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await he.access(an.dirname(i),he.constants.W_OK),n.metricsWritable=!0}catch(a){if(P(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Jd(r){let e=[],t=[],n={};try{let{stdout:i}=await xk("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
437
+ `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=an.join(r.projectPath,"package.json");try{let i=await he.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await he.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}.*${oc(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await he.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function qd(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await he.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(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await he.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(oc(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await he.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Kd(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await he.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(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await he.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(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Yd(r){let e=[],t=[],n={},s=an.join(r.projectPath,".prjct/prjct.config.json");try{let i=await he.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(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=an.join(Wd.homedir(),".prjct-cli");try{await he.access(o,he.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await he.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 Xd(r){let e=[],t=[],n={},s=an.join(r.projectPath,".prjct/prjct.config.json");try{let a=await he.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=an.join(Wd.homedir(),".prjct-cli/projects",o||"");try{await he.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Qd(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 he.access(an.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await he.stat(an.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Zd(r){let e=[],t=[],n={},s=r.paths.specs;try{await he.access(s),n.specsExists=!0;let i=await he.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=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 tp(r,e,t){let n=ep[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 Tk(r,e,t){let n=await tp(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Ek(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var xk,ep,Ak,jo,np=w(()=>{"use strict";F();xk=Pk(Ck);l(Bd,"formatDuration");l(oc,"escapeRegex");l(vk,"formatWarnings");l(Vd,"verifyDone");l(Jd,"verifyShip");l(qd,"verifyFeature");l(Kd,"verifyNow");l(Yd,"verifyInit");l(Xd,"verifySync");l(Qd,"verifyAnalyze");l(Zd,"verifySpec");ep={done:Vd,ship:Jd,feature:qd,now:Kd,init:Yd,sync:Xd,analyze:Qd,spec:Zd};l(tp,"verify");l(Tk,"prepareCommand");l(Ek,"requiresVerification");Ak={verify:tp,prepareCommand:Tk,requiresVerification:Ek,verifiers:ep,formatWarnings:vk,formatDuration:Bd,escapeRegex:oc,verifyDone:Vd,verifyShip:Jd,verifyFeature:qd,verifyNow:Kd,verifyInit:Yd,verifySync:Xd,verifyAnalyze:Qd,verifySpec:Zd},jo=Ak});function Dk(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 Rk(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of Ik)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:Dk(t)};return{detected:!1}}function jk(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 $k(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 Mk(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 Ok(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 Ik,ic,Fk,ls,sp=w(()=>{"use strict";Ik=[{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(Dk,"getHallucinationSuggestion");l(Rk,"detectHallucination");l(jk,"isSimilarError");l($k,"analyzeErrorPattern");l(Mk,"generateEscalationMessage");l(Ok,"generateSuggestion");ic=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=>jk(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=$k(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:Mk(e,o,this.maxAttempts),suggestion:Ok(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 Rk(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}}},Fk=new ic,ls=Fk});function ac(r,e){let t=rr(e),n=_k[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 Nk(r,e){let t=rr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function Lk(r,e,t){let n=rr(t),s=ac(r,t),o=ac(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $o(r,e=en){let t=rr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=Uk(r,e),s=Hk(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=Wk(o),a=Gk(o),c=zk(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Bk(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function op(r,e,t=en){let n=rr(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 Uk(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=Lk(i,s,e);if(!t.has(a)){let c=ac(i,e),u=Nk(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Hk(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+Vk(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>lc(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function Gk(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function zk(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=lc(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function Wk(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 Bk(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=lc(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 lc(r){if(!r.variance)return 0;let e=cc(r.estimatedDuration),t=cc(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function cc(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 ip(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(`
438
+ `)}function Vk(r){if(!r.estimatedDuration)return 0;let e=cc(r.estimatedDuration);if(e<=0)return 0;let t=rp[0],n=Number.POSITIVE_INFINITY;for(let s of rp){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function rr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var _k,rp,uc=w(()=>{"use strict";Jn();_k={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(ac,"getSprintStart");l(Nk,"getSprintEnd");l(Lk,"getSprintNumber");l($o,"calculateVelocity");l(op,"projectCompletion");l(Uk,"bucketBySprint");l(Hk,"buildSprintVelocities");l(Gk,"detectTrend");l(zk,"calculateOverallAccuracy");l(Wk,"calculateAverageVelocity");l(Bk,"detectEstimationPatterns");l(lc,"parseVariancePercent");l(cc,"parseDurationMinutes");l(ip,"formatVelocityContext");rp=[{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(Vk,"derivePoints");l(rr,"resolveConfig")});import{exec as Jk}from"node:child_process";import qk from"node:fs/promises";import Mo from"node:path";import{promisify as Kk}from"node:util";async function Oo(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=eS(r),c=await tS(e),u=await nS(e),d=[];for(let p of c){if(!i&&rS(p))continue;let g=sS(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function eS(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 tS(r){let e=[];async function t(n,s=""){try{let o=await qk.readdir(n,{withFileTypes:!0});for(let i of o){let a=Mo.join(n,i.name),c=Mo.join(s,i.name);if(i.isDirectory()){if(Zk.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Mo.extname(i.name).toLowerCase();Qk.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(r),e}async function nS(r){let e=new Map;try{let{stdout:t}=await Yk(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
420
439
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
421
440
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
422
441
  END { for (f in files) print files[f], lastmod[f], f }
423
442
  '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
424
- `).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function tk(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(KS))for(let S of f)if(c.includes(S)&&e.some(I=>f.includes(I)||I.includes(g)||g.includes(I))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Oo.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function nk(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 qS,KS,YS,XS,dc=w(()=>{"use strict";F();qS=JS(BS),KS={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"]},YS=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),XS=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Fo,"findRelevantFiles");l(QS,"extractKeywords");l(ZS,"getAllCodeFiles");l(ek,"getGitRecency");l(tk,"scoreFile");l(nk,"isTestFile")});import{exec as sk}from"node:child_process";import{promisify as rk}from"node:util";async function ap(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 ak(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await ik(r,t);return o=o.filter(c=>!ck(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 ik(r,e){let{stdout:t}=await or(`git log -${e} --pretty=format:"%ct" --name-only | awk '
443
+ `).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function sS(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(Xk))for(let k of f)if(c.includes(k)&&e.some(I=>f.includes(I)||I.includes(g)||g.includes(I))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Mo.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function rS(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 Yk,Xk,Qk,Zk,dc=w(()=>{"use strict";F();Yk=Kk(Jk),Xk={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"]},Qk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Zk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Oo,"findRelevantFiles");l(eS,"extractKeywords");l(tS,"getAllCodeFiles");l(nS,"getGitRecency");l(sS,"scoreFile");l(rS,"isTestFile")});import{exec as oS}from"node:child_process";import{promisify as iS}from"node:util";async function ap(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 lS(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await cS(r,t);return o=o.filter(c=>!uS(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 cS(r,e){let{stdout:t}=await or(`git log -${e} --pretty=format:"%ct" --name-only | awk '
425
444
  /^[0-9]+$/ { timestamp=$1; next }
426
445
  NF {
427
446
  count[$0]++
@@ -431,7 +450,7 @@ Recommendations:
431
450
  for (f in count) print count[f], lastmod[f], f
432
451
  }
433
452
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
434
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),S=Math.max(0,1-g/30),b=u/i,I=S*.6+b*.4,R;f<1?R="just now":f<24?R=`${f}h ago`:g<7?R=`${g}d ago`:g<30?R=`${Math.floor(g/7)}w ago`:R=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(I*100)/100,lastChanged:R,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function ak(r){let{stdout:e}=await or("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await or("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await or(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
453
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),S=u/i,I=k*.6+S*.4,D;f<1?D="just now":f<24?D=`${f}h ago`:g<7?D=`${g}d ago`:g<30?D=`${Math.floor(g/7)}w ago`:D=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(I*100)/100,lastChanged:D,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function lS(r){let{stdout:e}=await or("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await or("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await or(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
435
454
  `).filter(Boolean),{stdout:i}=await or(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
436
455
  /^[0-9]+$/ { timestamp=$1; next }
437
456
  NF {
@@ -442,10 +461,10 @@ Recommendations:
442
461
  for (f in count) print count[f], lastmod[f], f
443
462
  }
444
463
  '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
445
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),S=p[3],b=u-f,I=Math.floor(b/86400),R=Math.floor(b/3600),V=Math.max(0,1-I/14),me=g/d,Se=V*.5+me*.5,Ge;R<1?Ge="just now":R<24?Ge=`${R}h ago`:Ge=`${I}d ago`,a.push({path:S,changes:g,heatScore:Math.round(Se*100)/100,lastChanged:Ge,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function ck(r){let e=r.split("/").pop()||"";for(let t of ok)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var or,ok,cp=w(()=>{"use strict";or=rk(sk),ok=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(ap,"getRecentFiles");l(ik,"getHotFilesFromCommits");l(ak,"getBranchOnlyFiles");l(ck,"shouldIgnore")});function pc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function lp(r,e){let t=lk[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function dk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function dp(r,e){let t=pc(r),n=pc(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=lp(s,uk),a=up.map(c=>({model:c,...lp(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:dk(i.total),byModel:a}}}function mc(r){let e=pc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:up.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var lk,uk,up,pp=w(()=>{"use strict";lk={"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}},uk="claude-sonnet-4.5";l(pc,"countTokens");up=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(lp,"calculateModelCost");l(dk,"formatCostSaved");l(dp,"measureCompression");l(mc,"noCompression")});import pk from"node:fs/promises";import gc from"node:path";async function fp(r,e=process.cwd()){let t=gc.isAbsolute(r)?r:gc.join(e,r),n;try{n=await pk.readFile(t,"utf-8")}catch(u){if(C(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:mc("")};throw u}let s=gc.extname(r).toLowerCase(),o=mk[s]||"unknown",i=yk[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:mc(n)};let a=wk(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
446
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:dp(n,c)}}function wk(r,e){let t=[],n=r.split(`
464
+ `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],S=u-f,I=Math.floor(S/86400),D=Math.floor(S/3600),V=Math.max(0,1-I/14),me=g/d,Se=V*.5+me*.5,Ge;D<1?Ge="just now":D<24?Ge=`${D}h ago`:Ge=`${I}d ago`,a.push({path:k,changes:g,heatScore:Math.round(Se*100)/100,lastChanged:Ge,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function uS(r){let e=r.split("/").pop()||"";for(let t of aS)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var or,aS,cp=w(()=>{"use strict";or=iS(oS),aS=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(ap,"getRecentFiles");l(cS,"getHotFilesFromCommits");l(lS,"getBranchOnlyFiles");l(uS,"shouldIgnore")});function pc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function lp(r,e){let t=dS[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function mS(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function dp(r,e){let t=pc(r),n=pc(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=lp(s,pS),a=up.map(c=>({model:c,...lp(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:mS(i.total),byModel:a}}}function mc(r){let e=pc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:up.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var dS,pS,up,pp=w(()=>{"use strict";dS={"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}},pS="claude-sonnet-4.5";l(pc,"countTokens");up=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(lp,"calculateModelCost");l(mS,"formatCostSaved");l(dp,"measureCompression");l(mc,"noCompression")});import gS from"node:fs/promises";import gc from"node:path";async function fp(r,e=process.cwd()){let t=gc.isAbsolute(r)?r:gc.join(e,r),n;try{n=await gS.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:mc("")};throw u}let s=gc.extname(r).toLowerCase(),o=fS[s]||"unknown",i=kS[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:mc(n)};let a=SS(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
465
+ `);return{file:r,language:o,signatures:a,fallback:!1,metrics:dp(n,c)}}function SS(r,e){let t=[],n=r.split(`
447
466
  `),s=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(s.has(c))continue;s.add(c);let u=i.index,d=r.substring(0,u).split(`
448
- `).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:Sk(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Sk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var mk,mp,gk,fk,hk,gp,yk,hp=w(()=>{"use strict";F();pp();mk={".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"},mp=[{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}],gk=[{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}],fk=[{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}],hk=[{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}],gp=[{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}],yk={typescript:mp,javascript:mp,python:gk,go:fk,rust:hk,java:gp,csharp:gp,php:[],ruby:[],unknown:[]};l(fp,"extractSignatures");l(wk,"extractFromContent");l(Sk,"cleanSignature")});import{createHash as kk}from"node:crypto";import Sp from"node:fs/promises";import kp from"node:path";function yp(r){return kk("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function wp(r){try{let e=kp.join(r,"storage","classification-cache.json"),t=await Sp.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e)?zi:(console.warn("[classifier] Failed to load cache:",y(e)),zi)}}async function fc(r,e){try{let t=kp.join(r,"storage","classification-cache.json");await Sp.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function Pk(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>bk?null:n.classification}function Ck(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function xk(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=bp(e),s=Vi("classification")||"",o=`Classify this software engineering task into a domain.
467
+ `).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:bS(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function bS(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var fS,mp,hS,yS,wS,gp,kS,hp=w(()=>{"use strict";F();pp();fS={".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"},mp=[{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}],hS=[{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}],yS=[{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}],wS=[{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}],gp=[{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}],kS={typescript:mp,javascript:mp,python:hS,go:yS,rust:wS,java:gp,csharp:gp,php:[],ruby:[],unknown:[]};l(fp,"extractSignatures");l(SS,"extractFromContent");l(bS,"cleanSignature")});import{createHash as CS}from"node:crypto";import kp from"node:fs/promises";import Sp from"node:path";function yp(r){return CS("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function wp(r){try{let e=Sp.join(r,"storage","classification-cache.json"),t=await kp.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?Gi:(console.warn("[classifier] Failed to load cache:",y(e)),Gi)}}async function fc(r,e){try{let t=Sp.join(r,"storage","classification-cache.json");await kp.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function xS(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>PS?null:n.classification}function vS(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function TS(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=bp(e),s=Bi("classification")||"",o=`Classify this software engineering task into a domain.
449
468
 
450
469
  Task: "${r}"
451
470
 
@@ -453,19 +472,19 @@ Available domains in this project: ${n.join(", ")}
453
472
  Available agents: ${e.agents.join(", ")||"none"}
454
473
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
455
474
 
456
- ${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Qt.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function Tk(r,e){let t=bp(e),n=new Map;for(let[p,g]of Object.entries(vk)){if(p==="general"||!t.includes(p))continue;let f=0;for(let S of g)r.match(new RegExp(S,"gi"))&&(f+=S.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return iu;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=Ek(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function bp(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 Ek(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 bk,vk,hc,Ak,Pp,Cp=w(()=>{"use strict";Us();Mr();F();bk=3600*1e3;l(yp,"hashDescription");l(wp,"loadCache");l(fc,"saveCache");l(Pk,"lookupCache");l(Ck,"lookupPatterns");l(xk,"classifyWithLLM");vk={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(Tk,"classifyWithHeuristic");l(bp,"buildAvailableDomains");l(Ek,"getFilePatterns");hc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=yp(e),i=await wp(n),a=Pk(i,o,t);if(a)return{classification:a,source:"cache"};let c=Ck(i,o);if(c)return{classification:c,source:"history"};let u=await xk(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await fc(n,i),{classification:u,source:"llm"};let d=Tk(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await fc(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=yp(e),o=await wp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await fc(n,o))}},Ak=new hc,Pp=Ak});import{exec as Ik}from"node:child_process";import ir from"node:fs/promises";import Dk from"node:os";import En from"node:path";import{promisify as jk}from"node:util";var xp,vp,yc,Rk,_o,wc=w(()=>{"use strict";uc();ot();ce();Vn();Ft();dc();cp();hp();F();Tn();Cp();Zn();xp=jk(Ik),vp=["database","backend","frontend","testing","devops"],yc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=v.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((Se,Ge)=>{if(Se.status==="fulfilled")return Se.value;g.push(p[Ge]),console.warn(`Context tool "${p[Ge]}" failed: ${y(Se.reason)}`)}),[S,b,I]=f,R={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},V=this.shouldFragment(a,t),me=null;return V&&e==="task"&&(me=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:V,subtasks:me,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:S,sealedAnalysis:b??null,velocityContext:I??null,contextDegradation:R}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Fo(e,t,{maxFiles:10,minScore:.15}),ap(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await fp(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
475
+ ${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Zt.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function AS(r,e){let t=bp(e),n=new Map;for(let[p,g]of Object.entries(ES)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return ou;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=IS(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function bp(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 IS(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 PS,ES,hc,DS,Cp,Pp=w(()=>{"use strict";Us();$r();F();PS=3600*1e3;l(yp,"hashDescription");l(wp,"loadCache");l(fc,"saveCache");l(xS,"lookupCache");l(vS,"lookupPatterns");l(TS,"classifyWithLLM");ES={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(AS,"classifyWithHeuristic");l(bp,"buildAvailableDomains");l(IS,"getFilePatterns");hc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=yp(e),i=await wp(n),a=xS(i,o,t);if(a)return{classification:a,source:"cache"};let c=vS(i,o);if(c)return{classification:c,source:"history"};let u=await TS(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await fc(n,i),{classification:u,source:"llm"};let d=AS(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await fc(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=yp(e),o=await wp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await fc(n,o))}},DS=new hc,Cp=DS});import{exec as RS}from"node:child_process";import ir from"node:fs/promises";import jS from"node:os";import An from"node:path";import{promisify as $S}from"node:util";var xp,vp,yc,MS,Fo,wc=w(()=>{"use strict";uc();ct();le();Jn();_t();dc();cp();hp();F();En();Pp();es();xp=$S(RS),vp=["database","backend","frontend","testing","devops"],yc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=v.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((Se,Ge)=>{if(Se.status==="fulfilled")return Se.value;g.push(p[Ge]),console.warn(`Context tool "${p[Ge]}" failed: ${y(Se.reason)}`)}),[k,S,I]=f,D={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},V=this.shouldFragment(a,t),me=null;return V&&e==="task"&&(me=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:V,subtasks:me,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:S??null,velocityContext:I??null,contextDegradation:D}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Oo(e,t,{maxFiles:10,minScore:.15}),ap(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await fp(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
457
476
  `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([xp("git branch --show-current",{cwd:e}),xp("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
458
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await ct.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await Qe.getAll(e);if(t.length===0)return null;let n=Mo(t,Zt);return n.sprints.length===0?null:ip(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=En.join(e,"analysis","repo-analysis.json"),n=await ir.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return C(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=v.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Pp.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=En.join(e,"agents");return(await ir.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=v.getGlobalProjectPath(t),s=En.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=En.join(s,u);try{let m=await ir.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=zr(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=En.join(Dk.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=En.join(t,`${i}.md`),c=En.join(t,i,"SKILL.md");try{let u=await ir.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await ir.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=vp.indexOf(a),d=vp.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.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?"...":""}`}},Rk=new yc,_o=Rk});function $k(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 Sc,Mk,ve,Tp=w(()=>{"use strict";bt();ne();nn();nn();l($k,"generateApprovalPrompt");Sc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Ca.includes(e)}isDestructive(e){return xa.includes(e)}isToolAllowedInPlanning(e){return ao.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>ao.includes(n)):t}startPlanning(e,t,n){let s={id:oe(),projectId:e,command:t,params:n,status:Y.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?[Y.GATHERING,Y.ANALYZING,Y.PROPOSING,Y.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===Y.APPROVED?n.approvedAt=k():t===Y.EXECUTING?n.executionStartedAt=k():(t===Y.COMPLETED||t===Y.ABORTED)&&(n.completedAt=k()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=Y.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=Y.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!==Y.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=Y.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=Y.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!==Y.APPROVED?null:(t.status=Y.EXECUTING,t.executionStartedAt=k(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==Y.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!==Y.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=Y.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=Y.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 $k(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[Y.GATHERING]:"\u{1F50D}",[Y.ANALYZING]:"\u{1F9E0}",[Y.PROPOSING]:"\u{1F4DD}",[Y.PENDING_APPROVAL]:"\u23F3",[Y.APPROVED]:"\u2705",[Y.EXECUTING]:"\u26A1",[Y.COMPLETED]:"\u{1F389}",[Y.REJECTED]:"\u274C",[Y.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===Y.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
459
- `)}_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`}},Mk=new Sc,ve=Mk});function Ok(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return No[t]?No[t]:No[e]?No[e]:e}function Lo(r){let e=new Set,t=[];for(let n of r){let s=Ok(n);e.has(s)||(e.add(s),t.push(n))}return t}var No,kc=w(()=>{"use strict";No={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(Ok,"normalizeFrameworkName");l(Lo,"deduplicateTechStack")});import{z as Te}from"zod";function Ep(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
460
- `);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=Lo(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])=>Fk[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(`
477
+ `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await dt.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await tt.getAll(e);if(t.length===0)return null;let n=$o(t,en);return n.sprints.length===0?null:ip(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=An.join(e,"analysis","repo-analysis.json"),n=await ir.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=v.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Cp.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=An.join(e,"agents");return(await ir.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=v.getGlobalProjectPath(t),s=An.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=An.join(s,u);try{let m=await ir.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=Gr(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=An.join(jS.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=An.join(t,`${i}.md`),c=An.join(t,i,"SKILL.md");try{let u=await ir.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await ir.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=vp.indexOf(a),d=vp.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.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?"...":""}`}},MS=new yc,Fo=MS});function OS(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 kc,FS,Te,Tp=w(()=>{"use strict";xt();se();sn();sn();l(OS,"generateApprovalPrompt");kc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Ca.includes(e)}isDestructive(e){return Pa.includes(e)}isToolAllowedInPlanning(e){return io.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>io.includes(n)):t}startPlanning(e,t,n){let s={id:ie(),projectId:e,command:t,params:n,status:Y.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[Y.GATHERING,Y.ANALYZING,Y.PROPOSING,Y.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===Y.APPROVED?n.approvedAt=b():t===Y.EXECUTING?n.executionStartedAt=b():(t===Y.COMPLETED||t===Y.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=Y.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=Y.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!==Y.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=Y.APPROVED,n.approvedAt=b(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=Y.REJECTED,n.userFeedback=t,n.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==Y.APPROVED?null:(t.status=Y.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==Y.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!==Y.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=b(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=Y.COMPLETED,t.completedAt=b();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=Y.ABORTED,n.completedAt=b(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return OS(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[Y.GATHERING]:"\u{1F50D}",[Y.ANALYZING]:"\u{1F9E0}",[Y.PROPOSING]:"\u{1F4DD}",[Y.PENDING_APPROVAL]:"\u23F3",[Y.APPROVED]:"\u2705",[Y.EXECUTING]:"\u26A1",[Y.COMPLETED]:"\u{1F389}",[Y.REJECTED]:"\u274C",[Y.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===Y.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
478
+ `)}_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`}},FS=new kc,Te=FS});function _S(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return _o[t]?_o[t]:_o[e]?_o[e]:e}function No(r){let e=new Set,t=[];for(let n of r){let s=_S(n);e.has(s)||(e.add(s),t.push(n))}return t}var _o,Sc=w(()=>{"use strict";_o={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(_S,"normalizeFrameworkName");l(No,"deduplicateTechStack")});import{z as Ee}from"zod";function Ep(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
479
+ `);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=No(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])=>NS[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(`
461
480
  Context: ${r.fileCount} files in project.`),e.join(`
462
- `)}var k$,Fk,Ap=w(()=>{"use strict";kc();k$=Te.object({projectPath:Te.string(),language:Te.string().optional(),framework:Te.string().optional(),techStack:Te.array(Te.string()).default([]),domains:Te.object({hasFrontend:Te.boolean().default(!1),hasBackend:Te.boolean().default(!1),hasDatabase:Te.boolean().default(!1),hasTesting:Te.boolean().default(!1),hasDocker:Te.boolean().default(!1)}).optional(),fileCount:Te.number().optional(),availableAgents:Te.array(Te.string()).default([]),analysisLanguages:Te.array(Te.string()).default([]),analysisFrameworks:Te.array(Te.string()).default([]),analysisPackageManager:Te.string().optional()}),Fk={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Ep,"buildAntiHallucinationBlock")});import{z as At}from"zod";var _k,Ip,Dp=w(()=>{"use strict";_k=At.object({agents:At.boolean(),patterns:At.boolean(),checklist:At.boolean(),modules:At.array(At.string())}),Ip=At.object({version:At.string(),description:At.string().optional(),commands:At.record(At.string(),_k).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function bc(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function jp(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=bc(o,Nk),a=bc(o,Lk),c=bc(o,Uk);return s.some(d=>Hk.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var Nk,Lk,Uk,Hk,Rp=w(()=>{"use strict";Nk=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Lk=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Uk=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],Hk=["Write","Edit","Bash"];l(bc,"countMatches");l(jp,"classifyCommand")});import Pc from"node:fs/promises";import Gk from"node:path";async function Mp(){if(ar)return ar;let r=await Pc.readFile(Cc,"utf-8"),e=JSON.parse(r);return ar=Ip.parse(e),ar}function zk(r){return Op.get(r)}function Wk(r,e){Op.set(r,e)}function Vk(r,e){let t=r,n=$p.get(t);return n&&qk(n.entry,e)?(n.count++,n.count>=Bk):($p.set(t,{entry:e,count:1}),!1)}async function Jk(r,e){let t=await Pc.readFile(Cc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Pc.writeFile(Cc,`${JSON.stringify(n,null,2)}
463
- `,"utf-8"),ar=null}function qk(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 Fp(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=zk(e);if(n)return{entry:n,source:"cache"};if(t){let s=jp(e,t);return Wk(e,s),Vk(e,s)&&Jk(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Cc,ar,Op,$p,Bk,_p=w(()=>{"use strict";Dp();en();Rp();Cc=Gk.join(xe,"core/config/command-context.config.json"),ar=null;l(Mp,"loadCommandContextConfig");Op=new Map;l(zk,"getCachedClassification");l(Wk,"cacheClassification");$p=new Map,Bk=3;l(Vk,"trackClassification");l(Jk,"persistClassification");l(qk,"isSameEntry");l(Fp,"resolveCommandContextFull")});import Kk from"node:os";import{z as Lt}from"zod";function Yk(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Xk(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Np(r){let e=r.platform??Kk.platform(),t=r.runtime??Yk(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
464
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Xk(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
481
+ `)}var T$,NS,Ap=w(()=>{"use strict";Sc();T$=Ee.object({projectPath:Ee.string(),language:Ee.string().optional(),framework:Ee.string().optional(),techStack:Ee.array(Ee.string()).default([]),domains:Ee.object({hasFrontend:Ee.boolean().default(!1),hasBackend:Ee.boolean().default(!1),hasDatabase:Ee.boolean().default(!1),hasTesting:Ee.boolean().default(!1),hasDocker:Ee.boolean().default(!1)}).optional(),fileCount:Ee.number().optional(),availableAgents:Ee.array(Ee.string()).default([]),analysisLanguages:Ee.array(Ee.string()).default([]),analysisFrameworks:Ee.array(Ee.string()).default([]),analysisPackageManager:Ee.string().optional()}),NS={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Ep,"buildAntiHallucinationBlock")});import{z as Dt}from"zod";var LS,Ip,Dp=w(()=>{"use strict";LS=Dt.object({agents:Dt.boolean(),patterns:Dt.boolean(),checklist:Dt.boolean(),modules:Dt.array(Dt.string())}),Ip=Dt.object({version:Dt.string(),description:Dt.string().optional(),commands:Dt.record(Dt.string(),LS).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function bc(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Rp(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=bc(o,US),a=bc(o,HS),c=bc(o,GS);return s.some(d=>zS.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var US,HS,GS,zS,jp=w(()=>{"use strict";US=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],HS=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],GS=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],zS=["Write","Edit","Bash"];l(bc,"countMatches");l(Rp,"classifyCommand")});import Cc from"node:fs/promises";import WS from"node:path";async function Mp(){if(ar)return ar;let r=await Cc.readFile(Pc,"utf-8"),e=JSON.parse(r);return ar=Ip.parse(e),ar}function BS(r){return Op.get(r)}function VS(r,e){Op.set(r,e)}function qS(r,e){let t=r,n=$p.get(t);return n&&YS(n.entry,e)?(n.count++,n.count>=JS):($p.set(t,{entry:e,count:1}),!1)}async function KS(r,e){let t=await Cc.readFile(Pc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Cc.writeFile(Pc,`${JSON.stringify(n,null,2)}
482
+ `,"utf-8"),ar=null}function YS(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 Fp(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=BS(e);if(n)return{entry:n,source:"cache"};if(t){let s=Rp(e,t);return VS(e,s),qS(e,s)&&KS(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Pc,ar,Op,$p,JS,_p=w(()=>{"use strict";Dp();tn();jp();Pc=WS.join(ve,"core/config/command-context.config.json"),ar=null;l(Mp,"loadCommandContextConfig");Op=new Map;l(BS,"getCachedClassification");l(VS,"cacheClassification");$p=new Map,JS=3;l(qS,"trackClassification");l(KS,"persistClassification");l(YS,"isSameEntry");l(Fp,"resolveCommandContextFull")});import XS from"node:os";import{z as Ut}from"zod";function QS(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function ZS(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Np(r){let e=r.platform??XS.platform(),t=r.runtime??QS(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
483
+ ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",ZS(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
465
484
  `)}
466
- </env>`}var F$,Lp=w(()=>{"use strict";F$=Lt.object({projectName:Lt.string(),projectPath:Lt.string(),isGitRepo:Lt.boolean().default(!0),gitBranch:Lt.string().optional(),platform:Lt.string().optional(),runtime:Lt.string().optional(),date:Lt.string().optional(),model:Lt.string().optional(),provider:Lt.string().optional()});l(Yk,"detectRuntime");l(Xk,"normalizePlatform");l(Np,"buildEnvironmentBlock")});function Hp(r){let e=r.getAllocationFor("injection");return{...Ho,totalPrompt:e}}function An(r,e){let t=e*Gp;return r.length<=t?r:`${r.substring(0,t)}
467
- ... (truncated to ~${e} tokens)`}function Up(r){return Math.ceil(r.length/Gp)}function zp(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Qk[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 Ho,Gp,Qk,Uo,Wp=w(()=>{"use strict";Ho={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Hp,"budgetsFromCoordinator");Gp=4;l(An,"truncateToTokenBudget");l(Up,"estimateTokens");Qk={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(zp,"filterSkillsByDomains");Uo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Ho,...e}}addSection(e,t){let n=An(e,t),s=Up(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=An(n,o);return this.used+=Up(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 Bp from"node:fs/promises";import In from"node:path";var xc,Zk,Vp,Jp=w(()=>{"use strict";Ft();F();Fe();en();tc();Ap();_p();Lp();Wp();kc();Zn();xc=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 M(e)){let s=await Bp.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){C(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?Hp(this._coordinator):Ho}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=Ie(`global/modules/${e}`);if(t)return t;let n=In.join(xe,"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=Qn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=Ie(s);if(o){let i=In.basename(s,".md");t[i]=o}}}else{let s=In.join(xe,"templates","checklists");if(await M(s)){let o=(await Bp.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=In.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){C(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([_.read(e),fe.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(C(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 Xa.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){!C(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
468
- `);return An(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=In.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let P=await Mp();p=Fp(P,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
485
+ </env>`}var G$,Lp=w(()=>{"use strict";G$=Ut.object({projectName:Ut.string(),projectPath:Ut.string(),isGitRepo:Ut.boolean().default(!0),gitBranch:Ut.string().optional(),platform:Ut.string().optional(),runtime:Ut.string().optional(),date:Ut.string().optional(),model:Ut.string().optional(),provider:Ut.string().optional()});l(QS,"detectRuntime");l(ZS,"normalizePlatform");l(Np,"buildEnvironmentBlock")});function Hp(r){let e=r.getAllocationFor("injection");return{...Uo,totalPrompt:e}}function In(r,e){let t=e*Gp;return r.length<=t?r:`${r.substring(0,t)}
486
+ ... (truncated to ~${e} tokens)`}function Up(r){return Math.ceil(r.length/Gp)}function zp(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=eb[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 Uo,Gp,eb,Lo,Wp=w(()=>{"use strict";Uo={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Hp,"budgetsFromCoordinator");Gp=4;l(In,"truncateToTokenBudget");l(Up,"estimateTokens");eb={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(zp,"filterSkillsByDomains");Lo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Uo,...e}}addSection(e,t){let n=In(e,t),s=Up(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=In(n,o);return this.used+=Up(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 Bp from"node:fs/promises";import Dn from"node:path";var xc,tb,Vp,Jp=w(()=>{"use strict";_t();F();_e();tn();tc();Ap();_p();Lp();Wp();Sc();es();xc=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 M(e)){let s=await Bp.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){P(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?Hp(this._coordinator):Uo}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=De(`global/modules/${e}`);if(t)return t;let n=Dn.join(ve,"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=Zn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=De(s);if(o){let i=Dn.basename(s,".md");t[i]=o}}}else{let s=Dn.join(ve,"templates","checklists");if(await M(s)){let o=(await Bp.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Dn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(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([_.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(P(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await Xa.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!P(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
487
+ `);return In(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=Dn.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let C=await Mp();p=Fp(C,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
469
488
  `),s.role&&d.push(`Role: ${s.role}
470
489
  `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
471
490
  `),d.push(`
@@ -474,93 +493,93 @@ Apply specialized expertise. Read agent file for details if needed.
474
493
  `)),d.push(`TASK: ${e.frontmatter.description}
475
494
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
476
495
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
477
- `);let S=t.projectPath;if(S){let P=u?.project?.id?In.basename(S):In.basename(S),A=Np({projectName:P,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
478
- ${A}
479
- `)}if(u){let P=u.sealedAnalysis;if(d.push(`
496
+ `);let k=t.projectPath;if(k){let C=u?.project?.id?Dn.basename(k):Dn.basename(k),R=Np({projectName:C,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
497
+ ${R}
498
+ `)}if(u){let C=u.sealedAnalysis;if(d.push(`
480
499
  ## PROJECT ANALYSIS (Sealed)
481
500
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
482
501
  `),d.push(`**Primary Domain**: ${u.primaryDomain}
483
502
  `),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
484
- `),P){if(P.languages?.length>0&&d.push(`**Languages**: ${P.languages.join(", ")}
485
- `),P.frameworks?.length>0&&d.push(`**Frameworks**: ${P.frameworks.join(", ")}
486
- `),P.packageManager&&d.push(`**Package Manager**: ${P.packageManager}
487
- `),P.sourceDir&&d.push(`**Source Dir**: ${P.sourceDir}
488
- `),P.testDir&&d.push(`**Test Dir**: ${P.testDir}
489
- `),d.push(`**Files Analyzed**: ${P.fileCount}
490
- `),d.push(`**Analysis Status**: ${P.status}${P.commitHash?` (commit: ${P.commitHash.slice(0,8)})`:""}
491
- `),P.patterns?.length>0){d.push(`
503
+ `),C){if(C.languages?.length>0&&d.push(`**Languages**: ${C.languages.join(", ")}
504
+ `),C.frameworks?.length>0&&d.push(`**Frameworks**: ${C.frameworks.join(", ")}
505
+ `),C.packageManager&&d.push(`**Package Manager**: ${C.packageManager}
506
+ `),C.sourceDir&&d.push(`**Source Dir**: ${C.sourceDir}
507
+ `),C.testDir&&d.push(`**Test Dir**: ${C.testDir}
508
+ `),d.push(`**Files Analyzed**: ${C.fileCount}
509
+ `),d.push(`**Analysis Status**: ${C.status}${C.commitHash?` (commit: ${C.commitHash.slice(0,8)})`:""}
510
+ `),C.patterns?.length>0){d.push(`
492
511
  ### Code Patterns (Follow These)
493
- `);for(let A of P.patterns)d.push(`- **${A.name}**: ${A.description}${A.location?` (${A.location})`:""}
494
- `)}if(P.antiPatterns?.length>0){d.push(`
512
+ `);for(let R of C.patterns)d.push(`- **${R.name}**: ${R.description}${R.location?` (${R.location})`:""}
513
+ `)}if(C.antiPatterns?.length>0){d.push(`
495
514
  ### Anti-Patterns (Avoid These)
496
- `);for(let A of P.antiPatterns)d.push(`- **${A.issue}** in \`${A.file}\` \u2014 ${A.suggestion}
515
+ `);for(let R of C.antiPatterns)d.push(`- **${R.issue}** in \`${R.file}\` \u2014 ${R.suggestion}
497
516
  `)}}d.push(`
498
- `)}let b=p.patterns,I=n?.codePatterns||"";if(b&&I&&I.trim()){let P=this.extractPatternSummary(I);P&&(d.push(`## CODE PATTERNS
499
- `),d.push(P),d.push(`
517
+ `)}let S=p.patterns,I=n?.codePatterns||"";if(S&&I&&I.trim()){let C=this.extractPatternSummary(I);C&&(d.push(`## CODE PATTERNS
518
+ `),d.push(C),d.push(`
500
519
  Full patterns: Read analysis/patterns.md
501
- `))}let R=n?.analysis||"";if(b&&R&&R.trim()){let P=R.match(/Stack[:\s]+([^\n]+)/i)||R.match(/Technology[:\s]+([^\n]+)/i),A=P?P[1].trim():"detected";d.push(`
520
+ `))}let D=n?.analysis||"";if(S&&D&&D.trim()){let C=D.match(/Stack[:\s]+([^\n]+)/i)||D.match(/Technology[:\s]+([^\n]+)/i),R=C?C[1].trim():"detected";d.push(`
502
521
  ## STACK
503
- Stack: ${A}
522
+ Stack: ${R}
504
523
  `),I||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
505
524
  `)}if(u){if(u.agents.length>0){d.push(`
506
525
  ### LOADED AGENTS (Project-Specific Specialists)
507
526
 
508
- `);for(let A of u.agents){d.push(`#### Agent: ${A.name} (${A.domain})
509
- `),A.effort&&d.push(`Effort: ${A.effort}
510
- `),A.model&&d.push(`Model: ${A.model}
511
- `),A.skills.length>0&&d.push(`Skills: ${A.skills.join(", ")}
512
- `);let ke=An(A.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
513
- ${ke}
527
+ `);for(let R of u.agents){d.push(`#### Agent: ${R.name} (${R.domain})
528
+ `),R.effort&&d.push(`Effort: ${R.effort}
529
+ `),R.model&&d.push(`Model: ${R.model}
530
+ `),R.skills.length>0&&d.push(`Skills: ${R.skills.join(", ")}
531
+ `);let be=In(R.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
532
+ ${be}
514
533
  \`\`\`
515
534
 
516
- `)}}let P=zp(u.skills,u.detectedDomains);if(P.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
535
+ `)}}let C=zp(u.skills,u.detectedDomains);if(C.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
517
536
 
518
- `);for(let A of P){d.push(`#### Skill: ${A.name}
519
- `);let ke=An(A.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
520
- ${ke}
537
+ `);for(let R of C){d.push(`#### Skill: ${R.name}
538
+ `);let be=In(R.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
539
+ ${be}
521
540
  \`\`\`
522
541
 
523
- `)}}}let V=this.getModulesForCommand(m,p);if(V.length>0)for(let P of V){let A=await this.loadModule(P);A&&(d.push(`
524
- `),d.push(A))}if(c?.isPlanning&&(d.push(`
542
+ `)}}}let V=this.getModulesForCommand(m,p);if(V.length>0)for(let C of V){let R=await this.loadModule(C);R&&(d.push(`
543
+ `),d.push(R))}if(c?.isPlanning&&(d.push(`
525
544
  ## PLAN MODE
526
545
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
527
546
  `),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
528
547
  `)),c?.requiresApproval&&d.push(`
529
548
  ## APPROVAL REQUIRED
530
549
  Show changes, list affected files, ask for confirmation.
531
- `),S){let P=u?.sealedAnalysis,A=[...P?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],ke={projectPath:S,language:u?.project?.ecosystem,framework:P?.frameworks?.[0],techStack:Lo(A),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Un=>Un.name)||[],analysisLanguages:P?.languages||[],analysisFrameworks:P?.frameworks||[],analysisPackageManager:P?.packageManager};d.push(`
532
- ${Ep(ke)}
533
- `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let P=u.contextDegradation;d.push(`
550
+ `),k){let C=u?.sealedAnalysis,R=[...C?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],be={projectPath:k,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:No(R),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Hn=>Hn.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};d.push(`
551
+ ${Ep(be)}
552
+ `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let C=u.contextDegradation;d.push(`
534
553
  ### CONTEXT DEGRADATION NOTICE
535
554
 
536
- `),d.push(`**Level**: ${P.level}
537
- `),d.push(`**Unavailable**: ${P.failedTools.join(", ")}
555
+ `),d.push(`**Level**: ${C.level}
556
+ `),d.push(`**Unavailable**: ${C.failedTools.join(", ")}
538
557
  `),d.push(`Some context tools failed. Explore the codebase manually for missing context.
539
558
 
540
- `)}if(u?.realContext){let P=u.realContext;if(d.push(`
559
+ `)}if(u?.realContext){let C=u.realContext;if(d.push(`
541
560
  ### CODEBASE CONTEXT
542
561
 
543
- `),d.push(`**Git State**: Branch \`${P.gitBranch}\` | ${P.gitStatus}
562
+ `),d.push(`**Git State**: Branch \`${C.gitBranch}\` | ${C.gitStatus}
544
563
 
545
- `),P.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
564
+ `),C.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
546
565
  `),d.push(`| Score | File | Why |
547
566
  `),d.push(`|-------|------|-----|
548
- `);for(let A of P.relevantFiles.slice(0,8))d.push(`| ${A.score} | ${A.path} | ${A.reason} |
567
+ `);for(let R of C.relevantFiles.slice(0,8))d.push(`| ${R.score} | ${R.path} | ${R.reason} |
549
568
  `);d.push(`
550
- `)}if(P.signatures.length>0){d.push(`**Code Signatures** (top files):
551
- `);for(let A of P.signatures)d.push(`\`\`\`typescript
552
- // ${A.path}
553
- ${A.content}
569
+ `)}if(C.signatures.length>0){d.push(`**Code Signatures** (top files):
570
+ `);for(let R of C.signatures)d.push(`\`\`\`typescript
571
+ // ${R.path}
572
+ ${R.content}
554
573
  \`\`\`
555
574
  `);d.push(`
556
- `)}if(P.recentFiles.length>0){d.push("**Recently Changed**: ");let A=P.recentFiles.slice(0,5).map(ke=>`${ke.path} (${ke.lastChanged})`).join(", ");d.push(`${A}
575
+ `)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let R=C.recentFiles.slice(0,5).map(be=>`${be.path} (${be.lastChanged})`).join(", ");d.push(`${R}
557
576
 
558
- `)}}let me=t.files||[];if(me.length>0){let P=me.slice(0,5).join(", ");d.push(`
559
- ## FILES: ${me.length} available. Top: ${P}
577
+ `)}}let me=t.files||[];if(me.length>0){let C=me.slice(0,5).join(", ");d.push(`
578
+ ## FILES: ${me.length} available. Top: ${C}
560
579
  `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
561
580
 
562
- `)}else S&&d.push(`
563
- ## PROJECT: ${S}
581
+ `)}else k&&d.push(`
582
+ ## PROJECT: ${k}
564
583
  Read files before modifying.
565
584
 
566
585
  `);let Se=this.filterRelevantState(n);if(Se&&(d.push(`
@@ -571,20 +590,20 @@ Read files before modifying.
571
590
 
572
591
  `),d.push(u.velocityContext),d.push(`
573
592
 
574
- `)),o&&Object.keys(o).some(P=>o[P])){d.push(`
593
+ `)),o&&Object.keys(o).some(C=>o[C])){d.push(`
575
594
  ## PROJECT DEFAULTS (apply automatically)
576
- `);for(let[P,A]of Object.entries(o))A&&d.push(`- ${P}: ${A}
595
+ `);for(let[C,R]of Object.entries(o))R&&d.push(`- ${C}: ${R}
577
596
  `)}if(i?.plan&&i.plan.length>0){if(d.push(`
578
597
  ## THINK FIRST (reasoning from analysis)
579
598
  `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
580
- `);for(let P of i.conclusions)d.push(` \u2192 ${P}
599
+ `);for(let C of i.conclusions)d.push(` \u2192 ${C}
581
600
  `)}d.push(`Plan:
582
- `);for(let P=0;P<i.plan.length;P++)d.push(` ${P+1}. ${i.plan[P]}
601
+ `);for(let C=0;C<i.plan.length;C++)d.push(` ${C+1}. ${i.plan[C]}
583
602
  `);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
584
603
  `)}if(a&&a.length>0){d.push(`
585
604
  ## CONTEXT (apply these)
586
- `);for(let P of a)d.push(`- **${P.title}**: ${P.content}
587
- `),P.tags&&P.tags.length>0&&d.push(` Tags: ${P.tags.join(", ")}
605
+ `);for(let C of a)d.push(`- **${C.title}**: ${C.content}
606
+ `),C.tags&&C.tags.length>0&&d.push(` Tags: ${C.tags.join(", ")}
588
607
  `)}if(d.push(`
589
608
  ---
590
609
  `),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
@@ -592,34 +611,34 @@ Read files before modifying.
592
611
 
593
612
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
594
613
  `),d.push(`|---|--------|-------------|--------|
595
- `);for(let A of u.subtasks){let ke=A.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":A.status==="completed"?"\u2705 Done":A.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${A.order} | ${A.domain} | ${A.description} | ${ke} |
596
- `)}let P=u.subtasks.find(A=>A.status==="in_progress");if(P&&(d.push(`
597
- **FOCUS ON SUBTASK #${P.order}**: ${P.description}
598
- `),d.push(`Agent: ${P.agent} | Domain: ${P.domain}
599
- `),P.dependsOn.length>0&&d.push(`Dependencies: ${P.dependsOn.join(", ")}
600
- `),P.handoff)){let A=P.handoff;d.push(`
614
+ `);for(let R of u.subtasks){let be=R.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":R.status==="completed"?"\u2705 Done":R.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${R.order} | ${R.domain} | ${R.description} | ${be} |
615
+ `)}let C=u.subtasks.find(R=>R.status==="in_progress");if(C&&(d.push(`
616
+ **FOCUS ON SUBTASK #${C.order}**: ${C.description}
617
+ `),d.push(`Agent: ${C.agent} | Domain: ${C.domain}
618
+ `),C.dependsOn.length>0&&d.push(`Dependencies: ${C.dependsOn.join(", ")}
619
+ `),C.handoff)){let R=C.handoff;d.push(`
601
620
  ### Previous Subtask Handoff
602
621
 
603
- `),d.push(`**From:** ${A.fromSubtask}
622
+ `),d.push(`**From:** ${R.fromSubtask}
604
623
 
605
624
  `),d.push(`**What was done:**
606
- `);for(let ke of A.whatWasDone)d.push(`- ${ke}
607
- `);if(A.filesChanged.length>0){d.push(`
625
+ `);for(let be of R.whatWasDone)d.push(`- ${be}
626
+ `);if(R.filesChanged.length>0){d.push(`
608
627
  **Files changed:**
609
- `);for(let ke of A.filesChanged)d.push(`- \`${ke.path}\` (${ke.action})
628
+ `);for(let be of R.filesChanged)d.push(`- \`${be.path}\` (${be.action})
610
629
  `)}d.push(`
611
630
  **Context for this subtask:**
612
- ${A.outputForNextAgent}
631
+ ${R.outputForNextAgent}
613
632
  `)}d.push(`
614
- `)}let Ge=this.getSchemaTypeForCommand(m);if(Ge){let{renderSchemaForPrompt:P}=await Promise.resolve().then(()=>(Mr(),fu)),A=P(Ge);A&&d.push(`
615
- ${A}
616
- `)}if(p.checklist){let P=await this.loadChecklistRouting(),A=await this.loadChecklists();P&&Object.keys(A).length>0&&(d.push(`
633
+ `)}let Ge=this.getSchemaTypeForCommand(m);if(Ge){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>($r(),gu)),R=C(Ge);R&&d.push(`
634
+ ${R}
635
+ `)}if(p.checklist){let C=await this.loadChecklistRouting(),R=await this.loadChecklists();C&&Object.keys(R).length>0&&(d.push(`
617
636
  ## QUALITY CHECKLISTS
618
637
  `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
619
- `),d.push(`Available: ${Object.keys(A).join(", ")}
638
+ `),d.push(`Available: ${Object.keys(R).join(", ")}
620
639
  `),d.push(`Path: templates/checklists/{name}.md
621
640
  `),d.push(`Use Read tool to load checklists you determine are relevant.
622
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Uo({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}
641
+ `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Lo({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}
623
642
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
624
643
 
625
644
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -636,7 +655,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
636
655
  `);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
637
656
  Avoid:
638
657
  ${a}`)}let o=t.join(`
639
- `);return An(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
658
+ `);return In(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
640
659
  ## RULES (CRITICAL)
641
660
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
642
661
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -653,7 +672,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
653
672
  - Prefer structured output (JSON) over free text when applicable.
654
673
 
655
674
  EXECUTE: Follow flow. Use tools. Decide.
656
- `}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}}}},Zk=new xc,Vp=Zk});import qp from"node:fs/promises";import gt from"node:path";var eb,tb,vc,Tc,Go,Ec=w(()=>{"use strict";ot();ce();F();eb=["task","done","ship","resume","bug","enrich"],tb=["init","sync","pause","next","dash","history","undo","redo"],vc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return gt.dirname(Is.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=v.getGlobalProjectPath(s),a=await(Ke(),pt(st)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=gt.join(u,"templates")}catch{c=gt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await v.getAgentSettingsPath(),paths:{orchestrator:gt.join(c,"agentic","orchestrator.md"),agentRouting:gt.join(c,"agentic","agent-routing.md"),taskFragmentation:gt.join(c,"agentic","task-fragmentation.md"),commandTemplate:gt.join(c,"commands",`${e}.md`),repoAnalysis:gt.join(o,"analysis","repo-analysis.json"),agentsDir:gt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:gt.join(o,"storage","state.json")}}}requiresOrchestration(e){return eb.includes(e)?!0:!tb.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=gt.join(v.getGlobalProjectPath(t),"agents");return(await qp.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return C(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=gt.join(v.getGlobalProjectPath(t),"agents");return(await qp.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
675
+ `}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}}}},tb=new xc,Vp=tb});import qp from"node:fs/promises";import yt from"node:path";var nb,sb,vc,Tc,Ho,Ec=w(()=>{"use strict";ct();le();F();nb=["task","done","ship","resume","bug","enrich"],sb=["init","sync","pause","next","dash","history","undo","redo"],vc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return yt.dirname(Is.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=v.getGlobalProjectPath(s),a=await(Xe(),gt(it)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=yt.join(u,"templates")}catch{c=yt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await v.getAgentSettingsPath(),paths:{orchestrator:yt.join(c,"agentic","orchestrator.md"),agentRouting:yt.join(c,"agentic","agent-routing.md"),taskFragmentation:yt.join(c,"agentic","task-fragmentation.md"),commandTemplate:yt.join(c,"commands",`${e}.md`),repoAnalysis:yt.join(o,"analysis","repo-analysis.json"),agentsDir:yt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:yt.join(o,"storage","state.json")}}}requiresOrchestration(e){return nb.includes(e)?!0:!sb.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=yt.join(v.getGlobalProjectPath(t),"agents");return(await qp.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=yt.join(v.getGlobalProjectPath(t),"agents");return(await qp.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
657
676
  ## Agentic Execution Mode
658
677
 
659
678
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -736,13 +755,13 @@ When fragmenting tasks:
736
755
  2. Track progress: currentSubtaskIndex, subtaskProgress
737
756
  3. Each completed subtask generates a summary
738
757
  4. Pass summary to next agent for context handoff
739
- `,context:e,requiresOrchestration:t}}},Tc=new vc,Go=Tc});import{exec as nb}from"node:child_process";import Kp from"node:fs/promises";import{promisify as sb}from"node:util";var rb,Dn,Oe,Ac=w(()=>{"use strict";qr();rb=sb(nb),Dn={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())}};Dn.register("Read",async r=>{try{return await Ws.execute(async()=>await Kp.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Jr(e)||zs(e),null}});Dn.register("Write",async(r,e)=>{try{return await Ws.execute(async()=>await Kp.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Jr(t)||zs(t),!1}});Dn.register("Bash",async r=>{try{return await Ws.execute(async()=>await rb(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Dn.register("GetTimestamp",async()=>new Date().toISOString());Dn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Dn.register("GetDateTime",async()=>new Date().toISOString());Oe=Dn});import Ic from"node:fs/promises";import ob from"node:os";import Yp from"node:path";async function ib(r){try{let e=Yp.dirname(zo);await M(e)||await Ic.mkdir(e,{recursive:!0}),await Ic.writeFile(zo,`/p:${r}`)}catch{}}async function ab(){try{await M(zo)&&await Ic.unlink(zo)}catch{}}var zo,Dc,cb,Wo,jc=w(()=>{"use strict";F();Nd();Fe();Hd();zd();rc();np();sp();Jn();wc();Tp();Jp();Ec();Zn();Ac();zo=Yp.join(ob.homedir(),".prjct-cli",".running");l(ib,"signalStart");l(ab,"signalEnd");Dc=class{static{l(this,"CommandExecutor")}async signalStart(e){await ib(e)}async signalEnd(){await ab()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(cs.shouldEscalate(e,s)){let o=cs.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await oa.load(e),i=await Ze.build(n,t),a=ve.requiresPlanning(e),c=ve.isDestructive(e),u=ve.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=ve.startPlanning(i.projectId,e,t):u&&(d=ve.getActivePlan(i.projectId));let m=null;if($o.requiresVerification(e)){let P=await Ze.loadStateForCommand(i,e);m=await $o.verify(e,i,P),!m.verified&&m.warnings.length>0&&console.log($o.formatWarnings(m))}let p=null;if(Ro.requiresReasoning(e)){let P=await Ze.loadStateForCommand(i,e);p=await Ro.reason(e,i,P),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ro.formatPlan(p)))}let g=t.task||t.description||"",f=await Go.buildContext(e,g,n),S=Go.buildAgenticPrompt(f),b=null;if(Go.requiresOrchestration(e)&&g)try{b=await _o.execute(e,g,n),b.detectedDomains.length>0&&jo.orchestrate(b.detectedDomains);for(let P of b.agents){let A=P.domain||P.name.replace(".md","");jo.startAgent(P.name,A,`Loading ${A} specialist...`),jo.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let P=b.subtasks.map(A=>({id:A.id,domain:A.domain,description:A.description,status:A.status}));Ud(P)}}catch(P){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(P)}`)}let I={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},R=await Ze.loadState(i),V=null,me=null;i.projectId&&(V={commit_footer:await ge.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await ge.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await ge.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await ge.getSmartDecision(i.projectId,`preferred_agent_${e}`)},me=await ge.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Se={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:ve.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Ge=await Vp.build(o,I,R,null,V,null,me,Se,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),cs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:R,prompt:Ge,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:S.prompt,requiresOrchestration:S.requiresOrchestration,agentsPath:I.agentsPath,agentRoutingPath:I.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:V,relevantMemories:me,orchestratorContext:b,memory:{create:l(P=>ge.createMemory(i.projectId,P),"create"),autoRemember:l((P,A,ke)=>ge.autoRemember(i.projectId,P,A,ke),"autoRemember"),search:l(P=>ge.searchMemories(i.projectId,P),"search"),findByTags:l(P=>ge.findByTags(i.projectId,P),"findByTags"),getStats:l(()=>ge.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(P=>ve.recordGatheredInfo(i.projectId,P),"recordInfo"),setAnalysis:l(P=>ve.setAnalysis(i.projectId,P),"setAnalysis"),propose:l(P=>ve.proposePlan(i.projectId,P),"propose"),approve:l(P=>ve.approvePlan(i.projectId,P),"approve"),reject:l(P=>ve.rejectPlan(i.projectId,P),"reject"),getApprovalPrompt:l(()=>ve.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>ve.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>ve.getNextStep(i.projectId),"getNextStep"),completeStep:l(P=>ve.completeStep(i.projectId,P),"completeStep"),failStep:l(P=>ve.failStep(i.projectId,P),"failStep"),abort:l(P=>ve.abortPlan(i.projectId,P),"abort"),getStatus:l(()=>ve.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>ve.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=cs.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=cs.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(!Oe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Oe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await oa.load(e)).frontmatter["allowed-tools"]||[],i=await Ze.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:y(s)}}}},cb=new Dc,Wo=cb});import Bo from"node:fs/promises";import lb from"node:https";import ub from"node:os";import Rc from"node:path";import It from"chalk";var $c,Xp,Qp=w(()=>{"use strict";F();Fe();$c=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rc.join(ub.homedir(),".prjct-cli","config"),this.cacheFile=Rc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rc.join(__dirname,"..","..","package.json");return JSON.parse(await Bo.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=lb.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 M(this.cacheFile))return JSON.parse(await Bo.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await M(this.cacheDir)||await Bo.mkdir(this.cacheDir,{recursive:!0}),await Bo.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:`
740
- `+It.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")+`
741
- `+It.yellow("\u2502")+" "+It.bold("Update available!")+" "+It.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+It.yellow("\u2502")+`
742
- `+It.yellow("\u2502")+" "+It.yellow("\u2502")+`
743
- `+It.yellow("\u2502")+" Run: "+It.cyan("npm update -g prjct-cli")+" "+It.yellow("\u2502")+`
744
- `+It.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")+`
745
- `}},Xp=$c});var de,Be=w(()=>{"use strict";jc();rc();Ac();ot();ce();Qp();cn();ne();Fe();bn();de=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Xp,this.updateNotificationShown=!1,this.commandExecutor=Wo}get agent(){return ts.getAgent()}get agentInfo(){return ts.getInfo()}get currentAuthor(){return an.getCurrentAuthor()}async initializeAgent(){return ts.initialize()}async ensureProjectInit(e){return an.ensureInit(e)}async ensureAuthor(){return an.ensureAuthor()}async getGlobalProjectPath(e){return an.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return Ye.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return an.isEmptyDirectory(e)}async _detectExistingCode(e){return an.hasExistingCode(e)}_breakdownFeatureTasks(e){return no.breakdownFeature(e)}_detectBugSeverity(e){return no.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ts.assignForTask(e,t,n)}}});var Zp={};Hn(Zp,{PlanningCommands:()=>Rn});import jn from"node:path";async function db(){if(!Mc){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Jo(),em));Mc=new r}return Mc}var Mc,Rn,Vo=w(()=>{"use strict";Yr();yn();bt();Ft();F();os();is();tc();Be();Mc=null;l(db,"getAnalysisCommands");Rn=class extends de{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 $.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 as(t).runNonInteractive());else if(a=await new as(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await es(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await v.ensureProjectStructure(m);let p=v.getGlobalProjectPath(m),g={"core/now.md":`# NOW
758
+ `,context:e,requiresOrchestration:t}}},Tc=new vc,Ho=Tc});import{exec as rb}from"node:child_process";import Kp from"node:fs/promises";import{promisify as ob}from"node:util";var ib,Rn,Fe,Ac=w(()=>{"use strict";Jr();ib=ob(rb),Rn={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())}};Rn.register("Read",async r=>{try{return await Ws.execute(async()=>await Kp.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Vr(e)||zs(e),null}});Rn.register("Write",async(r,e)=>{try{return await Ws.execute(async()=>await Kp.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Vr(t)||zs(t),!1}});Rn.register("Bash",async r=>{try{return await Ws.execute(async()=>await ib(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Rn.register("GetTimestamp",async()=>new Date().toISOString());Rn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Rn.register("GetDateTime",async()=>new Date().toISOString());Fe=Rn});import Ic from"node:fs/promises";import ab from"node:os";import Yp from"node:path";async function cb(r){try{let e=Yp.dirname(Go);await M(e)||await Ic.mkdir(e,{recursive:!0}),await Ic.writeFile(Go,`/p:${r}`)}catch{}}async function lb(){try{await M(Go)&&await Ic.unlink(Go)}catch{}}var Go,Dc,ub,zo,Rc=w(()=>{"use strict";F();Nd();_e();Hd();zd();rc();np();sp();qn();wc();Tp();Jp();Ec();es();Ac();Go=Yp.join(ab.homedir(),".prjct-cli",".running");l(cb,"signalStart");l(lb,"signalEnd");Dc=class{static{l(this,"CommandExecutor")}async signalStart(e){await cb(e)}async signalEnd(){await lb()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(ls.shouldEscalate(e,s)){let o=ls.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await ra.load(e),i=await nt.build(n,t),a=Te.requiresPlanning(e),c=Te.isDestructive(e),u=Te.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Te.startPlanning(i.projectId,e,t):u&&(d=Te.getActivePlan(i.projectId));let m=null;if(jo.requiresVerification(e)){let C=await nt.loadStateForCommand(i,e);m=await jo.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(jo.formatWarnings(m))}let p=null;if(Ro.requiresReasoning(e)){let C=await nt.loadStateForCommand(i,e);p=await Ro.reason(e,i,C),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ro.formatPlan(p)))}let g=t.task||t.description||"",f=await Ho.buildContext(e,g,n),k=Ho.buildAgenticPrompt(f),S=null;if(Ho.requiresOrchestration(e)&&g)try{S=await Fo.execute(e,g,n),S.detectedDomains.length>0&&Do.orchestrate(S.detectedDomains);for(let C of S.agents){let R=C.domain||C.name.replace(".md","");Do.startAgent(C.name,R,`Loading ${R} specialist...`),Do.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let C=S.subtasks.map(R=>({id:R.id,domain:R.domain,description:R.description,status:R.status}));Ud(C)}}catch(C){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(C)}`)}let I={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},D=await nt.loadState(i),V=null,me=null;i.projectId&&(V={commit_footer:await xe.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await xe.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await xe.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await xe.getSmartDecision(i.projectId,`preferred_agent_${e}`)},me=await xe.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Se={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Te.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Ge=await Vp.build(o,I,D,null,V,null,me,Se,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),ls.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:D,prompt:Ge,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:I.agentsPath,agentRoutingPath:I.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:V,relevantMemories:me,orchestratorContext:S,memory:{create:l(C=>xe.createMemory(i.projectId,C),"create"),autoRemember:l((C,R,be)=>xe.autoRemember(i.projectId,C,R,be),"autoRemember"),search:l(C=>xe.searchMemories(i.projectId,C),"search"),findByTags:l(C=>xe.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>xe.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>Te.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>Te.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>Te.proposePlan(i.projectId,C),"propose"),approve:l(C=>Te.approvePlan(i.projectId,C),"approve"),reject:l(C=>Te.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>Te.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Te.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Te.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>Te.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>Te.failStep(i.projectId,C),"failStep"),abort:l(C=>Te.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>Te.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Te.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=ls.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=ls.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(!Fe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Fe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await ra.load(e)).frontmatter["allowed-tools"]||[],i=await nt.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:y(s)}}}},ub=new Dc,zo=ub});import Wo from"node:fs/promises";import db from"node:https";import pb from"node:os";import jc from"node:path";import Rt from"chalk";var $c,Xp,Qp=w(()=>{"use strict";F();_e();$c=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=jc.join(pb.homedir(),".prjct-cli","config"),this.cacheFile=jc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=jc.join(__dirname,"..","..","package.json");return JSON.parse(await Wo.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=db.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 M(this.cacheFile))return JSON.parse(await Wo.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await M(this.cacheDir)||await Wo.mkdir(this.cacheDir,{recursive:!0}),await Wo.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:`
759
+ `+Rt.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")+`
760
+ `+Rt.yellow("\u2502")+" "+Rt.bold("Update available!")+" "+Rt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Rt.yellow("\u2502")+`
761
+ `+Rt.yellow("\u2502")+" "+Rt.yellow("\u2502")+`
762
+ `+Rt.yellow("\u2502")+" Run: "+Rt.cyan("npm update -g prjct-cli")+" "+Rt.yellow("\u2502")+`
763
+ `+Rt.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")+`
764
+ `}},Xp=$c});var de,Be=w(()=>{"use strict";Rc();rc();Ac();ct();le();Qp();ln();se();_e();Cn();de=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Xp,this.updateNotificationShown=!1,this.commandExecutor=zo}get agent(){return ns.getAgent()}get agentInfo(){return ns.getInfo()}get currentAuthor(){return cn.getCurrentAuthor()}async initializeAgent(){return ns.initialize()}async ensureProjectInit(e){return cn.ensureInit(e)}async ensureAuthor(){return cn.ensureAuthor()}async getGlobalProjectPath(e){return cn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return Qe.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return cn.isEmptyDirectory(e)}async _detectExistingCode(e){return cn.hasExistingCode(e)}_breakdownFeatureTasks(e){return to.breakdownFeature(e)}_detectBugSeverity(e){return to.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ns.assignForTask(e,t,n)}}});var Zp={};Gn(Zp,{PlanningCommands:()=>$n});import jn from"node:path";async function mb(){if(!Mc){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Vo(),em));Mc=new r}return Mc}var Mc,$n,Bo=w(()=>{"use strict";Kr();wn();xt();_t();F();is();as();tc();Be();Mc=null;l(mb,"getAnalysisCommands");$n=class extends de{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 $.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 cs(t).runNonInteractive());else if(a=await new cs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await ts(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await v.ensureProjectStructure(m);let p=v.getGlobalProjectPath(m),g={"core/now.md":`# NOW
746
765
 
747
766
  No current task. Use \`/p:now\` to set focus.
748
767
  `,"core/next.md":`# NEXT
@@ -762,17 +781,17 @@ No current task. Use \`/p:now\` to set focus.
762
781
  `,"planning/roadmap.md":`# ROADMAP
763
782
 
764
783
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
765
- `,"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[I,R]of Object.entries(g))await Oe.get("Write")(jn.join(p,I),R);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let I=await db();if((await I.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await I.sync(t,{aiTools:a.agents}):await I.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!S){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let I=jn.join(p,"planning","architect-session.md"),R=`# Architect Session
784
+ `,"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[I,D]of Object.entries(g))await Fe.get("Write")(jn.join(p,I),D);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let I=await mb();if((await I.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await I.sync(t,{aiTools:a.agents}):await I.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let S=n.idea;if(f&&!k){if(!S)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 I=jn.join(p,"planning","architect-session.md"),D=`# Architect Session
766
785
 
767
786
  ## Idea
768
- ${b}
787
+ ${S}
769
788
 
770
789
  ## Status
771
790
  Initialized - awaiting stack recommendation
772
791
 
773
792
  Generated: ${new Date().toLocaleString()}
774
- `;return await Oe.get("Write")(I,R),await We.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await We.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 $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await Ze.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 fe.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:L.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await Ze.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await fe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:L.getTimestamp()}),n.md?console.log(ie(Le("Bug Reported",e),mt({Severity:a,Priority:m,Agent:u}),Me([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),ut("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
775
- `);let s=await this.getGlobalProjectPath(t),o=jn.join(s,"planning","architect-session.md"),i;try{i=await se.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
793
+ `;return await Fe.get("Write")(I,D),await We.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await We.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 $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await nt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ie(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await 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:U.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await nt.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await ge.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:U.getTimestamp()}),n.md?console.log(X(je("Bug Reported",e),ht({Severity:a,Priority:m,Agent:u}),fe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),pt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
794
+ `);let s=await this.getGlobalProjectPath(t),o=jn.join(s,"planning","architect-session.md"),i;try{i=await re.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
776
795
 
777
796
  Create a plan first:
778
797
  1. Run /p:init in an empty directory
@@ -793,7 +812,7 @@ The architect plan is ready. Claude will now:
793
812
  4. Create starter files with boilerplate
794
813
  `),console.log(`
795
814
  \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.
796
- `),await this.logToMemory(t,"architect_executed",{timestamp:L.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=v.getGlobalProjectPath(o),u=jn.join(c,"planning","architect-session.md"),d=`# Architect Session
815
+ `),await this.logToMemory(t,"architect_executed",{timestamp:U.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=v.getGlobalProjectPath(o),u=jn.join(c,"planning","architect-session.md"),d=`# Architect Session
797
816
 
798
817
  ## Idea
799
818
  ${e}
@@ -808,14 +827,14 @@ Initialized - awaiting architecture design
808
827
  4. Generate roadmap
809
828
 
810
829
  Generated: ${new Date().toLocaleString()}
811
- `;return await Oe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:L.getTimestamp()}),n.md?console.log(ie(Le("Idea Captured",e),mt({Mode:"architecture"}),Me([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
830
+ `;return await Fe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(X(je("Idea Captured",e),ht({Mode:"architecture"}),fe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
812
831
  \u{1F4A1} Use /p:architect execute to continue planning
813
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ne.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:L.getTimestamp()}),n.md?console.log(ie(Le("Idea Captured",e),mt({Mode:"capture"}),Me([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),ut("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=v.getGlobalProjectPath(s),m=jn.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(S=>S.endsWith(".md")&&S!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
832
+ `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Le.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(X(je("Idea Captured",e),ht({Mode:"capture"}),fe([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),pt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=v.getGlobalProjectPath(s),m=jn.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
814
833
  \u{1F4A1} Create one with /p:spec "feature name"
815
834
  `),{success:!0,specs:[]}):(console.log(`
816
835
  \u{1F4CB} SPECIFICATIONS
817
- `),console.log("\u2550".repeat(50)),f.forEach((S,b)=>{let I=S.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${I}`)}),console.log(`${"\u2550".repeat(50)}
818
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=v.getGlobalProjectPath(s),i=jn.join(o,"planning","specs");await se.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=jn.join(i,`${a}.md`),u=`# Specification: ${e}
836
+ `),console.log("\u2550".repeat(50)),f.forEach((k,S)=>{let I=k.replace(".md","").replace(/-/g," ");console.log(` ${S+1}. ${I}`)}),console.log(`${"\u2550".repeat(50)}
837
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=v.getGlobalProjectPath(s),i=jn.join(o,"planning","specs");await re.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=jn.join(i,`${a}.md`),u=`# Specification: ${e}
819
838
 
820
839
  ## Overview
821
840
  [Brief description of the feature]
@@ -845,41 +864,41 @@ Generated: ${new Date().toLocaleString()}
845
864
  ---
846
865
  Created: ${new Date().toLocaleString()}
847
866
  Status: Draft
848
- `;return await Oe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:L.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
867
+ `;return await Fe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:U.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
849
868
  \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
850
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var qo,an,tm=w(()=>{"use strict";zt();Yr();ot();ce();F();Fe();bn();qo=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Vo(),Zp)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw Nr.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await v.ensureProjectStructure(t),v.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await es();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await Bn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return C(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Bn(e)).some(s=>t.includes(s))}catch(t){return C(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},an=new qo});var pb,nm,sm,Oc,rm,om=w(()=>{"use strict";le();ne();pb=1800*1e3,nm=50,sm=200,Oc=class{static{l(this,"SessionTracker")}async read(e){try{return D.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){D.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:pb}}}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>nm&&(s.current.commands=s.current.commands.slice(-nm)),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>sm&&(s.current.files=s.current.files.slice(-sm)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Gt(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Gt(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},rm=new Oc});import{exec as mb}from"node:child_process";import{promisify as gb}from"node:util";var Fc,fb,Ko,cr,im=w(()=>{"use strict";le();F();om();Fc=gb(mb),fb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Ko=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...fb,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=D.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Fc("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([Fc(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Fc(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
869
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var Jo,cn,tm=w(()=>{"use strict";Wt();Kr();ct();le();F();_e();Cn();Jo=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Bo(),Zp)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw _r.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await v.ensureProjectStructure(t),v.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ts();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 Vn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return P(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 Vn(e)).some(s=>t.includes(s))}catch(t){return P(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},cn=new Jo});var gb,nm,sm,Oc,rm,om=w(()=>{"use strict";ae();se();gb=1800*1e3,nm=50,sm=200,Oc=class{static{l(this,"SessionTracker")}async read(e){try{return A.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){A.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:gb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>nm&&(s.current.commands=s.current.commands.slice(-nm)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>sm&&(s.current.files=s.current.files.slice(-sm)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:zt(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:zt(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},rm=new Oc});import{exec as fb}from"node:child_process";import{promisify as hb}from"node:util";var Fc,yb,qo,cr,im=w(()=>{"use strict";ae();F();om();Fc=hb(fb),yb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},qo=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...yb,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=A.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Fc("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([Fc(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Fc(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
851
870
  `).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${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(`
852
871
  `)}async getSessionInfo(e){return rm.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
853
872
  `);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(`
854
- `)}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}},cr=l((r,e)=>new Ko(r,e),"createStalenessChecker")});import am from"node:fs/promises";import Yo from"node:path";function lr(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 Sb(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...lr(p));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lr(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lr(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...lr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...lr(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!yb.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function cm(r,e){let t=[],n=await am.readdir(r,{withFileTypes:!0});for(let s of n){if(wb.has(s.name))continue;let o=Yo.join(r,s.name);if(s.isDirectory())t.push(...await cm(o,e));else if(s.isFile()){let i=Yo.extname(s.name).toLowerCase();hb.has(i)&&t.push(Yo.relative(e,o))}}return t}async function kb(r){let e=await cm(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await am.readFile(Yo.join(r,d),"utf-8"),p=Sb(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Pb(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]))};G.setDoc(r,bb,t)}async function lm(r,e){let t=await kb(r);return Pb(e,t),t}var hb,yb,wb,bb,um=w(()=>{"use strict";le();hb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),yb=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"]),wb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(lr,"splitIdentifier");l(Sb,"tokenizeFile");l(cm,"listFiles");l(kb,"buildIndex");bb="bm25-index";l(Pb,"saveIndex");l(lm,"indexProject")});import _c from"node:fs/promises";import Wt from"node:path";function Eb(r){let e=[],t,n=new RegExp(Tb.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Ab(r,e,t){let n;if(r.startsWith("@/"))n=Wt.join(t,"src",r.slice(2));else{let s=Wt.dirname(Wt.join(t,e));n=Wt.resolve(s,r)}for(let s of vb){let o=n+s;try{if((await _c.stat(o)).isFile())return Wt.relative(t,o)}catch{}}return null}async function dm(r,e){let t=[],n=await _c.readdir(r,{withFileTypes:!0});for(let s of n){if(xb.has(s.name))continue;let o=Wt.join(r,s.name);if(s.isDirectory())t.push(...await dm(o,e));else if(s.isFile()){let i=Wt.extname(s.name).toLowerCase();Cb.has(i)&&t.push(Wt.relative(e,o))}}return t}async function Ib(r){let e=await dm(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await _c.readFile(Wt.join(r,u),"utf-8"),m=Eb(d),p=[];for(let g of m){let f=await Ab(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function Db(r,e){G.setDoc(r,pm,e)}function mm(r){return G.getDoc(r,pm)}async function gm(r,e){let t=await Ib(r);return Db(e,t),t}var Cb,xb,vb,Tb,pm,Nc=w(()=>{"use strict";le();Cb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),xb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),vb=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Tb=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Eb,"extractImportSources");l(Ab,"resolveImport");l(dm,"listFiles");l(Ib,"buildGraph");pm="import-graph";l(Db,"saveGraph");l(mm,"loadGraph");l(gm,"indexImports")});function fm(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 d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function hm(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 ym=w(()=>{"use strict";Nc();l(fm,"propagateChanges");l(hm,"affectedDomains")});import Lc from"node:fs/promises";import Xo from"node:path";async function wm(r,e){let t=[],n=await Lc.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Rb.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Xo.join(r,o);if(s.isDirectory())t.push(...await wm(i,e));else if(s.isFile()){let a=Xo.extname(o).toLowerCase();jb.has(a)&&t.push(Xo.relative(e,i))}}return t}function $b(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 Mb(r){let e=await wm(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=Xo.join(r,a),[u,d]=await Promise.all([Lc.readFile(c,"utf-8"),Lc.stat(c)]);return{path:a,hash:$b(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function Ob(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 Uc(r,e){let t=G.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)})(),G.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Fb(r){let e=new Map;try{let t=G.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 Hc(r,e){let[t,n]=await Promise.all([Mb(r),Promise.resolve(Fb(e))]);return{diff:Ob(t,n),currentHashes:t}}function Sm(r){return G.hasDoc(r,"file-hashes-meta")}var jb,Rb,km=w(()=>{"use strict";le();jb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Rb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(wm,"listProjectFiles");l($b,"hashContent");l(Mb,"computeHashes");l(Ob,"diffHashes");l(Uc,"saveHashes");l(Fb,"loadHashes");l(Hc,"detectChanges");l(Sm,"hasHashRegistry")});import{exec as _b}from"node:child_process";import{promisify as Nb}from"node:util";async function Hb(r,e=100){try{let{stdout:t}=await Lb(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
855
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Pm&&n.push(s),s=new Set):i&&s&&Gb(i)&&s.add(i)}return s&&s.size>0&&s.size<=Pm&&n.push(s),n}catch{return[]}}function Gb(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 zb(r,e=100){let t=await Hb(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=Wb(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<bm||m<bm)continue;let p=d+m-a,g=p>0?a/p:0;g<Ub||(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 Wb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Vb(r,e){G.setDoc(r,Bb,e)}async function Cm(r,e,t=100){let n=await zb(r,t);return Vb(e,n),n}var Lb,Ub,bm,Pm,Bb,xm=w(()=>{"use strict";le();Lb=Nb(_b),Ub=.1,bm=2,Pm=30;l(Hb,"parseGitLog");l(Gb,"isSourceFile");l(zb,"buildMatrix");l(Wb,"pairKey");Bb="cochange-index";l(Vb,"saveMatrix");l(Cm,"indexCoChanges")});function ft(r){return`<!-- source: ${r.file}, ${r.type} -->`}function $n(){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 Gc=w(()=>{"use strict";l(ft,"cite");l($n,"defaultSources")});function ur(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
873
+ `)}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}},cr=l((r,e)=>new qo(r,e),"createStalenessChecker")});import am from"node:fs/promises";import Ko from"node:path";function lr(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 bb(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...lr(p));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lr(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lr(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...lr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...lr(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!kb.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function cm(r,e){let t=[],n=await am.readdir(r,{withFileTypes:!0});for(let s of n){if(Sb.has(s.name))continue;let o=Ko.join(r,s.name);if(s.isDirectory())t.push(...await cm(o,e));else if(s.isFile()){let i=Ko.extname(s.name).toLowerCase();wb.has(i)&&t.push(Ko.relative(e,o))}}return t}async function Cb(r){let e=await cm(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await am.readFile(Ko.join(r,d),"utf-8"),p=bb(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function xb(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]))};G.setDoc(r,Pb,t)}async function lm(r,e){let t=await Cb(r);return xb(e,t),t}var wb,kb,Sb,Pb,um=w(()=>{"use strict";ae();wb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),kb=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"]),Sb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(lr,"splitIdentifier");l(bb,"tokenizeFile");l(cm,"listFiles");l(Cb,"buildIndex");Pb="bm25-index";l(xb,"saveIndex");l(lm,"indexProject")});import _c from"node:fs/promises";import Bt from"node:path";function Ib(r){let e=[],t,n=new RegExp(Ab.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Db(r,e,t){let n;if(r.startsWith("@/"))n=Bt.join(t,"src",r.slice(2));else{let s=Bt.dirname(Bt.join(t,e));n=Bt.resolve(s,r)}for(let s of Eb){let o=n+s;try{if((await _c.stat(o)).isFile())return Bt.relative(t,o)}catch{}}return null}async function dm(r,e){let t=[],n=await _c.readdir(r,{withFileTypes:!0});for(let s of n){if(Tb.has(s.name))continue;let o=Bt.join(r,s.name);if(s.isDirectory())t.push(...await dm(o,e));else if(s.isFile()){let i=Bt.extname(s.name).toLowerCase();vb.has(i)&&t.push(Bt.relative(e,o))}}return t}async function Rb(r){let e=await dm(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await _c.readFile(Bt.join(r,u),"utf-8"),m=Ib(d),p=[];for(let g of m){let f=await Db(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function jb(r,e){G.setDoc(r,pm,e)}function mm(r){return G.getDoc(r,pm)}async function gm(r,e){let t=await Rb(r);return jb(e,t),t}var vb,Tb,Eb,Ab,pm,Nc=w(()=>{"use strict";ae();vb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Tb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Eb=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Ab=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Ib,"extractImportSources");l(Db,"resolveImport");l(dm,"listFiles");l(Rb,"buildGraph");pm="import-graph";l(jb,"saveGraph");l(mm,"loadGraph");l(gm,"indexImports")});function fm(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 d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function hm(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 ym=w(()=>{"use strict";Nc();l(fm,"propagateChanges");l(hm,"affectedDomains")});import Lc from"node:fs/promises";import Yo from"node:path";async function wm(r,e){let t=[],n=await Lc.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Mb.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Yo.join(r,o);if(s.isDirectory())t.push(...await wm(i,e));else if(s.isFile()){let a=Yo.extname(o).toLowerCase();$b.has(a)&&t.push(Yo.relative(e,i))}}return t}function Ob(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 Fb(r){let e=await wm(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=Yo.join(r,a),[u,d]=await Promise.all([Lc.readFile(c,"utf-8"),Lc.stat(c)]);return{path:a,hash:Ob(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function _b(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 Uc(r,e){let t=G.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)})(),G.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Nb(r){let e=new Map;try{let t=G.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 Hc(r,e){let[t,n]=await Promise.all([Fb(r),Promise.resolve(Nb(e))]);return{diff:_b(t,n),currentHashes:t}}function km(r){return G.hasDoc(r,"file-hashes-meta")}var $b,Mb,Sm=w(()=>{"use strict";ae();$b=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Mb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(wm,"listProjectFiles");l(Ob,"hashContent");l(Fb,"computeHashes");l(_b,"diffHashes");l(Uc,"saveHashes");l(Nb,"loadHashes");l(Hc,"detectChanges");l(km,"hasHashRegistry")});import{exec as Lb}from"node:child_process";import{promisify as Ub}from"node:util";async function zb(r,e=100){try{let{stdout:t}=await Hb(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
874
+ `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Cm&&n.push(s),s=new Set):i&&s&&Wb(i)&&s.add(i)}return s&&s.size>0&&s.size<=Cm&&n.push(s),n}catch{return[]}}function Wb(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 Bb(r,e=100){let t=await zb(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=Vb(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<bm||m<bm)continue;let p=d+m-a,g=p>0?a/p:0;g<Gb||(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 Vb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function qb(r,e){G.setDoc(r,Jb,e)}async function Pm(r,e,t=100){let n=await Bb(r,t);return qb(e,n),n}var Hb,Gb,bm,Cm,Jb,xm=w(()=>{"use strict";ae();Hb=Ub(Lb),Gb=.1,bm=2,Cm=30;l(zb,"parseGitLog");l(Wb,"isSourceFile");l(Bb,"buildMatrix");l(Vb,"pairKey");Jb="cochange-index";l(qb,"saveMatrix");l(Pm,"indexCoChanges")});function wt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function Mn(){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 Gc=w(()=>{"use strict";l(wt,"cite");l(Mn,"defaultSources")});function ur(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
856
875
  `)}function dr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
857
876
  `)}function vm(r){let e=[];return r.packageManager&&e.push(`- Package Manager: \`${r.packageManager}\``),r.sourceDir&&e.push(`- Source: \`${r.sourceDir}/\``),r.testDir&&e.push(`- Tests: \`${r.testDir}/\``),e.length>0?`
858
877
  ### Project Structure
859
878
 
860
879
  ${e.join(`
861
880
  `)}
862
- `:""}function Jb(r){let e=[];return r.patterns?.length>0&&e.push(`
881
+ `:""}function Kb(r){let e=[];return r.patterns?.length>0&&e.push(`
863
882
  ### Code Patterns (Follow These)
864
883
 
865
884
  ${ur(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
866
885
  ### Anti-Patterns (Avoid These)
867
886
 
868
887
  ${dr(r.antiPatterns)}`),e.push(vm(r)),e.join(`
869
- `)}function qb(r,e){let t=r.sources||$n();return`# ${r.name} - Project Rules
888
+ `)}function Yb(r,e){let t=r.sources||Mn();return`# ${r.name} - Project Rules
870
889
  <!-- projectId: ${r.projectId} -->
871
890
  <!-- Generated: ${new Date().toISOString()} -->
872
891
  <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
873
892
 
874
893
  ## THIS PROJECT (${r.ecosystem})
875
894
 
876
- ${ft(t.ecosystem)}
895
+ ${wt(t.ecosystem)}
877
896
  **Type:** ${r.projectType}
878
897
  **Path:** ${r.repoPath}
879
898
 
880
899
  ### Commands (USE THESE, NOT OTHERS)
881
900
 
882
- ${ft(t.commands)}
901
+ ${wt(t.commands)}
883
902
  | Action | Command |
884
903
  |--------|---------|
885
904
  | Install dependencies | \`${r.commands.install}\` |
@@ -891,11 +910,11 @@ ${ft(t.commands)}
891
910
 
892
911
  ### Code Conventions
893
912
 
894
- ${ft(t.languages)}
913
+ ${wt(t.languages)}
895
914
  - **Languages**: ${r.languages.join(", ")||"Not detected"}
896
- ${ft(t.frameworks)}
915
+ ${wt(t.frameworks)}
897
916
  - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
898
- ${r.analysis?Jb(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
917
+ ${r.analysis?Kb(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
899
918
  ---
900
919
 
901
920
  ## PRJCT RULES
@@ -921,7 +940,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
921
940
 
922
941
  ## PROJECT STATE
923
942
 
924
- ${ft(t.name)}
943
+ ${wt(t.name)}
925
944
  | Field | Value |
926
945
  |-------|-------|
927
946
  | Name | ${r.name} |
@@ -939,13 +958,13 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
939
958
 
940
959
  **Workflow**: ${r.agents.workflow.join(", ")}
941
960
  **Domain**: ${r.agents.domain.join(", ")||"none"}
942
- `}function Kb(r,e){let t=r.sources||$n(),n=[];if(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(ft(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(ft(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(""),r.analysis){r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(ur(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(dr(r.analysis.antiPatterns)),n.push(""));let s=vm(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
943
- `)}function Yb(r,e){let t=r.sources||$n(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(ft(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(ur(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(dr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(ft(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
944
- `)}function Xb(r,e){let t=r.sources||$n(),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(ft(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(ft(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(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(ur(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(dr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
945
- `)}function Qb(r,e){let t=[`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}`];if(r.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of r.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(r.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of r.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}r.analysis||t.push("","Run `p. sync` to populate project intelligence.");let s={systemMessage:t.join(`
946
- `),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(s,null,2)}function Zb(r,e){let t=[];return t.push(`# ${r.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(ur(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(dr(r.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
947
- `)}function Tm(r){return{claude:qb,cursor:Kb,copilot:Yb,windsurf:Xb,continue:Qb,codex:Zb}[r]||null}var zc=w(()=>{"use strict";Gc();l(ur,"formatPatterns");l(dr,"formatAntiPatterns");l(vm,"formatStructure");l(Jb,"formatAnalysisForClaude");l(qb,"formatForClaude");l(Kb,"formatForCursor");l(Yb,"formatForCopilot");l(Xb,"formatForWindsurf");l(Qb,"formatForContinue");l(Zb,"formatForCodex");l(Tm,"getFormatter")});import{exec as eP}from"node:child_process";import tP from"node:os";import ls from"node:path";import{promisify as nP}from"node:util";function Em(r){return Zo[r]||null}async function Qo(r){try{return await sP(`which ${r}`),!0}catch{return!1}}async function ei(r=process.cwd()){let e=[];return await Qo("claude")&&e.push("claude"),(await Qo("cursor")||await M(ls.join(r,".cursor")))&&e.push("cursor"),await M(ls.join(r,".github"))&&e.push("copilot"),(await Qo("windsurf")||await M(ls.join(r,".windsurf")))&&e.push("windsurf"),(await M(ls.join(r,".continue"))||await M(ls.join(tP.homedir(),".continue")))&&e.push("continue"),(await Qo("codex")||await M(ls.join(r,".agents")))&&e.push("codex"),e}async function Am(r,e=process.cwd()){if(r==="auto"){let t=await ei(e);return t.length>0?t:["claude"]}return r==="all"?rP:r.filter(t=>Zo[t])}var sP,Zo,pr,rP,Wc=w(()=>{"use strict";Fe();sP=nP(eP),Zo={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},pr=["claude"],rP=Object.keys(Zo);l(Em,"getAIToolConfig");l(Qo,"commandExists");l(ei,"detectInstalledTools");l(Am,"resolveToolIds")});import Bc from"node:fs/promises";import Vc from"node:path";async function Im(r,e,t,n=pr){let s=[];for(let o of n){let i=Em(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await oP(r,i,e,t);s.push(a)}return s}async function oP(r,e,t,n){let s=Tm(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=Vc.join(n,e.outputFile):i=Vc.join(t,"context",e.outputFile),await Bc.mkdir(Vc.dirname(i),{recursive:!0});try{let a=await Bc.readFile(i,"utf-8"),c=ua(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=la(o,a)}catch{}return await Bc.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 Dm=w(()=>{"use strict";F();da();zc();Wc();l(Im,"generateAIToolContexts");l(oP,"generateForTool")});var jm=w(()=>{"use strict";zc();Dm();Wc()});import mr from"node:fs/promises";import gr from"node:path";var Jc,Rm,qc,$m,Mm=w(()=>{"use strict";F();Jc=".prjct/.prjct-state.md",Rm=".prjct-state.md",qc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=gr.join(e,Jc);await mr.mkdir(gr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await mr.writeFile(n,s,"utf-8");try{let o=gr.join(e,Rm);await mr.unlink(o)}catch(o){if(!C(o))throw o}}async remove(e){for(let t of[Jc,Rm])try{await mr.unlink(gr.join(e,t))}catch(n){if(!C(n))throw n}}async exists(e){let t=gr.join(e,Jc);try{return await mr.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
948
- `)}},$m=new qc});import Kc from"node:fs/promises";import iP from"node:os";import Om from"node:path";function Yc(){return Om.join(iP.homedir(),".prjct-cli","skills",aP)}function cP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function fr(){try{let r=await Kc.readFile(Yc(),"utf-8");return JSON.parse(r)}catch{return cP()}}async function Xc(r){let e=Yc();await Kc.mkdir(Om.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Kc.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function lP(r){let e=await fr();e.skills[r.name]=r,await Xc(e)}async function uP(r){let e=await fr();return r in e.skills?(delete e.skills[r],await Xc(e),!0):!1}async function dP(r){return(await fr()).skills[r]||null}async function pP(){return(await fr()).skills}function mP(){return Yc()}var aP,hr,Fm=w(()=>{"use strict";aP=".skill-lock.json";l(Yc,"getLockFilePath");l(cP,"createEmptyLockFile");l(fr,"read");l(Xc,"write");l(lP,"addEntry");l(uP,"removeEntry");l(dP,"getEntry");l(pP,"getAll");l(mP,"getPath");hr={read:fr,write:Xc,addEntry:lP,removeEntry:uP,getEntry:dP,getAll:pP,getPath:mP}});import{exec as gP}from"node:child_process";import Bt from"node:fs/promises";import Zc from"node:os";import Ve from"node:path";import{promisify as fP}from"node:util";import{glob as _m}from"glob";function Lm(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?Ve.join(Zc.homedir(),r.slice(1)):Ve.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 Um(r){let e=[];try{let s=Ve.join(r,"SKILL.md");await Bt.access(s);let o=Ve.basename(r);e.push({name:o,filePath:s})}catch{}let t=await _m("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=Ve.basename(Ve.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await _m("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=Ve.basename(Ve.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function hP(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()}
961
+ `}function Xb(r,e){let t=r.sources||Mn(),n=[];if(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(wt(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(wt(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(""),r.analysis){r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(ur(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(dr(r.analysis.antiPatterns)),n.push(""));let s=vm(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
962
+ `)}function Qb(r,e){let t=r.sources||Mn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(wt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(ur(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(dr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(wt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
963
+ `)}function Zb(r,e){let t=r.sources||Mn(),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(wt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(wt(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(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(ur(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(dr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
964
+ `)}function eC(r,e){let t=[`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}`];if(r.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of r.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(r.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of r.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}r.analysis||t.push("","Run `p. sync` to populate project intelligence.");let s={systemMessage:t.join(`
965
+ `),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(s,null,2)}function tC(r,e){let t=[];return t.push(`# ${r.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(ur(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(dr(r.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
966
+ `)}function Tm(r){return{claude:Yb,cursor:Xb,copilot:Qb,windsurf:Zb,continue:eC,codex:tC}[r]||null}var zc=w(()=>{"use strict";Gc();l(ur,"formatPatterns");l(dr,"formatAntiPatterns");l(vm,"formatStructure");l(Kb,"formatAnalysisForClaude");l(Yb,"formatForClaude");l(Xb,"formatForCursor");l(Qb,"formatForCopilot");l(Zb,"formatForWindsurf");l(eC,"formatForContinue");l(tC,"formatForCodex");l(Tm,"getFormatter")});import{exec as nC}from"node:child_process";import sC from"node:os";import us from"node:path";import{promisify as rC}from"node:util";function Em(r){return Qo[r]||null}async function Xo(r){try{return await oC(`which ${r}`),!0}catch{return!1}}async function Zo(r=process.cwd()){let e=[];return await Xo("claude")&&e.push("claude"),(await Xo("cursor")||await M(us.join(r,".cursor")))&&e.push("cursor"),await M(us.join(r,".github"))&&e.push("copilot"),(await Xo("windsurf")||await M(us.join(r,".windsurf")))&&e.push("windsurf"),(await M(us.join(r,".continue"))||await M(us.join(sC.homedir(),".continue")))&&e.push("continue"),(await Xo("codex")||await M(us.join(r,".agents")))&&e.push("codex"),e}async function Am(r,e=process.cwd()){if(r==="auto"){let t=await Zo(e);return t.length>0?t:["claude"]}return r==="all"?iC:r.filter(t=>Qo[t])}var oC,Qo,pr,iC,Wc=w(()=>{"use strict";_e();oC=rC(nC),Qo={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},pr=["claude"],iC=Object.keys(Qo);l(Em,"getAIToolConfig");l(Xo,"commandExists");l(Zo,"detectInstalledTools");l(Am,"resolveToolIds")});import Bc from"node:fs/promises";import Vc from"node:path";async function Im(r,e,t,n=pr){let s=[];for(let o of n){let i=Em(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await aC(r,i,e,t);s.push(a)}return s}async function aC(r,e,t,n){let s=Tm(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=Vc.join(n,e.outputFile):i=Vc.join(t,"context",e.outputFile),await Bc.mkdir(Vc.dirname(i),{recursive:!0});try{let a=await Bc.readFile(i,"utf-8"),c=la(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=ca(o,a)}catch{}return await Bc.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 Dm=w(()=>{"use strict";F();ua();zc();Wc();l(Im,"generateAIToolContexts");l(aC,"generateForTool")});var Rm=w(()=>{"use strict";zc();Dm();Wc()});import mr from"node:fs/promises";import gr from"node:path";var Jc,jm,qc,$m,Mm=w(()=>{"use strict";F();Jc=".prjct/.prjct-state.md",jm=".prjct-state.md",qc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=gr.join(e,Jc);await mr.mkdir(gr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await mr.writeFile(n,s,"utf-8");try{let o=gr.join(e,jm);await mr.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[Jc,jm])try{await mr.unlink(gr.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=gr.join(e,Jc);try{return await mr.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
967
+ `)}},$m=new qc});import Kc from"node:fs/promises";import cC from"node:os";import Om from"node:path";function Yc(){return Om.join(cC.homedir(),".prjct-cli","skills",lC)}function uC(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function fr(){try{let r=await Kc.readFile(Yc(),"utf-8");return JSON.parse(r)}catch{return uC()}}async function Xc(r){let e=Yc();await Kc.mkdir(Om.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Kc.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function dC(r){let e=await fr();e.skills[r.name]=r,await Xc(e)}async function pC(r){let e=await fr();return r in e.skills?(delete e.skills[r],await Xc(e),!0):!1}async function mC(r){return(await fr()).skills[r]||null}async function gC(){return(await fr()).skills}function fC(){return Yc()}var lC,hr,Fm=w(()=>{"use strict";lC=".skill-lock.json";l(Yc,"getLockFilePath");l(uC,"createEmptyLockFile");l(fr,"read");l(Xc,"write");l(dC,"addEntry");l(pC,"removeEntry");l(mC,"getEntry");l(gC,"getAll");l(fC,"getPath");hr={read:fr,write:Xc,addEntry:dC,removeEntry:pC,getEntry:mC,getAll:gC,getPath:fC}});import{exec as hC}from"node:child_process";import Vt from"node:fs/promises";import Zc from"node:os";import Ve from"node:path";import{promisify as yC}from"node:util";import{glob as _m}from"glob";function Lm(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?Ve.join(Zc.homedir(),r.slice(1)):Ve.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 Um(r){let e=[];try{let s=Ve.join(r,"SKILL.md");await Vt.access(s);let o=Ve.basename(r);e.push({name:o,filePath:s})}catch{}let t=await _m("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=Ve.basename(Ve.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await _m("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=Ve.basename(Ve.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function wC(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()}
949
968
  ${s.join(`
950
969
  `)}`;return r.replace(o,`---
951
970
  ${c}
@@ -954,10 +973,10 @@ ${s.join(`
954
973
  `)}
955
974
  ---
956
975
 
957
- ${r}`}function el(){return Ve.join(Zc.homedir(),".claude","skills")}async function Qc(r,e,t,n){let s=el(),o=Ve.join(s,e),i=Ve.join(o,"SKILL.md"),a=await Bt.readFile(r,"utf-8"),c=hP(a,t,n);return await Bt.mkdir(o,{recursive:!0}),await Bt.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function yP(r){let e={installed:[],skipped:[],errors:[]};if(!go.isAvailable("git")){let n=go.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=Ve.join(Zc.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Nm(`git clone --depth 1 ${n} ${t}`,{timeout:co("GIT_CLONE")});let s;try{let{stdout:a}=await Nm("git rev-parse HEAD",{cwd:t,timeout:co("TOOL_CHECK")});s=a.trim()}catch{}let o=await Um(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 Qc(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await hr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await Bt.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function wP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await Bt.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await Bt.stat(t)).isFile()){let s=Ve.basename(Ve.dirname(t));try{let o=await Qc(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await hr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await Um(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 Qc(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await hr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function SP(r){let e=el(),t=Ve.join(e,r);try{await Bt.rm(t,{recursive:!0,force:!0})}catch{}let n=Ve.join(e,`${r}.md`);try{await Bt.rm(n,{force:!0})}catch{}return hr.removeEntry(r)}async function kP(r){let e=Lm(r);switch(e.type){case"github":return yP(e);case"local":return wP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Nm,Hm,Gm=w(()=>{"use strict";F();nn();Aa();Fm();Nm=fP(gP);l(Lm,"parseSource");l(Um,"discoverSkills");l(hP,"injectSourceMetadata");l(el,"getInstallDir");l(Qc,"installSkillFile");l(yP,"installFromGitHub");l(wP,"installFromLocal");l(SP,"remove");l(kP,"install");Hm={install:kP,remove:SP,parseSource:Lm,getInstallDir:el}});import ht from"node:fs/promises";import bP from"node:os";import dt from"node:path";async function zm(r,e,t,n){let s=[],o=dt.join(r,"agents");try{let c=await ht.readdir(o);for(let u of c)u.endsWith(".md")&&await ht.unlink(dt.join(o,u))}catch(c){B.debug("Failed to purge old agents",{path:o,error:K(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>PP(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=>CP(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 Wm(r){let e=dt.join(r,"agents"),t=[];try{let n=await ht.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 Bm(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=Ie(`subagents/${o}.md`);if(!i){let a=dt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await ht.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 PP(r,e){let t="";try{let n=dt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await ht.readFile(n,"utf-8"),t=await Bm(t)}catch(n){B.debug("Workflow agent template not found, generating minimal",{name:r,error:K(n)}),t=vP(r)}await ht.writeFile(dt.join(e,`${r}.md`),t,"utf-8")}async function CP(r,e,t,n,s){let o="";try{let i=dt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await ht.readFile(i,"utf-8"),o=await Bm(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){B.debug("Domain agent template not found, generating minimal",{name:r,error:K(i)}),o=TP(r,t,n)}o=xP(o,r,s),await ht.writeFile(dt.join(e,`${r}.md`),o,"utf-8")}function xP(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=[`
976
+ ${r}`}function el(){return Ve.join(Zc.homedir(),".claude","skills")}async function Qc(r,e,t,n){let s=el(),o=Ve.join(s,e),i=Ve.join(o,"SKILL.md"),a=await Vt.readFile(r,"utf-8"),c=wC(a,t,n);return await Vt.mkdir(o,{recursive:!0}),await Vt.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function kC(r){let e={installed:[],skipped:[],errors:[]};if(!mo.isAvailable("git")){let n=mo.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=Ve.join(Zc.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Nm(`git clone --depth 1 ${n} ${t}`,{timeout:ao("GIT_CLONE")});let s;try{let{stdout:a}=await Nm("git rev-parse HEAD",{cwd:t,timeout:ao("TOOL_CHECK")});s=a.trim()}catch{}let o=await Um(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 Qc(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await hr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await Vt.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function SC(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await Vt.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await Vt.stat(t)).isFile()){let s=Ve.basename(Ve.dirname(t));try{let o=await Qc(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await hr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await Um(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 Qc(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await hr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function bC(r){let e=el(),t=Ve.join(e,r);try{await Vt.rm(t,{recursive:!0,force:!0})}catch{}let n=Ve.join(e,`${r}.md`);try{await Vt.rm(n,{force:!0})}catch{}return hr.removeEntry(r)}async function CC(r){let e=Lm(r);switch(e.type){case"github":return kC(e);case"local":return SC(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Nm,Hm,Gm=w(()=>{"use strict";F();sn();Ea();Fm();Nm=yC(hC);l(Lm,"parseSource");l(Um,"discoverSkills");l(wC,"injectSourceMetadata");l(el,"getInstallDir");l(Qc,"installSkillFile");l(kC,"installFromGitHub");l(SC,"installFromLocal");l(bC,"remove");l(CC,"install");Hm={install:CC,remove:bC,parseSource:Lm,getInstallDir:el}});import kt from"node:fs/promises";import PC from"node:os";import mt from"node:path";async function zm(r,e,t,n){let s=[],o=mt.join(r,"agents");try{let c=await kt.readdir(o);for(let u of c)u.endsWith(".md")&&await kt.unlink(mt.join(o,u))}catch(c){B.debug("Failed to purge old agents",{path:o,error:K(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>xC(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=>vC(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 Wm(r){let e=mt.join(r,"agents"),t=[];try{let n=await kt.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 Bm(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=De(`subagents/${o}.md`);if(!i){let a=mt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await kt.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 xC(r,e){let t="";try{let n=mt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await kt.readFile(n,"utf-8"),t=await Bm(t)}catch(n){B.debug("Workflow agent template not found, generating minimal",{name:r,error:K(n)}),t=EC(r)}await kt.writeFile(mt.join(e,`${r}.md`),t,"utf-8")}async function vC(r,e,t,n,s){let o="";try{let i=mt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await kt.readFile(i,"utf-8"),o=await Bm(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){B.debug("Domain agent template not found, generating minimal",{name:r,error:K(i)}),o=AC(r,t,n)}o=TC(o,r,s),await kt.writeFile(mt.join(e,`${r}.md`),o,"utf-8")}function TC(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=[`
958
977
  ## Recent Learnings (from completed tasks)
959
978
  `];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(s.length>0){c.push("### Known Gotchas");for(let u of s)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return r+c.join(`
960
- `)}function vP(r){return`---
979
+ `)}function EC(r){return`---
961
980
  name: ${r}
962
981
  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"}
963
982
  tools: Read, Write, Glob
@@ -973,7 +992,7 @@ When invoked:
973
992
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
974
993
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
975
994
  3. Execute requested operation
976
- `}function TP(r,e,t){return`---
995
+ `}function AC(r,e,t){return`---
977
996
  name: ${r}
978
997
  description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
979
998
  tools: Read, Write, Glob, Grep
@@ -993,17 +1012,17 @@ Domain specialist for ${r} tasks.
993
1012
  ## Your Role
994
1013
 
995
1014
  You are the ${r} expert for this project. Apply best practices for the detected stack.
996
- `}function Vm(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 ht.writeFile(dt.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{B.debug("Failed to write skills.json",{error:K(o)})}),n}async function Jm(r){let e=[];try{let t=dt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await ht.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=dt.join(bP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=dt.join(a,d,"SKILL.md"),p=dt.join(a,`${d}.md`),g=!1;try{await ht.access(m),g=!0}catch{try{await ht.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),S;f.length===3?S=`${f[0]}/${f[1]}@${f[2]}`:S=c;let b=await Hm.install(S);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),B.debug(`Skill install error for ${d}`,{error:K(f)})}}}catch(t){B.debug("Skill auto-installation failed (non-critical)",{error:K(t)})}return e}var qm=w(()=>{"use strict";Zn();zt();ne();rs();Gm();l(zm,"generateAgents");l(Wm,"loadExistingAgents");l(Bm,"resolveTemplateIncludes");l(PP,"generateWorkflowAgent");l(CP,"generateDomainAgent");l(xP,"injectFeedbackSection");l(vP,"generateMinimalWorkflowAgent");l(TP,"generateMinimalDomainAgent");l(Vm,"configureSkills");l(Jm,"autoInstallSkills")});import Km from"node:fs/promises";import Ym from"node:path";var ti,Xm=w(()=>{"use strict";ti=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=Ym.join(this.projectPath,"package.json"),t=await Km.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Km.access(Ym.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as EP}from"node:child_process";import Qm from"node:fs/promises";import tl from"node:path";import{promisify as AP}from"node:util";async function Zm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Mn("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Mn("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Mn("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Mn("git status --porcelain",{cwd:r}),i=o.trim().split(`
997
- `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await Mn('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
998
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Mn('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:K(t)})}return e}async function Ut(r,e){try{return await Qm.access(tl.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function eg(r){let e={fileCount:0,version:"0.0.0",name:tl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Mn('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){B.debug("File count failed",{path:r,error:K(t)}),e.fileCount=0}try{let t=tl.join(r,"package.json"),n=JSON.parse(await Qm.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 Ut(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:K(t)})}return await Ut(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Ut(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Ut(r,"requirements.txt")||await Ut(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 tg(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 Ut(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 Ut(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 Ut(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 Ut(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 Ut(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 ng(r,e){let t=$n(),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 sg(r){return new ti(r).detect()}var Mn,rg=w(()=>{"use strict";zt();Gc();rs();Xm();Mn=AP(EP);l(Zm,"analyzeGit");l(Ut,"fileExists");l(eg,"gatherStats");l(tg,"detectCommands");l(ng,"buildSources");l(sg,"detectStack")});import{exec as IP}from"node:child_process";import nl from"node:fs/promises";import ni from"node:path";import{promisify as DP}from"node:util";var jP,sl,rl,og,ig=w(()=>{"use strict";Ft();F();jP=DP(IP),sl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ni.join(r,s);try{await nl.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=ni.basename(r);try{await _.read(n)}catch(s){C(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=ni.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 nl.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await nl.readFile(ni.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(!C(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}}},rl=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[sl.contextFilesExist(t),sl.jsonFilesValid(t),sl.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await jP(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}}}},og=new rl});import si from"node:fs/promises";import ri from"node:path";var oi,yr,ag=w(()=>{"use strict";Jn();um();ym();km();xm();Nc();zt();yn();ot();ce();bo();sn();le();qs();Po();xo();Ys();Xs();Zs();jm();ne();rs();Za();ec();Mm();Da();qm();rg();ig();oi=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 ei(e)).filter(i=>!pr.includes(i));s=[...pr,...o]}else t.aiTools[0]==="auto"?(s=await ei(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Am("all",e):s=t.aiTools;try{if(this.projectId=await $.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=v.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Ks(this.projectId);try{let O=await Co(this.projectId);O>0&&B.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(O)})}let[i,a,c,u]=await Promise.all([Zm(this.projectPath),eg(this.projectPath),tg(this.projectPath),sg(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&Sm(this.projectId))try{let{diff:O,currentHashes:Xg}=await Hc(this.projectPath,this.projectId),Al=O.added.length+O.modified.length+O.deleted.length;if(Al===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Ci=fm(O,this.projectId);f=hm(Ci.allAffected);let Qg=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=Ci.allAffected.some(dn=>{let Zg=dn.substring(dn.lastIndexOf("."));return Qg.has(Zg)}),g=Ci.directlyChanged.some(dn=>dn==="package.json"||dn==="tsconfig.json"||dn.includes("Dockerfile")||dn.includes("docker-compose")),m={isIncremental:!0,filesChanged:Al,filesUnchanged:O.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Uc(this.projectId,Xg)}catch(O){B.debug("Incremental detection failed, falling back to full sync",{error:K(O)})}else try{let{currentHashes:O}=await Hc(this.projectPath,this.projectId);Uc(this.projectId,O)}catch(O){B.debug("Hash computation failed (non-critical)",{error:K(O)})}if(p)try{await Promise.all([lm(this.projectPath,this.projectId),gm(this.projectPath,this.projectId),Cm(this.projectPath,this.projectId)])}catch(O){B.debug("File ranking index build failed (non-critical)",{error:K(O)})}let S;if(g)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(S=O)}catch{}let b=g?await zm(this.globalPath,u,a,S):await Wm(this.globalPath),I=Vm(b,this.projectId,this.globalPath),R=g?await Jm(b):[],V=ng(a,c),me=[],Se;try{let O=await ct.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(Se={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let Ge={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(O=>O.type==="workflow").map(O=>O.name),domain:b.filter(O=>O.type==="domain").map(O=>O.name)},sources:V,analysis:Se},P=await Im(Ge,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let A=Date.now()-n,ke=await this.recordSyncMetrics(a,me,b,A);await this.archiveStaleData(),await this.autoLearnFromHistory(),await We.installGlobalConfig(),await We.syncCommands();let Un;try{let O=await $.readConfig(this.projectPath);Un=await og.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){B.debug("Verification failed (non-critical)",{error:K(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:I,skillsInstalled:R,contextFiles:me,aiTools:P.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),syncMetrics:ke,verification:Un,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:K(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>si.mkdir(ri.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=D.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||k(),lastSync:k(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};D.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=k(),s.lastUpdated=k(),s.context={...s.context||{},lastSession:k(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await $m.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:K(o)})}}async logToMemory(e,t){D.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=ri.join(this.globalPath,m),g=await si.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Context file not found for metrics",{file:m,error:K(p)})}for(let m of n)try{let p=ri.join(this.globalPath,"agents",`${m.name}.md`),g=await si.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Agent file not found for metrics",{agent:m.name,error:K(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Pn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){B.debug("Failed to record sync metrics",{error:K(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await _.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 ct.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){B.debug("Failed to save draft analysis (non-critical)",{error:K(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([Xe.archiveOldShipped(this.projectId).catch(()=>0),Ne.markDormantIdeas(this.projectId).catch(()=>0),fe.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),Ye.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=it.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:K(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new gn,n=await Qa.learnFromTaskHistory(this.projectId,e,t);try{let s=await Fd.getFeatureOutcomes(this.projectId);s.length>0&&await Qa.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:K(e)})}}async getCliVersion(){try{let e=ri.join(__dirname,"..","..","package.json");return JSON.parse(await si.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:K(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:[]}}},yr=new oi});var cn=w(()=>{"use strict";Xu();id();ad();dd();md();Pa();hd();Da();yd();wd();tm();im();ag()});import Vt from"chalk";function cg(r){return Math.ceil(r.length/RP)}function lg(r){let e=r.split(`
1015
+ `}function Vm(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:b(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return kt.writeFile(mt.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{B.debug("Failed to write skills.json",{error:K(o)})}),n}async function Jm(r){let e=[];try{let t=mt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await kt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=mt.join(PC.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=mt.join(a,d,"SKILL.md"),p=mt.join(a,`${d}.md`),g=!1;try{await kt.access(m),g=!0}catch{try{await kt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let S=await Hm.install(k);S.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):S.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:S.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),B.debug(`Skill install error for ${d}`,{error:K(f)})}}}catch(t){B.debug("Skill auto-installation failed (non-critical)",{error:K(t)})}return e}var qm=w(()=>{"use strict";es();Wt();se();os();Gm();l(zm,"generateAgents");l(Wm,"loadExistingAgents");l(Bm,"resolveTemplateIncludes");l(xC,"generateWorkflowAgent");l(vC,"generateDomainAgent");l(TC,"injectFeedbackSection");l(EC,"generateMinimalWorkflowAgent");l(AC,"generateMinimalDomainAgent");l(Vm,"configureSkills");l(Jm,"autoInstallSkills")});import Km from"node:fs/promises";import Ym from"node:path";var ei,Xm=w(()=>{"use strict";ei=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=Ym.join(this.projectPath,"package.json"),t=await Km.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Km.access(Ym.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as IC}from"node:child_process";import Qm from"node:fs/promises";import tl from"node:path";import{promisify as DC}from"node:util";async function Zm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await On("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await On("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await On("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await On("git status --porcelain",{cwd:r}),i=o.trim().split(`
1016
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await On('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
1017
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await On('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:K(t)})}return e}async function Ht(r,e){try{return await Qm.access(tl.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function eg(r){let e={fileCount:0,version:"0.0.0",name:tl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await On('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){B.debug("File count failed",{path:r,error:K(t)}),e.fileCount=0}try{let t=tl.join(r,"package.json"),n=JSON.parse(await Qm.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 Ht(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:K(t)})}return await Ht(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Ht(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Ht(r,"requirements.txt")||await Ht(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 tg(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 Ht(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 Ht(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 Ht(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 Ht(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 Ht(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 ng(r,e){let t=Mn(),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 sg(r){return new ei(r).detect()}var On,rg=w(()=>{"use strict";Wt();Gc();os();Xm();On=DC(IC);l(Zm,"analyzeGit");l(Ht,"fileExists");l(eg,"gatherStats");l(tg,"detectCommands");l(ng,"buildSources");l(sg,"detectStack")});import{exec as RC}from"node:child_process";import nl from"node:fs/promises";import ti from"node:path";import{promisify as jC}from"node:util";var $C,sl,rl,og,ig=w(()=>{"use strict";_t();F();$C=jC(RC),sl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ti.join(r,s);try{await nl.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=ti.basename(r);try{await _.read(n)}catch(s){P(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=ti.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 nl.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await nl.readFile(ti.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(!P(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}}},rl=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[sl.contextFilesExist(t),sl.jsonFilesValid(t),sl.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await $C(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}}}},og=new rl});import ni from"node:fs/promises";import si from"node:path";var ri,yr,ag=w(()=>{"use strict";qn();um();ym();Sm();xm();Nc();Wt();wn();ct();le();So();rn();ae();Js();bo();Po();Ks();Ys();Qs();Rm();se();os();Za();ec();Mm();Ia();qm();rg();ig();ri=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 Zo(e)).filter(i=>!pr.includes(i));s=[...pr,...o]}else t.aiTools[0]==="auto"?(s=await Zo(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Am("all",e):s=t.aiTools;try{if(this.projectId=await $.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=v.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await qs(this.projectId);try{let O=await Co(this.projectId);O>0&&B.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(O)})}let[i,a,c,u]=await Promise.all([Zm(this.projectPath),eg(this.projectPath),tg(this.projectPath),sg(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&km(this.projectId))try{let{diff:O,currentHashes:Zg}=await Hc(this.projectPath,this.projectId),El=O.added.length+O.modified.length+O.deleted.length;if(El===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Ci=fm(O,this.projectId);f=hm(Ci.allAffected);let ef=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=Ci.allAffected.some(pn=>{let tf=pn.substring(pn.lastIndexOf("."));return ef.has(tf)}),g=Ci.directlyChanged.some(pn=>pn==="package.json"||pn==="tsconfig.json"||pn.includes("Dockerfile")||pn.includes("docker-compose")),m={isIncremental:!0,filesChanged:El,filesUnchanged:O.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Uc(this.projectId,Zg)}catch(O){B.debug("Incremental detection failed, falling back to full sync",{error:K(O)})}else try{let{currentHashes:O}=await Hc(this.projectPath,this.projectId);Uc(this.projectId,O)}catch(O){B.debug("Hash computation failed (non-critical)",{error:K(O)})}if(p)try{await Promise.all([lm(this.projectPath,this.projectId),gm(this.projectPath,this.projectId),Pm(this.projectPath,this.projectId)])}catch(O){B.debug("File ranking index build failed (non-critical)",{error:K(O)})}let k;if(g)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(k=O)}catch{}let S=g?await zm(this.globalPath,u,a,k):await Wm(this.globalPath),I=Vm(S,this.projectId,this.globalPath),D=g?await Jm(S):[],V=ng(a,c),me=[],Se;try{let O=await dt.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(Se={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let Ge={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:S.filter(O=>O.type==="workflow").map(O=>O.name),domain:S.filter(O=>O.type==="domain").map(O=>O.name)},sources:V,analysis:Se},C=await Im(Ge,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let R=Date.now()-n,be=await this.recordSyncMetrics(a,me,S,R);await this.archiveStaleData(),await this.autoLearnFromHistory(),await We.installGlobalConfig(),await We.syncCommands();let Hn;try{let O=await $.readConfig(this.projectPath);Hn=await og.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){B.debug("Verification failed (non-critical)",{error:K(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:S,skills:I,skillsInstalled:D,contextFiles:me,aiTools:C.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),syncMetrics:be,verification:Hn,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:K(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>ni.mkdir(si.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=A.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await $m.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:K(o)})}}async logToMemory(e,t){A.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=si.join(this.globalPath,m),g=await ni.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Context file not found for metrics",{file:m,error:K(p)})}for(let m of n)try{let p=si.join(this.globalPath,"agents",`${m.name}.md`),g=await ni.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Agent file not found for metrics",{agent:m.name,error:K(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Pn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){B.debug("Failed to record sync metrics",{error:K(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await _.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 dt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:b(),status:"draft",commitHash:s??void 0})}catch(s){B.debug("Failed to save draft analysis (non-critical)",{error:K(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([Ze.archiveOldShipped(this.projectId).catch(()=>0),Le.markDormantIdeas(this.projectId).catch(()=>0),ge.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),Qe.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=lt.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:K(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new fn,n=await Qa.learnFromTaskHistory(this.projectId,e,t);try{let s=await Fd.getFeatureOutcomes(this.projectId);s.length>0&&await Qa.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:K(e)})}}async getCliVersion(){try{let e=si.join(__dirname,"..","..","package.json");return JSON.parse(await ni.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:K(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:[]}}},yr=new ri});var ln=w(()=>{"use strict";Yu();od();id();ud();pd();ba();fd();Ia();hd();yd();tm();im();ag()});import Jt from"chalk";function cg(r){return Math.ceil(r.length/MC)}function lg(r){let e=r.split(`
999
1018
  `),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+=`
1000
1019
  ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function ol(r){return r.includes("<!-- prjct:preserve")}function ug(r,e){let t=lg(r),n=lg(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:cg(r),tokensAfter:cg(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)ol(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1001
1020
  `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(ol(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
1002
1021
  `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
1003
1022
  `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!ol(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1004
- `).length}),s.hasChanges=!0)}return s}function dg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Vt.green:p=>p,o=t?Vt.red:p=>p,i=t?Vt.yellow:p=>p,a=t?Vt.dim:p=>p,c=t?Vt.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1023
+ `).length}),s.hasChanges=!0)}return s}function dg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Jt.green:p=>p,o=t?Jt.red:p=>p,i=t?Jt.yellow:p=>p,a=t?Jt.dim:p=>p,c=t?Jt.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1005
1024
  `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),r.added.length>0)for(let p of r.added)n.push(s(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of r.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(s(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?s:o;return n.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
1006
- `)}function pg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Vt.green:c=>c,o=t?Vt.red:c=>c,i=t?Vt.cyan:c=>c,a=t?Vt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1025
+ `)}function pg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Jt.green:c=>c,o=t?Jt.red:c=>c,i=t?Jt.cyan:c=>c,a=t?Jt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1007
1026
  `))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(`
1008
1027
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1009
1028
  `).length>5&&n.push(a(` ... ${c.before.split(`
@@ -1014,11 +1033,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function ol(r){return r.incl
1014
1033
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1015
1034
  `).length>5&&n.push(a(` ... ${c.before.split(`
1016
1035
  `).length-5} more lines`))}n.push("")}return n.join(`
1017
- `)}var RP,mg=w(()=>{"use strict";RP=4;l(cg,"estimateTokens");l(lg,"parseMarkdownSections");l(ol,"isPreservedSection");l(ug,"generateSyncDiff");l(dg,"formatDiffPreview");l(pg,"formatFullDiff")});import $P from"node:path";async function il(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await We.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(`
1018
- `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return ut("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function gg(r){try{let e=await Ye.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=L.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function wr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function al(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 hg(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 | ${wr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${Wr(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 | ${al(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: ${wr(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(`
1036
+ `)}var MC,mg=w(()=>{"use strict";MC=4;l(cg,"estimateTokens");l(lg,"parseMarkdownSections");l(ol,"isPreservedSection");l(ug,"generateSyncDiff");l(dg,"formatDiffPreview");l(pg,"formatFullDiff")});import OC from"node:path";async function il(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await We.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(`
1037
+ `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return pt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function gg(r){try{let e=await Qe.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=U.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function wr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function al(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 hg(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 | ${wr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${zr(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 | ${al(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: ${wr(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(`
1019
1038
  `)}function yg(r,e){let t=[];t.push(`# Repository Analysis
1020
1039
  `),t.push(`Generated: ${new Date().toLocaleString()}
1021
- `);let n=$P.basename(e);if(t.push(`## Project: ${n}
1040
+ `);let n=OC.basename(e);if(t.push(`## Project: ${n}
1022
1041
  `),t.push(`## Stack Detected
1023
1042
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
1024
1043
  `),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
@@ -1034,29 +1053,29 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function ol(r){return r.incl
1034
1053
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1035
1054
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1036
1055
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1037
- `)}var wg=w(()=>{"use strict";yn();Br();cn();is();bn();Be();l(il,"showSyncResult");l(gg,"getSessionActivity");l(wr,"formatTokens");l(al,"formatDuration");l(fg,"generateSparkline");l(hg,"generateStatsMarkdown");l(yg,"generateAnalysisSummary")});var em={};Hn(em,{AnalysisCommands:()=>Fn});import cl from"node:fs/promises";import Sg from"node:path";import*as On from"@clack/prompts";var Fn,Jo=w(()=>{"use strict";Jn();Lu();yn();Br();cn();mg();bo();le();Po();F();os();is();bn();wg();Be();Fn=class extends de{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1038
- `),$e.init(t);let n=await Ze.build(t,e),s={packageJson:await $e.readPackageJson(),cargoToml:await $e.readCargoToml(),goMod:await $e.readGoMod(),requirements:await $e.readRequirements(),directories:await $e.listDirectories(),fileCount:await $e.countFiles(),gitStats:await $e.getGitStats(),gitLog:await $e.getGitLog(20),hasDockerfile:await $e.fileExists("Dockerfile"),hasDockerCompose:await $e.fileExists("docker-compose.yml"),hasReadme:await $e.fileExists("README.md"),hasTsconfig:await $e.fileExists("tsconfig.json"),hasViteConfig:await $e.fileExists("vite.config.ts")||await $e.fileExists("vite.config.js"),hasNextConfig:await $e.fileExists("next.config.js")||await $e.fileExists("next.config.mjs")},o=yg(s,t),i=await $.getProjectId(t),a=n.paths.analysis||v.getFilePath(i,"analysis","repo-summary.md");await Oe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:L.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ke(),pt(st)).getActiveProvider(),d=await We.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${v.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1056
+ `)}var wg=w(()=>{"use strict";wn();Wr();ln();as();Cn();Be();l(il,"showSyncResult");l(gg,"getSessionActivity");l(wr,"formatTokens");l(al,"formatDuration");l(fg,"generateSparkline");l(hg,"generateStatsMarkdown");l(yg,"generateAnalysisSummary")});var em={};Gn(em,{AnalysisCommands:()=>_n});import cl from"node:fs/promises";import kg from"node:path";import*as Fn from"@clack/prompts";var _n,Vo=w(()=>{"use strict";qn();Nu();wn();Wr();ln();mg();So();ae();bo();F();is();as();Cn();wg();Be();_n=class extends de{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1057
+ `),Oe.init(t);let n=await nt.build(t,e),s={packageJson:await Oe.readPackageJson(),cargoToml:await Oe.readCargoToml(),goMod:await Oe.readGoMod(),requirements:await Oe.readRequirements(),directories:await Oe.listDirectories(),fileCount:await Oe.countFiles(),gitStats:await Oe.getGitStats(),gitLog:await Oe.getGitLog(20),hasDockerfile:await Oe.fileExists("Dockerfile"),hasDockerCompose:await Oe.fileExists("docker-compose.yml"),hasReadme:await Oe.fileExists("README.md"),hasTsconfig:await Oe.fileExists("tsconfig.json"),hasViteConfig:await Oe.fileExists("vite.config.ts")||await Oe.fileExists("vite.config.js"),hasNextConfig:await Oe.fileExists("next.config.js")||await Oe.fileExists("next.config.mjs")},o=yg(s,t),i=await $.getProjectId(t),a=n.paths.analysis||v.getFilePath(i,"analysis","repo-summary.md");await Fe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:U.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Xe(),gt(it)).getActiveProvider(),d=await We.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${v.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1039
1058
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1040
- `),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 $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=v.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await v.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(S=>S.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await yr.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(ie(Et(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=Sg.join(o,"context","CLAUDE.md"),c=null;try{c=await cl.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await yr.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(ie("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await cl.readFile(a,"utf-8")}catch{p=""}let g=ug(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(ie(Et("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await cl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let R of g.added)b.push(`Added: ${R.name} (${R.lineCount} lines)`);for(let R of g.modified)b.push(`Modified: ${R.name} (${R.lineCount} lines)`);for(let R of g.removed)b.push(`Removed: ${R.name} (${R.lineCount} lines)`);let I=ie("## \u26A1 Sync Preview",b.length>0?Le("Changes",lt(b)):"No section changes.",mt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(I),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(I=>({name:I.name,lineCount:I.lineCount})),modified:g.modified.map(I=>({name:I.name,lineCount:I.lineCount})),removed:g.removed.map(I=>({name:I.name,lineCount:I.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:b,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(dg(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await On.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(On.isCancel(S)||S==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(S==="diff"){console.log(`
1041
- ${pg(g)}`);let b=await On.confirm({message:"Apply these changes?",initialValue:!0});if(On.isCancel(b)||!b)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),il(m,i)}t.md||h.spin("Syncing project...");let d=await yr.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(ie("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=vo("sync"),S=ie(Et("Sync Complete"),mt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),d.git.hasChanges?Dd("Uncommitted changes detected"):null,Me(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return il(d,i)}catch(n){return t.md?console.log(ie("## \u274C Sync Failed",`> ${y(n)}`)):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 $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Pn.getSummary(s),i=await Pn.getDailyStats(s,30),a=await gg(s),c=await ge.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=D.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Pn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${wr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Wr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${al(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=fg(i);if(console.log(` ${p} ${wr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=hg(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",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 $.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=cr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await ct.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=Sg.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=ie(`## \u26A1 Status: ${u}`,mt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Le("Analysis",lt(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=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 $.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 ct.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 $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await ct.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 $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=D.getDoc(s,"project")?.repoPath||e}catch{}let i=await ct.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as KP}from"node:child_process";import{promisify as YP}from"node:util";async function mi(r){if(process.platform!=="darwin")return Dg(r);try{let{stdout:e}=await XP(`security find-generic-password -s "${QP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Dg(r)}}function Dg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var XP,QP,bl=w(()=>{"use strict";F();XP=YP(KP),QP="prjct-cli";l(mi,"getCredential");l(Dg,"getEnvFallback")});import wt from"node:fs";import{createServer as JC}from"node:net";vi();Jo();cn();Ft();F();os();Be();import MP from"node:path";ot();ce();F();ne();var ii=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);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 $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:v.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()}},H=new ii;var us=class extends de{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=MP.basename(t),a=await _.getCurrentTask(o),c=await fe.getActiveTasks(o),u=await Xe.getRecent(o,5),d=await Ne.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=L.getDaysAgo(m),g=[];try{let b=p.toISOString();g=D.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(R=>({...JSON.parse(R.data),timestamp:R.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
1059
+ `),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 $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=v.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await v.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await yr.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(X(Ye(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=kg.join(o,"context","CLAUDE.md"),c=null;try{c=await cl.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await yr.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(X("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await cl.readFile(a,"utf-8")}catch{p=""}let g=ug(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(X(Ye("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await cl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let D of g.added)S.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)S.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)S.push(`Removed: ${D.name} (${D.lineCount} lines)`);let I=X("## \u26A1 Sync Preview",S.length>0?je("Changes",et(S)):"No section changes.",ht({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(I),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let S={added:g.added.map(I=>({name:I.name,lineCount:I.lineCount})),modified:g.modified.map(I=>({name:I.name,lineCount:I.lineCount})),removed:g.removed.map(I=>({name:I.name,lineCount:I.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:S,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 k=await Fn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Fn.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
1060
+ ${pg(g)}`);let S=await Fn.confirm({message:"Apply these changes?",initialValue:!0});if(Fn.isCancel(S)||!S)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),il(m,i)}t.md||h.spin("Syncing project...");let d=await yr.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(X("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(S=>S.success).length||0),g=d.agents.length,f=xo("sync"),k=X(Ye("Sync Complete"),ht({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),d.git.hasChanges?Dd("Uncommitted changes detected"):null,fe(f.map(S=>({label:S.desc,command:S.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return il(d,i)}catch(n){return t.md?console.log(X("## \u274C Sync Failed",`> ${y(n)}`)):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 $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Pn.getSummary(s),i=await Pn.getDailyStats(s,30),a=await gg(s),c=await xe.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Pn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${wr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${zr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${al(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=fg(i);if(console.log(` ${p} ${wr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=hg(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",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 $.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=cr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await dt.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=kg.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=X(`## \u26A1 Status: ${u}`,ht({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?je("Analysis",et(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=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 $.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 dt.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 $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await dt.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 $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(s,"project")?.repoPath||e}catch{}let i=await dt.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as XC}from"node:child_process";import{promisify as QC}from"node:util";async function pi(r){if(process.platform!=="darwin")return jg(r);try{let{stdout:e}=await ZC(`security find-generic-password -s "${eP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return jg(r)}}function jg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var ZC,eP,Sl=w(()=>{"use strict";F();ZC=QC(XC),eP="prjct-cli";l(pi,"getCredential");l(jg,"getEnvFallback")});import bt from"node:fs";import{createServer as KP}from"node:net";xi();Vo();ln();_t();F();is();Be();import FC from"node:path";ct();le();F();se();var oi=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);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 $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:v.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},H=new oi;var ds=class extends de{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=FC.basename(t),a=await _.getCurrentTask(o),c=await ge.getActiveTasks(o),u=await Ze.getRecent(o,5),d=await Le.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=U.getDaysAgo(m),g=[];try{let S=p.toISOString();g=A.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
1042
1061
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1043
- `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let S=this._generateSparkline(g,m);return console.log(`
1044
- Activity: ${S}
1045
- `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await Ze.build(t),p=await Oe.get("Read")(m.paths.roadmap);if(console.log(`
1062
+ `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
1063
+ Activity: ${k}
1064
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await nt.build(t),p=await Fe.get("Read")(m.paths.roadmap);if(console.log(`
1046
1065
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1047
1066
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1048
- `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let b=f.split(`
1049
- `)[0].trim();console.log(` ${S+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1050
- `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${L.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(S=>{let b=S.priority?` [${S.priority}]`:"";return`${S.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let b=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=ie(`## \u26A1 Dashboard: ${i}`,Le("Current Focus",m),Le(`Queue (${c.length})`,lt(p,!0)),Le("Recent Ships",lt(g)),Le("Ideas",`${d.length} pending`),Me([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1067
+ `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let S=f.split(`
1068
+ `)[0].trim();console.log(` ${k+1}. ${S}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1069
+ `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${U.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let S=k.priority?` [${k.priority}]`:"";return`${k.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let S=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=X(`## \u26A1 Dashboard: ${i}`,je("Current Focus",m),je(`Queue (${c.length})`,et(p,!0)),je("Recent Ships",et(g)),je("Ideas",`${d.length} pending`),fe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1051
1070
  \u{1F4CA} DASHBOARD - ${i}
1052
1071
  `),console.log("\u2550".repeat(50));let m=cr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1053
1072
  ${g}`),console.log(`
1054
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=L.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1055
- \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1056
- \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let S=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${S?`(${S})`:""}`)}),console.log(`
1073
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=U.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1074
+ \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let S=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${S}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1075
+ \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
1057
1076
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1058
1077
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1059
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:L.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1078
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:U.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1060
1079
  PRJCT COMMANDS
1061
1080
  `),console.log("=".repeat(50));let i=H.getAllCategories(),a=H.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1062
1081
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
@@ -1071,7 +1090,7 @@ ${"\u2550".repeat(50)}
1071
1090
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1072
1091
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1073
1092
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1074
- `),{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)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};wc();ot();ce();Ft();F();import OP from"node:fs/promises";import FP from"node:path";var _n=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 $.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=v.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await _o.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}async loadRepoAnalysis(e){try{let t=FP.join(e,"analysis","repo-analysis.json"),n=await OP.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 C(t),null}}},yL=new _n;Be();cn();Ft();le();F();Be();async function ai(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;G.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(ai,"cleanupMemory");async function ci(r){let e=await $.getProjectId(r);if(!e)return;let n=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;G.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(ci,"cleanupMemoryInternal");async function ll(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ai(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=G.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;G.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await Ne.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${y(a)}`)}try{let c=(await fe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await ci(e),await Ye.log(e,"cleanup_performed",{items:s.length,timestamp:L.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(ll,"cleanup");cn();F();Be();import kg from"node:path";async function ul(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 $.getProjectId(t),a=kg.join(v.getGlobalProjectPath(i),"planning","designs");await se.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1093
+ `),{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)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};wc();ct();le();_t();F();import _C from"node:fs/promises";import NC from"node:path";var Nn=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 $.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=v.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await Fo.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}async loadRepoAnalysis(e){try{let t=NC.join(e,"analysis","repo-analysis.json"),n=await _C.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 P(t),null}}},PL=new Nn;Be();ln();_t();ae();F();Be();async function ii(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;G.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(ii,"cleanupMemory");async function ai(r){let e=await $.getProjectId(r);if(!e)return;let n=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;G.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(ai,"cleanupMemoryInternal");async function ll(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ii(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=G.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;G.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await Le.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${y(a)}`)}try{let c=(await ge.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await ai(e),await Qe.log(e,"cleanup_performed",{items:s.length,timestamp:U.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(ll,"cleanup");ln();F();Be();import Sg from"node:path";async function ul(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 $.getProjectId(t),a=Sg.join(v.getGlobalProjectPath(i),"planning","designs");await re.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1075
1094
 
1076
1095
  *Use templates/design/architecture.md for full design*
1077
1096
  `;break;case"api":c=`# API Design: ${o}
@@ -1086,12 +1105,12 @@ ${"\u2550".repeat(50)}
1086
1105
  `;break;case"flow":c=`# Flow Design: ${o}
1087
1106
 
1088
1107
  *Use templates/design/flow.md for full design*
1089
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=kg.join(a,u);return await se.writeFile(d,c),await Ye.log(t,"design_created",{type:n,target:o,timestamp:L.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}l(ul,"design");cn();F();Be();import ds from"node:path";async function dl(r=process.cwd()){try{let e=await $.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=v.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await se.readFile(t);n=JSON.parse(s)}catch(s){if(C(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(`
1108
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Sg.join(a,u);return await re.writeFile(d,c),await Qe.log(t,"design_created",{type:n,target:o,timestamp:U.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}l(ul,"design");ln();F();Be();import ps from"node:path";async function dl(r=process.cwd()){try{let e=await $.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=v.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await re.readFile(t);n=JSON.parse(s)}catch(s){if(P(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(`
1090
1109
  Found abandoned session:
1091
- `),console.log(` Task: ${n.task}`),n.startedAt){let s=L.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1110
+ `),console.log(` Task: ${n.task}`),n.startedAt){let s=U.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1092
1111
  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
1093
- `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(dl,"recover");async function pl(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ds.join(v.getGlobalProjectPath(e),"snapshots");await se.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=ds.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await se.readFile(a);c=JSON.parse(u)}catch(u){if(!C(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 se.writeFile(a,JSON.stringify(c,null,2)),await Ye.log(r,"undo_performed",{snapshotId:i,timestamp:L.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(pl,"undo");async function ml(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ds.join(v.getGlobalProjectPath(e),"snapshots"),n=ds.join(t,"history.json"),s;try{let i=await se.readFile(n);s=JSON.parse(i)}catch(i){if(C(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(`
1094
- `).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 se.writeFile(n,JSON.stringify(s,null,2)),await Ye.log(r,"redo_performed",{timestamp:L.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(ml,"redo");async function gl(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ds.join(v.getGlobalProjectPath(e),"snapshots"),n=ds.join(t,"history.json"),s;try{let o=await se.readFile(n);s=JSON.parse(o)}catch(o){if(C(o)||o instanceof SyntaxError)return console.log(`
1112
+ `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(dl,"recover");async function pl(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ps.join(v.getGlobalProjectPath(e),"snapshots");await re.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 re.readFile(a);c=JSON.parse(u)}catch(u){if(!P(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await re.writeFile(a,JSON.stringify(c,null,2)),await Qe.log(r,"undo_performed",{snapshotId:i,timestamp:U.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(s)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(pl,"undo");async function ml(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ps.join(v.getGlobalProjectPath(e),"snapshots"),n=ps.join(t,"history.json"),s;try{let i=await re.readFile(n);s=JSON.parse(i)}catch(i){if(P(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(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(`
1113
+ `).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 re.writeFile(n,JSON.stringify(s,null,2)),await Qe.log(r,"redo_performed",{timestamp:U.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(i)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(ml,"redo");async function gl(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ps.join(v.getGlobalProjectPath(e),"snapshots"),n=ps.join(t,"history.json"),s;try{let o=await re.readFile(n);s=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1095
1114
  SNAPSHOT HISTORY
1096
1115
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1097
1116
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1099,11 +1118,11 @@ ${"\u2550".repeat(50)}
1099
1118
  `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1100
1119
  `)):(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
1101
1120
  `)),console.log(`${"=".repeat(50)}
1102
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(gl,"history");var ps=class extends de{static{l(this,"MaintenanceCommands")}_cleanupMemory=ai;_cleanupMemoryInternal=ci;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?ll(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?ul(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?pl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ml(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?gl(e):t}};import ye from"chalk";le();var fl=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){G.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)G.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){G.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){G.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return G.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),f=c.map(S=>S.value);o.memory={avgHeapMB:p(g.reduce((S,b)=>S+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,b)=>S+b,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((S,b)=>S+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},_P=new fl,bg=_P;F();Be();var ln={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function li(r,e,t){return t==="below"?r<=e?ye.green("\u2713"):ye.yellow("\u26A0"):r>=e?ye.green("\u2713"):ye.yellow("\u26A0")}l(li,"statusIcon");var ms=class extends de{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 $.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 bg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1121
+ `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(gl,"history");var ms=class extends de{static{l(this,"MaintenanceCommands")}_cleanupMemory=ii;_cleanupMemoryInternal=ai;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?ll(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?ul(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?pl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ml(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?gl(e):t}};import ye from"chalk";ae();var fl=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){G.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)G.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){G.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){G.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return G.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,S)=>k+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,S)=>k+S,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,S)=>k+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},LC=new fl,bg=LC;F();Be();var un={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function ci(r,e,t){return t==="below"?r<=e?ye.green("\u2713"):ye.yellow("\u26A0"):r>=e?ye.green("\u2713"):ye.yellow("\u26A0")}l(ci,"statusIcon");var gs=class extends de{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 $.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 bg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1103
1122
  ${ye.dim("No performance data yet.")}`),console.log(`${ye.dim("Metrics are collected automatically as you use the CLI.")}
1104
1123
  `),{success:!0,message:"No data"};if(console.log(`
1105
- ${ye.cyan("Performance Report")} ${ye.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=li(i.startup.avg,ln.startup.max,"below");console.log(` Startup: avg ${ye.bold(`${i.startup.avg}ms`)} ${ye.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${ye.dim(`target: <${ln.startup.max}ms`)}`)}if(i.memory){let c=li(i.memory.peakHeapMB,ln.heapMB.max,"below");console.log(` Memory: avg ${ye.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${ye.dim(`target: <${ln.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=li(i.contextCorrectness.rate,ln.contextRate.min,"above");console.log(` Context: ${ye.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${ye.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${ye.dim(`target: ${ln.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=li(i.subtaskHandoff.rate,ln.handoffRate.min,"above");console.log(` Handoff: ${ye.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${ye.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${ye.dim(`target: ${ln.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1106
- ${ye.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${ye.bold(`${u.avg}ms`)} ${ye.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)}}}};Vo();yn();ce();F();Fe();en();Be();import hl from"node:fs/promises";import NP from"node:path";import ee from"chalk";var gs=class extends de{static{l(this,"SetupCommands")}async start(){let t=await(Ke(),pt(st)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1124
+ ${ye.cyan("Performance Report")} ${ye.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ci(i.startup.avg,un.startup.max,"below");console.log(` Startup: avg ${ye.bold(`${i.startup.avg}ms`)} ${ye.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${ye.dim(`target: <${un.startup.max}ms`)}`)}if(i.memory){let c=ci(i.memory.peakHeapMB,un.heapMB.max,"below");console.log(` Memory: avg ${ye.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${ye.dim(`target: <${un.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ci(i.contextCorrectness.rate,un.contextRate.min,"above");console.log(` Context: ${ye.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${ye.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${ye.dim(`target: ${un.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ci(i.subtaskHandoff.rate,un.handoffRate.min,"above");console.log(` Handoff: ${ye.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${ye.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${ye.dim(`target: ${un.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1125
+ ${ye.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${ye.bold(`${u.avg}ms`)} ${ye.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)}}}};Bo();wn();le();F();_e();tn();Be();import hl from"node:fs/promises";import UC from"node:path";import te from"chalk";var fs=class extends de{static{l(this,"SetupCommands")}async start(){let t=await(Xe(),gt(it)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1107
1126
  `),!(await We.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1108
1127
 
1109
1128
  Please install it first:
@@ -1116,15 +1135,15 @@ Next steps:`),console.log(` 1. Open ${t.displayName}`),console.log(" 2. Naviga
1116
1135
  `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await We.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await We.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1117
1136
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1118
1137
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
1119
- \u{1F4DD} Installing global configuration...`);let n=await We.installGlobalConfig(),s=n.path?v.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(Ke(),pt(st)).getActiveProvider()).name==="claude"){console.log(`
1138
+ \u{1F4DD} Installing global configuration...`);let n=await We.installGlobalConfig(),s=n.path?v.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(Xe(),gt(it)).getActiveProvider()).name==="claude"){console.log(`
1120
1139
  \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(`
1121
1140
  \u{1F389} Setup complete!
1122
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=v.getClaudeDir(),t=v.getClaudeSettingsPath(),n=NP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1141
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=v.getClaudeDir(),t=v.getClaudeSettingsPath(),n=UC.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1123
1142
  # prjct Status Line for Claude Code
1124
1143
  # Shows version update notifications and current task
1125
1144
 
1126
1145
  # Current CLI version (embedded at install time)
1127
- CLI_VERSION="${Yn}"
1146
+ CLI_VERSION="${Xn}"
1128
1147
 
1129
1148
  # Read JSON context from stdin (provided by Claude Code)
1130
1149
  read -r json
@@ -1175,18 +1194,25 @@ fi
1175
1194
 
1176
1195
  # Default: show prjct branding
1177
1196
  echo "\u26A1 prjct"
1178
- `;await hl.writeFile(n,s,{mode:493});let o={};if(await M(t))try{o=JSON.parse(await hl.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await hl.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(ee.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ee.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ee.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ee.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ee.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ee.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ee.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ee.bold.cyan("prjct")}${ee.magenta("/")}${ee.green("cli")} ${ee.dim.white(`v${Yn} installed`)}`),console.log(""),console.log(` ${ee.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ee.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ee.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ee.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ee.bold.cyan("\u{1F680} Quick Start")),console.log(ee.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ee.bold("1.")} Initialize your project:`),console.log(` ${ee.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ee.bold("2.")} Start your first task:`),console.log(` ${ee.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ee.bold("3.")} Ship & celebrate:`),console.log(` ${ee.green('prjct ship "user login"')}`),console.log(""),console.log(ee.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ee.dim("Documentation:")} ${ee.cyan("https://prjct.app")}`),console.log(` ${ee.dim("Report issues:")} ${ee.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ee.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};Jn();Ft();F();os();is();import Tg from"node:path";Fe();import et from"node:path";async function LP(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 M(et.join(r,"pnpm-lock.yaml"))?"pnpm":await M(et.join(r,"yarn.lock"))?"yarn":await M(et.join(r,"bun.lockb"))||await M(et.join(r,"bun.lock"))?"bun":(await M(et.join(r,"package-lock.json")),"npm")}l(LP,"detectPackageManager");function Pg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(Pg,"pmRun");function UP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(UP,"pmTest");async function yl(r){let e=et.join(r,"package.json"),t=await pn(e,null);if(t){let o=await LP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:Pg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:Pg(o,"typecheck")}),i.test&&(a.test={tool:o,command:UP(o)}),a}if(await M(et.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Wn(et.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await M(et.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await M(et.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Bn(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await M(et.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await M(et.join(r,"gradlew"))&&(await M(et.join(r,"build.gradle"))||await M(et.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(yl,"detectProjectCommands");Jn();F();nn();import{exec as HP}from"node:child_process";import{promisify as GP}from"node:util";import Dt from"chalk";var zP=GP(HP),ui=new Map,fs=new Map;function Sr(r,e){return`workflow:${r}_${e}`}l(Sr,"prefKey");async function Cg(r,e){let t=Sr(e.hook,e.command);switch(e.scope){case"permanent":await ge.recordDecision(r,t,e.action,"workflow");break;case"session":ui.set(t,e);break;case"once":fs.set(t,e);break}}l(Cg,"setWorkflowPreference");async function WP(r,e){let t={};for(let n of["before","after","skip"]){let s=Sr(n,e),o=fs.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ui.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await ge.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(WP,"getWorkflowPreferences");async function Jt(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await WP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=Sr(e,t);fs.has(i)&&fs.delete(i),console.log(`
1179
- ${Dt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await zP(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(`${Dt.green("\u2713")} ${Dt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Dt.red("\u2717 failed"));let c=y(a)||"Unknown error";return console.log(Dt.dim(c.split(`
1180
- `)[0])),{success:!1,failed:o,output:c}}}l(Jt,"runWorkflowHooks");async function wl(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=Sr(o,s),a=fs.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=ui.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await ge.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(wl,"listWorkflowPreferences");async function xg(r,e,t){let n=Sr(e,t);return fs.delete(n),ui.delete(n),await ge.recordDecision(r,n,"","workflow:remove"),!0}l(xg,"removeWorkflowPreference");function vg(r){if(r.length===0)return`${Dt.dim(Js.NO_PREFERENCES)}
1181
-
1182
- Set one: "${Js.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"?Dt.green("permanent"):t.scope==="session"?Dt.yellow("session"):Dt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Dt.dim(`Modify: "${Js.MODIFY_EXAMPLE}"`)),e.push(Dt.dim(`Remove: "${Js.REMOVE_EXAMPLE}"`)),e.join(`
1183
- `)}l(vg,"formatWorkflowPreferences");Be();var hs=class extends de{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Oe.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1197
+ `;await hl.writeFile(n,s,{mode:493});let o={};if(await M(t))try{o=JSON.parse(await hl.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await hl.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(te.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(te.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(te.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(te.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(te.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(te.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(te.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(` ${te.bold.cyan("prjct")}${te.magenta("/")}${te.green("cli")} ${te.dim.white(`v${Xn} installed`)}`),console.log(""),console.log(` ${te.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${te.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${te.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(te.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(te.bold.cyan("\u{1F680} Quick Start")),console.log(te.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(` ${te.bold("1.")} Initialize your project:`),console.log(` ${te.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${te.bold("2.")} Start your first task:`),console.log(` ${te.green('prjct task "build auth"')}`),console.log(""),console.log(` ${te.bold("3.")} Ship & celebrate:`),console.log(` ${te.green('prjct ship "user login"')}`),console.log(""),console.log(te.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(` ${te.dim("Documentation:")} ${te.cyan("https://prjct.app")}`),console.log(` ${te.dim("Report issues:")} ${te.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(te.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};qn();_t();Zs();F();is();as();import Ag from"node:path";_e();import st from"node:path";async function HC(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 M(st.join(r,"pnpm-lock.yaml"))?"pnpm":await M(st.join(r,"yarn.lock"))?"yarn":await M(st.join(r,"bun.lockb"))||await M(st.join(r,"bun.lock"))?"bun":(await M(st.join(r,"package-lock.json")),"npm")}l(HC,"detectPackageManager");function Cg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(Cg,"pmRun");function GC(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(GC,"pmTest");async function yl(r){let e=st.join(r,"package.json"),t=await mn(e,null);if(t){let o=await HC(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:Cg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:Cg(o,"typecheck")}),i.test&&(a.test={tool:o,command:GC(o)}),a}if(await M(st.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Bn(st.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await M(st.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await M(st.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Vn(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await M(st.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await M(st.join(r,"gradlew"))&&(await M(st.join(r,"build.gradle"))||await M(st.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(yl,"detectProjectCommands");Zs();F();import{exec as BC}from"node:child_process";import{promisify as VC}from"node:util";import Je from"chalk";qn();F();sn();import{exec as zC}from"node:child_process";import{promisify as WC}from"node:util";import E1 from"chalk";var R1=WC(zC),Pg=new Map,xg=new Map;function vg(r,e){return`workflow:${r}_${e}`}l(vg,"prefKey");async function Tg(r,e){let t={};for(let n of["before","after","skip"]){let s=vg(n,e),o=xg.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Pg.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await xe.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(Tg,"getWorkflowPreferences");async function Eg(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=vg(o,s),a=xg.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Pg.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await xe.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(Eg,"listWorkflowPreferences");var li=VC(BC);async function qt(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=ft.getRulesForCommand(r,e).filter(p=>p.position===t),a=await Tg(r,e);if(a.skip)return s;let c=a[t],u=i.filter(p=>p.type==="gate");for(let p of u){let g=p.description||p.action;console.log(`
1198
+ ${Je.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let f=Date.now();await li(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let k=Date.now()-f,S=k>1e3?`${(k/1e3).toFixed(1)}s`:`${k}ms`;console.log(`${Je.green("\u2713")} ${Je.dim(`gate passed (${S})`)}`)}catch(f){return console.log(`${Je.red("\u2717")} gate failed: ${g}`),s.gatesFailed.push(g),s.success=!1,s.output+=`Gate failed: ${g}
1199
+ ${y(f)}
1200
+ `,s}}let d=i.filter(p=>p.type==="hook");for(let p of d){console.log(`
1201
+ ${Je.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await li(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${Je.green("\u2713")} ${Je.dim(`(${k})`)}`)}catch(g){console.log(`${Je.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),s.hooksFailed.push(p.description||p.action),s.output+=`Hook failed: ${p.action}
1202
+ ${y(g)}
1203
+ `}}if(c){console.log(`
1204
+ ${Je.dim(`[legacy] ${t}-${e}: ${c}`)}`);try{let p=Date.now();await li(c,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Je.green("\u2713")} ${Je.dim(`(${f})`)}`)}catch(p){console.log(`${Je.yellow("\u26A0")} legacy hook failed: ${c}`),s.hooksFailed.push(c),s.output+=`Legacy hook failed: ${c}
1205
+ ${y(p)}
1206
+ `}}let m=i.filter(p=>p.type==="step");for(let p of m){console.log(`
1207
+ ${Je.dim(`[step] ${e}: ${p.action}`)}`);try{let g=Date.now();await li(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${Je.green("\u2713")} ${Je.dim(`step passed (${k})`)}`),s.stepsRun.push(p.description||p.action)}catch(g){return console.log(`${Je.red("\u2717")} step failed: ${p.action}`),s.gatesFailed.push(p.description||p.action),s.success=!1,s.output+=`Step failed: ${p.action}
1208
+ ${y(g)}
1209
+ `,s}}return s}l(qt,"executeWorkflowRules");Be();var hs=class extends de{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Fe.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1184
1210
  ${o.stderr}`.trim(),a=i.split(`
1185
1211
  `),c;for(let m=a.length-1;m>=0;m--)if(a[m].startsWith("__EXIT:")){c=a[m];break}let u=c?Number(c.replace("__EXIT:","").trim()):1,d=i.split(`
1186
1212
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
1187
- `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await _.getCurrentTask(o))?.description||"current work");let a=await Jt(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await Xe.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:L.getTimestamp()}),await ge.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await ge.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await ge.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await Jt(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=vo("ship"),S=ie(Et(`Shipped: ${i}`,`Version: ${d}`),Le("Results",lt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`])),Me(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(S)}else h.done(`v${d} shipped`),ut("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _runLint(e){try{let t=await yl(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 C(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await yl(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 C(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Tg.join(e,"package.json"),n=await se.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 se.writeJson(t,n)),c}catch(t){if(C(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=Tg.join(n,"CHANGELOG.md"),o=await se.readFile(s,`# Changelog
1213
+ `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await qt(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Hook failed: ${c.hooksFailed.join(", ")}`};n.md||h.step(1,5,`Linting ${i}...`);let u=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let d=await this._runTests(t),m=ft.getRulesForCommand(o,"ship").filter(S=>S.type==="step"&&S.enabled);for(let S of m){n.md||h.step(2,5,`Running step: ${S.action}...`);let{exitCode:I}=await this._runWithExitCode(S.action);if(I!==0){let D=`Custom step failed: ${S.action}`;return n.md?console.log(`> ${D}`):h.fail(D),{success:!1,error:D}}}n.md||h.step(3,5,"Updating version...");let p=await this._bumpVersion(t);await this._updateChangelog(i,p,t),n.md||h.step(4,5,"Committing...");let g=await this._createShipCommit(i,t),f="skipped";if(g.success){n.md||h.step(5,5,"Pushing...");let S=await this._gitPush(t);f=S.success?"pushed":S.message}if(await Ze.addShipped(o,{name:i,version:p}),await this.logToMemory(t,"feature_shipped",{feature:i,version:p,timestamp:U.getTimestamp()}),await xe.learnDecision(o,"commit_footer","prjct","ship"),d.success&&await xe.recordDecision(o,"test_before_ship","true","ship"),(!u.success||!d.success)&&await xe.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await qt(o,"ship","after",{projectPath:t,skipRules:n.skipHooks}),n.md){let S=xo("ship"),I=X(Ye(`Shipped: ${i}`,`Version: ${p}`),je("Results",et([`Lint: ${u.message}`,`Tests: ${d.message}`,`Commit: ${g.success?"created":g.message}`,`Push: ${f}`])),fe(S.map(D=>({label:D.desc,command:D.cmd}))));console.log(I)}else h.done(`v${p} shipped`),pt("ship");return{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 yl(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return P(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await yl(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return P(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Ag.join(e,"package.json"),n=await re.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 re.writeJson(t,n)),c}catch(t){if(P(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=Ag.join(n,"CHANGELOG.md"),o=await re.readFile(s,`# Changelog
1188
1214
 
1189
- `),i=`## [${t}] - ${L.formatDate(new Date)}
1215
+ `),i=`## [${t}] - ${U.formatDate(new Date)}
1190
1216
 
1191
1217
  ### Added
1192
1218
  - ${e}
@@ -1195,34 +1221,34 @@ ${o.stderr}`.trim(),a=i.split(`
1195
1221
 
1196
1222
  `,`# Changelog
1197
1223
 
1198
- ${i}`);await se.writeFile(s,a)}catch(s){C(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Oe.get("Bash")("git add .");let n=`feat: ${e}
1224
+ ${i}`);await re.writeFile(s,a)}catch(s){P(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Fe.get("Bash")("git add .");let n=`feat: ${e}
1199
1225
 
1200
- Generated with [p/](https://www.prjct.app/)`;return await Oe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return C(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Oe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return C(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};ot();ce();xo();F();bn();Be();import BP from"node:fs/promises";import VP from"node:path";import ys from"chalk";var ws=class extends de{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(ys.dim(`[dry-run] Would update ${o.length} project(s)
1201
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${ys.dim("would update")} ${m}`);continue}try{let p=await Ks(d),g=await Co(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${ys.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${ys.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${ys.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${ys.red("\u2717")} ${m}: ${y(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(y(o)),{success:!1,error:y(o)}}}async getCurrentProjectId(e){let t=await $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=VP.join(v.getGlobalBasePath(),"projects");try{return(await BP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};uc();Vn();Ja();F();Tn();Be();import we from"chalk";var Ss=class extends de{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 $.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 Qe.getAll(s);if(i.length===0)return console.log(`
1226
+ Generated with [p/](https://www.prjct.app/)`;return await Fe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Fe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};ct();le();Po();F();Cn();Be();import JC from"node:fs/promises";import qC from"node:path";import ys from"chalk";var ws=class extends de{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(ys.dim(`[dry-run] Would update ${o.length} project(s)
1227
+ `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${ys.dim("would update")} ${m}`);continue}try{let p=await qs(d),g=await Co(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${ys.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${ys.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${ys.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${ys.red("\u2717")} ${m}: ${y(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(y(o)),{success:!1,error:y(o)}}}async getCurrentProjectId(e){let t=await $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=qC.join(v.getGlobalBasePath(),"projects");try{return(await JC.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};uc();Jn();Va();F();En();Be();import we from"chalk";var ks=class extends de{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 $.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 tt.getAll(s);if(i.length===0)return console.log(`
1202
1228
  ${we.dim("No velocity data yet.")}`),console.log(`${we.dim("Complete tasks with estimates to build velocity history.")}
1203
- `),{success:!0,message:"No data"};let a=Mo(i,o);await Va.saveMetrics(s,a),console.log(`
1229
+ `),{success:!0,message:"No data"};let a=$o(i,o);await Ba.saveMetrics(s,a),console.log(`
1204
1230
  ${we.cyan("Sprint Velocity")} ${we.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?we.green:m.estimationAccuracy>=60?we.yellow:we.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${we.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?we.green("\u2191"):a.velocityTrend==="declining"?we.red("\u2193"):we.dim("\u2192");if(console.log(` Average: ${we.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${we.bold(`${a.estimationAccuracy}%`)} ${we.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1205
1231
  ${we.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${we.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${we.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${we.green("\u2713")} ${m.category} tasks estimated within ${we.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=op(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1206
- ${we.dim("Projection:")}`),console.log(` Backlog: ${we.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${we.bold(p)}`)}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 $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Zt,...n.velocity}}catch{}return Zt}};jc();Ec();import lC from"node:fs/promises";import uC from"node:path";Tn();var JP=[1,2,3,5,8,13,21],qP={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}},Ag=l(r=>JP.includes(r),"isValidPoint"),di=l(r=>qP[r],"pointsToMinutes"),Eg=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"),Ig=l(r=>{let e=di(r);return`${Eg(e.min)}\u2013${Eg(e.max)}`},"pointsToTimeRange");ce();ko();var pi=300*1e3,He=new Tt({ttl:pi,maxSize:100}),jt=new Tt({ttl:pi,maxSize:10}),ks=new Tt({ttl:pi,maxSize:5}),bs=new Tt({ttl:pi,maxSize:5});function Sl(){He.clear(),jt.clear(),ks.clear(),bs.clear()}l(Sl,"clearLinearCache");function kl(){return{issues:He.stats(),assignedIssues:jt.stats(),teams:ks.stats(),projects:bs.stats()}}l(kl,"getLinearCacheStats");F();bl();var ZP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},eC={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},jg={none:0,urgent:1,high:2,medium:3,low:4},gi=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 mi("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(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?jg[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=jg[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:ZP[t?.type||"backlog"]||"backlog",priority:eC[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):[]}},tt=new gi;var fi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&tt.isConfigured()}async initialize(e){this.initialized||(await tt.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=jt.get(t);if(n)return n;let s=await tt.fetchAssignedIssues(e);jt.set(t,s);for(let o of s)He.set(`issue:${o.id}`,o),He.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=jt.get(n);if(s)return s;let o=await tt.fetchTeamIssues(e,t);jt.set(n,o);for(let i of o)He.set(`issue:${i.id}`,i),He.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=He.get(t);if(n)return n;let s=await tt.fetchIssue(e);return s&&(He.set(`issue:${s.id}`,s),He.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await tt.createIssue(e);return He.set(`issue:${t.id}`,t),He.set(`issue:${t.externalId}`,t),jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await tt.updateIssue(e,t);return He.set(`issue:${n.id}`,n),He.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await tt.markInProgress(e),He.delete(`issue:${e}`),jt.clear()}async markDone(e){this.ensureInitialized(),await tt.markDone(e),He.delete(`issue:${e}`),jt.clear()}async addComment(e,t){this.ensureInitialized(),await tt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ks.get("teams");if(e)return e;let t=await tt.getTeams();return ks.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=bs.get("projects");if(e)return e;let t=await tt.getProjects();return bs.set("projects",t),t}clearCache(){Sl()}getCacheStats(){return kl()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},yt=new fi;Bi();le();F();var Rg=1800*1e3,hi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await yt.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Rg,issues:o};return D.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await yt.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await yt.markInProgress(t):n==="done"&&await yt.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Rg;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return D.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){D.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=uu("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},tC=new hi;bt();ce();le();ne();import{exec as nC}from"node:child_process";import{promisify as sC}from"node:util";var $g=sC(nC),Ps="session-snapshot",rC=30,Pl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:k(),resumeHint:c};return D.setDoc(e,Ps,u),u}getSnapshot(e){try{return D.getDoc(e,Ps)}catch{return null}}clearSnapshot(e){try{D.deleteDoc(e,Ps)}catch{}}async listAllSnapshots(){let e=await v.listProjects(),t=[];for(let n of e)try{if(!D.exists(n))continue;let s=D.getDoc(n,Ps);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=rC){let t=await v.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!D.exists(o))continue;let i=D.getDoc(o,Ps);i&&new Date(i.timestamp).getTime()<n&&(D.deleteDoc(o,Ps),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${Gt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${Gt(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1207
- `)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${Gt(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await $g("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await $g("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1208
- `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},un=new Pl;Ft();dc();F();os();is();F();Fe();bl();import oC from"node:fs/promises";import iC from"node:os";import aC from"node:path";function cC(r){return aC.join(iC.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(cC,"getCredentialsPath");async function yi(r){let e=cC(r);if(!await M(e))return{};try{return JSON.parse(await oC.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(yi,"getProjectCredentials");async function Cl(r){let e=await yi(r);return e.linear?.apiKey?e.linear.apiKey:mi("linear-api-key")}l(Cl,"getLinearApiKey");Tn();Be();var Cs=class extends de{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 $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Jt(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await yi(o),S=await Cl(o);if(S&&f.linear?.teamId){await yt.initializeFromApiKey(S,f.linear.teamId);let b=await yt.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await yt.markInProgress(e))}}catch{}if(n.md){let f=await _.getCurrentTask(o);if(f)return _t("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:oe(),description:c,sessionId:oe(),linearId:a});let S=v.getGlobalProjectPath(o),[b,I,R,V]=await Promise.all([dC(),ct.getActive(o).catch(()=>null),pC(S),Fo(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),me=null;try{let O=un.getSnapshot(o);O&&(me=un.formatContinuityContext(O),un.clearSnapshot(o))}catch{}let Se=Ka({description:c,branch:b,linearId:a}),Ge=mC(I,R),P=Ad(V.files.map(O=>({path:O.path,description:O.reasons.join(", ")}))),A=gC(R),ke=fC(I),Un=Me([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(ie(me,Se,Ge,P,A,ke,Un)),await this.logToMemory(t,"task_started",{task:e,timestamp:L.getTimestamp()}),await Jt(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Wo.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:oe(),description:c,sessionId:oe(),linearId:a});let m=await Tc.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),tr("working"),ut("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:L.getTimestamp()}),await Jt(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Ag,pointsToMinutes:di,pointsToTimeRange:Ig,storeEstimate:l(async f=>{let S=di(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?_t("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?L.calculateDuration(new Date(i.startedAt)):void 0,c=Ka({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Ed(u,d):"",p=Me([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?_t("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?_t("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await Jt(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=L.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await Qe.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:L.getTimestamp(),estimatedDuration:d?Mg(d):"0m",actualDuration:c||"0m",variance:d?hC(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,S=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Mg(d)}) \u2192 ${b}${S}%`}await _.completeTask(s,t.feedback);try{un.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await yi(s),S=await Cl(s);S&&f.linear?.teamId&&(await yt.initializeFromApiKey(S,f.linear.teamId),await yt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(ie(Et("Completed",`${a}${f}`),mt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Me([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),tr("completed"),ut("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:L.getTimestamp()}),await Jt(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(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await fe.getActiveTasks(s);if(o.length===0)return t.md?_t("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(ie(Le("Queue",`${o.length} task${o.length!==1?"s":""}`),lt(i,!0),Me([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),ut("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?_t("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=L.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await un.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(ie(Et("Task Paused",`**Paused:** ${i.description}`),mt({Reason:e||void 0,"Duration worked":a||void 0}),Me([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),tr("paused"),ut("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:L.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?_t("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(ie(Et("Task Resumed",`**Resumed:** ${a.description}`),Me([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),tr("working"),ut("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:L.getTimestamp()}),{success:!0,task:a.description}):(n.md?_t("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await wl(s);return console.log(vg(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await Cg(s,{...o,createdAt:L.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await xg(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>wl(s),"listWorkflowPreferences")}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await un.cleanup();return t.md?console.log(Et("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await un.listAllSnapshots();if(n.length===0)return t.md?_t("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=L.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(ie(Le("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),lt(s),Me([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=L.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Mg(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(Mg,"formatMinutesToDuration");async function dC(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(dC,"getGitBranch");async function pC(r){try{let e=uC.join(r,"analysis","repo-analysis.json"),t=await lC.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e),null}}l(pC,"loadRepoAnalysis");function mC(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=mt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,S])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${S}\``);m=`### Commands
1209
- ${lt(g)}`}return[u?`### Project
1232
+ ${we.dim("Projection:")}`),console.log(` Backlog: ${we.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${we.bold(p)}`)}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 $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...en,...n.velocity}}catch{}return en}};Rc();Ec();import dP from"node:fs/promises";import pP from"node:path";En();var KC=[1,2,3,5,8,13,21],YC={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}},Dg=l(r=>KC.includes(r),"isValidPoint"),ui=l(r=>YC[r],"pointsToMinutes"),Ig=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"),Rg=l(r=>{let e=ui(r);return`${Ig(e.min)}\u2013${Ig(e.max)}`},"pointsToTimeRange");le();ko();var di=300*1e3,He=new It({ttl:di,maxSize:100}),jt=new It({ttl:di,maxSize:10}),Ss=new It({ttl:di,maxSize:5}),bs=new It({ttl:di,maxSize:5});function wl(){He.clear(),jt.clear(),Ss.clear(),bs.clear()}l(wl,"clearLinearCache");function kl(){return{issues:He.stats(),assignedIssues:jt.stats(),teams:Ss.stats(),projects:bs.stats()}}l(kl,"getLinearCacheStats");F();Sl();var tP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},nP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},$g={none:0,urgent:1,high:2,medium:3,low:4},mi=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 pi("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(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?$g[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=$g[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:tP[t?.type||"backlog"]||"backlog",priority:nP[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):[]}},rt=new mi;var gi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&rt.isConfigured()}async initialize(e){this.initialized||(await rt.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=jt.get(t);if(n)return n;let s=await rt.fetchAssignedIssues(e);jt.set(t,s);for(let o of s)He.set(`issue:${o.id}`,o),He.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=jt.get(n);if(s)return s;let o=await rt.fetchTeamIssues(e,t);jt.set(n,o);for(let i of o)He.set(`issue:${i.id}`,i),He.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=He.get(t);if(n)return n;let s=await rt.fetchIssue(e);return s&&(He.set(`issue:${s.id}`,s),He.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await rt.createIssue(e);return He.set(`issue:${t.id}`,t),He.set(`issue:${t.externalId}`,t),jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await rt.updateIssue(e,t);return He.set(`issue:${n.id}`,n),He.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await rt.markInProgress(e),He.delete(`issue:${e}`),jt.clear()}async markDone(e){this.ensureInitialized(),await rt.markDone(e),He.delete(`issue:${e}`),jt.clear()}async addComment(e,t){this.ensureInitialized(),await rt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Ss.get("teams");if(e)return e;let t=await rt.getTeams();return Ss.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=bs.get("projects");if(e)return e;let t=await rt.getProjects();return bs.set("projects",t),t}clearCache(){wl()}getCacheStats(){return kl()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},St=new gi;Wi();ae();F();var Mg=1800*1e3,fi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await St.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Mg,issues:o};return A.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await St.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await St.markInProgress(t):n==="done"&&await St.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Mg;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return A.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){A.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=lu("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},sP=new fi;xt();le();ae();se();import{exec as rP}from"node:child_process";import{promisify as oP}from"node:util";var Og=oP(rP),Cs="session-snapshot",iP=30,bl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return A.setDoc(e,Cs,u),u}getSnapshot(e){try{return A.getDoc(e,Cs)}catch{return null}}clearSnapshot(e){try{A.deleteDoc(e,Cs)}catch{}}async listAllSnapshots(){let e=await v.listProjects(),t=[];for(let n of e)try{if(!A.exists(n))continue;let s=A.getDoc(n,Cs);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=iP){let t=await v.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!A.exists(o))continue;let i=A.getDoc(o,Cs);i&&new Date(i.timestamp).getTime()<n&&(A.deleteDoc(o,Cs),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${zt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${zt(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1233
+ `)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${zt(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await Og("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await Og("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1234
+ `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},dn=new bl;_t();Zs();dc();F();is();as();F();_e();Sl();import aP from"node:fs/promises";import cP from"node:os";import lP from"node:path";function uP(r){return lP.join(cP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(uP,"getCredentialsPath");async function hi(r){let e=uP(r);if(!await M(e))return{};try{return JSON.parse(await aP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(hi,"getProjectCredentials");async function Cl(r){let e=await hi(r);return e.linear?.apiKey?e.linear.apiKey:pi("linear-api-key")}l(Cl,"getLinearApiKey");En();Be();var Ps=class extends de{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 $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await qt(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await hi(o),k=await Cl(o);if(k&&f.linear?.teamId){await St.initializeFromApiKey(k,f.linear.teamId);let S=await St.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await St.markInProgress(e))}}catch{}if(n.md){let f=await _.getCurrentTask(o);if(f)return Nt("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:ie(),description:c,sessionId:ie(),linearId:a});let k=v.getGlobalProjectPath(o),[S,I,D,V]=await Promise.all([mP(),dt.getActive(o).catch(()=>null),gP(k),Oo(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),me=null;try{let O=dn.getSnapshot(o);O&&(me=dn.formatContinuityContext(O),dn.clearSnapshot(o))}catch{}let Se=Ka({description:c,branch:S,linearId:a}),Ge=fP(I,D),C=Ad(V.files.map(O=>({path:O.path,description:O.reasons.join(", ")}))),R=hP(D),be=yP(I),Hn=fe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(X(me,Se,Ge,C,R,be,Hn)),await this.logToMemory(t,"task_started",{task:e,timestamp:U.getTimestamp()}),await qt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await zo.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:ie(),description:c,sessionId:ie(),linearId:a});let m=await Tc.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),tr("working"),pt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:U.getTimestamp()}),await qt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Dg,pointsToMinutes:ui,pointsToTimeRange:Rg,storeEstimate:l(async f=>{let k=ui(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?U.calculateDuration(new Date(i.startedAt)):void 0,c=Ka({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Ed(u,d):"",p=fe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(X(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?Nt("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await qt(s,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=U.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await tt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:U.getTimestamp(),estimatedDuration:d?Fg(d):"0m",actualDuration:c||"0m",variance:d?wP(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${Fg(d)}) \u2192 ${S}${k}%`}await _.completeTask(s,t.feedback);try{dn.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await hi(s),k=await Cl(s);k&&f.linear?.teamId&&(await St.initializeFromApiKey(k,f.linear.teamId),await St.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(X(Ye("Completed",`${a}${f}`),ht({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),fe([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),tr("completed"),pt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:U.getTimestamp()}),await qt(s,"done","after",{projectPath:e,skipRules: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(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ge.getActiveTasks(s);if(o.length===0)return t.md?Nt("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(X(je("Queue",`${o.length} task${o.length!==1?"s":""}`),et(i,!0),fe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),pt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=U.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await dn.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(X(Ye("Task Paused",`**Paused:** ${i.description}`),ht({Reason:e||void 0,"Duration worked":a||void 0}),fe([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),tr("paused"),pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:U.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?Nt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(X(Ye("Task Resumed",`**Resumed:** ${a.description}`),fe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),tr("working"),pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:U.getTimestamp()}),{success:!0,task:a.description}):(n.md?Nt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"",a=i.split(/\s+/)[0]?.toLowerCase();switch(a){case"add":return this._workflowAdd(i.slice(3).trim(),o,n);case"gate":return this._workflowGate(i.slice(4).trim(),o,n);case"rm":return this._workflowRm(i.slice(2).trim(),o,n);case"reset":return this._workflowReset(o,n);default:return this._workflowShow(a||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let d='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let d='Position must be "before" or "after"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}if(!c||!["task","done","ship","sync"].includes(c)){let d="Command must be one of: task, done, ship, sync";return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=ft.addRule(t,{type:"hook",command:c,position:a,action:s,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(X(Ye("Rule Added",`#${u} [hook] ${a} ${c} \u2192 \`${s}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):h.done(`rule #${u} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:u}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase();if(!o||!["task","done","ship","sync"].includes(o)){let u='Usage: prjct workflow gate <task|done|ship|sync> "command"';return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let i=e.slice(e.indexOf(o)+o.length).trim(),[a]=this._parseAction(i);if(!a){let u='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=ft.addRule(t,{type:"gate",command:o,position:"before",action:a,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(X(Ye("Gate Added",`#${c} [gate] before ${o} \u2192 \`${a}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${c} --md`}]))):h.done(`gate #${c} added: before ${o} \u2192 ${a}`),{success:!0,ruleId:c}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!ft.removeRule(t,s)){let i=`Rule #${s} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(X(Ye("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=ft.resetRules(e);return t.md?console.log(X(Ye("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;e&&s.includes(e)?o=ft.getRulesForCommand(t,e):o=ft.getAllRules(t);let i=await Eg(t);if(o.length===0&&i.length===0)return n.md?console.log(X(je("Workflow Rules","No rules configured"),fe([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[],legacy:i};if(n.md){let a=[];for(let u of o){let d=u.enabled?"":" (disabled)";a.push(`#${u.id} [${u.type}] ${u.position} ${u.command} \u2192 \`${u.action}\`${d}`)}for(let u of i)a.push(`[legacy] ${u.key} \u2192 \`${u.action}\` (${u.scope})`);let c=e?`Workflow Rules: ${e}`:"Workflow Rules";console.log(X(je(c,`${o.length} rule${o.length!==1?"s":""}`),et(a),fe([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let a=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(a),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");for(let c of o){let u=c.enabled?"":" (disabled)";console.log(` #${c.id} [${c.type}] ${c.position.padEnd(6)} ${c.command.padEnd(5)} \u2192 ${c.action}${u}`)}if(i.length>0){console.log(""),console.log(" Legacy preferences:");for(let c of i)console.log(` [legacy] ${c.key.padEnd(15)} \u2192 ${c.action} (${c.scope})`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o,legacy:i}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await dn.cleanup();return t.md?console.log(Ye("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await dn.listAllSnapshots();if(n.length===0)return t.md?Nt("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=U.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(X(je("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),et(s),fe([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=U.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Fg(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(Fg,"formatMinutesToDuration");async function mP(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(mP,"getGitBranch");async function gP(r){try{let e=pP.join(r,"analysis","repo-analysis.json"),t=await dP.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(gP,"loadRepoAnalysis");function fP(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=ht(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
1235
+ ${et(g)}`}return[u?`### Project
1210
1236
  ${u}`:null,m].filter(Boolean).join(`
1211
1237
 
1212
- `)||null}l(mC,"buildProjectContext");function gC(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Id(e)}l(gC,"buildRules");function fC(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"";return`- **${o.name}**: ${o.description}${i}`});e.push(`### Patterns (follow these)
1238
+ `)||null}l(fP,"buildProjectContext");function hP(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Id(e)}l(hP,"buildRules");function yP(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"";return`- **${o.name}**: ${o.description}${i}`});e.push(`### Patterns (follow these)
1213
1239
  ${s.join(`
1214
1240
  `)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s=n.map(o=>`- **${o.issue}** \u2014 \`${o.file}\` \u2192 ${o.suggestion}`);e.push(`### Anti-patterns (avoid these)
1215
1241
  ${s.join(`
1216
1242
  `)}`)}return e.length>0?e.join(`
1217
1243
 
1218
- `):null}l(fC,"buildPatterns");function hC(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(hC,"formatVariance");var Nn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Cs,this.planning=new Rn,this.shipping=new hs,this.analytics=new us,this.performanceCmds=new ms,this.maintenance=new ps,this.analysis=new Fn,this.setupCmds=new gs,this.updateCmds=new ws,this.velocityCmds=new Ss,this.contextCmds=new _n,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},xH=new Nn;Jo();var Og={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}},Fg=[{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:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Vo();yn();ce();F();Fe();Be();import{execSync as wi}from"node:child_process";import nt from"node:fs/promises";import yC from"node:os";import qt from"node:path";import wC from"node:readline";import pe from"chalk";var Si="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",kr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function xl(r){let e=0;try{let t=await nt.readdir(r,{withFileTypes:!0});for(let n of t){let s=qt.join(r,n.name);if(n.isDirectory())e+=await xl(s);else try{let o=await nt.stat(s);e+=o.size}catch{}}}catch{}return e}l(xl,"getDirectorySize");function _g(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(_g,"formatSize");async function SC(r){try{return(await nt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(SC,"countDirectoryItems");function kC(){let r={homebrew:!1,npm:!1};try{wi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{wi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(kC,"detectInstallation");async function bC(){let r=[],e=zu(),t=v.getGlobalBasePath(),n=await M(t),s=n?await SC(qt.join(t,"projects")):0,o=n?await xl(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 M(i),c=!1;if(a)try{let Se=await nt.readFile(i,"utf-8");c=Se.includes(Si)&&Se.includes(kr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await M(u),m=d?await xl(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await M(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=qt.join(e.claude.config,"prjct-statusline.sh"),S=await M(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let b=e.gemini.router,I=await M(b);r.push({path:b,type:"file",description:"Gemini router",exists:I});let R=qt.join(e.gemini.config,"GEMINI.md"),V=await M(R),me=!1;if(V)try{let Se=await nt.readFile(R,"utf-8");me=Se.includes(Si)&&Se.includes(kr)}catch{}return V&&me&&r.push({path:R,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(bC,"gatherUninstallItems");async function PC(r){try{let e=await nt.readFile(r,"utf-8");if(!e.includes(Si)||!e.includes(kr))return!1;let t=e.indexOf(Si),n=e.indexOf(kr)+kr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1244
+ `):null}l(yP,"buildPatterns");function wP(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(wP,"formatVariance");var Ln=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ps,this.planning=new $n,this.shipping=new hs,this.analytics=new ds,this.performanceCmds=new gs,this.maintenance=new ms,this.analysis=new _n,this.setupCmds=new fs,this.updateCmds=new ws,this.velocityCmds=new ks,this.contextCmds=new Nn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},WH=new Ln;Vo();var _g={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}},Ng=[{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:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Bo();wn();le();F();_e();Be();import{execSync as yi}from"node:child_process";import ot from"node:fs/promises";import kP from"node:os";import Kt from"node:path";import SP from"node:readline";import pe from"chalk";var wi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",kr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Pl(r){let e=0;try{let t=await ot.readdir(r,{withFileTypes:!0});for(let n of t){let s=Kt.join(r,n.name);if(n.isDirectory())e+=await Pl(s);else try{let o=await ot.stat(s);e+=o.size}catch{}}}catch{}return e}l(Pl,"getDirectorySize");function Lg(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(Lg,"formatSize");async function bP(r){try{return(await ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(bP,"countDirectoryItems");function CP(){let r={homebrew:!1,npm:!1};try{yi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{yi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(CP,"detectInstallation");async function PP(){let r=[],e=Gu(),t=v.getGlobalBasePath(),n=await M(t),s=n?await bP(Kt.join(t,"projects")):0,o=n?await Pl(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=Kt.join(e.claude.config,"CLAUDE.md"),a=await M(i),c=!1;if(a)try{let Se=await ot.readFile(i,"utf-8");c=Se.includes(wi)&&Se.includes(kr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await M(u),m=d?await Pl(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await M(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=Kt.join(e.claude.config,"prjct-statusline.sh"),k=await M(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let S=e.gemini.router,I=await M(S);r.push({path:S,type:"file",description:"Gemini router",exists:I});let D=Kt.join(e.gemini.config,"GEMINI.md"),V=await M(D),me=!1;if(V)try{let Se=await ot.readFile(D,"utf-8");me=Se.includes(wi)&&Se.includes(kr)}catch{}return V&&me&&r.push({path:D,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(PP,"gatherUninstallItems");async function xP(r){try{let e=await ot.readFile(r,"utf-8");if(!e.includes(wi)||!e.includes(kr))return!1;let t=e.indexOf(wi),n=e.indexOf(kr)+kr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1219
1245
 
1220
- `).trim(),!s||s.trim().length===0?await nt.unlink(r):await nt.writeFile(r,`${s}
1221
- `,"utf-8"),!0}catch{return!1}}l(PC,"removePrjctSection");async function CC(){let r=yC.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=qt.join(r,`.prjct-backup-${e}`);try{await nt.mkdir(t,{recursive:!0});let n=v.getGlobalBasePath();return await M(n)&&await Ng(n,qt.join(t,".prjct-cli")),t}catch{return null}}l(CC,"createBackup");async function Ng(r,e){await nt.mkdir(e,{recursive:!0});let t=await nt.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 Ng(s,o):await nt.copyFile(s,o)}}l(Ng,"copyDirectory");async function xC(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await PC(o.path)&&n.push(o.path):o.type==="directory"?(await nt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await nt.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||wi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||wi("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(xC,"performUninstall");async function vC(r){let e=wC.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(vC,"promptConfirmation");async function TC(r={},e=process.cwd()){let t=await bC(),n=kC(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(pe.yellow(`
1222
- 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(pe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(pe.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=v.getDisplayPath(c.path),d="";c.type==="section"?d=pe.dim("(section only)"):c.size&&(d=pe.dim(`(${_g(c.size)})`)),console.log(` ${pe.cyan(u.padEnd(35))} ${d}`),console.log(` ${pe.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${pe.cyan("Homebrew".padEnd(35))} ${pe.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${pe.cyan("npm global".padEnd(35))} ${pe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(pe.dim(` Total size: ${_g(o)}`)),console.log("")),r.dryRun)return console.log(pe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(pe.blue("Creating backup..."));let c=await CC();c?(console.log(pe.green(`Backup created: ${v.getDisplayPath(c)}`)),console.log("")):console.log(pe.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(pe.yellow('Type "uninstall" to confirm:')),!await vC("> ")))return console.log(pe.yellow(`
1223
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(pe.blue("Removing prjct..."));let{deleted:i,errors:a}=await xC(t,n,r);if(console.log(""),i.length>0&&console.log(pe.green(`Removed ${i.length} items`)),a.length>0){console.log(pe.yellow(`
1224
- ${a.length} errors:`));for(let c of a)console.log(pe.red(` - ${c}`))}return console.log(""),console.log(pe.green("prjct has been uninstalled.")),console.log(pe.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(TC,"uninstall");var ki=class extends de{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return TC(e,t)}};var Ln=new Cs,bi=new Rn,EC=new hs,Lg=new us,AC=new ms,xs=new ps,vs=new Fn,Ug=new gs,IC=new _n,DC=new Ss,jC=new ki,RC=new ws;function $C(){for(let[r,e]of Object.entries(Og))H.registerCategory(r,e)}l($C,"registerCategories");function Hg(){if(H.has("work"))return;$C();let r=l(e=>Fg.find(t=>t.name===e),"getMeta");H.registerMethod("task",Ln,"now",r("task")),H.registerMethod("done",Ln,"done",r("done")),H.registerMethod("next",Ln,"next",r("next")),H.registerMethod("pause",Ln,"pause",r("pause")),H.registerMethod("resume",Ln,"resume",r("resume")),H.registerMethod("workflow",Ln,"workflow",r("workflow")),H.registerMethod("sessions",Ln,"sessions",r("sessions")),H.registerMethod("init",bi,"init",r("init")),H.registerMethod("bug",bi,"bug",r("bug")),H.registerMethod("idea",bi,"idea",r("idea")),H.registerMethod("spec",bi,"spec",r("spec")),H.registerMethod("ship",EC,"ship",r("ship")),H.registerMethod("dash",Lg,"dash",r("dash")),H.registerMethod("help",Lg,"help",r("help")),H.registerMethod("perf",AC,"perf",r("perf")),H.registerMethod("velocity",DC,"velocity",r("velocity")),H.registerMethod("cleanup",xs,"cleanup",r("cleanup")),H.registerMethod("design",xs,"design",r("design")),H.registerMethod("recover",xs,"recover",r("recover")),H.registerMethod("undo",xs,"undo",r("undo")),H.registerMethod("redo",xs,"redo",r("redo")),H.registerMethod("history",xs,"history",r("history")),H.registerMethod("analyze",vs,"analyze",r("analyze")),H.registerMethod("sync",vs,"sync",r("sync")),H.registerMethod("stats",vs,"stats",r("stats")),H.registerMethod("status",vs,"status",r("status")),H.registerMethod("seal",vs,"seal",r("seal")),H.registerMethod("verify",vs,"verify",r("verify")),H.registerMethod("start",Ug,"start",r("start")),H.registerMethod("setup",Ug,"setup",r("setup")),H.registerMethod("uninstall",jC,"uninstall",r("uninstall")),H.registerMethod("update",RC,"update",r("update")),H.registerMethod("context",IC,"context",r("context"))}l(Hg,"registerAllCommands");Hg();ot();Fi();import{Hono as WC}from"hono";import{cors as BC}from"hono/cors";import{logger as VC}from"hono/logger";ce();le();qs();Ys();Xs();Zs();F();rs();import MC from"node:fs/promises";import OC from"node:path";import{Hono as FC}from"hono";function _C(r){return v.getGlobalProjectPath(r)}l(_C,"getProjectDataPath");function Gg(r,e){let t=new FC,n=_C(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await fe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ne.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=D.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Xe.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),fe.read(r),Ne.read(r),Xe.read(r)]),u=D.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=OC.join(n,"context",`${o}.md`),c=await MC.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return C(a)||B.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Gg,"createRoutes");ce();le();qs();Ys();Xs();Zs();import Ts from"node:fs/promises";import NC from"node:path";import{Hono as LC}from"hono";var UC=v.getGlobalBasePath(),Es=NC.join(UC,"projects");function Pi(r){return D.getDoc(r,"project")}l(Pi,"getProjectConfig");async function vl(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(vl,"calculateDuration");function zg(){let r=new LC;return r.get("/projects",async e=>{try{await Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=Pi(o),a=await _.read(o),c=await fe.read(o),u=await Ne.read(o),d=await Xe.read(o),m=a?.currentTask,p=await vl(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(Pi(t)),_.read(t),fe.read(t),Ne.read(t),Xe.read(t)]),c=D.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await vl(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),fe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Ne.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await fe.read(c),m=await Ne.read(c),p=await Xe.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Ts.mkdir(Es,{recursive:!0});let s=(await Ts.readdir(Es,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=Pi(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=Pi(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await vl(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}l(zg,"createExtendedRoutes");xi();import{streamSSE as HC}from"hono/streaming";var Wg=3600*1e3,GC=300*1e3,zC=3e4;function Bg(){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()>Wg&&t(i)},GC),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 HC(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},zC),p=setTimeout(()=>{t(a)},Wg);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}l(Bg,"createSSEManager");function Vg(r){let e=new WC,t=Bg();r.enableCors!==!1&&e.use("*",BC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",VC()),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=Gg(r.projectId,r.projectPath);e.route("/api",n);let s=zg();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(Ms())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: ${Ms()?"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(Vg,"createServer");var Jg=3478;var Ht={runDir:l(()=>`${process.env.HOME||Is("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ht.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ht.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ht.runDir()}/daemon.log`,"log")},qg=1800*1e3;function Tl(r){return Buffer.from(`${JSON.stringify(r)}
1225
- `)}l(Tl,"encodeMessage");var As=null,br=null,Ce=null,je=null;async function Kg(r){let e=Ht.socket(),t=Ht.pid(),n=Ht.runDir();if(wt.mkdirSync(n,{recursive:!0}),wt.existsSync(t)){let s=parseInt(wt.readFileSync(t,"utf-8").trim(),10);QC(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),wt.unlinkSync(t)}if(wt.existsSync(e)&&wt.unlinkSync(e),je={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:qg,idleTimer:null},Ce=new Nn,As=JC(s=>qC(s)),As.listen(e,()=>{wt.chmodSync(e,384),wt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Yg()}),As.on("error",s=>{console.error("Daemon socket error:",s.message),Pr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||Jg;br=Vg({port:i,projectId:o,projectPath:s,enableLogging:!1}),await br.start()}}catch{}if(process.on("SIGTERM",()=>Pr(0)),process.on("SIGINT",()=>Pr(0)),process.on("SIGHUP",()=>{Ce=new Nn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Kg,"startDaemon");function qC(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1226
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await KC(o);r.write(Tl(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Tl(i))}}}),r.on("error",()=>{})}l(qC,"handleConnection");async function KC(r){if(!je||!Ce)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Yg(),je.commandsServed++,je.lastActivity=Date.now(),r.command==="daemon")return XC(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 YC(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1246
+ `).trim(),!s||s.trim().length===0?await ot.unlink(r):await ot.writeFile(r,`${s}
1247
+ `,"utf-8"),!0}catch{return!1}}l(xP,"removePrjctSection");async function vP(){let r=kP.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Kt.join(r,`.prjct-backup-${e}`);try{await ot.mkdir(t,{recursive:!0});let n=v.getGlobalBasePath();return await M(n)&&await Ug(n,Kt.join(t,".prjct-cli")),t}catch{return null}}l(vP,"createBackup");async function Ug(r,e){await ot.mkdir(e,{recursive:!0});let t=await ot.readdir(r,{withFileTypes:!0});for(let n of t){let s=Kt.join(r,n.name),o=Kt.join(e,n.name);n.isDirectory()?await Ug(s,o):await ot.copyFile(s,o)}}l(Ug,"copyDirectory");async function TP(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await xP(o.path)&&n.push(o.path):o.type==="directory"?(await ot.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await ot.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||yi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||yi("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(TP,"performUninstall");async function EP(r){let e=SP.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(EP,"promptConfirmation");async function AP(r={},e=process.cwd()){let t=await PP(),n=CP(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(pe.yellow(`
1248
+ 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(pe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(pe.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=v.getDisplayPath(c.path),d="";c.type==="section"?d=pe.dim("(section only)"):c.size&&(d=pe.dim(`(${Lg(c.size)})`)),console.log(` ${pe.cyan(u.padEnd(35))} ${d}`),console.log(` ${pe.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${pe.cyan("Homebrew".padEnd(35))} ${pe.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${pe.cyan("npm global".padEnd(35))} ${pe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(pe.dim(` Total size: ${Lg(o)}`)),console.log("")),r.dryRun)return console.log(pe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(pe.blue("Creating backup..."));let c=await vP();c?(console.log(pe.green(`Backup created: ${v.getDisplayPath(c)}`)),console.log("")):console.log(pe.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(pe.yellow('Type "uninstall" to confirm:')),!await EP("> ")))return console.log(pe.yellow(`
1249
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(pe.blue("Removing prjct..."));let{deleted:i,errors:a}=await TP(t,n,r);if(console.log(""),i.length>0&&console.log(pe.green(`Removed ${i.length} items`)),a.length>0){console.log(pe.yellow(`
1250
+ ${a.length} errors:`));for(let c of a)console.log(pe.red(` - ${c}`))}return console.log(""),console.log(pe.green("prjct has been uninstalled.")),console.log(pe.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(AP,"uninstall");var ki=class extends de{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return AP(e,t)}};var Un=new Ps,Si=new $n,IP=new hs,Hg=new ds,DP=new gs,xs=new ms,vs=new _n,Gg=new fs,RP=new Nn,jP=new ks,$P=new ki,MP=new ws;function OP(){for(let[r,e]of Object.entries(_g))H.registerCategory(r,e)}l(OP,"registerCategories");function zg(){if(H.has("work"))return;OP();let r=l(e=>Ng.find(t=>t.name===e),"getMeta");H.registerMethod("task",Un,"now",r("task")),H.registerMethod("done",Un,"done",r("done")),H.registerMethod("next",Un,"next",r("next")),H.registerMethod("pause",Un,"pause",r("pause")),H.registerMethod("resume",Un,"resume",r("resume")),H.registerMethod("workflow",Un,"workflow",r("workflow")),H.registerMethod("sessions",Un,"sessions",r("sessions")),H.registerMethod("init",Si,"init",r("init")),H.registerMethod("bug",Si,"bug",r("bug")),H.registerMethod("idea",Si,"idea",r("idea")),H.registerMethod("spec",Si,"spec",r("spec")),H.registerMethod("ship",IP,"ship",r("ship")),H.registerMethod("dash",Hg,"dash",r("dash")),H.registerMethod("help",Hg,"help",r("help")),H.registerMethod("perf",DP,"perf",r("perf")),H.registerMethod("velocity",jP,"velocity",r("velocity")),H.registerMethod("cleanup",xs,"cleanup",r("cleanup")),H.registerMethod("design",xs,"design",r("design")),H.registerMethod("recover",xs,"recover",r("recover")),H.registerMethod("undo",xs,"undo",r("undo")),H.registerMethod("redo",xs,"redo",r("redo")),H.registerMethod("history",xs,"history",r("history")),H.registerMethod("analyze",vs,"analyze",r("analyze")),H.registerMethod("sync",vs,"sync",r("sync")),H.registerMethod("stats",vs,"stats",r("stats")),H.registerMethod("status",vs,"status",r("status")),H.registerMethod("seal",vs,"seal",r("seal")),H.registerMethod("verify",vs,"verify",r("verify")),H.registerMethod("start",Gg,"start",r("start")),H.registerMethod("setup",Gg,"setup",r("setup")),H.registerMethod("uninstall",$P,"uninstall",r("uninstall")),H.registerMethod("update",MP,"update",r("update")),H.registerMethod("context",RP,"context",r("context"))}l(zg,"registerAllCommands");zg();ct();Oi();import{Hono as VP}from"hono";import{cors as JP}from"hono/cors";import{logger as qP}from"hono/logger";le();ae();Js();Ks();Ys();Qs();F();os();import FP from"node:fs/promises";import _P from"node:path";import{Hono as NP}from"hono";function LP(r){return v.getGlobalProjectPath(r)}l(LP,"getProjectDataPath");function Wg(r,e){let t=new NP,n=LP(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await ge.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Le.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=A.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Ze.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),ge.read(r),Le.read(r),Ze.read(r)]),u=A.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=_P.join(n,"context",`${o}.md`),c=await FP.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||B.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Wg,"createRoutes");le();ae();Js();Ks();Ys();Qs();import Ts from"node:fs/promises";import UP from"node:path";import{Hono as HP}from"hono";var GP=v.getGlobalBasePath(),Es=UP.join(GP,"projects");function bi(r){return A.getDoc(r,"project")}l(bi,"getProjectConfig");async function xl(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(xl,"calculateDuration");function Bg(){let r=new HP;return r.get("/projects",async e=>{try{await Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=bi(o),a=await _.read(o),c=await ge.read(o),u=await Le.read(o),d=await Ze.read(o),m=a?.currentTask,p=await xl(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(bi(t)),_.read(t),ge.read(t),Le.read(t),Ze.read(t)]),c=A.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await xl(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),ge.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Le.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await ge.read(c),m=await Le.read(c),p=await Ze.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Ts.mkdir(Es,{recursive:!0});let s=(await Ts.readdir(Es,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=bi(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=bi(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await xl(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}l(Bg,"createExtendedRoutes");Pi();import{streamSSE as zP}from"hono/streaming";var Vg=3600*1e3,WP=300*1e3,BP=3e4;function Jg(){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()>Vg&&t(i)},WP),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 zP(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},BP),p=setTimeout(()=>{t(a)},Vg);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}l(Jg,"createSSEManager");function qg(r){let e=new VP,t=Jg();r.enableCors!==!1&&e.use("*",JP({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",qP()),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=Wg(r.projectId,r.projectPath);e.route("/api",n);let s=Bg();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(Ms())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: ${Ms()?"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(qg,"createServer");var Kg=3478;var Gt={runDir:l(()=>`${process.env.HOME||Is("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Gt.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Gt.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Gt.runDir()}/daemon.log`,"log")},Yg=1800*1e3;function vl(r){return Buffer.from(`${JSON.stringify(r)}
1251
+ `)}l(vl,"encodeMessage");var As=null,Sr=null,ke=null,$e=null;async function Xg(r){let e=Gt.socket(),t=Gt.pid(),n=Gt.runDir();if(bt.mkdirSync(n,{recursive:!0}),bt.existsSync(t)){let s=parseInt(bt.readFileSync(t,"utf-8").trim(),10);ex(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),bt.unlinkSync(t)}if(bt.existsSync(e)&&bt.unlinkSync(e),$e={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Yg,idleTimer:null},ke=new Ln,As=KP(s=>YP(s)),As.listen(e,()=>{bt.chmodSync(e,384),bt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Qg()}),As.on("error",s=>{console.error("Daemon socket error:",s.message),br(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||Kg;Sr=qg({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Sr.start()}}catch{}if(process.on("SIGTERM",()=>br(0)),process.on("SIGINT",()=>br(0)),process.on("SIGHUP",()=>{ke=new Ln,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Xg,"startDaemon");function YP(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1252
+ `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await XP(o);r.write(vl(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(vl(i))}}}),r.on("error",()=>{})}l(YP,"handleConnection");async function XP(r){if(!$e||!ke)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Qg(),$e.commandsServed++,$e.lastActivity=Date.now(),r.command==="daemon")return ZP(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 QP(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1227
1253
  `)||o.message||void 0,stderr:t.join(`
1228
- `)||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(KC,"handleRequest");async function YC(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Ce.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Ce.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Ce.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Ce.seal(r.cwd,{json:t.json===!0});case"verify":return Ce.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Ce.task(e,r.cwd,{md:n});case"done":return Ce.done(r.cwd,{md:n});case"next":return Ce.next(r.cwd,{md:n});case"pause":return Ce.pause(e||"",r.cwd,{md:n});case"resume":return Ce.resume(e,r.cwd,{md:n});case"bug":return Ce.bug(e||"",r.cwd,{md:n});case"idea":return Ce.idea(e||"",r.cwd,{md:n});case"ship":return Ce.ship(e,r.cwd,{md:n});case"dash":return Ce.dash(e||"default",r.cwd,{md:n});case"sessions":return Ce.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return Ce.design(e||"",t);case"analyze":return Ce.analyze(t);case"cleanup":return Ce.cleanup(t);default:return H.execute(r.command,e,r.cwd)}}l(YC,"executeCommand");function XC(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ht.socket(),uptime:je?Date.now()-je.startedAt:0,commandsServed:je?.commandsServed??0,lastActivity:je?new Date(je.lastActivity).toISOString():null,registeredCommands:H.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Pr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(XC,"handleDaemonCommand");function Yg(){je&&(je.idleTimer&&clearTimeout(je.idleTimer),je.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${je.idleTimeoutMs/1e3/60} minutes, shutting down`),Pr(0)},je.idleTimeoutMs),je.idleTimer.unref&&je.idleTimer.unref())}l(Yg,"resetIdleTimer");function Pr(r){console.log("Daemon shutting down..."),je?.idleTimer&&clearTimeout(je.idleTimer),br&&(br.stop(),br=null),As&&(As.close(),As=null);let e=Ht.socket(),t=Ht.pid();try{wt.existsSync(e)&&wt.unlinkSync(e)}catch{}try{wt.existsSync(t)&&wt.unlinkSync(t)}catch{}process.exit(r)}l(Pr,"shutdown");function QC(r){try{return process.kill(r,0),!0}catch{return!1}}l(QC,"isProcessRunning");var El=process.argv.slice(2),ZC=parseInt(El.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,ex=El.includes("--no-http"),tx=El.includes("--foreground");Kg({port:ZC,noHttp:ex,foreground:tx}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1254
+ `)||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(XP,"handleRequest");async function QP(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return ke.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return ke.status(r.cwd,{json:t.json===!0,md:n});case"stats":return ke.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return ke.seal(r.cwd,{json:t.json===!0});case"verify":return ke.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ke.task(e,r.cwd,{md:n});case"done":return ke.done(r.cwd,{md:n});case"next":return ke.next(r.cwd,{md:n});case"pause":return ke.pause(e||"",r.cwd,{md:n});case"resume":return ke.resume(e,r.cwd,{md:n});case"bug":return ke.bug(e||"",r.cwd,{md:n});case"idea":return ke.idea(e||"",r.cwd,{md:n});case"ship":return ke.ship(e,r.cwd,{md:n});case"dash":return ke.dash(e||"default",r.cwd,{md:n});case"workflow":return ke.workflowPrefs(e,r.cwd,{md:n});case"sessions":return ke.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return ke.design(e||"",t);case"analyze":return ke.analyze(t);case"cleanup":return ke.cleanup(t);default:return H.execute(r.command,e,r.cwd)}}l(QP,"executeCommand");function ZP(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Gt.socket(),uptime:$e?Date.now()-$e.startedAt:0,commandsServed:$e?.commandsServed??0,lastActivity:$e?new Date($e.lastActivity).toISOString():null,registeredCommands:H.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>br(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(ZP,"handleDaemonCommand");function Qg(){$e&&($e.idleTimer&&clearTimeout($e.idleTimer),$e.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${$e.idleTimeoutMs/1e3/60} minutes, shutting down`),br(0)},$e.idleTimeoutMs),$e.idleTimer.unref&&$e.idleTimer.unref())}l(Qg,"resetIdleTimer");function br(r){console.log("Daemon shutting down..."),$e?.idleTimer&&clearTimeout($e.idleTimer),Sr&&(Sr.stop(),Sr=null),As&&(As.close(),As=null);let e=Gt.socket(),t=Gt.pid();try{bt.existsSync(e)&&bt.unlinkSync(e)}catch{}try{bt.existsSync(t)&&bt.unlinkSync(t)}catch{}process.exit(r)}l(br,"shutdown");function ex(r){try{return process.kill(r,0),!0}catch{return!1}}l(ex,"isProcessRunning");var Tl=process.argv.slice(2),tx=parseInt(Tl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,nx=Tl.includes("--no-http"),sx=Tl.includes("--foreground");Xg({port:tx,noHttp:nx,foreground:sx}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});