prjct-cli 1.30.1 → 1.31.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 wr=Object.defineProperty;var Wg=Object.getOwnPropertyDescriptor;var Bg=Object.getOwnPropertyNames;var Vg=Object.prototype.hasOwnProperty;var l=(r,e)=>wr(r,"name",{value:e,configurable:!0}),xs=(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')}),bl=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(r,e)=>()=>(r&&(e=r(r=0)),e);var Fn=(r,e)=>{for(var t in e)wr(r,t,{get:e[t],enumerable:!0})},Jg=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Bg(e))!Vg.call(r,s)&&s!==t&&wr(r,s,{get:()=>e[s],enumerable:!(n=Wg(e,s))||n.enumerable});return r};var lt=r=>Jg(wr({},"__esModule",{value:!0}),r);var Pl=y(()=>{"use strict"});var Sr,Cl=y(()=>{"use strict";Sr={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 vs,kr=y(()=>{"use strict";vs={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 xl(r){return r instanceof Error&&"code"in r}function C(r){return xl(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var O=y(()=>{"use strict";l(xl,"isNodeError");l(C,"isNotFoundError");l(w,"getErrorMessage")});var vl=y(()=>{"use strict"});var Tl=y(()=>{"use strict";vl()});function br(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var D,El,_n=y(()=>{"use strict";D={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"},El=["frontend","backend","devops","docs","testing","database","general"];l(br,"calculateConfidence")});var wi=y(()=>{"use strict"});var Si=y(()=>{"use strict";Pl();Cl();kr();O();Tl();_n();wi()});var U={};Fn(U,{calculateDuration:()=>of,formatDate:()=>Pr,formatDuration:()=>Ts,formatMonth:()=>Qg,getDateKey:()=>Zg,getDateRange:()=>nf,getDaysAgo:()=>Jt,getDaysFromNow:()=>tf,getEndOfDay:()=>cf,getStartOfDay:()=>af,getTimestamp:()=>k,getTodayKey:()=>Al,getYearMonthDay:()=>ki,isToday:()=>sf,isWithinLastDays:()=>rf,parseDate:()=>ef,toRelative:()=>lf});import{formatDistanceToNowStrict as Xg}from"date-fns";function Pr(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 Qg(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Al(){return Pr(new Date)}function Zg(r){return Pr(r)}function ki(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function ef(r){return new Date(r)}function k(){return new Date().toISOString()}function Jt(r){let e=new Date;return e.setDate(e.getDate()-r),e}function tf(r){let e=new Date;return e.setDate(e.getDate()+r),e}function nf(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 sf(r){return Pr(r)===Al()}function rf(r,e){let t=Jt(e);return r>=t}function Ts(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function of(r,e=new Date){let t=e.getTime()-r.getTime();return Ts(t)}function af(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function cf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function lf(r){let e=typeof r=="string"?new Date(r):r;return Xg(e,{addSuffix:!0})}var se=y(()=>{"use strict";l(Pr,"formatDate");l(Qg,"formatMonth");l(Al,"getTodayKey");l(Zg,"getDateKey");l(ki,"getYearMonthDay");l(ef,"parseDate");l(k,"getTimestamp");l(Jt,"getDaysAgo");l(tf,"getDaysFromNow");l(nf,"getDateRange");l(sf,"isToday");l(rf,"isWithinLastDays");l(Ts,"formatDuration");l(of,"calculateDuration");l(af,"getStartOfDay");l(cf,"getEndOfDay");l(lf,"toRelative")});import jl from"node:fs/promises";async function Rl(r,e){let t;try{t=await jl.readFile(r,"utf-8")}catch(o){if(C(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Il(r,t),Dl(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Il(r,t),Dl(r,uf(s.error)),null)}async function Il(r,e){let t=`${r}.backup`;try{await jl.writeFile(t,e,"utf-8")}catch{}}function Dl(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 uf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var $l=y(()=>{"use strict";O();l(Rl,"safeRead");l(Il,"createBackup");l(Dl,"logCorruption");l(uf,"formatZodError")});var te={};Fn(te,{appendLine:()=>bi,appendToFile:()=>pf,atomicWrite:()=>df,copyFile:()=>wf,deleteDir:()=>ff,deleteFile:()=>gf,dirExists:()=>Cr,ensureDir:()=>wt,fileExists:()=>M,getFileExtension:()=>Pf,getFileModifiedTime:()=>yf,getFileNameWithoutExtension:()=>Cf,getFileSize:()=>hf,listFiles:()=>Un,moveFile:()=>Sf,prependToFile:()=>mf,readFile:()=>Ln,readJson:()=>ln,readLines:()=>kf,writeFile:()=>Ml,writeJson:()=>Es,writeLines:()=>bf});import oe from"node:fs/promises";import Nn from"node:path";async function ln(r,e=null,t){if(t)return await Rl(r,t)??e;try{let n=await oe.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(C(n))return e;throw n}}async function Es(r,e,t=2){let n=JSON.stringify(e,null,t);await oe.writeFile(r,n,"utf-8")}async function Ln(r,e=""){try{return await oe.readFile(r,"utf-8")}catch(t){if(C(t))return e;throw t}}async function Ml(r,e){let t=Nn.dirname(r);await oe.mkdir(t,{recursive:!0}),await oe.writeFile(r,e,"utf-8")}async function df(r,e){let t=Nn.dirname(r);await oe.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await oe.writeFile(n,e,"utf-8"),await oe.rename(n,r)}async function pf(r,e){await oe.appendFile(r,e,"utf-8")}async function bi(r,e){let t=Nn.dirname(r);await oe.mkdir(t,{recursive:!0}),await oe.appendFile(r,`${e}
9
- `,"utf-8")}async function mf(r,e){try{let t=await oe.readFile(r,"utf-8");await oe.writeFile(r,e+t,"utf-8")}catch(t){if(C(t))await oe.writeFile(r,e,"utf-8");else throw t}}async function M(r){try{return await oe.access(r),!0}catch(e){if(C(e))return!1;throw e}}async function Cr(r){try{return(await oe.stat(r)).isDirectory()}catch(e){if(C(e))return!1;throw e}}async function wt(r){await oe.mkdir(r,{recursive:!0})}async function gf(r){try{return await oe.unlink(r),!0}catch(e){if(C(e))return!1;throw e}}async function ff(r){try{return await oe.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(C(e))return!1;throw e}}async function Un(r,e={}){try{let n=await oe.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 hf(r){return(await oe.stat(r)).size}async function yf(r){return(await oe.stat(r)).mtime}async function wf(r,e){await oe.copyFile(r,e)}async function Sf(r,e){await oe.rename(r,e)}async function kf(r){return(await Ln(r,"")).split(`
10
- `)}async function bf(r,e){let t=e.join(`
11
- `);await Ml(r,t)}function Pf(r){return Nn.extname(r)}function Cf(r){return Nn.basename(r,Nn.extname(r))}var Me=y(()=>{"use strict";$l();O();l(ln,"readJson");l(Es,"writeJson");l(Ln,"readFile");l(Ml,"writeFile");l(df,"atomicWrite");l(pf,"appendToFile");l(bi,"appendLine");l(mf,"prependToFile");l(M,"fileExists");l(Cr,"dirExists");l(wt,"ensureDir");l(gf,"deleteFile");l(ff,"deleteDir");l(Un,"listFiles");l(hf,"getFileSize");l(yf,"getFileModifiedTime");l(wf,"copyFile");l(Sf,"moveFile");l(kf,"readLines");l(bf,"writeLines");l(Pf,"getFileExtension");l(Cf,"getFileNameWithoutExtension")});import{z as Dt}from"zod";function Ol(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 Ax,Ix,Dx,As,jx,Is=y(()=>{"use strict";Ax=Dt.enum(["opus","sonnet","haiku"]),Ix=Dt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Dx=Dt.string().min(1),As=Dt.object({provider:Dt.string(),model:Dt.string(),cliVersion:Dt.string().optional(),recordedAt:Dt.string()}),jx=Dt.object({preferredModel:Dt.string().optional(),lastAnalysisModel:As.optional()});l(Ol,"compareSemver")});import Pi from"node:fs/promises";import xf from"node:os";import Fl from"node:path";async function Ll(){try{let r=await Pi.readFile(Nl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>vf?null:e.detection}catch{return null}}async function Ul(r){let e={timestamp:new Date().toISOString(),detection:r};await Pi.mkdir(_l,{recursive:!0}),await Pi.writeFile(Nl,JSON.stringify(e,null,2))}var _l,Nl,vf,Hl=y(()=>{"use strict";_l=Fl.join(xf.homedir(),".prjct-cli","cache"),Nl=Fl.join(_l,"providers.json"),vf=600*1e3;l(Ll,"readProviderCache");l(Ul,"writeProviderCache")});var tt={};Fn(tt,{AntigravityProvider:()=>vi,ClaudeProvider:()=>xr,CodexProvider:()=>Ti,CursorProvider:()=>Wl,GeminiProvider:()=>xi,Providers:()=>St,WindsurfProvider:()=>Bl,detectAllProviders:()=>Ei,detectAntigravity:()=>$f,detectCodex:()=>Mf,detectCursorProject:()=>ql,detectProvider:()=>Ci,detectWindsurfProject:()=>Kl,getActiveProvider:()=>If,getCommandsDir:()=>Nf,getGlobalContextPath:()=>Of,getGlobalSettingsPath:()=>Ff,getProjectCommandsPath:()=>Lf,getProviderBranding:()=>vr,getSkillsPath:()=>_f,hasProviderConfig:()=>Df,needsCursorRouterRegeneration:()=>jf,needsWindsurfRouterRegeneration:()=>Rf,selectProvider:()=>Uf,validateCliVersion:()=>Jl});import{exec as Tf}from"node:child_process";import qt from"node:os";import Te from"node:path";import{promisify as Ef}from"node:util";async function Vl(r){try{let{stdout:e}=await Gl(`which ${r}`,{timeout:zl});return e.trim()}catch{return null}}async function Af(r){try{let{stdout:e}=await Gl(`${r} --version`,{timeout:zl}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ci(r){let e=St[r];if(!e.cliCommand)return{installed:!1};let t=await Vl(e.cliCommand);if(!t)return{installed:!1};let n=await Af(e.cliCommand),s=Jl(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Jl(r,e){let t=St[r];return!t.minCliVersion||!e?null:Ol(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 Ei(r=!1){if(!r){let s=await Ll();if(s)return s}let[e,t]=await Promise.all([Ci("claude"),Ci("gemini")]),n={claude:e,gemini:t};return await Ul(n).catch(()=>{}),n}async function If(r){if(r&&St[r])return St[r];let e=await Ei();return e.claude.installed&&!e.gemini.installed?xr:e.gemini.installed&&!e.claude.installed?xi:xr}async function Df(r){let e=St[r];return e.configDir?M(e.configDir):!1}function vr(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 ql(r){let e=Te.join(r,".cursor"),t=Te.join(e,"rules"),n=Te.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 jf(r){let e=await ql(r);return e.detected&&!e.routerInstalled}async function Kl(r){let e=Te.join(r,".windsurf"),t=Te.join(e,"rules"),n=Te.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 Rf(r){let e=await Kl(r);return e.detected&&!e.routerInstalled}async function $f(){let r=vi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Te.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 Mf(){let r=Ti.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Vl("codex"),t=Te.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 Of(r){let e=St[r];return e.configDir?Te.join(e.configDir,e.contextFile):null}function Ff(r){let e=St[r];return!e.configDir||!e.settingsFile?null:Te.join(e.configDir,e.settingsFile)}function _f(r){return St[r].skillsDir}function Nf(r){return St[r].commandsDir}function Lf(r,e){let t=St[r];return Te.join(e,t.commandsDir)}async function Uf(){let r=await Ei(),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 Gl,zl,xr,xi,vi,Wl,Bl,Ti,St,Je=y(()=>{"use strict";Is();Me();Hl();Gl=Ef(Tf),zl=2e3,xr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Te.join(qt.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Te.join(qt.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"},xi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Te.join(qt.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Te.join(qt.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"},vi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Te.join(qt.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Te.join(qt.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},Wl={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},Bl={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},Ti={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Te.join(qt.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Te.join(qt.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},St={claude:xr,gemini:xi,cursor:Wl,antigravity:vi,windsurf:Bl,codex:Ti};l(Vl,"whichCommand");l(Af,"getCliVersion");l(Ci,"detectProvider");l(Jl,"validateCliVersion");l(Ei,"detectAllProviders");l(If,"getActiveProvider");l(Df,"hasProviderConfig");l(vr,"getProviderBranding");l(ql,"detectCursorProject");l(jf,"needsCursorRouterRegeneration");l(Kl,"detectWindsurfProject");l(Rf,"needsWindsurfRouterRegeneration");l($f,"detectAntigravity");l(Mf,"detectCodex");l(Of,"getGlobalContextPath");l(Ff,"getGlobalSettingsPath");l(_f,"getSkillsPath");l(Nf,"getCommandsDir");l(Lf,"getProjectCommandsPath");l(Uf,"selectProvider")});import Hf from"node:crypto";import jt from"node:fs/promises";import Ai from"node:os";import N from"node:path";import{globSync as Gf}from"glob";var Ii,zf,E,le=y(()=>{"use strict";se();Me();Ii=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(Ai.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 Hf.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 Cr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await wt(this.globalBaseDir),await wt(this.globalProjectsDir),await wt(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 wt(N.join(t,s));return await wt(N.join(t,"planning","tasks")),await wt(N.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=ki(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 wt(n),n}async listSessions(e,t=null,n=null){let s=N.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await jt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=N.join(s,a.name),u=await jt.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 jt.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 jt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await Cr(t)}getDisplayPath(e){let t=Ai.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(Je(),lt(tt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Je(),lt(tt)).getActiveProvider();return(Je(),lt(tt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return N.join(Ai.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 jt.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await jt.readFile(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 jt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=N.join(e,"lerna.json");if(await M(c)){let u=await jt.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 jt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=Gf(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 jt.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 Ii,E=zf});function Wf(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ds(){return Wf()==="bun"}var Di=y(()=>{"use strict";l(Wf,"detectRuntime");l(Ds,"isBun")});import ji from"node:fs";import Yl from"node:path";function Bf(r){if(Ds()){let{Database:s}=xs("bun:sqlite");return new s(r,{create:!0})}let e=xs("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Vf,Tr,$,G,ue=y(()=>{"use strict";le();Di();l(Bf,"openDatabase");Vf=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
8
+ var kr=Object.defineProperty;var qg=Object.getOwnPropertyDescriptor;var Kg=Object.getOwnPropertyNames;var Yg=Object.prototype.hasOwnProperty;var l=(r,e)=>kr(r,"name",{value:e,configurable:!0}),vs=(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 _n=(r,e)=>{for(var t in e)kr(r,t,{get:e[t],enumerable:!0})},Xg=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Kg(e))!Yg.call(r,s)&&s!==t&&kr(r,s,{get:()=>e[s],enumerable:!(n=qg(e,s))||n.enumerable});return r};var ut=r=>Xg(kr({},"__esModule",{value:!0}),r);var vl=w(()=>{"use strict"});var br,Tl=w(()=>{"use strict";br={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Ts,Pr=w(()=>{"use strict";Ts={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function El(r){return r instanceof Error&&"code"in r}function C(r){return El(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var O=w(()=>{"use strict";l(El,"isNodeError");l(C,"isNotFoundError");l(y,"getErrorMessage")});var Al=w(()=>{"use strict"});var Il=w(()=>{"use strict";Al()});function Cr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var D,Dl,Nn=w(()=>{"use strict";D={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"},Dl=["frontend","backend","devops","docs","testing","database","general"];l(Cr,"calculateConfidence")});var bi=w(()=>{"use strict"});var Pi=w(()=>{"use strict";vl();Tl();Pr();O();Il();Nn();bi()});var U={};_n(U,{calculateDuration:()=>uf,formatDate:()=>xr,formatDuration:()=>Es,formatMonth:()=>nf,getDateKey:()=>sf,getDateRange:()=>af,getDaysAgo:()=>Jt,getDaysFromNow:()=>of,getEndOfDay:()=>pf,getStartOfDay:()=>df,getTimestamp:()=>b,getTodayKey:()=>jl,getYearMonthDay:()=>Ci,isToday:()=>cf,isWithinLastDays:()=>lf,parseDate:()=>rf,toRelative:()=>mf});import{formatDistanceToNowStrict as tf}from"date-fns";function xr(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 nf(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function jl(){return xr(new Date)}function sf(r){return xr(r)}function Ci(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function rf(r){return new Date(r)}function b(){return new Date().toISOString()}function Jt(r){let e=new Date;return e.setDate(e.getDate()-r),e}function of(r){let e=new Date;return e.setDate(e.getDate()+r),e}function af(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 cf(r){return xr(r)===jl()}function lf(r,e){let t=Jt(e);return r>=t}function Es(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 uf(r,e=new Date){let t=e.getTime()-r.getTime();return Es(t)}function df(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function pf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function mf(r){let e=typeof r=="string"?new Date(r):r;return tf(e,{addSuffix:!0})}var re=w(()=>{"use strict";l(xr,"formatDate");l(nf,"formatMonth");l(jl,"getTodayKey");l(sf,"getDateKey");l(Ci,"getYearMonthDay");l(rf,"parseDate");l(b,"getTimestamp");l(Jt,"getDaysAgo");l(of,"getDaysFromNow");l(af,"getDateRange");l(cf,"isToday");l(lf,"isWithinLastDays");l(Es,"formatDuration");l(uf,"calculateDuration");l(df,"getStartOfDay");l(pf,"getEndOfDay");l(mf,"toRelative")});import Ml from"node:fs/promises";async function Ol(r,e){let t;try{t=await Ml.readFile(r,"utf-8")}catch(o){if(C(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Rl(r,t),$l(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Rl(r,t),$l(r,gf(s.error)),null)}async function Rl(r,e){let t=`${r}.backup`;try{await Ml.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 gf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Fl=w(()=>{"use strict";O();l(Ol,"safeRead");l(Rl,"createBackup");l($l,"logCorruption");l(gf,"formatZodError")});var ne={};_n(ne,{appendLine:()=>xi,appendToFile:()=>hf,atomicWrite:()=>ff,copyFile:()=>Pf,deleteDir:()=>Sf,deleteFile:()=>wf,dirExists:()=>vr,ensureDir:()=>wt,fileExists:()=>M,getFileExtension:()=>Tf,getFileModifiedTime:()=>bf,getFileNameWithoutExtension:()=>Ef,getFileSize:()=>kf,listFiles:()=>Hn,moveFile:()=>Cf,prependToFile:()=>yf,readFile:()=>Un,readJson:()=>un,readLines:()=>xf,writeFile:()=>_l,writeJson:()=>As,writeLines:()=>vf});import ie from"node:fs/promises";import Ln from"node:path";async function un(r,e=null,t){if(t)return await Ol(r,t)??e;try{let n=await ie.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(C(n))return e;throw n}}async function As(r,e,t=2){let n=JSON.stringify(e,null,t);await ie.writeFile(r,n,"utf-8")}async function Un(r,e=""){try{return await ie.readFile(r,"utf-8")}catch(t){if(C(t))return e;throw t}}async function _l(r,e){let t=Ln.dirname(r);await ie.mkdir(t,{recursive:!0}),await ie.writeFile(r,e,"utf-8")}async function ff(r,e){let t=Ln.dirname(r);await ie.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ie.writeFile(n,e,"utf-8"),await ie.rename(n,r)}async function hf(r,e){await ie.appendFile(r,e,"utf-8")}async function xi(r,e){let t=Ln.dirname(r);await ie.mkdir(t,{recursive:!0}),await ie.appendFile(r,`${e}
9
+ `,"utf-8")}async function yf(r,e){try{let t=await ie.readFile(r,"utf-8");await ie.writeFile(r,e+t,"utf-8")}catch(t){if(C(t))await ie.writeFile(r,e,"utf-8");else throw t}}async function M(r){try{return await ie.access(r),!0}catch(e){if(C(e))return!1;throw e}}async function vr(r){try{return(await ie.stat(r)).isDirectory()}catch(e){if(C(e))return!1;throw e}}async function wt(r){await ie.mkdir(r,{recursive:!0})}async function wf(r){try{return await ie.unlink(r),!0}catch(e){if(C(e))return!1;throw e}}async function Sf(r){try{return await ie.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(C(e))return!1;throw e}}async function Hn(r,e={}){try{let n=await ie.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 kf(r){return(await ie.stat(r)).size}async function bf(r){return(await ie.stat(r)).mtime}async function Pf(r,e){await ie.copyFile(r,e)}async function Cf(r,e){await ie.rename(r,e)}async function xf(r){return(await Un(r,"")).split(`
10
+ `)}async function vf(r,e){let t=e.join(`
11
+ `);await _l(r,t)}function Tf(r){return Ln.extname(r)}function Ef(r){return Ln.basename(r,Ln.extname(r))}var Oe=w(()=>{"use strict";Fl();O();l(un,"readJson");l(As,"writeJson");l(Un,"readFile");l(_l,"writeFile");l(ff,"atomicWrite");l(hf,"appendToFile");l(xi,"appendLine");l(yf,"prependToFile");l(M,"fileExists");l(vr,"dirExists");l(wt,"ensureDir");l(wf,"deleteFile");l(Sf,"deleteDir");l(Hn,"listFiles");l(kf,"getFileSize");l(bf,"getFileModifiedTime");l(Pf,"copyFile");l(Cf,"moveFile");l(xf,"readLines");l(vf,"writeLines");l(Tf,"getFileExtension");l(Ef,"getFileNameWithoutExtension")});import{z as Dt}from"zod";function Nl(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 $x,Mx,Ox,Is,Fx,Ds=w(()=>{"use strict";$x=Dt.enum(["opus","sonnet","haiku"]),Mx=Dt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Ox=Dt.string().min(1),Is=Dt.object({provider:Dt.string(),model:Dt.string(),cliVersion:Dt.string().optional(),recordedAt:Dt.string()}),Fx=Dt.object({preferredModel:Dt.string().optional(),lastAnalysisModel:Is.optional()});l(Nl,"compareSemver")});import vi from"node:fs/promises";import Af from"node:os";import Ll from"node:path";async function Gl(){try{let r=await vi.readFile(Hl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>If?null:e.detection}catch{return null}}async function zl(r){let e={timestamp:new Date().toISOString(),detection:r};await vi.mkdir(Ul,{recursive:!0}),await vi.writeFile(Hl,JSON.stringify(e,null,2))}var Ul,Hl,If,Wl=w(()=>{"use strict";Ul=Ll.join(Af.homedir(),".prjct-cli","cache"),Hl=Ll.join(Ul,"providers.json"),If=600*1e3;l(Gl,"readProviderCache");l(zl,"writeProviderCache")});var nt={};_n(nt,{AntigravityProvider:()=>Ai,ClaudeProvider:()=>Tr,CodexProvider:()=>Ii,CursorProvider:()=>Jl,GeminiProvider:()=>Ei,Providers:()=>St,WindsurfProvider:()=>ql,detectAllProviders:()=>Di,detectAntigravity:()=>_f,detectCodex:()=>Nf,detectCursorProject:()=>Xl,detectProvider:()=>Ti,detectWindsurfProject:()=>Ql,getActiveProvider:()=>$f,getCommandsDir:()=>Gf,getGlobalContextPath:()=>Lf,getGlobalSettingsPath:()=>Uf,getProjectCommandsPath:()=>zf,getProviderBranding:()=>Er,getSkillsPath:()=>Hf,hasProviderConfig:()=>Mf,needsCursorRouterRegeneration:()=>Of,needsWindsurfRouterRegeneration:()=>Ff,selectProvider:()=>Wf,validateCliVersion:()=>Yl});import{exec as Df}from"node:child_process";import qt from"node:os";import Ee from"node:path";import{promisify as jf}from"node:util";async function Kl(r){try{let{stdout:e}=await Bl(`which ${r}`,{timeout:Vl});return e.trim()}catch{return null}}async function Rf(r){try{let{stdout:e}=await Bl(`${r} --version`,{timeout:Vl}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ti(r){let e=St[r];if(!e.cliCommand)return{installed:!1};let t=await Kl(e.cliCommand);if(!t)return{installed:!1};let n=await Rf(e.cliCommand),s=Yl(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Yl(r,e){let t=St[r];return!t.minCliVersion||!e?null:Nl(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 Di(r=!1){if(!r){let s=await Gl();if(s)return s}let[e,t]=await Promise.all([Ti("claude"),Ti("gemini")]),n={claude:e,gemini:t};return await zl(n).catch(()=>{}),n}async function $f(r){if(r&&St[r])return St[r];let e=await Di();return e.claude.installed&&!e.gemini.installed?Tr:e.gemini.installed&&!e.claude.installed?Ei:Tr}async function Mf(r){let e=St[r];return e.configDir?M(e.configDir):!1}function Er(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 Xl(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 Of(r){let e=await Xl(r);return e.detected&&!e.routerInstalled}async function Ql(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 Ff(r){let e=await Ql(r);return e.detected&&!e.routerInstalled}async function _f(){let r=Ai.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 Nf(){let r=Ii.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Kl("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 Lf(r){let e=St[r];return e.configDir?Ee.join(e.configDir,e.contextFile):null}function Uf(r){let e=St[r];return!e.configDir||!e.settingsFile?null:Ee.join(e.configDir,e.settingsFile)}function Hf(r){return St[r].skillsDir}function Gf(r){return St[r].commandsDir}function zf(r,e){let t=St[r];return Ee.join(e,t.commandsDir)}async function Wf(){let r=await Di(),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 Bl,Vl,Tr,Ei,Ai,Jl,ql,Ii,St,qe=w(()=>{"use strict";Ds();Oe();Wl();Bl=jf(Df),Vl=2e3,Tr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ee.join(qt.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ee.join(qt.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"},Ei={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ee.join(qt.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ee.join(qt.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"},Ai={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ee.join(qt.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ee.join(qt.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},Jl={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},Ii={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ee.join(qt.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ee.join(qt.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},St={claude:Tr,gemini:Ei,cursor:Jl,antigravity:Ai,windsurf:ql,codex:Ii};l(Kl,"whichCommand");l(Rf,"getCliVersion");l(Ti,"detectProvider");l(Yl,"validateCliVersion");l(Di,"detectAllProviders");l($f,"getActiveProvider");l(Mf,"hasProviderConfig");l(Er,"getProviderBranding");l(Xl,"detectCursorProject");l(Of,"needsCursorRouterRegeneration");l(Ql,"detectWindsurfProject");l(Ff,"needsWindsurfRouterRegeneration");l(_f,"detectAntigravity");l(Nf,"detectCodex");l(Lf,"getGlobalContextPath");l(Uf,"getGlobalSettingsPath");l(Hf,"getSkillsPath");l(Gf,"getCommandsDir");l(zf,"getProjectCommandsPath");l(Wf,"selectProvider")});import Bf from"node:crypto";import jt from"node:fs/promises";import ji from"node:os";import N from"node:path";import{globSync as Vf}from"glob";var Ri,Jf,E,de=w(()=>{"use strict";re();Oe();Ri=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(ji.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 Bf.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 vr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await wt(this.globalBaseDir),await wt(this.globalProjectsDir),await wt(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 wt(N.join(t,s));return await wt(N.join(t,"planning","tasks")),await wt(N.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Ci(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 wt(n),n}async listSessions(e,t=null,n=null){let s=N.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await jt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=N.join(s,a.name),u=await jt.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 jt.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 jt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await vr(t)}getDisplayPath(e){let t=ji.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(qe(),ut(nt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(qe(),ut(nt)).getActiveProvider();return(qe(),ut(nt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return N.join(ji.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 jt.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await jt.readFile(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 jt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=N.join(e,"lerna.json");if(await M(c)){let u=await jt.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 jt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=Vf(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 jt.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}},Jf=new Ri,E=Jf});function qf(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function js(){return qf()==="bun"}var $i=w(()=>{"use strict";l(qf,"detectRuntime");l(js,"isBun")});import Mi from"node:fs";import Zl from"node:path";function Kf(r){if(js()){let{Database:s}=vs("bun:sqlite");return new s(r,{create:!0})}let e=vs("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Yf,Ar,$,G,pe=w(()=>{"use strict";de();$i();l(Kf,"openDatabase");Yf=[{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,13 @@ var wr=Object.defineProperty;var Wg=Object.getOwnPropertyDescriptor;var Bg=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")}],Tr=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Yl.join(E.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Yl.dirname(n);ji.existsSync(s)||ji.mkdirSync(s,{recursive:!0});let o=Bf(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 ji.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")}],Ar=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Zl.join(E.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Zl.dirname(n);Mi.existsSync(s)||Mi.mkdirSync(s,{recursive:!0});let o=Kf(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 Mi.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
244
  CREATE TABLE IF NOT EXISTS _migrations (
245
245
  version INTEGER PRIMARY KEY,
246
246
  name TEXT NOT NULL,
247
247
  applied_at TEXT NOT NULL
248
248
  )
249
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Vf)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new Tr,G=$});function $i(r){if(El.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Er))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 Ri,Er,un,js,Rs,$s=y(()=>{"use strict";ue();_n();se();Ri={frontend:[D.CODE_STYLE,D.FILE_STRUCTURE,D.ARCHITECTURE,D.TECH_STACK],backend:[D.CODE_STYLE,D.ARCHITECTURE,D.DEPENDENCIES,D.TECH_STACK],devops:[D.SHIP_WORKFLOW,D.TEST_BEHAVIOR,D.DEPENDENCIES,D.ARCHITECTURE],docs:[D.CODE_STYLE,D.NAMING_CONVENTION,D.FILE_STRUCTURE],testing:[D.TEST_BEHAVIOR,D.CODE_STYLE,D.DEPENDENCIES],database:[D.ARCHITECTURE,D.NAMING_CONVENTION,D.TECH_STACK,D.DEPENDENCIES],general:Object.values(D)},Er={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($i,"resolveCanonicalDomains");un=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}},js=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()}},Rs=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 Ms,Mi=y(()=>{"use strict";ue();_n();se();$s();Ms=class r extends un{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=br(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=br(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:br(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 Xl=y(()=>{"use strict"});import Os from"node:fs/promises";import Kt from"node:path";import{z as ee}from"zod";async function Xf(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=Kt.join(e,"package.json"),s=await Os.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 Qf(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 nh(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Yf[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 Zf(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=Kt.join(e,a);try{await Os.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 eh(r,e){let t=Date.now();try{let n=await sh(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 th(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=Kt.join(e,o.file);try{await Os.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 Ql(r,e){let t=Date.now(),n=await Promise.all([Xf(r,e),Qf(r,e),Zf(r,e),eh(r,e),th(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 nh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Os.readdir(s,{withFileTypes:!0});for(let i of o){let a=Kt.join(s,i.name),c=Kt.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Kt.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function sh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Os.readdir(s,{withFileTypes:!0});for(let i of o){let a=Kt.join(s,i.name),c=Kt.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 Jf,qf,Kf,Oi,vv,Yf,Fi=y(()=>{"use strict";O();Is();Jf=ee.enum(["draft","verified","sealed"]),qf=ee.object({name:ee.string(),description:ee.string(),location:ee.string().optional()}),Kf=ee.object({issue:ee.string(),file:ee.string(),suggestion:ee.string()}),Oi=ee.object({projectId:ee.string(),languages:ee.array(ee.string()),frameworks:ee.array(ee.string()),packageManager:ee.string().optional(),sourceDir:ee.string().optional(),testDir:ee.string().optional(),configFiles:ee.array(ee.string()),fileCount:ee.number(),patterns:ee.array(qf),antiPatterns:ee.array(Kf),analyzedAt:ee.string(),modelMetadata:As.optional(),status:Jf.default("draft"),commitHash:ee.string().optional(),signature:ee.string().optional(),sealedAt:ee.string().optional(),verifiedAt:ee.string().optional()}),vv={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Yf={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(Xf,"verifyFrameworks");l(Qf,"verifyLanguages");l(Zf,"verifyPatternLocations");l(eh,"verifyFileCount");l(th,"verifyAntiPatternFiles");l(Ql,"semanticVerify");l(nh,"getProjectExtensions");l(sh,"countProjectFiles")});import{z as ke}from"zod";var Ar,Yt,rh,Iv,_i,Zl,Fs=y(()=>{"use strict";Ar=ke.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Yt=ke.object({primaryDomain:Ar,secondaryDomains:ke.array(Ar),confidence:ke.number().min(0).max(1),filePatterns:ke.array(ke.string()),relevantAgents:ke.array(ke.string())}),rh=ke.object({classification:Yt,classifiedAt:ke.string(),source:ke.enum(["cache","history","llm","heuristic"]),descriptionHash:ke.string(),projectId:ke.string()}),Iv=ke.object({entries:ke.record(ke.string(),rh),confirmedPatterns:ke.array(ke.object({descriptionHash:ke.string(),classification:Yt,confirmedAt:ke.string(),taskDescription:ke.string()}))}),_i={entries:{},confirmedPatterns:[]},Zl={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as L}from"zod";var oh,ih,eu,ah,ch,lh,uh,dh,tu,Rv,Ni=y(()=>{"use strict";oh=L.enum(["low","medium","high"]),ih=L.enum(["pending","converted","completed","archived","dormant"]),eu=L.enum(["high","medium","low"]),ah=L.object({impact:eu,effort:eu}),ch=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()}),lh=L.object({name:L.string(),description:L.string()}),uh=L.object({name:L.string(),description:L.string().optional()}),dh=L.object({id:L.string(),text:L.string(),details:L.string().optional(),priority:oh,status:ih,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:ah.optional(),implementationNotes:L.string().optional(),stack:ch.optional(),modules:L.array(lh).optional(),roles:L.array(uh).optional(),risks:L.array(L.string()).optional(),risksCount:L.number().optional()}),tu=L.object({ideas:L.array(dh),lastUpdated:L.string()}),Rv={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z}from"zod";function su(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var nu,ph,mh,gh,fh,Fv,_v,Li=y(()=>{"use strict";nu=z.enum(["linear","jira","github","monday","asana","none"]),ph=z.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),mh=z.enum(["none","urgent","high","medium","low"]),gh=z.enum(["feature","bug","improvement","task","chore","epic"]),fh=z.object({id:z.string(),identifier:z.string(),title:z.string(),description:z.string().optional(),status:ph,priority:mh,type:gh.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()}),Fv=z.object({provider:nu,lastSync:z.string(),staleAfter:z.number().default(18e5),issues:z.record(z.string(),fh)}),_v=z.object({provider:nu,fetched:z.number(),updated:z.number(),errors:z.array(z.object({issueId:z.string(),error:z.string()})),timestamp:z.string()});l(su,"createEmptyIssues")});var cu={};Fn(cu,{AgentAssignmentSchema:()=>ru,OUTPUT_SCHEMAS:()=>iu,SubtaskBreakdownSchema:()=>ou,TaskClassificationSchema:()=>Yt,renderSchemaForPrompt:()=>Ui});import{z as je}from"zod";function Ui(r){let e=iu[r];return e?`## OUTPUT FORMAT
249
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Yf)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new Ar,G=$});function Fi(r){if(Dl.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Ir))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 Oi,Ir,dn,Rs,$s,Ms=w(()=>{"use strict";pe();Nn();re();Oi={frontend:[D.CODE_STYLE,D.FILE_STRUCTURE,D.ARCHITECTURE,D.TECH_STACK],backend:[D.CODE_STYLE,D.ARCHITECTURE,D.DEPENDENCIES,D.TECH_STACK],devops:[D.SHIP_WORKFLOW,D.TEST_BEHAVIOR,D.DEPENDENCIES,D.ARCHITECTURE],docs:[D.CODE_STYLE,D.NAMING_CONVENTION,D.FILE_STRUCTURE],testing:[D.TEST_BEHAVIOR,D.CODE_STYLE,D.DEPENDENCIES],database:[D.ARCHITECTURE,D.NAMING_CONVENTION,D.TECH_STACK,D.DEPENDENCIES],general:Object.values(D)},Ir={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(Fi,"resolveCanonicalDomains");dn=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}},Rs=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()}},$s=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 Os,_i=w(()=>{"use strict";pe();Nn();re();Ms();Os=class r extends dn{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=Cr(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=Cr(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:Cr(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 eu=w(()=>{"use strict"});import Fs from"node:fs/promises";import Kt from"node:path";import{z as te}from"zod";async function th(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=Kt.join(e,"package.json"),s=await Fs.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 nh(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 ih(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=eh[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 sh(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=Kt.join(e,a);try{await Fs.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 rh(r,e){let t=Date.now();try{let n=await ah(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 oh(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=Kt.join(e,o.file);try{await Fs.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 tu(r,e){let t=Date.now(),n=await Promise.all([th(r,e),nh(r,e),sh(r,e),rh(r,e),oh(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 ih(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Fs.readdir(s,{withFileTypes:!0});for(let i of o){let a=Kt.join(s,i.name),c=Kt.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Kt.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function ah(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Fs.readdir(s,{withFileTypes:!0});for(let i of o){let a=Kt.join(s,i.name),c=Kt.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 Xf,Qf,Zf,Ni,Dv,eh,Li=w(()=>{"use strict";O();Ds();Xf=te.enum(["draft","verified","sealed"]),Qf=te.object({name:te.string(),description:te.string(),location:te.string().optional()}),Zf=te.object({issue:te.string(),file:te.string(),suggestion:te.string()}),Ni=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(Qf),antiPatterns:te.array(Zf),analyzedAt:te.string(),modelMetadata:Is.optional(),status:Xf.default("draft"),commitHash:te.string().optional(),signature:te.string().optional(),sealedAt:te.string().optional(),verifiedAt:te.string().optional()}),Dv={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},eh={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(th,"verifyFrameworks");l(nh,"verifyLanguages");l(sh,"verifyPatternLocations");l(rh,"verifyFileCount");l(oh,"verifyAntiPatternFiles");l(tu,"semanticVerify");l(ih,"getProjectExtensions");l(ah,"countProjectFiles")});import{z as be}from"zod";var Dr,Yt,ch,Mv,Ui,nu,_s=w(()=>{"use strict";Dr=be.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Yt=be.object({primaryDomain:Dr,secondaryDomains:be.array(Dr),confidence:be.number().min(0).max(1),filePatterns:be.array(be.string()),relevantAgents:be.array(be.string())}),ch=be.object({classification:Yt,classifiedAt:be.string(),source:be.enum(["cache","history","llm","heuristic"]),descriptionHash:be.string(),projectId:be.string()}),Mv=be.object({entries:be.record(be.string(),ch),confirmedPatterns:be.array(be.object({descriptionHash:be.string(),classification:Yt,confirmedAt:be.string(),taskDescription:be.string()}))}),Ui={entries:{},confirmedPatterns:[]},nu={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as L}from"zod";var lh,uh,su,dh,ph,mh,gh,fh,ru,_v,Hi=w(()=>{"use strict";lh=L.enum(["low","medium","high"]),uh=L.enum(["pending","converted","completed","archived","dormant"]),su=L.enum(["high","medium","low"]),dh=L.object({impact:su,effort:su}),ph=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()}),mh=L.object({name:L.string(),description:L.string()}),gh=L.object({name:L.string(),description:L.string().optional()}),fh=L.object({id:L.string(),text:L.string(),details:L.string().optional(),priority:lh,status:uh,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:dh.optional(),implementationNotes:L.string().optional(),stack:ph.optional(),modules:L.array(mh).optional(),roles:L.array(gh).optional(),risks:L.array(L.string()).optional(),risksCount:L.number().optional()}),ru=L.object({ideas:L.array(fh),lastUpdated:L.string()}),_v={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z}from"zod";function iu(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var ou,hh,yh,wh,Sh,Hv,Gv,Gi=w(()=>{"use strict";ou=z.enum(["linear","jira","github","monday","asana","none"]),hh=z.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),yh=z.enum(["none","urgent","high","medium","low"]),wh=z.enum(["feature","bug","improvement","task","chore","epic"]),Sh=z.object({id:z.string(),identifier:z.string(),title:z.string(),description:z.string().optional(),status:hh,priority:yh,type:wh.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()}),Hv=z.object({provider:ou,lastSync:z.string(),staleAfter:z.number().default(18e5),issues:z.record(z.string(),Sh)}),Gv=z.object({provider:ou,fetched:z.number(),updated:z.number(),errors:z.array(z.object({issueId:z.string(),error:z.string()})),timestamp:z.string()});l(iu,"createEmptyIssues")});var du={};_n(du,{AgentAssignmentSchema:()=>au,OUTPUT_SCHEMAS:()=>lu,SubtaskBreakdownSchema:()=>cu,TaskClassificationSchema:()=>Yt,renderSchemaForPrompt:()=>zi});import{z as Re}from"zod";function zi(r){let e=lu[r];return e?`## OUTPUT FORMAT
250
250
 
251
251
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
252
252
 
@@ -255,15 +255,15 @@ ${e.example}
255
255
  \`\`\`
256
256
 
257
257
  Fields:
258
- ${hh(e.schema)}`:null}function hh(r){if(r instanceof je.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${au(n)}`).join(`
259
- `)}return"(see example above)"}function au(r){return r instanceof je.ZodString?"string":r instanceof je.ZodNumber?"number":r instanceof je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof je.ZodArray?`array of ${au(r.element)}`:r instanceof je.ZodObject?"object":"any"}var ru,ou,iu,Ir=y(()=>{"use strict";Fs();Fs();ru=je.object({agentName:je.string(),reasoning:je.string(),confidence:je.number().min(0).max(1)}),ou=je.object({subtasks:je.array(je.object({description:je.string(),domain:Ar,agent:je.string(),dependsOn:je.array(je.number())})),effort:je.enum(["low","medium","high"])}),iu={classification:{schema:Yt,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:ru,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:ou,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(Ui,"renderSchemaForPrompt");l(hh,"describeSchema");l(au,"describeField")});import{z as v}from"zod";var lu,yh,wh,uu,Sh,kh,bh,Ph,Ch,xh,vh,du,Th,Eh,Bv,pu,mu,gu,fu,Ah,Dr,Hi=y(()=>{"use strict";lu=v.number().min(1).max(5),yh=v.enum(["exceeded","met","partial","failed"]),wh=v.enum(["definitely","probably","maybe","no"]),uu=v.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Sh=v.object({estimated:v.object({hours:v.number(),confidence:v.enum(["low","medium","high"]).optional(),source:v.enum(["prd","manual","historical"]).optional()}),actual:v.object({hours:v.number(),commits:v.number().optional(),linesAdded:v.number().optional(),linesRemoved:v.number().optional(),sessions:v.number().optional()}),variance:v.object({hours:v.number(),percentage:v.number(),reason:uu.optional(),explanation:v.string().optional()})}),kh=v.object({name:v.string(),baseline:v.number().nullable(),target:v.number(),actual:v.number(),unit:v.string(),achieved:v.boolean(),percentOfTarget:v.number()}),bh=v.object({criteria:v.string(),met:v.boolean(),notes:v.string().optional()}),Ph=v.object({metrics:v.array(kh),acceptanceCriteria:v.array(bh),overallSuccess:yh,successScore:v.number().min(0).max(100)}),Ch=v.object({category:v.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:v.string(),actionable:v.boolean(),action:v.string().optional()}),xh=v.object({whatWorked:v.array(v.string()),whatDidnt:v.array(v.string()),surprises:v.array(v.string()),recommendations:v.array(Ch)}),vh=v.object({valueDelivered:v.number().min(1).max(10),userImpact:v.enum(["none","low","medium","high","critical"]),businessImpact:v.enum(["none","low","medium","high","critical"]),roiScore:v.number(),worthIt:wh,worthItReason:v.string().optional(),alternativeConsidered:v.string().optional(),betterAlternativeExists:v.boolean().optional()}),du=v.object({id:v.string(),taskId:v.string(),description:v.string(),estimatedMinutes:v.number().optional(),actualMinutes:v.number(),completedAsPlanned:v.boolean(),qualityScore:lu,blockers:v.array(v.string()),agentUsed:v.string().optional(),skillsUsed:v.array(v.string()).optional(),startedAt:v.string(),completedAt:v.string()}),Th=v.object({id:v.string(),featureId:v.string(),featureName:v.string(),prdId:v.string().nullable(),version:v.string().optional(),branch:v.string().optional(),prUrl:v.string().optional(),effort:Sh,success:Ph.optional(),learnings:xh,roi:vh,rating:lu,taskOutcomes:v.array(du).optional(),startedAt:v.string(),shippedAt:v.string(),reviewedAt:v.string().optional(),reviewedBy:v.string().optional(),legacy:v.boolean().optional()}),Eh=v.object({totalFeatures:v.number(),averageEstimationAccuracy:v.number(),averageSuccessRate:v.number(),averageROI:v.number(),bySuccessLevel:v.object({exceeded:v.number(),met:v.number(),partial:v.number(),failed:v.number()}),variancePatterns:v.array(v.object({reason:uu,count:v.number(),averageVariance:v.number()})),topLearnings:v.array(v.object({insight:v.string(),frequency:v.number()}))}),Bv=v.object({outcomes:v.array(Th),taskOutcomes:v.array(du).optional(),aggregates:Eh.optional(),lastUpdated:v.string(),lastAggregated:v.string().optional()}),pu={outcomes:[],taskOutcomes:[],lastUpdated:""},mu=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"),gu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),fu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Ah=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Dr=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=>Ah(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 Ee}from"zod";function Mh(){let r={};for(let e of jh)r[e]="allow";for(let e of Rh)r[e]="ask";for(let e of $h)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var jr,Kv,Ih,Gi,Dh,Yv,jh,Rh,$h,Xv,hu=y(()=>{"use strict";jr=Ee.enum(["allow","deny","ask"]),Kv=Ee.enum(["read","write","delete","create"]),Ih=Ee.record(Ee.string(),jr),Gi=Ee.record(Ee.string(),jr),Dh=Ee.object({enabled:Ee.boolean().default(!0),allowedDomains:Ee.array(Ee.string()).optional(),blockedDomains:Ee.array(Ee.string()).optional()}),Yv=Ee.object({bash:Ih.optional(),files:Ee.object({read:Gi.optional(),write:Gi.optional(),delete:Gi.optional()}).optional(),web:Dh.optional(),skills:Ee.record(Ee.string(),jr).optional(),doomLoop:Ee.object({enabled:Ee.boolean().default(!0),maxRetries:Ee.number().default(3)}).optional(),externalDirectories:jr.default("ask")}),jh=["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*"],Rh=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],$h=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Mh,"buildDefaultPermissions");Xv=Mh()});import{z as Be}from"zod";var tT,nT,yu=y(()=>{"use strict";tT=Be.object({projectId:Be.string(),name:Be.string(),repoPath:Be.string(),description:Be.string().optional(),version:Be.string().optional(),cliVersion:Be.string().optional(),techStack:Be.array(Be.string()),fileCount:Be.number(),commitCount:Be.number(),createdAt:Be.string(),lastSync:Be.string(),lastSyncCommit:Be.string().optional(),lastSyncBranch:Be.string().optional()}),nT={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as T}from"zod";var Oh,Fh,_h,Nh,Lh,Uh,Hh,Gh,zh,Wh,Bh,Vh,Jh,qh,Kh,Yh,Xh,Qh,iT,aT,wu=y(()=>{"use strict";Oh=T.enum(["planned","active","completed","shipped"]),Fh=T.enum(["low","medium","high"]),_h=T.enum(["feature","breaking_change","refactor","infrastructure"]),Nh=T.enum(["completed","active","planned"]),Lh=T.enum(["planned","active","completed"]),Uh=T.enum(["git","git-branch","manual","prd"]),Hh=T.object({id:T.string(),description:T.string(),completed:T.boolean(),completedAt:T.string().optional()}),Gh=T.object({id:T.string(),name:T.string(),status:Nh,completedAt:T.string().optional()}),zh=T.object({goal:T.string(),phases:T.array(Gh),successMetrics:T.array(T.string()).optional()}),Wh=T.object({hours:T.number(),minutes:T.number(),totalMinutes:T.number(),display:T.string().optional()}),Bh=T.object({hash:T.string(),message:T.string(),date:T.string(),author:T.string().optional()}),Vh=T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),breakdown:T.array(T.object({area:T.string(),hours:T.number()})).optional()}),Jh=T.object({hours:T.number().optional(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional()}),qh=T.object({estimated:Vh.nullable(),actual:Jh.nullable()}),Kh=T.object({totalHours:T.number(),allocatedHours:T.number(),bufferPercent:T.number().optional()}),Yh=T.object({id:T.string(),name:T.string(),theme:T.string().optional(),goals:T.array(T.string()).optional(),features:T.array(T.string()),capacity:Kh.optional(),status:Lh,startDate:T.string().optional(),endDate:T.string().optional()}),Xh=T.object({id:T.string(),name:T.string(),description:T.string().optional(),date:T.string(),status:Oh,impact:Fh,effort:T.string().optional(),progress:T.number(),type:_h.optional(),roi:T.number().optional(),why:T.array(T.string()).optional(),technicalNotes:T.array(T.string()).optional(),compatibility:T.string().optional(),phase:T.string().optional(),tasks:T.array(Hh),createdAt:T.string(),shippedAt:T.string().optional(),version:T.string().optional(),duration:Wh.optional(),taskCount:T.number().optional(),agent:T.string().optional(),sprintName:T.string().optional(),completedDate:T.string().optional(),prdId:T.string().nullable().optional(),legacy:T.boolean().optional(),inferredFrom:Uh.optional(),quarter:T.string().nullable().optional(),dependencies:T.array(T.string()).optional(),blockedBy:T.array(T.string()).optional(),effortTracking:qh.optional(),valueScore:T.number().optional(),commits:T.array(Bh).optional(),branch:T.string().optional(),commitsAhead:T.number().optional()}),Qh=T.object({id:T.string(),title:T.string(),prdId:T.string().nullable().optional(),valueScore:T.number().optional(),effortEstimate:T.number().optional(),reason:T.string().optional()}),iT=T.object({strategy:zh.nullable().optional(),features:T.array(Xh),backlog:T.array(T.union([T.string(),Qh])),lastUpdated:T.string(),quarters:T.array(Yh).optional(),generatedFrom:T.enum(["git-history","manual","prd"]).optional(),generatedAt:T.string().optional()}),aT={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 Zh from"node:crypto";import{homedir as ey}from"node:os";import{join as ty}from"node:path";function re(){return Zh.randomUUID()}var ny,Su=y(()=>{"use strict";l(re,"generateUUID");ny=ty(ey(),".prjct-cli","projects")});import{z as J}from"zod";var sy,ku,ry,oy,iy,ay,cy,ly,uy,bu,zi=y(()=>{"use strict";sy=J.enum(["feature","fix","improvement","refactor"]),ku=J.enum(["pass","warning","fail","skipped"]),ry=J.enum(["added","changed","fixed","removed"]),oy=J.object({hours:J.number(),minutes:J.number(),totalMinutes:J.number()}),iy=J.object({filesChanged:J.number().nullable().optional(),linesAdded:J.number().nullable().optional(),linesRemoved:J.number().nullable().optional(),commits:J.number().nullable().optional()}),ay=J.object({description:J.string(),type:ry.optional()}),cy=J.object({lintStatus:ku.nullable().optional(),lintDetails:J.string().optional(),testStatus:ku.nullable().optional(),testDetails:J.string().optional()}),ly=J.object({hash:J.string().optional(),message:J.string().optional(),branch:J.string().optional()}),uy=J.object({id:J.string(),name:J.string(),version:J.string().nullable().optional(),type:sy,agent:J.string().optional(),description:J.string().optional(),changes:J.array(ay).optional(),codeSnippets:J.array(J.string()).optional(),commit:ly.optional(),codeMetrics:iy.optional(),qualityMetrics:cy.optional(),quantitativeImpact:J.string().optional(),duration:oy.optional(),tasksCompleted:J.number().nullable().optional(),shippedAt:J.string(),featureId:J.string().optional()}),bu=J.object({shipped:J.array(uy),lastUpdated:J.string()})});import{z as x}from"zod";var dy,Cu,py,my,gy,Wi,xu,fy,hy,vu,Pu,yy,wy,Tu,Eu,Au,Sy,ky,kT,Rr=y(()=>{"use strict";Is();dy=x.enum(["low","medium","high","critical"]),Cu=x.enum(["feature","bug","improvement","chore"]),py=x.enum(["active","backlog","previously_active"]),my=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),gy=x.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Wi=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()}),xu=x.object({output:x.string().min(1,"Subtask output is required"),summary:Wi}),fy=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:my,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:Wi.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),hy=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),vu=x.object({id:x.string(),description:x.string(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(fy).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:hy.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:As.optional()}),Pu=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional()}),yy=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()}),wy=x.object({taskId:x.string(),title:x.string(),classification:Cu,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(Wi),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:yy.optional()}),Tu=x.object({currentTask:vu.nullable(),previousTask:Pu.nullable().optional(),pausedTasks:x.array(Pu).optional(),taskHistory:x.array(wy).optional(),lastUpdated:x.string()}),Eu=x.object({id:x.string(),description:x.string(),priority:dy,type:Cu,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()}),Au=x.object({tasks:x.array(Eu),lastUpdated:x.string()}),Sy=x.object({tasksToday:x.number(),tasksThisWeek:x.number(),streak:x.number(),velocity:x.string(),avgDuration:x.string()}),ky=x.object({type:gy,description:x.string(),timestamp:x.string(),duration:x.string().optional()}),kT=x.object({projectId:x.string(),currentTask:vu.nullable(),queue:x.array(Eu),stats:Sy,recentActivity:x.array(ky),lastSync:x.string()})});import{z as Q}from"zod";var by,Py,Iu,xT,vT,TT,Xt,Du,Hn=y(()=>{"use strict";by=Q.enum(["improving","stable","declining"]),Py=Q.object({sprintNumber:Q.number(),startDate:Q.string(),endDate:Q.string(),pointsCompleted:Q.number(),tasksCompleted:Q.number(),avgVariance:Q.number(),estimationAccuracy:Q.number()}),Iu=Q.object({category:Q.string(),avgVariance:Q.number(),taskCount:Q.number()}),xT=Q.object({totalPoints:Q.number(),sprints:Q.number(),estimatedDate:Q.string()}),vT=Q.object({sprints:Q.array(Py),averageVelocity:Q.number(),velocityTrend:by,estimationAccuracy:Q.number(),overEstimated:Q.array(Iu),underEstimated:Q.array(Iu),lastUpdated:Q.string()}),TT=Q.object({sprintLengthDays:Q.number().min(1).max(90).default(7),startDay:Q.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:Q.number().min(1).max(52).default(6),accuracyTolerance:Q.number().min(0).max(100).default(20)}),Xt={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Du={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var kt=y(()=>{"use strict";Xl();Fi();Fs();Ni();Li();Ir();Is();Hi();hu();yu();wu();Su();zi();Rr();Hn()});var dn,Bi=y(()=>{"use strict";kt();_n();se();$s();dn=class extends un{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(D),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(D);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(D));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:re(),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),j=(p.tags||[]).filter(V=>I.includes(V));g.tagMatch=Math.min(20,j.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),j=0;for(let V of I)p.content.toLowerCase().includes(V)&&(j+=2),p.title.toLowerCase().includes(V)&&(j+=3);g.keywords=Math.min(15,j)}p.userTriggered&&(g.userTriggered=5);let P=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:P,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=Ri[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Er[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 $i(e)}_getCommandTags(e){return{ship:[D.COMMIT_STYLE,D.SHIP_WORKFLOW,D.TEST_BEHAVIOR],feature:[D.ARCHITECTURE,D.CODE_STYLE],done:[D.SHIP_WORKFLOW],analyze:[D.TECH_STACK,D.ARCHITECTURE],spec:[D.ARCHITECTURE,D.CODE_STYLE],task:[D.BRANCH_NAMING,D.CODE_STYLE],sync:[D.TECH_STACK,D.ARCHITECTURE,D.DEPENDENCIES],test:[D.TEST_BEHAVIOR],bug:[D.CODE_STYLE,D.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:[D.COMMIT_STYLE,D.SHIP_WORKFLOW,D.TEST_BEHAVIOR],feature:[D.ARCHITECTURE,D.CODE_STYLE],done:[D.SHIP_WORKFLOW],analyze:[D.TECH_STACK,D.ARCHITECTURE],spec:[D.ARCHITECTURE,D.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:[D.COMMIT_STYLE],branch_naming:[D.BRANCH_NAMING],test_before_ship:[D.TEST_BEHAVIOR,D.SHIP_WORKFLOW],preferred_agent:[D.AGENT_PREFERENCE],code_style:[D.CODE_STYLE],verbosity:[D.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 Vi,Cy,pe,Gn=y(()=>{"use strict";$s();Mi();Bi();$s();Mi();Bi();Vi=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new dn,this._patternStore=new Ms,this._historyStore=new Rs,this._sessionStore=new js}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()}},Cy=new Vi,pe=Cy});import{exec as xy}from"node:child_process";import nt from"node:fs/promises";import bt from"node:path";import{promisify as vy}from"node:util";var pn,Ji,Ty,Re,ju=y(()=>{"use strict";O();pn=vy(xy),Ji=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=bt.join(this.projectPath,"package.json"),t=await nt.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=bt.join(this.projectPath,"Cargo.toml");return await nt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readRequirements(){try{let e=bt.join(this.projectPath,"requirements.txt");return await nt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGoMod(){try{let e=bt.join(this.projectPath,"go.mod");return await nt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGemfile(){try{let e=bt.join(this.projectPath,"Gemfile");return await nt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readMixExs(){try{let e=bt.join(this.projectPath,"mix.exs");return await nt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readPomXml(){try{let e=bt.join(this.projectPath,"pom.xml");return await nt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readComposerJson(){try{let e=bt.join(this.projectPath,"composer.json"),t=await nt.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=bt.join(this.projectPath,"pyproject.toml");return await nt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await pn('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 nt.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 nt.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 pn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await pn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await pn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await pn('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 pn('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 nt.access(bt.join(this.projectPath,e)),!0}catch(t){if(C(t))return!1;throw t}}async readFile(e){try{let t=bt.join(this.projectPath,e);return await nt.readFile(t,"utf-8")}catch(t){if(C(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await pn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
262
- `).filter(Boolean)}catch{return[]}}},Ty=new Ji,Re=Ty});import{z as ie}from"zod";function Ey(r){return r instanceof zn}function K(r){return Ey(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Wn,SE,kE,bE,PE,CE,xE,zn,$r,Mr,_s,Ut=y(()=>{"use strict";Wn={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}},SE=Wn.create("FileError",ie.object({path:ie.string(),operation:ie.enum(["read","write","delete","create","copy"]),reason:ie.string().optional()})),kE=Wn.create("ValidationError",ie.object({field:ie.string(),expected:ie.string(),received:ie.string().optional(),message:ie.string().optional()})),bE=Wn.create("PermissionError",ie.object({action:ie.string(),resource:ie.string(),reason:ie.string().optional()})),PE=Wn.create("TaskError",ie.object({taskId:ie.string().optional(),operation:ie.enum(["create","update","complete","pause","resume","delete"]),reason:ie.string()})),CE=Wn.create("SessionError",ie.object({sessionId:ie.string().optional(),reason:ie.string()})),xE=Wn.create("SyncError",ie.object({projectId:ie.string().optional(),operation:ie.enum(["push","pull","auth","connect"]),reason:ie.string()})),zn=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 zn{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")}},Mr=class r extends zn{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")}},_s=class r extends zn{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(Ey,"isPrjctError");l(K,"getErrorMessage")});import qi from"node:fs";import Fr from"node:path";function Ru(){if(Ns)return Ns;let r=__dirname;for(let e=0;e<5;e++){let t=Fr.join(r,"package.json");if(qi.existsSync(t))try{if(JSON.parse(qi.readFileSync(t,"utf-8")).name==="prjct-cli")return Ns=r,r}catch{}r=Fr.dirname(r)}return Ns=Fr.join(__dirname,"..","..",".."),Ns}function Iy(){if(Or)return Or;try{let r=Fr.join(Ru(),"package.json"),e=JSON.parse(qi.readFileSync(r,"utf-8"));return Or=e.version,Ay=e,Or}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}var Or,Ay,Ns,Bn,Pe,mn=y(()=>{"use strict";O();Or=null,Ay=null,Ns=null;l(Ru,"getPackageRoot");l(Iy,"getVersion");Bn=Iy(),Pe=Ru()});import Yi from"node:fs";import Dy from"node:fs/promises";import _r from"node:path";function Xi(){if($u)return Ki;$u=!0;let r=_r.join(Pe,"dist","templates.json");try{let e=Yi.readFileSync(r,"utf-8");return Ki=JSON.parse(e),Ki}catch{return null}}function Ry(r){let e=gn.indexOf(r);e>-1&&gn.splice(e,1),gn.push(r)}function $y(){for(;Vn.size>=jy&&gn.length>0;){let r=gn.shift();r&&Vn.delete(r)}}function Nr(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 Mu(r){if(Vn.has(r))return Ry(r),Vn.get(r);let e,t=Xi();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=_r.join(Pe,"templates","commands",`${r}.md`);try{e=await Dy.readFile(s,"utf-8")}catch{throw Mr.notFound(r)}}let n=Nr(e);return $y(),Vn.set(r,n),gn.push(r),n}async function My(r){return(await Mu(r)).frontmatter["allowed-tools"]||[]}function Oy(){Vn.clear(),gn.length=0}function Ae(r){let e=Xi();if(e?.[r])return e[r];let t=_r.join(Pe,"templates",r);try{return Yi.readFileSync(t,"utf-8")}catch{return null}}function Jn(r){let e=Xi();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=_r.join(Pe,"templates",r);try{return Yi.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var jy,Vn,gn,Ki,$u,Fy,Qi,qn=y(()=>{"use strict";Ut();mn();jy=50,Vn=new Map,gn=[],Ki=null,$u=!1;l(Xi,"loadBundle");l(Ry,"updateLruOrder");l($y,"evictLru");l(Nr,"parseFrontmatter");l(Mu,"load");l(My,"getAllowedTools");l(Oy,"clearCache");l(Ae,"getTemplateContent");l(Jn,"listTemplates");Fy={load:Mu,parseFrontmatter:Nr,getAllowedTools:My,clearCache:Oy,getTemplateContent:Ae,listTemplates:Jn},Qi=Fy});import W from"node:fs/promises";import ea from"node:os";import q from"node:path";async function _y(){try{let r=Ae("global/modules/module-config.json");if(r)return JSON.parse(r);let e=q.join(Pe,"templates/global/modules/module-config.json"),t=await W.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Ny(r){let e=await _y();if(!e){let i=Ae("global/CLAUDE.md");if(i)return i;let a=q.join(Pe,"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=Ae("global/CLAUDE.md");if(a)return a;let c=q.join(Pe,"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=Ae(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=q.join(Pe,"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 Ly(){try{let r=q.join(ea.homedir(),".prjct-cli","docs");await W.mkdir(r,{recursive:!0});let e=Jn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Ae(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(Pe,"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:w(r)}}}async function Uy(){let r=(Je(),lt(tt)),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(Pe,"templates","global",e.contextFile),i="";try{let u=Ae(`global/${e.contextFile}`);u?i=u:i=await W.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Ny()}catch{let d=Ae("global/CLAUDE.md");if(d)i=d;else{let m=q.join(Pe,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}}else{let d=Ae("global/CLAUDE.md");if(d)i=d;else{let m=q.join(Pe,"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}
258
+ ${kh(e.schema)}`:null}function kh(r){if(r instanceof Re.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${uu(n)}`).join(`
259
+ `)}return"(see example above)"}function uu(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 ${uu(r.element)}`:r instanceof Re.ZodObject?"object":"any"}var au,cu,lu,jr=w(()=>{"use strict";_s();_s();au=Re.object({agentName:Re.string(),reasoning:Re.string(),confidence:Re.number().min(0).max(1)}),cu=Re.object({subtasks:Re.array(Re.object({description:Re.string(),domain:Dr,agent:Re.string(),dependsOn:Re.array(Re.number())})),effort:Re.enum(["low","medium","high"])}),lu={classification:{schema:Yt,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:au,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:cu,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(zi,"renderSchemaForPrompt");l(kh,"describeSchema");l(uu,"describeField")});import{z as v}from"zod";var pu,bh,Ph,mu,Ch,xh,vh,Th,Eh,Ah,Ih,gu,Dh,jh,Yv,fu,hu,yu,wu,Rh,Rr,Wi=w(()=>{"use strict";pu=v.number().min(1).max(5),bh=v.enum(["exceeded","met","partial","failed"]),Ph=v.enum(["definitely","probably","maybe","no"]),mu=v.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Ch=v.object({estimated:v.object({hours:v.number(),confidence:v.enum(["low","medium","high"]).optional(),source:v.enum(["prd","manual","historical"]).optional()}),actual:v.object({hours:v.number(),commits:v.number().optional(),linesAdded:v.number().optional(),linesRemoved:v.number().optional(),sessions:v.number().optional()}),variance:v.object({hours:v.number(),percentage:v.number(),reason:mu.optional(),explanation:v.string().optional()})}),xh=v.object({name:v.string(),baseline:v.number().nullable(),target:v.number(),actual:v.number(),unit:v.string(),achieved:v.boolean(),percentOfTarget:v.number()}),vh=v.object({criteria:v.string(),met:v.boolean(),notes:v.string().optional()}),Th=v.object({metrics:v.array(xh),acceptanceCriteria:v.array(vh),overallSuccess:bh,successScore:v.number().min(0).max(100)}),Eh=v.object({category:v.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:v.string(),actionable:v.boolean(),action:v.string().optional()}),Ah=v.object({whatWorked:v.array(v.string()),whatDidnt:v.array(v.string()),surprises:v.array(v.string()),recommendations:v.array(Eh)}),Ih=v.object({valueDelivered:v.number().min(1).max(10),userImpact:v.enum(["none","low","medium","high","critical"]),businessImpact:v.enum(["none","low","medium","high","critical"]),roiScore:v.number(),worthIt:Ph,worthItReason:v.string().optional(),alternativeConsidered:v.string().optional(),betterAlternativeExists:v.boolean().optional()}),gu=v.object({id:v.string(),taskId:v.string(),description:v.string(),estimatedMinutes:v.number().optional(),actualMinutes:v.number(),completedAsPlanned:v.boolean(),qualityScore:pu,blockers:v.array(v.string()),agentUsed:v.string().optional(),skillsUsed:v.array(v.string()).optional(),startedAt:v.string(),completedAt:v.string()}),Dh=v.object({id:v.string(),featureId:v.string(),featureName:v.string(),prdId:v.string().nullable(),version:v.string().optional(),branch:v.string().optional(),prUrl:v.string().optional(),effort:Ch,success:Th.optional(),learnings:Ah,roi:Ih,rating:pu,taskOutcomes:v.array(gu).optional(),startedAt:v.string(),shippedAt:v.string(),reviewedAt:v.string().optional(),reviewedBy:v.string().optional(),legacy:v.boolean().optional()}),jh=v.object({totalFeatures:v.number(),averageEstimationAccuracy:v.number(),averageSuccessRate:v.number(),averageROI:v.number(),bySuccessLevel:v.object({exceeded:v.number(),met:v.number(),partial:v.number(),failed:v.number()}),variancePatterns:v.array(v.object({reason:mu,count:v.number(),averageVariance:v.number()})),topLearnings:v.array(v.object({insight:v.string(),frequency:v.number()}))}),Yv=v.object({outcomes:v.array(Dh),taskOutcomes:v.array(gu).optional(),aggregates:jh.optional(),lastUpdated:v.string(),lastAggregated:v.string().optional()}),fu={outcomes:[],taskOutcomes:[],lastUpdated:""},hu=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"),yu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),wu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Rh=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Rr=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=>Rh(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 Nh(){let r={};for(let e of Oh)r[e]="allow";for(let e of Fh)r[e]="ask";for(let e of _h)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var $r,eT,$h,Bi,Mh,tT,Oh,Fh,_h,nT,Su=w(()=>{"use strict";$r=Ae.enum(["allow","deny","ask"]),eT=Ae.enum(["read","write","delete","create"]),$h=Ae.record(Ae.string(),$r),Bi=Ae.record(Ae.string(),$r),Mh=Ae.object({enabled:Ae.boolean().default(!0),allowedDomains:Ae.array(Ae.string()).optional(),blockedDomains:Ae.array(Ae.string()).optional()}),tT=Ae.object({bash:$h.optional(),files:Ae.object({read:Bi.optional(),write:Bi.optional(),delete:Bi.optional()}).optional(),web:Mh.optional(),skills:Ae.record(Ae.string(),$r).optional(),doomLoop:Ae.object({enabled:Ae.boolean().default(!0),maxRetries:Ae.number().default(3)}).optional(),externalDirectories:$r.default("ask")}),Oh=["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*"],Fh=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],_h=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Nh,"buildDefaultPermissions");nT=Nh()});import{z as Ve}from"zod";var iT,aT,ku=w(()=>{"use strict";iT=Ve.object({projectId:Ve.string(),name:Ve.string(),repoPath:Ve.string(),description:Ve.string().optional(),version:Ve.string().optional(),cliVersion:Ve.string().optional(),techStack:Ve.array(Ve.string()),fileCount:Ve.number(),commitCount:Ve.number(),createdAt:Ve.string(),lastSync:Ve.string(),lastSyncCommit:Ve.string().optional(),lastSyncBranch:Ve.string().optional()}),aT={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as T}from"zod";var Lh,Uh,Hh,Gh,zh,Wh,Bh,Vh,Jh,qh,Kh,Yh,Xh,Qh,Zh,ey,ty,ny,dT,pT,bu=w(()=>{"use strict";Lh=T.enum(["planned","active","completed","shipped"]),Uh=T.enum(["low","medium","high"]),Hh=T.enum(["feature","breaking_change","refactor","infrastructure"]),Gh=T.enum(["completed","active","planned"]),zh=T.enum(["planned","active","completed"]),Wh=T.enum(["git","git-branch","manual","prd"]),Bh=T.object({id:T.string(),description:T.string(),completed:T.boolean(),completedAt:T.string().optional()}),Vh=T.object({id:T.string(),name:T.string(),status:Gh,completedAt:T.string().optional()}),Jh=T.object({goal:T.string(),phases:T.array(Vh),successMetrics:T.array(T.string()).optional()}),qh=T.object({hours:T.number(),minutes:T.number(),totalMinutes:T.number(),display:T.string().optional()}),Kh=T.object({hash:T.string(),message:T.string(),date:T.string(),author:T.string().optional()}),Yh=T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),breakdown:T.array(T.object({area:T.string(),hours:T.number()})).optional()}),Xh=T.object({hours:T.number().optional(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional()}),Qh=T.object({estimated:Yh.nullable(),actual:Xh.nullable()}),Zh=T.object({totalHours:T.number(),allocatedHours:T.number(),bufferPercent:T.number().optional()}),ey=T.object({id:T.string(),name:T.string(),theme:T.string().optional(),goals:T.array(T.string()).optional(),features:T.array(T.string()),capacity:Zh.optional(),status:zh,startDate:T.string().optional(),endDate:T.string().optional()}),ty=T.object({id:T.string(),name:T.string(),description:T.string().optional(),date:T.string(),status:Lh,impact:Uh,effort:T.string().optional(),progress:T.number(),type:Hh.optional(),roi:T.number().optional(),why:T.array(T.string()).optional(),technicalNotes:T.array(T.string()).optional(),compatibility:T.string().optional(),phase:T.string().optional(),tasks:T.array(Bh),createdAt:T.string(),shippedAt:T.string().optional(),version:T.string().optional(),duration:qh.optional(),taskCount:T.number().optional(),agent:T.string().optional(),sprintName:T.string().optional(),completedDate:T.string().optional(),prdId:T.string().nullable().optional(),legacy:T.boolean().optional(),inferredFrom:Wh.optional(),quarter:T.string().nullable().optional(),dependencies:T.array(T.string()).optional(),blockedBy:T.array(T.string()).optional(),effortTracking:Qh.optional(),valueScore:T.number().optional(),commits:T.array(Kh).optional(),branch:T.string().optional(),commitsAhead:T.number().optional()}),ny=T.object({id:T.string(),title:T.string(),prdId:T.string().nullable().optional(),valueScore:T.number().optional(),effortEstimate:T.number().optional(),reason:T.string().optional()}),dT=T.object({strategy:Jh.nullable().optional(),features:T.array(ty),backlog:T.array(T.union([T.string(),ny])),lastUpdated:T.string(),quarters:T.array(ey).optional(),generatedFrom:T.enum(["git-history","manual","prd"]).optional(),generatedAt:T.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 sy from"node:crypto";import{homedir as ry}from"node:os";import{join as oy}from"node:path";function oe(){return sy.randomUUID()}var iy,Pu=w(()=>{"use strict";l(oe,"generateUUID");iy=oy(ry(),".prjct-cli","projects")});import{z as J}from"zod";var ay,Cu,cy,ly,uy,dy,py,my,gy,xu,Vi=w(()=>{"use strict";ay=J.enum(["feature","fix","improvement","refactor"]),Cu=J.enum(["pass","warning","fail","skipped"]),cy=J.enum(["added","changed","fixed","removed"]),ly=J.object({hours:J.number(),minutes:J.number(),totalMinutes:J.number()}),uy=J.object({filesChanged:J.number().nullable().optional(),linesAdded:J.number().nullable().optional(),linesRemoved:J.number().nullable().optional(),commits:J.number().nullable().optional()}),dy=J.object({description:J.string(),type:cy.optional()}),py=J.object({lintStatus:Cu.nullable().optional(),lintDetails:J.string().optional(),testStatus:Cu.nullable().optional(),testDetails:J.string().optional()}),my=J.object({hash:J.string().optional(),message:J.string().optional(),branch:J.string().optional()}),gy=J.object({id:J.string(),name:J.string(),version:J.string().nullable().optional(),type:ay,agent:J.string().optional(),description:J.string().optional(),changes:J.array(dy).optional(),codeSnippets:J.array(J.string()).optional(),commit:my.optional(),codeMetrics:uy.optional(),qualityMetrics:py.optional(),quantitativeImpact:J.string().optional(),duration:ly.optional(),tasksCompleted:J.number().nullable().optional(),shippedAt:J.string(),featureId:J.string().optional()}),xu=J.object({shipped:J.array(gy),lastUpdated:J.string()})});import{z as x}from"zod";var fy,Tu,hy,yy,wy,Ji,Eu,Sy,ky,Au,vu,by,Py,Iu,Du,ju,Cy,xy,vT,Mr=w(()=>{"use strict";Ds();fy=x.enum(["low","medium","high","critical"]),Tu=x.enum(["feature","bug","improvement","chore"]),hy=x.enum(["active","backlog","previously_active"]),yy=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),wy=x.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ji=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()}),Eu=x.object({output:x.string().min(1,"Subtask output is required"),summary:Ji}),Sy=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:yy,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:Ji.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),ky=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),Au=x.object({id:x.string(),description:x.string(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(Sy).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:ky.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:Is.optional()}),vu=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional()}),by=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()}),Py=x.object({taskId:x.string(),title:x.string(),classification:Tu,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(Ji),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:by.optional()}),Iu=x.object({currentTask:Au.nullable(),previousTask:vu.nullable().optional(),pausedTasks:x.array(vu).optional(),taskHistory:x.array(Py).optional(),lastUpdated:x.string()}),Du=x.object({id:x.string(),description:x.string(),priority:fy,type:Tu,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:hy,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),ju=x.object({tasks:x.array(Du),lastUpdated:x.string()}),Cy=x.object({tasksToday:x.number(),tasksThisWeek:x.number(),streak:x.number(),velocity:x.string(),avgDuration:x.string()}),xy=x.object({type:wy,description:x.string(),timestamp:x.string(),duration:x.string().optional()}),vT=x.object({projectId:x.string(),currentTask:Au.nullable(),queue:x.array(Du),stats:Cy,recentActivity:x.array(xy),lastSync:x.string()})});import{z as Z}from"zod";var vy,Ty,Ru,IT,DT,jT,Xt,$u,Gn=w(()=>{"use strict";vy=Z.enum(["improving","stable","declining"]),Ty=Z.object({sprintNumber:Z.number(),startDate:Z.string(),endDate:Z.string(),pointsCompleted:Z.number(),tasksCompleted:Z.number(),avgVariance:Z.number(),estimationAccuracy:Z.number()}),Ru=Z.object({category:Z.string(),avgVariance:Z.number(),taskCount:Z.number()}),IT=Z.object({totalPoints:Z.number(),sprints:Z.number(),estimatedDate:Z.string()}),DT=Z.object({sprints:Z.array(Ty),averageVelocity:Z.number(),velocityTrend:vy,estimationAccuracy:Z.number(),overEstimated:Z.array(Ru),underEstimated:Z.array(Ru),lastUpdated:Z.string()}),jT=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)}),Xt={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},$u={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var kt=w(()=>{"use strict";eu();Li();_s();Hi();Gi();jr();Ds();Wi();Su();ku();bu();Pu();Vi();Mr();Gn()});var pn,qi=w(()=>{"use strict";kt();Nn();re();Ms();pn=class extends dn{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(D),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(D);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(D));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: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=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),j=(p.tags||[]).filter(V=>I.includes(V));g.tagMatch=Math.min(20,j.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),j=0;for(let V of I)p.content.toLowerCase().includes(V)&&(j+=2),p.title.toLowerCase().includes(V)&&(j+=3);g.keywords=Math.min(15,j)}p.userTriggered&&(g.userTriggered=5);let k=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:k,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=Oi[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Ir[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 Fi(e)}_getCommandTags(e){return{ship:[D.COMMIT_STYLE,D.SHIP_WORKFLOW,D.TEST_BEHAVIOR],feature:[D.ARCHITECTURE,D.CODE_STYLE],done:[D.SHIP_WORKFLOW],analyze:[D.TECH_STACK,D.ARCHITECTURE],spec:[D.ARCHITECTURE,D.CODE_STYLE],task:[D.BRANCH_NAMING,D.CODE_STYLE],sync:[D.TECH_STACK,D.ARCHITECTURE,D.DEPENDENCIES],test:[D.TEST_BEHAVIOR],bug:[D.CODE_STYLE,D.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:[D.COMMIT_STYLE,D.SHIP_WORKFLOW,D.TEST_BEHAVIOR],feature:[D.ARCHITECTURE,D.CODE_STYLE],done:[D.SHIP_WORKFLOW],analyze:[D.TECH_STACK,D.ARCHITECTURE],spec:[D.ARCHITECTURE,D.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:[D.COMMIT_STYLE],branch_naming:[D.BRANCH_NAMING],test_before_ship:[D.TEST_BEHAVIOR,D.SHIP_WORKFLOW],preferred_agent:[D.AGENT_PREFERENCE],code_style:[D.CODE_STYLE],verbosity:[D.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 Ki,Ey,ge,zn=w(()=>{"use strict";Ms();_i();qi();Ms();_i();qi();Ki=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new pn,this._patternStore=new Os,this._historyStore=new $s,this._sessionStore=new Rs}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()}},Ey=new Ki,ge=Ey});import{exec as Ay}from"node:child_process";import st from"node:fs/promises";import bt from"node:path";import{promisify as Iy}from"node:util";var mn,Yi,Dy,$e,Mu=w(()=>{"use strict";O();mn=Iy(Ay),Yi=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=bt.join(this.projectPath,"package.json"),t=await st.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=bt.join(this.projectPath,"Cargo.toml");return await st.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readRequirements(){try{let e=bt.join(this.projectPath,"requirements.txt");return await st.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGoMod(){try{let e=bt.join(this.projectPath,"go.mod");return await st.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGemfile(){try{let e=bt.join(this.projectPath,"Gemfile");return await st.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readMixExs(){try{let e=bt.join(this.projectPath,"mix.exs");return await st.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readPomXml(){try{let e=bt.join(this.projectPath,"pom.xml");return await st.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readComposerJson(){try{let e=bt.join(this.projectPath,"composer.json"),t=await st.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=bt.join(this.projectPath,"pyproject.toml");return await st.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await mn('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 st.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(C(e))return[];throw e}}async listDirectories(){try{return(await st.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(C(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await mn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await mn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await mn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await mn('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 mn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await st.access(bt.join(this.projectPath,e)),!0}catch(t){if(C(t))return!1;throw t}}async readFile(e){try{let t=bt.join(this.projectPath,e);return await st.readFile(t,"utf-8")}catch(t){if(C(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await mn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
262
+ `).filter(Boolean)}catch{return[]}}},Dy=new Yi,$e=Dy});import{z as ae}from"zod";function jy(r){return r instanceof Wn}function K(r){return jy(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Bn,xE,vE,TE,EE,AE,IE,Wn,Or,Fr,Ns,Ut=w(()=>{"use strict";Bn={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}},xE=Bn.create("FileError",ae.object({path:ae.string(),operation:ae.enum(["read","write","delete","create","copy"]),reason:ae.string().optional()})),vE=Bn.create("ValidationError",ae.object({field:ae.string(),expected:ae.string(),received:ae.string().optional(),message:ae.string().optional()})),TE=Bn.create("PermissionError",ae.object({action:ae.string(),resource:ae.string(),reason:ae.string().optional()})),EE=Bn.create("TaskError",ae.object({taskId:ae.string().optional(),operation:ae.enum(["create","update","complete","pause","resume","delete"]),reason:ae.string()})),AE=Bn.create("SessionError",ae.object({sessionId:ae.string().optional(),reason:ae.string()})),IE=Bn.create("SyncError",ae.object({projectId:ae.string().optional(),operation:ae.enum(["push","pull","auth","connect"]),reason:ae.string()})),Wn=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)}},Or=class r extends Wn{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")}},Fr=class r extends Wn{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")}},Ns=class r extends Wn{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(jy,"isPrjctError");l(K,"getErrorMessage")});import Xi from"node:fs";import Nr from"node:path";function Ou(){if(Ls)return Ls;let r=__dirname;for(let e=0;e<5;e++){let t=Nr.join(r,"package.json");if(Xi.existsSync(t))try{if(JSON.parse(Xi.readFileSync(t,"utf-8")).name==="prjct-cli")return Ls=r,r}catch{}r=Nr.dirname(r)}return Ls=Nr.join(__dirname,"..","..",".."),Ls}function Qi(){if(_r)return _r;try{let r=Nr.join(Ou(),"package.json"),e=JSON.parse(Xi.readFileSync(r,"utf-8"));return _r=e.version,Ry=e,_r}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var _r,Ry,Ls,Vn,Ce,Qt=w(()=>{"use strict";O();_r=null,Ry=null,Ls=null;l(Ou,"getPackageRoot");l(Qi,"getVersion");Vn=Qi(),Ce=Ou()});import ea from"node:fs";import $y from"node:fs/promises";import Lr from"node:path";function ta(){if(Fu)return Zi;Fu=!0;let r=Lr.join(Ce,"dist","templates.json");try{let e=ea.readFileSync(r,"utf-8");return Zi=JSON.parse(e),Zi}catch{return null}}function Oy(r){let e=gn.indexOf(r);e>-1&&gn.splice(e,1),gn.push(r)}function Fy(){for(;Jn.size>=My&&gn.length>0;){let r=gn.shift();r&&Jn.delete(r)}}function Ur(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 _u(r){if(Jn.has(r))return Oy(r),Jn.get(r);let e,t=ta();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=Lr.join(Ce,"templates","commands",`${r}.md`);try{e=await $y.readFile(s,"utf-8")}catch{throw Fr.notFound(r)}}let n=Ur(e);return Fy(),Jn.set(r,n),gn.push(r),n}async function _y(r){return(await _u(r)).frontmatter["allowed-tools"]||[]}function Ny(){Jn.clear(),gn.length=0}function Ie(r){let e=ta();if(e?.[r])return e[r];let t=Lr.join(Ce,"templates",r);try{return ea.readFileSync(t,"utf-8")}catch{return null}}function qn(r){let e=ta();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=Lr.join(Ce,"templates",r);try{return ea.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var My,Jn,gn,Zi,Fu,Ly,na,Kn=w(()=>{"use strict";Ut();Qt();My=50,Jn=new Map,gn=[],Zi=null,Fu=!1;l(ta,"loadBundle");l(Oy,"updateLruOrder");l(Fy,"evictLru");l(Ur,"parseFrontmatter");l(_u,"load");l(_y,"getAllowedTools");l(Ny,"clearCache");l(Ie,"getTemplateContent");l(qn,"listTemplates");Ly={load:_u,parseFrontmatter:Ur,getAllowedTools:_y,clearCache:Ny,getTemplateContent:Ie,listTemplates:qn},na=Ly});import W from"node:fs/promises";import ra from"node:os";import q from"node:path";async function Uy(){try{let r=Ie("global/modules/module-config.json");if(r)return JSON.parse(r);let e=q.join(Ce,"templates/global/modules/module-config.json"),t=await W.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Hy(r){let e=await Uy();if(!e){let i=Ie("global/CLAUDE.md");if(i)return i;let a=q.join(Ce,"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(Ce,"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(Ce,"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 Gy(){try{let r=q.join(ra.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(Ce,"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 zy(){let r=(qe(),ut(nt)),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(Ce,"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 Hy()}catch{let d=Ie("global/CLAUDE.md");if(d)i=d;else{let m=q.join(Ce,"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(Ce,"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}
265
265
 
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:w(s),action:"failed"}}}function Ou(){let r=ea.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 Zi,Hy,He,fn=y(()=>{"use strict";qn();O();mn();l(_y,"loadModuleConfig");l(Ny,"composeGlobalTemplate");l(Ly,"installDocs");l(Uy,"installGlobalConfig");Zi=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=ea.homedir(),this.templatesDir=q.join(Pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Je(),lt(tt)).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=Jn("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(Je(),lt(tt)).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=Ae(`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:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=q.join(this.claudeCommandsPath,s);await W.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await W.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await 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(Ae(`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(Je(),lt(tt)).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=Ae(`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(Je(),lt(tt)).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=Ae(`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:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Uy()}async installDocs(){return Ly()}};l(Ou,"getProviderPaths");Hy=new Zi,He=Hy});import{z as be}from"zod";function Lu(r,e="default"){let t=Fu[e]||Fu.default;return r/1e3*t}function Lr(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Gy,zy,_u,Nu,Fu,Ur=y(()=>{"use strict";Gy=be.object({date:be.string(),tokensSaved:be.number(),syncs:be.number(),avgCompressionRate:be.number(),totalDuration:be.number()}),zy=be.object({agentName:be.string(),usageCount:be.number(),tokensSaved:be.number()}),_u=be.object({totalTokensSaved:be.number(),avgCompressionRate:be.number(),syncCount:be.number(),watchTriggers:be.number(),avgSyncDuration:be.number(),totalSyncDuration:be.number(),agentUsage:be.array(zy),dailyStats:be.array(Gy),firstSync:be.string(),lastUpdated:be.string()}),Nu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Fu={"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(Lu,"estimateCostSaved");l(Lr,"formatCost")});function Wy(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function By(r){let e=[],t=Wy(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(ta,o+i.length);if(c===-1)continue;let u=c+ta.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function na(r,e){let t=By(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
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 Nu(){let r=ra.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 sa,Wy,Ge,fn=w(()=>{"use strict";Kn();O();Qt();l(Uy,"loadModuleConfig");l(Hy,"composeGlobalTemplate");l(Gy,"installDocs");l(zy,"installGlobalConfig");sa=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=ra.homedir(),this.templatesDir=q.join(Ce,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(qe(),ut(nt)).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(qe(),ut(nt)).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(qe(),ut(nt)).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(qe(),ut(nt)).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 zy()}async installDocs(){return Gy()}};l(Nu,"getProviderPaths");Wy=new sa,Ge=Wy});import{z as Pe}from"zod";function Gu(r,e="default"){let t=Lu[e]||Lu.default;return r/1e3*t}function Hr(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var By,Vy,Uu,Hu,Lu,Gr=w(()=>{"use strict";By=Pe.object({date:Pe.string(),tokensSaved:Pe.number(),syncs:Pe.number(),avgCompressionRate:Pe.number(),totalDuration:Pe.number()}),Vy=Pe.object({agentName:Pe.string(),usageCount:Pe.number(),tokensSaved:Pe.number()}),Uu=Pe.object({totalTokensSaved:Pe.number(),avgCompressionRate:Pe.number(),syncCount:Pe.number(),watchTriggers:Pe.number(),avgSyncDuration:Pe.number(),totalSyncDuration:Pe.number(),agentUsage:Pe.array(Vy),dailyStats:Pe.array(By),firstSync:Pe.string(),lastUpdated:Pe.string()}),Hu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Lu={"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(Gu,"estimateCostSaved");l(Hr,"formatCost")});function Jy(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function qy(r){let e=[],t=Jy(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(oa,o+i.length);if(c===-1)continue;let u=c+oa.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function ia(r,e){let t=qy(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
267
267
 
268
268
  ---
269
269
 
@@ -274,11 +274,56 @@ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
274
274
  `;for(let s of t)n+=s.content,n+=`
275
275
 
276
276
  `;return`${n.trimEnd()}
277
- `}function sa(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(ta)&&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 ta,ra=y(()=>{"use strict";ta="<!-- /prjct:preserve -->";l(Wy,"createPreserveStartRegex");l(By,"extractPreservedSections");l(na,"mergePreservedSections");l(sa,"validatePreserveBlocks")});function Ls(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Vy.has(e.code))return!0;if(e.code&&Hu.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 Gr(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Hu.has(e.code))}function Uu(r,e,t){let n=Qt.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Qt.delete(r),!1):!0:!1}function oa(r,e){let t=Qt.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Qt.set(r,t)}function Jy(r){Qt.delete(r)}var Vy,Hu,Qt,Hr,Gu,Us,zr=y(()=>{"use strict";Vy=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Hu=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Ls,"isTransientError");l(Gr,"isPermanentError");Qt=new Map;l(Uu,"isCircuitOpen");l(oa,"recordFailure");l(Jy,"recordSuccess");Hr=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(Uu(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 Jy(t),o}catch(o){if(n=o,s++,Gr(o))throw oa(t,this.options.circuitBreakerThreshold),o;if(!(Ls(o)&&s<this.options.maxAttempts))throw oa(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 oa(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Ls(e)}isCircuitOpen(e){return Uu(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Qt.get(e)}resetCircuit(e){Qt.delete(e)}resetAllCircuits(){Qt.clear()}},Gu=new Hr({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Us=new Hr({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var zu=y(()=>{"use strict";ra();zr()});import{exec as qy}from"node:child_process";import{promisify as Ky}from"node:util";async function Wr(r){try{let{stdout:e}=await Yy(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Xy(){let r=await Wr("gh api user --jq .login");return r.success&&r.output||(r=await Wr("git config --global github.user"),r.success&&r.output)?r.output:null}async function Qy(){let r=await Wr("git config user.name");return r.success&&r.output?r.output:null}async function Zy(){let r=await Wr("git config user.email");return r.success&&r.output?r.output:null}async function Kn(){let[r,e,t]=await Promise.all([Xy(),Qy(),Zy()]);return{github:r,email:t,name:e||r||"Unknown"}}var Yy,Br=y(()=>{"use strict";Yy=Ky(qy);l(Wr,"execCommand");l(Xy,"detectGitHubUsername");l(Qy,"detectGitName");l(Zy,"detectGitEmail");l(Kn,"detect")});import hn from"node:fs/promises";import ew from"node:path";import*as Vr from"jsonc-parser";function Wu(r){let e=[],t=Vr.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}: ${Vr.printParseErrorCode(n.error)}`)}return t}var aa,tw,R,st=y(()=>{"use strict";Ut();O();se();mn();Br();le();l(Wu,"parseJsonc");aa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=E.getLocalConfigPath(e),n=await hn.readFile(t,"utf-8");return Wu(n)}catch(t){return C(t)||console.warn(`Warning: Could not read config at ${e}: ${K(t)}`),null}}async writeConfig(e,t){let n=E.getLocalConfigPath(e),s=E.getLegacyPrjctPath(e);await hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await hn.writeFile(n,`${o}
279
- `,"utf-8")}async readGlobalConfig(e){try{let t=E.getGlobalProjectConfigPath(e),n=await hn.readFile(t,"utf-8");return Wu(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=E.getGlobalProjectConfigPath(e),s=E.getGlobalProjectPath(e);await hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await hn.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:Bn,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=E.generateProjectId(e),s=E.getGlobalProjectPath(n),o=E.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:Bn,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 E.hasLegacyStructure(e))return!1;if(!await E.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=E.getGlobalProjectPath(s.projectId);try{return(await hn.readdir(ew.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:E.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 Kn(),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=E.generateProjectId(e);return{projectId:n,dataPath:E.getDisplayPath(E.getGlobalProjectPath(n))}}},tw=new aa,R=tw});import Jr from"node:fs/promises";import ca from"node:path";var la,Bu,Vu=y(()=>{"use strict";st();le();O();la=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=E.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Jr.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Jr.readFile(ca.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return C(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=ca.join(this.agentsPath,`${e}.md`),n=await Jr.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return C(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=ca.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 Jr.appendFile(s,o)}catch(s){C(s)||console.error(`Agent usage log error: ${w(s)}`)}}},Bu=la});import Ju from"node:path";async function rw(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await M(Ju.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await M(Ju.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function ow(){return{...nw}}function iw(){return{...sw}}async function qu(){return qr||(qr=await rw()?ow():iw(),qr)}var qr,nw,sw,Ku=y(()=>{"use strict";Me();qr=null,nw={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}},sw={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(rw,"isClaudeEnvironment");l(ow,"getClaudeAgent");l(iw,"getTerminalAgent");l(qu,"detect")});var cw,ua=y(()=>{cw=bl({})});var lw,Kr,Yn,Yu=y(()=>{"use strict";Vu();Ut();Ku();zr();ua();lw=["claude"],Kr=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Bu}async initialize(){return this.agent?this.agent:await Gu.execute(async()=>{if(this.agentInfo=await qu(),!this.agentInfo?.isSupported)throw _s.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!lw.includes(e))throw _s.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await cw(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
277
+ `}function aa(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(oa)&&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 oa,ca=w(()=>{"use strict";oa="<!-- /prjct:preserve -->";l(Jy,"createPreserveStartRegex");l(qy,"extractPreservedSections");l(ia,"mergePreservedSections");l(aa,"validatePreserveBlocks")});function Us(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Ky.has(e.code))return!0;if(e.code&&Wu.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 Wr(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Wu.has(e.code))}function zu(r,e,t){let n=Zt.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Zt.delete(r),!1):!0:!1}function la(r,e){let t=Zt.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Zt.set(r,t)}function Yy(r){Zt.delete(r)}var Ky,Wu,Zt,zr,Bu,Hs,Br=w(()=>{"use strict";Ky=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Wu=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Us,"isTransientError");l(Wr,"isPermanentError");Zt=new Map;l(zu,"isCircuitOpen");l(la,"recordFailure");l(Yy,"recordSuccess");zr=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(zu(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 Yy(t),o}catch(o){if(n=o,s++,Wr(o))throw la(t,this.options.circuitBreakerThreshold),o;if(!(Us(o)&&s<this.options.maxAttempts))throw la(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 la(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Us(e)}isCircuitOpen(e){return zu(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Zt.get(e)}resetCircuit(e){Zt.delete(e)}resetAllCircuits(){Zt.clear()}},Bu=new zr({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Hs=new zr({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Vu=w(()=>{"use strict";ca();Br()});import{exec as Xy}from"node:child_process";import{promisify as Qy}from"node:util";async function Vr(r){try{let{stdout:e}=await Zy(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function ew(){let r=await Vr("gh api user --jq .login");return r.success&&r.output||(r=await Vr("git config --global github.user"),r.success&&r.output)?r.output:null}async function tw(){let r=await Vr("git config user.name");return r.success&&r.output?r.output:null}async function nw(){let r=await Vr("git config user.email");return r.success&&r.output?r.output:null}async function Yn(){let[r,e,t]=await Promise.all([ew(),tw(),nw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Zy,Jr=w(()=>{"use strict";Zy=Qy(Xy);l(Vr,"execCommand");l(ew,"detectGitHubUsername");l(tw,"detectGitName");l(nw,"detectGitEmail");l(Yn,"detect")});import hn from"node:fs/promises";import sw from"node:path";import*as qr from"jsonc-parser";function Ju(r){let e=[],t=qr.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}: ${qr.printParseErrorCode(n.error)}`)}return t}var da,rw,R,rt=w(()=>{"use strict";Ut();O();re();Qt();Jr();de();l(Ju,"parseJsonc");da=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=E.getLocalConfigPath(e),n=await hn.readFile(t,"utf-8");return Ju(n)}catch(t){return C(t)||console.warn(`Warning: Could not read config at ${e}: ${K(t)}`),null}}async writeConfig(e,t){let n=E.getLocalConfigPath(e),s=E.getLegacyPrjctPath(e);await hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await hn.writeFile(n,`${o}
279
+ `,"utf-8")}async readGlobalConfig(e){try{let t=E.getGlobalProjectConfigPath(e),n=await hn.readFile(t,"utf-8");return Ju(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=E.getGlobalProjectConfigPath(e),s=E.getGlobalProjectPath(e);await hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await hn.writeFile(n,`${o}
280
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:Vn,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=E.generateProjectId(e),s=E.getGlobalProjectPath(n),o=E.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:Vn,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 E.hasLegacyStructure(e))return!1;if(!await E.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=E.getGlobalProjectPath(s.projectId);try{return(await hn.readdir(sw.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:E.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 Yn(),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=E.generateProjectId(e);return{projectId:n,dataPath:E.getDisplayPath(E.getGlobalProjectPath(n))}}},rw=new da,R=rw});import Kr from"node:fs/promises";import pa from"node:path";var ma,qu,Ku=w(()=>{"use strict";rt();de();O();ma=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=E.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Kr.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Kr.readFile(pa.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=pa.join(this.agentsPath,`${e}.md`),n=await Kr.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=pa.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 Kr.appendFile(s,o)}catch(s){C(s)||console.error(`Agent usage log error: ${y(s)}`)}}},qu=ma});import Yu from"node:path";async function aw(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await M(Yu.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await M(Yu.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function cw(){return{...ow}}function lw(){return{...iw}}async function Xu(){return Yr||(Yr=await aw()?cw():lw(),Yr)}var Yr,ow,iw,Qu=w(()=>{"use strict";Oe();Yr=null,ow={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}},iw={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(aw,"isClaudeEnvironment");l(cw,"getClaudeAgent");l(lw,"getTerminalAgent");l(Xu,"detect")});import Gs from"node:fs/promises";var ga,Zu,ed=w(()=>{"use strict";O();ga=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 Gs.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 Gs.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 Gs.readdir(e)}async fileExists(e){try{return await Gs.access(e),!0}catch(t){if(C(t))return!1;throw t}}async createDirectory(e){await Gs.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
+ ${e.map((t,n)=>`${n+1}. ${t}`).join(`
283
+ `)}`}formatRecap(e){return`\u{1F4CA} Recap
284
+
285
+ \u{1F3AF} Current: ${e.currentTask||"None"}
286
+ \u{1F680} Shipped: ${e.shippedCount}
287
+ \u{1F4DD} Queue: ${e.queuedCount}
288
+ \u{1F4A1} Ideas: ${e.ideasCount}
289
+ ${e.recentActivity?`
290
+ ${e.recentActivity}`:""}`}formatProgress(e){let t=e.velocity>e.previousVelocity?"\u{1F4C8}":e.velocity<e.previousVelocity?"\u{1F4C9}":"\u27A1\uFE0F";return`\u{1F4CA} ${e.period}
291
+
292
+ Shipped: ${e.count}
293
+ Velocity: ${e.velocity.toFixed(1)}/day ${t}
294
+ ${e.recentFeatures||""}`}getHelpContent(e){let t={debugging:`\u{1F50D} 1. Isolate code causing error
295
+ 2. Add logs at key points
296
+ 3. Search exact error message`,design:`\u{1F3A8} 1. Define problem clearly
297
+ 2. Start with simplest solution
298
+ 3. Ship MVP, iterate`,performance:`\u26A1 1. Profile/measure first
299
+ 2. Optimize slowest parts
300
+ 3. Cache expensive operations`,default:`\u{1F4A1} 1. Break into smaller tasks
301
+ 2. Start with simplest part
302
+ 3. Ship it`},n=Object.keys(t).find(s=>e.toLowerCase().includes(s))||"default";return t[n]}suggestNextAction(e){return{taskCompleted:`What's next?
303
+ \u2022 "start [task]" \u2192 Begin working
304
+ \u2022 "ship feature" \u2192 Track & celebrate
305
+ \u2022 "add idea" \u2192 Brainstorm
306
+
307
+ Or: /p:now | /p:ship | /p:idea`,featureShipped:`Keep the momentum!
308
+ \u2022 "start next task" \u2192 Keep building
309
+ \u2022 "see progress" \u2192 View stats
310
+ \u2022 "plan ahead" \u2192 Strategic thinking
311
+
312
+ Or: /p:now | /p:recap | /p:roadmap`,ideaCaptured:`Ready to start?
313
+ \u2022 "start this" \u2192 Begin now
314
+ \u2022 "plan more" \u2192 Keep brainstorming
315
+ \u2022 "see ideas" \u2192 View backlog
316
+
317
+ Or: /p:now | /p:idea | /p:recap`,initialized:`Ready to start? Tell me what you want to build!
318
+
319
+ Or type /p:help to see all options`,stuck:`Let's break it down:
320
+ \u2022 "start the first part"
321
+ \u2022 "add as tasks"
322
+ \u2022 "think more"
323
+
324
+ Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
325
+
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}}},Zu=ga});var dw,Xr,Xn,td=w(()=>{"use strict";Ku();Ut();Qu();ed();Br();dw=["claude"],Xr=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new qu}async initialize(){return this.agent?this.agent:await Bu.execute(async()=>{if(this.agentInfo=await Xu(),!this.agentInfo?.isSupported)throw Ns.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!dw.includes(e))throw Ns.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Zu,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:`
282
327
  AGENTIC EXECUTION:
283
328
  - Read: templates/agentic/orchestrator.md
284
329
  - Analyze task: "${e}"
@@ -286,14 +331,14 @@ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
286
331
  - Claude decides which agent(s) to use
287
332
  - Always prefer specialists over generalist
288
333
  - Fragment complex tasks into subtasks
289
- `}}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}},Yn=new Kr});var Yr,Xr,Xu=y(()=>{"use strict";Yr=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"}},Xr=new Yr});import uw from"node:crypto";import Qr from"node:fs/promises";import Qu from"node:path";function Zu(){return{version:Pt,lastUpdated:"",checksums:{}}}var Pt,da,Oe,Hs=y(()=>{"use strict";le();O();se();ue();Pt="1.0.0";l(Zu,"getDefaultChecksums");da=class{static{l(this,"IndexStorage")}getIndexPath(e){return Qu.join(E.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Qr.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Pt?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 Zu()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Qr.readFile(e);return uw.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:Pt,lastUpdated:k(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await Qr.readdir(t);await Promise.all(n.map(s=>Qr.unlink(Qu.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!==Pt?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!==Pt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=$.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Oe=new da});var ed,dw,Zr,pw,td=y(()=>{"use strict";Hs();ed=8e4,dw={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"]},Zr=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||ed,[c,u,d]=await Promise.all([Oe.readIndex(t),Oe.readDomains(t),Oe.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let j of m){let V=d.domainIndex[j]||[];for(let de of V)p.add(de)}if(i&&d.domainIndex.general){let j=d.domainIndex.general.slice(0,10);for(let V of j)p.add(V)}let g=c.relevantFiles.filter(j=>p.has(j.path)&&j.score>=o);g.sort((j,V)=>V.score-j.score);let f=0,S=[];for(let j of g){let V=Math.ceil(j.size/this.CHARS_PER_TOKEN);if(f+V>a||S.length>=s)break;S.push(j),f+=V}let P=Math.ceil(c.relevantFiles.reduce((j,V)=>j+V.size,0)/this.CHARS_PER_TOKEN),I=P>0?(P-f)/P:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:I,estimatedTokensSaved:P-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(dw))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 Oe.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 Oe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Oe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||ed,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)}},pw=new Zr});import nd from"node:path";var pa,eo,mw,sd=y(()=>{"use strict";Hs();se();pa=[{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"}],eo=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 pa)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=nd.dirname(i.path);n.get(u).add(`**/${nd.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=pa.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 pa)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:Pt,projectId:e,domains:t,discoveredAt:s};await Oe.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:Pt,lastUpdate:s,fileCategories:n,domainIndex:i};await Oe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Oe.readDomains(e),Oe.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 Oe.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 Oe.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:Pt,lastUpdate:k(),fileCategories:u,domainIndex:d};await Oe.writeCategories(e,m)}return o}},mw=new eo});import ma from"node:path";var ga,gw,fw,to,rd,fa=y(()=>{"use strict";ga=30,gw=[/^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$/],fw=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],to=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=ga){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=ma.basename(e.path);for(let n of gw)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ma.basename(e.path);for(let s of fw)if(s.test(t))return 15;let n=ma.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}},rd=new to});function so(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 hw[r]}var Y,ha,ya,no,hw,Ct,od,Gs,Zt=y(()=>{"use strict";Y={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},ha=["feature","spec","design","refactor","migrate"],ya=["ship","cleanup","git","migrate"],no=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],hw={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(so,"getTimeout");Ct={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},od={HISTORY_MAX:100},Gs={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 wa(r,e){return{...vs[r],...e}}function ro(r,e,t){return{message:r,hint:e,...t}}var oo=y(()=>{"use strict";kr();kr();l(wa,"getError");l(ro,"createError")});import{execSync as Sa}from"node:child_process";var io,ka,ao,co,ba=y(()=>{"use strict";oo();io={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},ka=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=io[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=io[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new ao(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=io[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
290
- `);throw new ao({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
291
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(io),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Sa(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:ro(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Sa(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Sa(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:ro(`${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())}},ao=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}},co=new ka});import{exec as yw}from"node:child_process";import{promisify as ww}from"node:util";var yI,id=y(()=>{"use strict";Zt();ba();yI=ww(yw)});var Rt,Pa,rt,en=y(()=>{"use strict";kt();se();ue();Rt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Pa=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=re(),s=k();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=k();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(re(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},rt=new Pa});var lo,qe,Ca=y(()=>{"use strict";st();en();ue();lo=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.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 R.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 R.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 R.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<=Rt.MEMORY_MAX_ENTRIES)return 0;let s=n-Rt.MEMORY_MAX_ENTRIES,o=G.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);rt.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 lo});var ad=y(()=>{"use strict";le();Me()});import{exec as kw}from"node:child_process";import{promisify as bw}from"node:util";var NI,cd=y(()=>{"use strict";Hs();se();fa();NI=bw(kw)});import yn from"chalk";var ld,Pw,Cw,xt,ud=y(()=>{"use strict";Je();ld=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Pw=80,Cw={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:ld,speed:Pw},cli:{header:l(()=>`${yn.cyan.bold("\u26A1")} ${yn.cyan("prjct")}`,"header"),footer:l(()=>yn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${yn.cyan("\u26A1")} ${yn.cyan("prjct")} ${yn.cyan(ld[r%10])} ${yn.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")=>vr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>vr(r).signature,"getSignature")},xt=Cw});import X from"chalk";function Tw(){return xw[vw]}var KI,xa,xw,vw,wn,Xn,va,ot,tn,Ew,Aw,h,Sn=y(()=>{"use strict";ud();Zt();oo();oo();KI=xt.spinner.frames,xa=xt.spinner.speed,xw={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}},vw="compact";l(Tw,"getTierConfig");wn={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")},Xn=null,va=0,ot=!1,tn=l((r,e)=>{let t=e??(Tw().maxCharsPerLine||Ct.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Ew=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ct.CLEAR_WIDTH)}\r`):!0,"clear"),Aw={start(){return ot||console.log(xt.cli.header()),this},end(){return ot||console.log(xt.cli.footer()),this},spin(r){return ot?this:(this.stop(),process.stdout.isTTY?(Xn=setInterval(()=>{process.stdout.write(`\r${xt.cli.spin(va++,tn(r,Ct.SPINNER_MSG))}`)},xa),this):(process.stdout.write(`${xt.cli.spin(0,tn(r,Ct.SPINNER_MSG))}
292
- `),this))},done(r,e){if(this.stop(),!ot){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(`${wn.success} ${tn(r,Ct.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${wn.fail} ${tn(r,Ct.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?wa(r):r;return console.error(),console.error(`${wn.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(),ot||console.log(`${wn.warn} ${tn(r,Ct.WARN_MSG)}`),this},info(r){return this.stop(),ot||console.log(`${wn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ot&&e&&console.log(`${wn.debug} ${X.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),ot)return this;let t=e.bullet||wn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),ot||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(),ot)return this;let t=e.split(`
293
- `),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(),ot?this:(console.log(`
294
- ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){return Xn&&(clearInterval(Xn),Xn=null,Ew()),this},step(r,e,t){if(ot)return this;this.stop();let n=X.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Xn=setInterval(()=>{process.stdout.write(`\r${xt.cli.spin(va++,`${n} ${tn(t,Ct.STEP_MSG)}`)}`)},xa),this):(process.stdout.write(`${xt.cli.spin(0,`${n} ${tn(t,Ct.STEP_MSG)}`)}
295
- `),this)},progress(r,e,t){if(ot)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?` ${tn(t,Ct.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Xn=setInterval(()=>{process.stdout.write(`\r${xt.cli.spin(va++,`[${i}] ${n}%${a}`)}`)},xa),this):(process.stdout.write(`${xt.cli.spin(0,`[${i}] ${n}%${a}`)}
296
- `),this)}},h=Aw});function Dw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Iw.has(r)||r.includes("prjct"))return{level:Qn.debug,name:"debug"};let e=Qn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function uo(r,e,t){return dd>=r?(...n)=>console[t](e,...n):Rw}var Qn,Iw,dd,jw,Rw,$w,B,Zn=y(()=>{"use strict";Qn={error:0,warn:1,info:2,debug:3},Iw=new Set(["1","true","*"]);l(Dw,"getLogLevel");({level:dd,name:jw}=Dw()),Rw=l(()=>{},"noop");l(uo,"createLogMethod");$w={error:uo(Qn.error,"[prjct:error]","error"),warn:uo(Qn.warn,"[prjct:warn]","warn"),info:uo(Qn.info,"[prjct:info]","log"),debug:uo(Qn.debug,"[prjct:debug]","log"),isEnabled:l(()=>dd>=0,"isEnabled"),level:l(()=>jw,"level")},B=$w});var po,Mw,pd=y(()=>{"use strict";Ut();ue();Si();Zt();Zn();po=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=od.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(Sr.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(Sr.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{$.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())}},Mw=new po});var mo,go,md=y(()=>{"use strict";le();se();Me();mo=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await ln(t,[])??[];n.push(e),await Es(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await ln(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await Es(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:k(),success:!0};await Es(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await ln(t,null)}},go=new mo});var Ta=y(()=>{"use strict";pd();md()});var vt,fo=y(()=>{"use strict";vt=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 Ie,$t=y(()=>{"use strict";Ta();fo();se();ue();Ie=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new vt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:k(),projectId:e};await go.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 $.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 Fw}from"node:crypto";var Ea,it,ho=y(()=>{"use strict";Fi();se();$t();Ea=class extends Ie{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"};Oi.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 Oi.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 Ql(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 Fw("sha256").update(JSON.stringify(t)).digest("hex")}},it=new Ea});var Aa,Fe,zs=y(()=>{"use strict";kt();Ni();se();en();$t();Aa=class extends Ie{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",tu)}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:re(),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=Jt(Rt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;rt.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}},Fe=new Aa});var Ia,kn,yo=y(()=>{"use strict";Ur();se();$t();Ia=class extends Ie{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",_u)}getDefault(){return{...Nu}}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),P=[...i.agentUsage];if(t.agents)for(let I of t.agents){let j=P.findIndex(V=>V.agentName===I);j>=0?P[j]={...P[j],usageCount:P[j].usageCount+1,tokensSaved:P[j].tokensSaved+Math.floor(n/t.agents.length)}:P.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:P,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:Lu(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)}},kn=new Ia});import Ve from"node:fs/promises";import ne from"node:path";async function Ws(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=E.getGlobalProjectPath(r),s=ne.join(n,"storage"),o=ne.join(n,"index"),i=ne.join(n,"memory");t.backupDir=await _w(s,o,i),$.getDb(r);for(let{filename:a,key:c}of Ra){let u=ne.join(s,a),d=await bn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),gd(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of ja){let u=ne.join(o,a),d=await bn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),fd(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Bw(r,o,t),await Vw(r,o,t),await Jw(r,i,t),await qw(r,i,t),t.errors.length===0&&await Kw(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 _w(r,e,t){let n=ne.join(r,"backup");return await Ve.mkdir(n,{recursive:!0}),await Ve.mkdir(ne.join(n,"index"),{recursive:!0}),await Ve.mkdir(ne.join(n,"memory"),{recursive:!0}),await Da(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Da(e,ne.join(n,"index")),await Da(t,ne.join(n,"memory")),n}async function Da(r,e,t){try{let n=await Ve.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=ne.join(r,s.name),i=ne.join(e,s.name);await Ve.copyFile(o,i)}}catch(n){if(!C(n))throw n}}function gd(r,e,t){switch(e){case"state":Nw(r,t);break;case"queue":Lw(r,t);break;case"ideas":Uw(r,t);break;case"shipped":Hw(r,t);break;case"metrics":Gw(r,t);break;case"analysis":zw(r,t);break}}function Nw(r,e){let t=$.getDb(r),n=t.prepare(`
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}},Xn=new Xr});var Qr,Zr,nd=w(()=>{"use strict";Qr=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"}},Zr=new Qr});import pw from"node:crypto";import eo from"node:fs/promises";import sd from"node:path";function rd(){return{version:Pt,lastUpdated:"",checksums:{}}}var Pt,fa,Fe,zs=w(()=>{"use strict";de();O();re();pe();Pt="1.0.0";l(rd,"getDefaultChecksums");fa=class{static{l(this,"IndexStorage")}getIndexPath(e){return sd.join(E.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await eo.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Pt?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 rd()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await eo.readFile(e);return pw.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:Pt,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await eo.readdir(t);await Promise.all(n.map(s=>eo.unlink(sd.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!==Pt?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!==Pt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=$.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Fe=new fa});var od,mw,to,gw,id=w(()=>{"use strict";zs();od=8e4,mw={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"]},to=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||od,[c,u,d]=await Promise.all([Fe.readIndex(t),Fe.readDomains(t),Fe.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let j of m){let V=d.domainIndex[j]||[];for(let me of V)p.add(me)}if(i&&d.domainIndex.general){let j=d.domainIndex.general.slice(0,10);for(let V of j)p.add(V)}let g=c.relevantFiles.filter(j=>p.has(j.path)&&j.score>=o);g.sort((j,V)=>V.score-j.score);let f=0,S=[];for(let j of g){let V=Math.ceil(j.size/this.CHARS_PER_TOKEN);if(f+V>a||S.length>=s)break;S.push(j),f+=V}let k=Math.ceil(c.relevantFiles.reduce((j,V)=>j+V.size,0)/this.CHARS_PER_TOKEN),I=k>0?(k-f)/k:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:I,estimatedTokensSaved:k-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(mw))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 Fe.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 Fe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Fe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||od,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)}},gw=new to});import ad from"node:path";var ha,no,fw,cd=w(()=>{"use strict";zs();re();ha=[{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"}],no=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 ha)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=ad.dirname(i.path);n.get(u).add(`**/${ad.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=ha.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 ha)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:Pt,projectId:e,domains:t,discoveredAt:s};await Fe.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:Pt,lastUpdate:s,fileCategories:n,domainIndex:i};await Fe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Fe.readDomains(e),Fe.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 Fe.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 Fe.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:Pt,lastUpdate:b(),fileCategories:u,domainIndex:d};await Fe.writeCategories(e,m)}return o}},fw=new no});import ya from"node:path";var wa,hw,yw,so,ld,Sa=w(()=>{"use strict";wa=30,hw=[/^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$/],yw=[/^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],so=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=wa){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=ya.basename(e.path);for(let n of hw)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ya.basename(e.path);for(let s of yw)if(s.test(t))return 15;let n=ya.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}},ld=new so});function oo(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 ww[r]}var Y,ka,ba,ro,ww,Ct,ud,Ws,en=w(()=>{"use strict";Y={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},ka=["feature","spec","design","refactor","migrate"],ba=["ship","cleanup","git","migrate"],ro=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],ww={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(oo,"getTimeout");Ct={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},ud={HISTORY_MAX:100},Ws={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 Pa(r,e){return{...Ts[r],...e}}function io(r,e,t){return{message:r,hint:e,...t}}var ao=w(()=>{"use strict";Pr();Pr();l(Pa,"getError");l(io,"createError")});import{execSync as Ca}from"node:child_process";var co,xa,lo,uo,va=w(()=>{"use strict";ao();co={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"}},xa=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=co[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=co[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new lo(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=co[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
335
+ `);throw new lo({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(co),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=Ca(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:io(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Ca(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Ca(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:io(`${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())}},lo=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}},uo=new xa});import{exec as Sw}from"node:child_process";import{promisify as kw}from"node:util";var xI,dd=w(()=>{"use strict";en();va();xI=kw(Sw)});var Rt,Ta,ot,tn=w(()=>{"use strict";kt();re();pe();Rt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ta=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=oe(),s=b();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=b();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(oe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ot=new Ta});var po,Ke,Ea=w(()=>{"use strict";rt();tn();pe();po=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.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 R.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 R.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 R.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<=Rt.MEMORY_MAX_ENTRIES)return 0;let s=n-Rt.MEMORY_MAX_ENTRIES,o=G.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);ot.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}}},Ke=new po});var pd=w(()=>{"use strict";de();Oe()});import{exec as Pw}from"node:child_process";import{promisify as Cw}from"node:util";var BI,md=w(()=>{"use strict";zs();re();Sa();BI=Cw(Pw)});import yn from"chalk";var gd,xw,vw,xt,fd=w(()=>{"use strict";qe();gd=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],xw=80,vw={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:gd,speed:xw},cli:{header:l(()=>`${yn.cyan.bold("\u26A1")} ${yn.cyan("prjct")}`,"header"),footer:l(()=>yn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${yn.cyan("\u26A1")} ${yn.cyan("prjct")} ${yn.cyan(gd[r%10])} ${yn.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")=>Er(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Er(r).signature,"getSignature")},xt=vw});import X from"chalk";function Aw(){return Tw[Ew]}var nD,Aa,Tw,Ew,wn,Qn,Ia,it,nn,Iw,Dw,h,Sn=w(()=>{"use strict";fd();en();ao();ao();nD=xt.spinner.frames,Aa=xt.spinner.speed,Tw={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}},Ew="compact";l(Aw,"getTierConfig");wn={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")},Qn=null,Ia=0,it=!1,nn=l((r,e)=>{let t=e??(Aw().maxCharsPerLine||Ct.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Iw=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ct.CLEAR_WIDTH)}\r`):!0,"clear"),Dw={start(){return it||console.log(xt.cli.header()),this},end(){return it||console.log(xt.cli.footer()),this},spin(r){return it?this:(this.stop(),process.stdout.isTTY?(Qn=setInterval(()=>{process.stdout.write(`\r${xt.cli.spin(Ia++,nn(r,Ct.SPINNER_MSG))}`)},Aa),this):(process.stdout.write(`${xt.cli.spin(0,nn(r,Ct.SPINNER_MSG))}
337
+ `),this))},done(r,e){if(this.stop(),!it){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(`${wn.success} ${nn(r,Ct.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${wn.fail} ${nn(r,Ct.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Pa(r):r;return console.error(),console.error(`${wn.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(),it||console.log(`${wn.warn} ${nn(r,Ct.WARN_MSG)}`),this},info(r){return this.stop(),it||console.log(`${wn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!it&&e&&console.log(`${wn.debug} ${X.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),it)return this;let t=e.bullet||wn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),it||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(),it)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(),it?this:(console.log(`
339
+ ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){return Qn&&(clearInterval(Qn),Qn=null,Iw()),this},step(r,e,t){if(it)return this;this.stop();let n=X.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Qn=setInterval(()=>{process.stdout.write(`\r${xt.cli.spin(Ia++,`${n} ${nn(t,Ct.STEP_MSG)}`)}`)},Aa),this):(process.stdout.write(`${xt.cli.spin(0,`${n} ${nn(t,Ct.STEP_MSG)}`)}
340
+ `),this)},progress(r,e,t){if(it)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?` ${nn(t,Ct.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Qn=setInterval(()=>{process.stdout.write(`\r${xt.cli.spin(Ia++,`[${i}] ${n}%${a}`)}`)},Aa),this):(process.stdout.write(`${xt.cli.spin(0,`[${i}] ${n}%${a}`)}
341
+ `),this)}},h=Dw});function Rw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(jw.has(r)||r.includes("prjct"))return{level:Zn.debug,name:"debug"};let e=Zn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function mo(r,e,t){return hd>=r?(...n)=>console[t](e,...n):Mw}var Zn,jw,hd,$w,Mw,Ow,B,es=w(()=>{"use strict";Zn={error:0,warn:1,info:2,debug:3},jw=new Set(["1","true","*"]);l(Rw,"getLogLevel");({level:hd,name:$w}=Rw()),Mw=l(()=>{},"noop");l(mo,"createLogMethod");Ow={error:mo(Zn.error,"[prjct:error]","error"),warn:mo(Zn.warn,"[prjct:warn]","warn"),info:mo(Zn.info,"[prjct:info]","log"),debug:mo(Zn.debug,"[prjct:debug]","log"),isEnabled:l(()=>hd>=0,"isEnabled"),level:l(()=>$w,"level")},B=Ow});var go,Fw,yd=w(()=>{"use strict";Ut();pe();Pi();en();es();go=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=ud.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(br.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(br.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{$.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())}},Fw=new go});var fo,ho,wd=w(()=>{"use strict";de();re();Oe();fo=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await un(t,[])??[];n.push(e),await As(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await un(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await As(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:b(),success:!0};await As(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await un(t,null)}},ho=new fo});var Da=w(()=>{"use strict";yd();wd()});var vt,yo=w(()=>{"use strict";vt=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,$t=w(()=>{"use strict";Da();yo();re();pe();De=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new vt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await ho.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 $.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 Nw}from"node:crypto";var ja,at,wo=w(()=>{"use strict";Li();re();$t();ja=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"};Ni.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 Ni.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 tu(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 Nw("sha256").update(JSON.stringify(t)).digest("hex")}},at=new ja});var Ra,_e,Bs=w(()=>{"use strict";kt();Hi();re();tn();$t();Ra=class extends De{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",ru)}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: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=Jt(Rt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;ot.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}},_e=new Ra});var $a,kn,So=w(()=>{"use strict";Gr();re();$t();$a=class extends De{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Uu)}getDefault(){return{...Hu}}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),k=[...i.agentUsage];if(t.agents)for(let I of t.agents){let j=k.findIndex(V=>V.agentName===I);j>=0?k[j]={...k[j],usageCount:k[j].usageCount+1,tokensSaved:k[j].tokensSaved+Math.floor(n/t.agents.length)}:k.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:k,dailyStats:S,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:Gu(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)}},kn=new $a});import Je from"node:fs/promises";import se from"node:path";async function Vs(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=E.getGlobalProjectPath(r),s=se.join(n,"storage"),o=se.join(n,"index"),i=se.join(n,"memory");t.backupDir=await Lw(s,o,i),$.getDb(r);for(let{filename:a,key:c}of Fa){let u=se.join(s,a),d=await bn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),Sd(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Oa){let u=se.join(o,a),d=await bn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),kd(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Jw(r,o,t),await qw(r,o,t),await Kw(r,i,t),await Yw(r,i,t),t.errors.length===0&&await Xw(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 Lw(r,e,t){let n=se.join(r,"backup");return await Je.mkdir(n,{recursive:!0}),await Je.mkdir(se.join(n,"index"),{recursive:!0}),await Je.mkdir(se.join(n,"memory"),{recursive:!0}),await Ma(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Ma(e,se.join(n,"index")),await Ma(t,se.join(n,"memory")),n}async function Ma(r,e,t){try{let n=await Je.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=se.join(r,s.name),i=se.join(e,s.name);await Je.copyFile(o,i)}}catch(n){if(!C(n))throw n}}function Sd(r,e,t){switch(e){case"state":Uw(r,t);break;case"queue":Hw(r,t);break;case"ideas":Gw(r,t);break;case"shipped":zw(r,t);break;case"metrics":Ww(r,t);break;case"analysis":Bw(r,t);break}}function Uw(r,e){let t=$.getDb(r),n=t.prepare(`
297
342
  INSERT OR REPLACE INTO tasks
298
343
  (id, description, type, status, parent_description, branch, linear_id,
299
344
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -304,81 +349,79 @@ ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){retur
304
349
  (id, task_id, description, status, domain, agent, sort_order,
305
350
  depends_on, started_at, completed_at, output, summary)
306
351
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
307
- `),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 Lw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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 Hw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
308
353
  INSERT OR REPLACE INTO queue_tasks
309
354
  (id, description, type, priority, section, created_at, completed, completed_at,
310
355
  feature_id, feature_name)
311
356
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
312
- `);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 Uw(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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 Gw(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
313
358
  INSERT OR REPLACE INTO ideas
314
359
  (id, text, status, priority, tags, added_at, converted_to, details, data)
315
360
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
316
- `);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 Hw(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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 zw(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
317
362
  INSERT OR REPLACE INTO shipped_features
318
363
  (id, name, shipped_at, version, description, type, duration, data)
319
364
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
320
- `);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 Gw(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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 Ww(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
321
366
  INSERT OR REPLACE INTO metrics_daily
322
367
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
323
368
  VALUES (?, ?, ?, ?, ?)
324
- `);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=$.getDb(r).prepare(`
369
+ `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Bw(r,e){let n=$.getDb(r).prepare(`
325
370
  INSERT OR REPLACE INTO analysis
326
371
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
327
372
  VALUES (?, ?, ?, ?, ?, ?, ?)
328
- `),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 fd(r,e,t){e==="categories-cache"&&Ww(r,t)}function Ww(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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 kd(r,e,t){e==="categories-cache"&&Vw(r,t)}function Vw(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
329
374
  INSERT OR REPLACE INTO index_files
330
375
  (path, categories, domain, score, size, mtime, language)
331
376
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
332
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Bw(r,e,t){let n=ne.join(e,"checksums.json"),s=await bn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Vw(r,e,t){let n=ne.join(e,"file-scores.json"),s=await bn(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=$.getDb(r),a=i.prepare(`
377
+ `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Jw(r,e,t){let n=se.join(e,"checksums.json"),s=await bn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function qw(r,e,t){let n=se.join(e,"file-scores.json"),s=await bn(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=$.getDb(r),a=i.prepare(`
333
378
  INSERT OR REPLACE INTO index_files
334
379
  (path, score, size, mtime, language, categories, domain)
335
380
  VALUES (?, ?, ?, ?, NULL,
336
381
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
337
382
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
338
- `);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 Jw(r,e,t){let n=ne.join(e,"events.jsonl");try{let o=(await Ve.readFile(n,"utf-8")).split(`
339
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function qw(r,e,t){let n=ne.join(e,"learnings.jsonl");try{let o=(await Ve.readFile(n,"utf-8")).split(`
340
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Kw(r,e,t,n){let s=l(async(i,a)=>{try{await Ve.unlink(i)}catch(c){C(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Ra)await s(ne.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(ne.join(e,i),`cleanup:index/${i}`);await s(ne.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(ne.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function bn(r){try{let e=await Ve.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function wo(r){let e=E.getGlobalProjectPath(r),t=ne.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of Ra){let m=ne.join(t,u),p=await bn(m);if(p!==null){$.setDoc(r,d,p),gd(r,d,p);try{await Ve.unlink(m)}catch{}n++}}let s=ne.join(e,"project.json"),o=await bn(s);if(o!==null){$.setDoc(r,"project",o);try{await Ve.unlink(s)}catch{}n++}let i=ne.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=ne.join(i,u);try{let p=(await Ve.readFile(d,"utf-8")).split(`
341
- `).filter(f=>f.trim());if(p.length===0){await Ve.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let P=JSON.parse(S);f.run(P.type??P.action??"unknown",P.taskId??P.task_id??null,S,P.timestamp??P.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 P=JSON.parse(S),I=`learning:${P.taskId??P.timestamp??Date.now()}`,j=P.tags;f.run(I,j?.[0]??null,S,1,P.timestamp??new Date().toISOString())}catch{}})()}await Ve.unlink(d),n++}catch{}}let a=ne.join(e,"index"),c=[...ja.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=ne.join(a,u),m=await bn(d);if(m===null)continue;let p=ja.find(g=>g.filename===u);p&&($.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),fd(r,p.key,m));try{await Ve.unlink(d)}catch{}n++}return n}var Ra,ja,So=y(()=>{"use strict";le();O();ue();Ra=[{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"}],ja=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Ws,"migrateJsonToSqlite");l(_w,"createBackup");l(Da,"copyFiles");l(gd,"populateNormalized");l(Nw,"populateTasksFromState");l(Lw,"populateQueueTasks");l(Uw,"populateIdeas");l(Hw,"populateShippedFeatures");l(Gw,"populateMetricsDaily");l(zw,"populateAnalysis");l(fd,"populateIndexTables");l(Ww,"populateCategoriesIndex");l(Bw,"migrateChecksums");l(Vw,"migrateFileScores");l(Jw,"migrateEventsJsonl");l(qw,"migrateLearningsJsonl");l(Kw,"cleanupJsonFiles");l(bn,"readJsonSafe");l(wo,"sweepLegacyJson")});var $a,me,Bs=y(()=>{"use strict";kt();Rr();se();en();$t();$a=class extends Ie{static{l(this,"QueueStorage")}constructor(){super("queue.json",Au)}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:re(),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:re(),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=Jt(Rt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;rt.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()})}},me=new $a});var Ma,Ke,Vs=y(()=>{"use strict";kt();zi();se();en();$t();Ma=class extends Ie{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",bu)}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:re(),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=Jt(Rt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;rt.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}},Ke=new Ma});var Js,Oa,Pn,Fa=y(()=>{"use strict";Js={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},Oa=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Js[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Js[e]}getPrompt(e){return Js[e].prompt}getValidCommands(e){return Js[e].transitions}formatNextSteps(e){return Js[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Pn=new Oa});var _a,F,qs=y(()=>{"use strict";kt();Rr();se();Fa();en();$t();_a=class extends Ie{static{l(this,"StateStorage")}constructor(){super("state.json",Tu)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Pn.getCurrentState(e),s=Pn.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:re()};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[];rt.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=xu.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:
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 Kw(r,e,t){let n=se.join(e,"events.jsonl");try{let o=(await Je.readFile(n,"utf-8")).split(`
384
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Yw(r,e,t){let n=se.join(e,"learnings.jsonl");try{let o=(await Je.readFile(n,"utf-8")).split(`
385
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Xw(r,e,t,n){let s=l(async(i,a)=>{try{await Je.unlink(i)}catch(c){C(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Fa)await s(se.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(se.join(e,i),`cleanup:index/${i}`);await s(se.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(se.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function bn(r){try{let e=await Je.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function ko(r){let e=E.getGlobalProjectPath(r),t=se.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of Fa){let m=se.join(t,u),p=await bn(m);if(p!==null){$.setDoc(r,d,p),Sd(r,d,p);try{await Je.unlink(m)}catch{}n++}}let s=se.join(e,"project.json"),o=await bn(s);if(o!==null){$.setDoc(r,"project",o);try{await Je.unlink(s)}catch{}n++}let i=se.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=se.join(i,u);try{let p=(await Je.readFile(d,"utf-8")).split(`
386
+ `).filter(f=>f.trim());if(p.length===0){await Je.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let k=JSON.parse(S);f.run(k.type??k.action??"unknown",k.taskId??k.task_id??null,S,k.timestamp??k.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 k=JSON.parse(S),I=`learning:${k.taskId??k.timestamp??Date.now()}`,j=k.tags;f.run(I,j?.[0]??null,S,1,k.timestamp??new Date().toISOString())}catch{}})()}await Je.unlink(d),n++}catch{}}let a=se.join(e,"index"),c=[...Oa.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=se.join(a,u),m=await bn(d);if(m===null)continue;let p=Oa.find(g=>g.filename===u);p&&($.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),kd(r,p.key,m));try{await Je.unlink(d)}catch{}n++}return n}var Fa,Oa,bo=w(()=>{"use strict";de();O();pe();Fa=[{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"}],Oa=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Vs,"migrateJsonToSqlite");l(Lw,"createBackup");l(Ma,"copyFiles");l(Sd,"populateNormalized");l(Uw,"populateTasksFromState");l(Hw,"populateQueueTasks");l(Gw,"populateIdeas");l(zw,"populateShippedFeatures");l(Ww,"populateMetricsDaily");l(Bw,"populateAnalysis");l(kd,"populateIndexTables");l(Vw,"populateCategoriesIndex");l(Jw,"migrateChecksums");l(qw,"migrateFileScores");l(Kw,"migrateEventsJsonl");l(Yw,"migrateLearningsJsonl");l(Xw,"cleanupJsonFiles");l(bn,"readJsonSafe");l(ko,"sweepLegacyJson")});var _a,fe,Js=w(()=>{"use strict";kt();Mr();re();tn();$t();_a=class extends De{static{l(this,"QueueStorage")}constructor(){super("queue.json",ju)}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: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: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: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=Jt(Rt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;ot.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()})}},fe=new _a});var Na,Ye,qs=w(()=>{"use strict";kt();Vi();re();tn();$t();Na=class extends De{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",xu)}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: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=Jt(Rt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;ot.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}},Ye=new Na});var Ks,La,Pn,Ua=w(()=>{"use strict";Ks={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"}},La=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=Ks[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 Ks[e]}getPrompt(e){return Ks[e].prompt}getValidCommands(e){return Ks[e].transitions}formatNextSteps(e){return Ks[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}`}})}},Pn=new La});var Ha,F,Ys=w(()=>{"use strict";kt();Mr();re();Ua();tn();$t();Ha=class extends De{static{l(this,"StateStorage")}constructor(){super("state.json",Iu)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Pn.getCurrentState(e),s=Pn.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:oe()};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[];ot.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=Eu.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:
342
387
  ${f.join(`
343
- `)}`)}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}},F=new _a});var hd=y(()=>{"use strict";Ta();O()});var Na,La,Ua=y(()=>{"use strict";Hn();$t();Na=class extends Ie{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Du,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}},La=new Na});var Mt=y(()=>{"use strict";ho();en();ue();zs();Hs();yo();So();Bs();Vs();qs();hd();$t();Ua()});function Ge(r,e,t=2){return`${r}
344
- ${e}`}function ut(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
345
- `)}function Ha(r){let e=[];r.branch&&e.push(`Branch: ${r.branch}`),r.linearId&&e.push(`Linear: ${r.linearId}`),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`);let t=e.length>0?`
346
- ${e.join(" | ")}`:"";return`Task: ${r.description}${t}`}function yd(r,e){return`Subtasks
347
- ${r.map((n,s)=>{let o=n.status==="completed",i=s===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
348
- `)}`}function wd(r){return r.length===0?"":`Relevant files
349
- ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- ${t.path}${n}${s}`}).join(`
350
- `)}`}function Sd(r){return`Rules
351
- ${ut(r)}`}function _e(r){return`Next
352
- ${r.map(t=>`- ${t.label}: ${t.command}`).join(`
353
- `)}`}function dt(r){let e=[];for(let[t,n]of Object.entries(r))n!=null&&e.push(`- ${t}: ${n}`);return e.join(`
354
- `)}function Ot(r,e){return e?`${r}
355
- ${e}`:r}function kd(r){return`> \u26A0\uFE0F ${r}`}function ge(...r){return r.filter(Boolean).join(`
356
-
357
- `)}function Ht(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var es=y(()=>{"use strict";l(Ge,"mdSection");l(ut,"mdList");l(Ha,"mdTaskHeader");l(yd,"mdSubtasks");l(wd,"mdRelevantFiles");l(Sd,"mdRules");l(_e,"mdNextSteps");l(dt,"mdStats");l(Ot,"mdDone");l(kd,"mdWarn");l(ge,"mdJoin");l(Ht,"mdActionRequired")});import Ks from"chalk";function at(r,e={}){if(e.quiet)return;let t=Pd[r]||"idle",n=Pn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:bd[o]||o}));console.log(Ks.dim(`
358
- Next:`));for(let o of s){let i=Ks.cyan(o.cmd.padEnd(12));console.log(Ks.dim(` ${i} \u2192 ${o.desc}`))}}function ko(r){let e=Pd[r]||"idle";return Pn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:bd[n]||n}))}function Ys(r){let e=Pn.getStateInfo(r);console.log(Ks.dim(`\u{1F4CD} State: ${Ks.white(r.toUpperCase())} - ${e.description}`))}var bd,Pd,ts=y(()=>{"use strict";Fa();bd={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"},Pd={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(at,"showNextSteps");l(ko,"getNextSteps");l(Ys,"showStateInfo")});import pt from"chalk";import Cn from"prompts";var Ga,Cd,ns,xd=y(()=>{"use strict";Sn();Ga=[{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."}],Cd=[{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"}],ns=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,Cn.override({})}async run(){this.printWelcome();let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(this.currentStep++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=await Cn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:Ga.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:Ga.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Cn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Cd.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(pt.dim(`
359
- Detected: ${e}
360
- `));let t=await Cn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Cn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.framework||""}],{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Cn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(pt.bold(" Configuration Summary")),console.log(pt.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${pt.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${pt.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${pt.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${pt.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${pt.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Cn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(pt.bold.cyan(" Welcome to prjct-cli!")),console.log(pt.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(pt.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(pt.yellow(`
361
- Setup cancelled. Run again anytime.
362
- `))}getProjectTypeLabel(e){return Ga.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Cd.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 za from"node:path";var Yw,Xw,bo,Qw,Ye,xn=y(()=>{"use strict";le();kt();Me();Yw="outcomes",Xw="outcomes.jsonl",bo=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=E.getGlobalProjectPath(e);return za.join(t,Yw)}getOutcomesPath(e){return za.join(this.getOutcomesDir(e),Xw)}async record(e,t){let n={...t,id:re()},s=this.getOutcomesPath(e);return await wt(za.dirname(s)),await bi(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await M(t))return[];let n=await Ln(t);return n.trim()?n.trim().split(`
363
- `).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}},Qw=new bo,Ye=Qw});var Po,Zw,Wa,vd=y(()=>{"use strict";xn();Po=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await Ye.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 Ye.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 Ye.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,P)=>S+P.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let P=this.parseVariance(S.variance),I=this.parseDuration(S.estimatedDuration);return I===0?!1:Math.abs(P)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(P=>P.completedAsPlanned))for(let P of S.tags||[])g.set(P,(g.get(P)||0)+1);let f=[...g.entries()].sort((S,P)=>P[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 Ye.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 Ye.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}},Zw=new Po,Wa=Zw});var Xs,Co,Ba,Va=y(()=>{"use strict";_n();se();Xs=3,Co=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>=Xs){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}/${Xs} 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>=Xs){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}/${Xs} 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>=Xs&&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:[D.FILE_STRUCTURE,D.ARCHITECTURE],tech_stack:[D.TECH_STACK],architecture:[D.ARCHITECTURE,D.CODE_STYLE],estimation:[D.SHIP_WORKFLOW],workflow:[D.SHIP_WORKFLOW,D.CODE_STYLE],gotcha:[D.TEST_BEHAVIOR,D.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(`
364
- `)}},Ba=new Co});var xo,Td,Ja=y(()=>{"use strict";Hi();$t();se();xo=class extends Ie{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...pu,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Dr([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?Dr(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Dr(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=mu(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=gu(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:fu(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},Td=new xo});var qa=y(()=>{"use strict";xd();vd();Va();xn();Ja()});import Ft from"chalk";function eS(r){return Ed[r.toLowerCase()]||Ed.default}var Ed,Ka,vo,Ad=y(()=>{"use strict";Ed={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(eS,"getIcon");Ka=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Ft.cyan(`
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: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}},F=new Ha});var bd=w(()=>{"use strict";Da();O()});var Ga,za,Wa=w(()=>{"use strict";Gn();$t();Ga=class extends De{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}},za=new Ga});var Mt=w(()=>{"use strict";wo();tn();pe();Bs();zs();So();bo();Js();qs();Ys();bd();$t();Wa()});function Qw(){return`\u26A1 prjct
389
+
390
+ ---`}function Zw(){return`---
391
+ \u26A1 prjct \xB7 v${Qi()}`}function ce(...r){return eS(Qw(),...r.filter(Boolean),Zw())}function Ba(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
392
+ `)}function ze(r,e,t=3){return`### ${r}
393
+ ${e}`}function dt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
394
+ `)}function Va(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
+ > ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Pd(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
+ ${Ba(t,n)}`}function Cd(r){return r.length===0?"":`### Relevant Files
397
+ ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
398
+ `)}`}function xd(r){return`### Rules
399
+ ${dt(r)}`}function Ne(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
400
+ ${Ba(e,t)}`}function pt(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 Ba(t,n)}function Ot(r,e){return e?`## \u2705 ${r}
401
+ > ${e}`:`## \u2705 ${r}`}function vd(r){return`> \u26A0\uFE0F **${r}**`}function eS(...r){return r.filter(Boolean).join(`
402
+
403
+ `)}function Ht(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var ts=w(()=>{"use strict";Qt();l(Qw,"mdHeader");l(Zw,"mdFooter");l(ce,"mdOutput");l(Ba,"mdTable");l(ze,"mdSection");l(dt,"mdList");l(Va,"mdTaskHeader");l(Pd,"mdSubtasks");l(Cd,"mdRelevantFiles");l(xd,"mdRules");l(Ne,"mdNextSteps");l(pt,"mdStats");l(Ot,"mdDone");l(vd,"mdWarn");l(eS,"mdJoin");l(Ht,"mdActionRequired")});import Xs from"chalk";function ct(r,e={}){if(e.quiet)return;let t=Ed[r]||"idle",n=Pn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Td[o]||o}));console.log(Xs.dim(`
404
+ Next:`));for(let o of s){let i=Xs.cyan(o.cmd.padEnd(12));console.log(Xs.dim(` ${i} \u2192 ${o.desc}`))}}function Po(r){let e=Ed[r]||"idle";return Pn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Td[n]||n}))}function Qs(r){let e=Pn.getStateInfo(r);console.log(Xs.dim(`\u{1F4CD} State: ${Xs.white(r.toUpperCase())} - ${e.description}`))}var Td,Ed,ns=w(()=>{"use strict";Ua();Td={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"},Ed={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(ct,"showNextSteps");l(Po,"getNextSteps");l(Qs,"showStateInfo")});import*as Q from"@clack/prompts";import Cn from"chalk";var Co,Ad,ss,Id=w(()=>{"use strict";Sn();Co=[{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."}],Ad=[{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"}],ss=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(Cn.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(Cn.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=Co.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:Co.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Co[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:Ad.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=[`${Cn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Cn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Cn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Cn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Cn.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 Co.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Ad.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 Ja from"node:path";var tS,nS,xo,sS,Xe,xn=w(()=>{"use strict";de();kt();Oe();tS="outcomes",nS="outcomes.jsonl",xo=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=E.getGlobalProjectPath(e);return Ja.join(t,tS)}getOutcomesPath(e){return Ja.join(this.getOutcomesDir(e),nS)}async record(e,t){let n={...t,id:oe()},s=this.getOutcomesPath(e);return await wt(Ja.dirname(s)),await xi(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await M(t))return[];let n=await Un(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}},sS=new xo,Xe=sS});var vo,rS,qa,Dd=w(()=>{"use strict";xn();vo=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await Xe.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 Xe.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 Xe.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,k)=>S+k.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let k=this.parseVariance(S.variance),I=this.parseDuration(S.estimatedDuration);return I===0?!1:Math.abs(k)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(k=>k.completedAsPlanned))for(let k of S.tags||[])g.set(k,(g.get(k)||0)+1);let f=[...g.entries()].sort((S,k)=>k[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 Xe.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 Xe.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}},rS=new vo,qa=rS});var Zs,To,Ka,Ya=w(()=>{"use strict";Nn();re();Zs=3,To=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>=Zs){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}/${Zs} 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>=Zs){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}/${Zs} 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>=Zs&&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:[D.FILE_STRUCTURE,D.ARCHITECTURE],tech_stack:[D.TECH_STACK],architecture:[D.ARCHITECTURE,D.CODE_STYLE],estimation:[D.SHIP_WORKFLOW],workflow:[D.SHIP_WORKFLOW,D.CODE_STYLE],gotcha:[D.TEST_BEHAVIOR,D.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(`
407
+ `)}},Ka=new To});var Eo,jd,Xa=w(()=>{"use strict";Wi();$t();re();Eo=class extends De{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...fu,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Rr([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?Rr(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Rr(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=hu(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=yu(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:wu(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}},jd=new Eo});var Qa=w(()=>{"use strict";Id();Dd();Ya();xn();Xa()});import Ft from"chalk";function oS(r){return Rd[r.toLowerCase()]||Rd.default}var Rd,Za,Ao,$d=w(()=>{"use strict";Rd={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(oS,"getIcon");Za=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Ft.cyan(`
365
408
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
366
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=eS(t);console.log(Ft.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Ft.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Ft.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Ft.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?Ft.green("\u2713"):Ft.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Ft.dim(`(${n})`)}
367
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Ft.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Ft.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},vo=new Ka});import Ne from"chalk";function tS(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Id.length;return Id[t]}function nS(r,e,t="\u25B6"){let n=Ne.dim(String(r+1).padStart(2)),o=tS(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=Ne.green("\u2713 Complete");break;case"in_progress":a=Ne.yellow(`${t} Working...`);break;case"pending":a=Ne.gray("\u25CB Pending");break;case"failed":a=Ne.red("\u2717 Failed");break;case"blocked":a=Ne.gray("\u2298 Blocked");break;default:a=Ne.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function sS(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ne.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ne.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(nS(t,r[t]));return e.push(""),e.join(`
368
- `)}function Dd(r){console.log(sS(r))}var Id,jd=y(()=>{"use strict";Id=[Ne.cyan,Ne.magenta,Ne.yellow,Ne.blue,Ne.green,Ne.redBright,Ne.magentaBright,Ne.cyanBright];l(tS,"getDomainColor");l(nS,"formatSubtaskLine");l(sS,"renderSubtaskProgress");l(Dd,"printSubtaskProgress")});function rS(r){return Rd.includes(r)}async function oS(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 iS(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(`
369
- `)}var Rd,aS,To,$d=y(()=>{"use strict";Rd=["ship","feature","spec","cleanup","migrate"];l(rS,"requiresReasoning");l(oS,"reason");l(iS,"formatPlan");aS={requiresReasoning:rS,reason:oS,formatPlan:iS,REASONING_REQUIRED_COMMANDS:Rd},To=aS});import Qs from"node:fs/promises";var Ya,cS,Xe,Xa=y(()=>{"use strict";st();le();O();fo();Ya=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new vt({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=E.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:E.getFilePath(n,"core","now.md"),next:E.getFilePath(n,"core","next.md"),context:E.getFilePath(n,"core","context.md"),shipped:E.getFilePath(n,"progress","shipped.md"),metrics:E.getFilePath(n,"progress","metrics.md"),ideas:E.getFilePath(n,"planning","ideas.md"),roadmap:E.getFilePath(n,"planning","roadmap.md"),specs:E.getFilePath(n,"planning","specs"),memory:E.getFilePath(n,"memory","context.jsonl"),patterns:E.getFilePath(n,"memory","patterns.json"),analysis:E.getFilePath(n,"analysis","repo-summary.md"),codePatterns:E.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 Qs.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([Qs.readFile(d,"utf-8"),Qs.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 Qs.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 Qs.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},cS=new Ya,Xe=cS});import{exec as lS}from"node:child_process";import fe from"node:fs/promises";import Md from"node:os";import nn from"node:path";import{promisify as uS}from"node:util";function Od(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 Qa(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pS(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
409
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=oS(t);console.log(Ft.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Ft.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Ft.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Ft.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?Ft.green("\u2713"):Ft.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Ft.dim(`(${n})`)}
410
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Ft.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Ft.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Ao=new Za});import Le from"chalk";function iS(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Md.length;return Md[t]}function aS(r,e,t="\u25B6"){let n=Le.dim(String(r+1).padStart(2)),o=iS(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=Le.green("\u2713 Complete");break;case"in_progress":a=Le.yellow(`${t} Working...`);break;case"pending":a=Le.gray("\u25CB Pending");break;case"failed":a=Le.red("\u2717 Failed");break;case"blocked":a=Le.gray("\u2298 Blocked");break;default:a=Le.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function cS(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Le.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Le.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(aS(t,r[t]));return e.push(""),e.join(`
411
+ `)}function Od(r){console.log(cS(r))}var Md,Fd=w(()=>{"use strict";Md=[Le.cyan,Le.magenta,Le.yellow,Le.blue,Le.green,Le.redBright,Le.magentaBright,Le.cyanBright];l(iS,"getDomainColor");l(aS,"formatSubtaskLine");l(cS,"renderSubtaskProgress");l(Od,"printSubtaskProgress")});function lS(r){return _d.includes(r)}async function uS(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 dS(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 _d,pS,Io,Nd=w(()=>{"use strict";_d=["ship","feature","spec","cleanup","migrate"];l(lS,"requiresReasoning");l(uS,"reason");l(dS,"formatPlan");pS={requiresReasoning:lS,reason:uS,formatPlan:dS,REASONING_REQUIRED_COMMANDS:_d},Io=pS});import er from"node:fs/promises";var ec,mS,Qe,tc=w(()=>{"use strict";rt();de();O();yo();ec=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new vt({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=E.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:E.getFilePath(n,"core","now.md"),next:E.getFilePath(n,"core","next.md"),context:E.getFilePath(n,"core","context.md"),shipped:E.getFilePath(n,"progress","shipped.md"),metrics:E.getFilePath(n,"progress","metrics.md"),ideas:E.getFilePath(n,"planning","ideas.md"),roadmap:E.getFilePath(n,"planning","roadmap.md"),specs:E.getFilePath(n,"planning","specs"),memory:E.getFilePath(n,"memory","context.jsonl"),patterns:E.getFilePath(n,"memory","patterns.json"),analysis:E.getFilePath(n,"analysis","repo-summary.md"),codePatterns:E.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 er.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([er.readFile(d,"utf-8"),er.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 er.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 er.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},mS=new ec,Qe=mS});import{exec as gS}from"node:child_process";import he from"node:fs/promises";import Ld from"node:os";import sn from"node:path";import{promisify as fS}from"node:util";function Ud(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function nc(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function yS(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
370
413
  `;return r.warnings.forEach(t=>{e+=` - ${t}
371
414
  `}),r.recommendations.length>0&&(e+=`
372
415
  Recommendations:
373
416
  `,r.recommendations.forEach(t=>{e+=` -> ${t}
374
- `})),e}async function Fd(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await fe.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=Od(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 fe.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 fe.access(nn.dirname(i),fe.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 _d(r){let e=[],t=[],n={};try{let{stdout:i}=await dS("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
375
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=nn.join(r.projectPath,"package.json");try{let i=await fe.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 fe.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}.*${Qa(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 fe.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 Nd(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await fe.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 fe.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Qa(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 fe.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 Ld(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await fe.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 fe.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 Ud(r){let e=[],t=[],n={},s=nn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await fe.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=nn.join(Md.homedir(),".prjct-cli");try{await fe.access(o,fe.constants.W_OK),n.globalPathWritable=!0}catch(i){if(C(i))try{await fe.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Hd(r){let e=[],t=[],n={},s=nn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await fe.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=nn.join(Md.homedir(),".prjct-cli/projects",o||"");try{await fe.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 Gd(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 fe.access(nn.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 fe.stat(nn.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 fe.access(s),n.specsExists=!0;let i=await fe.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 Bd(r,e,t){let n=Wd[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function mS(r,e,t){let n=await Bd(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function gS(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var dS,Wd,fS,Eo,Vd=y(()=>{"use strict";O();dS=uS(lS);l(Od,"formatDuration");l(Qa,"escapeRegex");l(pS,"formatWarnings");l(Fd,"verifyDone");l(_d,"verifyShip");l(Nd,"verifyFeature");l(Ld,"verifyNow");l(Ud,"verifyInit");l(Hd,"verifySync");l(Gd,"verifyAnalyze");l(zd,"verifySpec");Wd={done:Fd,ship:_d,feature:Nd,now:Ld,init:Ud,sync:Hd,analyze:Gd,spec:zd};l(Bd,"verify");l(mS,"prepareCommand");l(gS,"requiresVerification");fS={verify:Bd,prepareCommand:mS,requiresVerification:gS,verifiers:Wd,formatWarnings:pS,formatDuration:Od,escapeRegex:Qa,verifyDone:Fd,verifyShip:_d,verifyFeature:Nd,verifyNow:Ld,verifyInit:Ud,verifySync:Hd,verifyAnalyze:Gd,verifySpec:zd},Eo=fS});function yS(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 wS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of hS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:yS(t)};return{detected:!1}}function SS(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 kS(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 bS(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 PS(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 hS,Za,CS,ss,Jd=y(()=>{"use strict";hS=[{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(yS,"getHallucinationSuggestion");l(wS,"detectHallucination");l(SS,"isSimilarError");l(kS,"analyzeErrorPattern");l(bS,"generateEscalationMessage");l(PS,"generateSuggestion");Za=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=>SS(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=kS(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:bS(e,o,this.maxAttempts),suggestion:PS(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 wS(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}}},CS=new Za,ss=CS});function ec(r,e){let t=Zs(e),n=xS[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 vS(r,e){let t=Zs(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function TS(r,e,t){let n=Zs(t),s=ec(r,t),o=ec(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Ao(r,e=Xt){let t=Zs(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=ES(r,e),s=AS(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=jS(o),a=IS(o),c=DS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=RS(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Kd(r,e,t=Xt){let n=Zs(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 ES(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=TS(i,s,e);if(!t.has(a)){let c=ec(i,e),u=vS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function AS(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+$S(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>nc(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 IS(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 DS(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=nc(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function jS(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 RS(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=nc(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 nc(r){if(!r.variance)return 0;let e=tc(r.estimatedDuration),t=tc(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function tc(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 Yd(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(`
376
- `)}function $S(r){if(!r.estimatedDuration)return 0;let e=tc(r.estimatedDuration);if(e<=0)return 0;let t=qd[0],n=Number.POSITIVE_INFINITY;for(let s of qd){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Zs(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var xS,qd,sc=y(()=>{"use strict";Hn();xS={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(ec,"getSprintStart");l(vS,"getSprintEnd");l(TS,"getSprintNumber");l(Ao,"calculateVelocity");l(Kd,"projectCompletion");l(ES,"bucketBySprint");l(AS,"buildSprintVelocities");l(IS,"detectTrend");l(DS,"calculateOverallAccuracy");l(jS,"calculateAverageVelocity");l(RS,"detectEstimationPatterns");l(nc,"parseVariancePercent");l(tc,"parseDurationMinutes");l(Yd,"formatVelocityContext");qd=[{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($S,"derivePoints");l(Zs,"resolveConfig")});import{exec as MS}from"node:child_process";import OS from"node:fs/promises";import Io from"node:path";import{promisify as FS}from"node:util";async function Do(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=HS(r),c=await GS(e),u=await zS(e),d=[];for(let p of c){if(!i&&BS(p))continue;let g=WS(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 HS(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 GS(r){let e=[];async function t(n,s=""){try{let o=await OS.readdir(n,{withFileTypes:!0});for(let i of o){let a=Io.join(n,i.name),c=Io.join(s,i.name);if(i.isDirectory()){if(US.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Io.extname(i.name).toLowerCase();LS.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(r),e}async function zS(r){let e=new Map;try{let{stdout:t}=await _S(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
417
+ `})),e}async function Hd(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=Ud(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(sn.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 Gd(r){let e=[],t=[],n={};try{let{stdout:i}=await hS("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=sn.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}.*${nc(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 zd(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(nc(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 Wd(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 Bd(r){let e=[],t=[],n={},s=sn.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=sn.join(Ld.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 Vd(r){let e=[],t=[],n={},s=sn.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=sn.join(Ld.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 Jd(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(sn.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(sn.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 qd(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 Yd(r,e,t){let n=Kd[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 wS(r,e,t){let n=await Yd(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function SS(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var hS,Kd,kS,Do,Xd=w(()=>{"use strict";O();hS=fS(gS);l(Ud,"formatDuration");l(nc,"escapeRegex");l(yS,"formatWarnings");l(Hd,"verifyDone");l(Gd,"verifyShip");l(zd,"verifyFeature");l(Wd,"verifyNow");l(Bd,"verifyInit");l(Vd,"verifySync");l(Jd,"verifyAnalyze");l(qd,"verifySpec");Kd={done:Hd,ship:Gd,feature:zd,now:Wd,init:Bd,sync:Vd,analyze:Jd,spec:qd};l(Yd,"verify");l(wS,"prepareCommand");l(SS,"requiresVerification");kS={verify:Yd,prepareCommand:wS,requiresVerification:SS,verifiers:Kd,formatWarnings:yS,formatDuration:Ud,escapeRegex:nc,verifyDone:Hd,verifyShip:Gd,verifyFeature:zd,verifyNow:Wd,verifyInit:Bd,verifySync:Vd,verifyAnalyze:Jd,verifySpec:qd},Do=kS});function PS(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 CS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of bS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:PS(t)};return{detected:!1}}function xS(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 vS(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 TS(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 ES(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 bS,sc,AS,rs,Qd=w(()=>{"use strict";bS=[{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(PS,"getHallucinationSuggestion");l(CS,"detectHallucination");l(xS,"isSimilarError");l(vS,"analyzeErrorPattern");l(TS,"generateEscalationMessage");l(ES,"generateSuggestion");sc=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=>xS(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=vS(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:TS(e,o,this.maxAttempts),suggestion:ES(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 CS(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}}},AS=new sc,rs=AS});function rc(r,e){let t=tr(e),n=IS[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 DS(r,e){let t=tr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function jS(r,e,t){let n=tr(t),s=rc(r,t),o=rc(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function jo(r,e=Xt){let t=tr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=RS(r,e),s=$S(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=FS(o),a=MS(o),c=OS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=_S(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function ep(r,e,t=Xt){let n=tr(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 RS(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=jS(i,s,e);if(!t.has(a)){let c=rc(i,e),u=DS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function $S(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+NS(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>ic(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 MS(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 OS(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=ic(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function FS(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 _S(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=ic(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 ic(r){if(!r.variance)return 0;let e=oc(r.estimatedDuration),t=oc(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function oc(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 tp(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 NS(r){if(!r.estimatedDuration)return 0;let e=oc(r.estimatedDuration);if(e<=0)return 0;let t=Zd[0],n=Number.POSITIVE_INFINITY;for(let s of Zd){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function tr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var IS,Zd,ac=w(()=>{"use strict";Gn();IS={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(rc,"getSprintStart");l(DS,"getSprintEnd");l(jS,"getSprintNumber");l(jo,"calculateVelocity");l(ep,"projectCompletion");l(RS,"bucketBySprint");l($S,"buildSprintVelocities");l(MS,"detectTrend");l(OS,"calculateOverallAccuracy");l(FS,"calculateAverageVelocity");l(_S,"detectEstimationPatterns");l(ic,"parseVariancePercent");l(oc,"parseDurationMinutes");l(tp,"formatVelocityContext");Zd=[{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(NS,"derivePoints");l(tr,"resolveConfig")});import{exec as LS}from"node:child_process";import US from"node:fs/promises";import Ro from"node:path";import{promisify as HS}from"node:util";async function $o(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=VS(r),c=await JS(e),u=await qS(e),d=[];for(let p of c){if(!i&&YS(p))continue;let g=KS(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 VS(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 JS(r){let e=[];async function t(n,s=""){try{let o=await US.readdir(n,{withFileTypes:!0});for(let i of o){let a=Ro.join(n,i.name),c=Ro.join(s,i.name);if(i.isDirectory()){if(BS.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Ro.extname(i.name).toLowerCase();WS.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(r),e}async function qS(r){let e=new Map;try{let{stdout:t}=await GS(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
377
420
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
378
421
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
379
422
  END { for (f in files) print files[f], lastmod[f], f }
380
423
  '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
381
- `).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 WS(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(NS))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=Io.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 BS(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 _S,NS,LS,US,rc=y(()=>{"use strict";O();_S=FS(MS),NS={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"]},LS=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),US=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Do,"findRelevantFiles");l(HS,"extractKeywords");l(GS,"getAllCodeFiles");l(zS,"getGitRecency");l(WS,"scoreFile");l(BS,"isTestFile")});import{exec as VS}from"node:child_process";import{promisify as JS}from"node:util";async function Xd(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 YS(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await KS(r,t);return o=o.filter(c=>!XS(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 KS(r,e){let{stdout:t}=await er(`git log -${e} --pretty=format:"%ct" --name-only | awk '
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 KS(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(zS))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=Ro.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 YS(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 GS,zS,WS,BS,cc=w(()=>{"use strict";O();GS=HS(LS),zS={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"]},WS=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),BS=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l($o,"findRelevantFiles");l(VS,"extractKeywords");l(JS,"getAllCodeFiles");l(qS,"getGitRecency");l(KS,"scoreFile");l(YS,"isTestFile")});import{exec as XS}from"node:child_process";import{promisify as QS}from"node:util";async function np(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 tk(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await ek(r,t);return o=o.filter(c=>!nk(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 ek(r,e){let{stdout:t}=await nr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
382
425
  /^[0-9]+$/ { timestamp=$1; next }
383
426
  NF {
384
427
  count[$0]++
@@ -388,8 +431,8 @@ Recommendations:
388
431
  for (f in count) print count[f], lastmod[f], f
389
432
  }
390
433
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
391
- `).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),P=u/i,I=S*.6+P*.4,j;f<1?j="just now":f<24?j=`${f}h ago`:g<7?j=`${g}d ago`:g<30?j=`${Math.floor(g/7)}w ago`:j=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(I*100)/100,lastChanged:j,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function YS(r){let{stdout:e}=await er("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await er("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await er(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
392
- `).filter(Boolean),{stdout:i}=await er(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
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),k=u/i,I=S*.6+k*.4,j;f<1?j="just now":f<24?j=`${f}h ago`:g<7?j=`${g}d ago`:g<30?j=`${Math.floor(g/7)}w ago`:j=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(I*100)/100,lastChanged:j,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function tk(r){let{stdout:e}=await nr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await nr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await nr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
435
+ `).filter(Boolean),{stdout:i}=await nr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
393
436
  /^[0-9]+$/ { timestamp=$1; next }
394
437
  NF {
395
438
  count[$0]++
@@ -399,10 +442,10 @@ Recommendations:
399
442
  for (f in count) print count[f], lastmod[f], f
400
443
  }
401
444
  '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
402
- `).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],P=u-f,I=Math.floor(P/86400),j=Math.floor(P/3600),V=Math.max(0,1-I/14),de=g/d,we=V*.5+de*.5,Ue;j<1?Ue="just now":j<24?Ue=`${j}h ago`:Ue=`${I}d ago`,a.push({path:S,changes:g,heatScore:Math.round(we*100)/100,lastChanged:Ue,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function XS(r){let e=r.split("/").pop()||"";for(let t of qS)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var er,qS,Qd=y(()=>{"use strict";er=JS(VS),qS=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Xd,"getRecentFiles");l(KS,"getHotFilesFromCommits");l(YS,"getBranchOnlyFiles");l(XS,"shouldIgnore")});function oc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Zd(r,e){let t=QS[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function ek(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function tp(r,e){let t=oc(r),n=oc(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=Zd(s,ZS),a=ep.map(c=>({model:c,...Zd(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:ek(i.total),byModel:a}}}function ic(r){let e=oc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:ep.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var QS,ZS,ep,np=y(()=>{"use strict";QS={"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}},ZS="claude-sonnet-4.5";l(oc,"countTokens");ep=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Zd,"calculateModelCost");l(ek,"formatCostSaved");l(tp,"measureCompression");l(ic,"noCompression")});import tk from"node:fs/promises";import ac from"node:path";async function op(r,e=process.cwd()){let t=ac.isAbsolute(r)?r:ac.join(e,r),n;try{n=await tk.readFile(t,"utf-8")}catch(u){if(C(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:ic("")};throw u}let s=ac.extname(r).toLowerCase(),o=nk[s]||"unknown",i=ik[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:ic(n)};let a=ak(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
403
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:tp(n,c)}}function ak(r,e){let t=[],n=r.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],k=u-f,I=Math.floor(k/86400),j=Math.floor(k/3600),V=Math.max(0,1-I/14),me=g/d,Se=V*.5+me*.5,He;j<1?He="just now":j<24?He=`${j}h ago`:He=`${I}d ago`,a.push({path:S,changes:g,heatScore:Math.round(Se*100)/100,lastChanged:He,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function nk(r){let e=r.split("/").pop()||"";for(let t of ZS)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var nr,ZS,sp=w(()=>{"use strict";nr=QS(XS),ZS=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(np,"getRecentFiles");l(ek,"getHotFilesFromCommits");l(tk,"getBranchOnlyFiles");l(nk,"shouldIgnore")});function lc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function rp(r,e){let t=sk[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function ok(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ip(r,e){let t=lc(r),n=lc(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=rp(s,rk),a=op.map(c=>({model:c,...rp(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:ok(i.total),byModel:a}}}function uc(r){let e=lc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:op.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var sk,rk,op,ap=w(()=>{"use strict";sk={"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}},rk="claude-sonnet-4.5";l(lc,"countTokens");op=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(rp,"calculateModelCost");l(ok,"formatCostSaved");l(ip,"measureCompression");l(uc,"noCompression")});import ik from"node:fs/promises";import dc from"node:path";async function up(r,e=process.cwd()){let t=dc.isAbsolute(r)?r:dc.join(e,r),n;try{n=await ik.readFile(t,"utf-8")}catch(u){if(C(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:uc("")};throw u}let s=dc.extname(r).toLowerCase(),o=ak[s]||"unknown",i=dk[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:uc(n)};let a=pk(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:ip(n,c)}}function pk(r,e){let t=[],n=r.split(`
404
447
  `),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(`
405
- `).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:ck(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function ck(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var nk,sp,sk,rk,ok,rp,ik,ip=y(()=>{"use strict";O();np();nk={".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"},sp=[{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}],sk=[{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}],rk=[{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}],ok=[{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}],rp=[{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}],ik={typescript:sp,javascript:sp,python:sk,go:rk,rust:ok,java:rp,csharp:rp,php:[],ruby:[],unknown:[]};l(op,"extractSignatures");l(ak,"extractFromContent");l(ck,"cleanSignature")});import{createHash as lk}from"node:crypto";import lp from"node:fs/promises";import up from"node:path";function ap(r){return lk("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function cp(r){try{let e=up.join(r,"storage","classification-cache.json"),t=await lp.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e)?_i:(console.warn("[classifier] Failed to load cache:",w(e)),_i)}}async function cc(r,e){try{let t=up.join(r,"storage","classification-cache.json");await lp.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function dk(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>uk?null:n.classification}function pk(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function mk(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=dp(e),s=Ui("classification")||"",o=`Classify this software engineering task into a domain.
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:mk(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function mk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var ak,cp,ck,lk,uk,lp,dk,dp=w(()=>{"use strict";O();ap();ak={".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"},cp=[{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}],ck=[{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}],lk=[{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}],uk=[{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}],lp=[{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}],dk={typescript:cp,javascript:cp,python:ck,go:lk,rust:uk,java:lp,csharp:lp,php:[],ruby:[],unknown:[]};l(up,"extractSignatures");l(pk,"extractFromContent");l(mk,"cleanSignature")});import{createHash as gk}from"node:crypto";import gp from"node:fs/promises";import fp from"node:path";function pp(r){return gk("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function mp(r){try{let e=fp.join(r,"storage","classification-cache.json"),t=await gp.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e)?Ui:(console.warn("[classifier] Failed to load cache:",y(e)),Ui)}}async function pc(r,e){try{let t=fp.join(r,"storage","classification-cache.json");await gp.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function hk(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>fk?null:n.classification}function yk(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function wk(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=hp(e),s=zi("classification")||"",o=`Classify this software engineering task into a domain.
406
449
 
407
450
  Task: "${r}"
408
451
 
@@ -410,19 +453,19 @@ Available domains in this project: ${n.join(", ")}
410
453
  Available agents: ${e.agents.join(", ")||"none"}
411
454
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
412
455
 
413
- ${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=Yt.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 fk(r,e){let t=dp(e),n=new Map;for(let[p,g]of Object.entries(gk)){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 Zl;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=hk(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 dp(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 hk(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 uk,gk,lc,yk,pp,mp=y(()=>{"use strict";Fs();Ir();O();uk=3600*1e3;l(ap,"hashDescription");l(cp,"loadCache");l(cc,"saveCache");l(dk,"lookupCache");l(pk,"lookupPatterns");l(mk,"classifyWithLLM");gk={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(fk,"classifyWithHeuristic");l(dp,"buildAvailableDomains");l(hk,"getFilePatterns");lc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=ap(e),i=await cp(n),a=dk(i,o,t);if(a)return{classification:a,source:"cache"};let c=pk(i,o);if(c)return{classification:c,source:"history"};let u=await mk(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await cc(n,i),{classification:u,source:"llm"};let d=fk(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await cc(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=ap(e),o=await cp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await cc(n,o))}},yk=new lc,pp=yk});import{exec as wk}from"node:child_process";import tr from"node:fs/promises";import Sk from"node:os";import vn from"node:path";import{promisify as kk}from"node:util";var gp,fp,uc,bk,jo,dc=y(()=>{"use strict";sc();st();le();Hn();Mt();rc();Qd();ip();O();xn();mp();qn();gp=kk(wk),fp=["database","backend","frontend","testing","devops"],uc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=E.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((we,Ue)=>{if(we.status==="fulfilled")return we.value;g.push(p[Ue]),console.warn(`Context tool "${p[Ue]}" failed: ${w(we.reason)}`)}),[S,P,I]=f,j={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},V=this.shouldFragment(a,t),de=null;return V&&e==="task"&&(de=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:V,subtasks:de,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:S,sealedAnalysis:P??null,velocityContext:I??null,contextDegradation:j}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Do(e,t,{maxFiles:10,minScore:.15}),Xd(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await op(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(`
414
- `);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([gp("git branch --show-current",{cwd:e}),gp("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
415
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await it.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??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 Ye.getAll(e);if(t.length===0)return null;let n=Ao(t,Xt);return n.sprints.length===0?null:Yd(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=vn.join(e,"analysis","repo-analysis.json"),n=await tr.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return C(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=E.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await F.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=vn.join(e,"agents");return(await tr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=E.getGlobalProjectPath(t),s=vn.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=vn.join(s,u);try{let m=await tr.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=Nr(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=vn.join(Sk.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=vn.join(t,`${i}.md`),c=vn.join(t,i,"SKILL.md");try{let u=await tr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await tr.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=fp.indexOf(a),d=fp.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 F.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?"...":""}`}},bk=new uc,jo=bk});function Pk(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 pc,Ck,Ce,hp=y(()=>{"use strict";kt();se();Zt();Zt();l(Pk,"generateApprovalPrompt");pc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return ha.includes(e)}isDestructive(e){return ya.includes(e)}isToolAllowedInPlanning(e){return no.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>no.includes(n)):t}startPlanning(e,t,n){let s={id:re(),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 Pk(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(`
416
- `)}_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`}},Ck=new pc,Ce=Ck});function xk(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Ro[t]?Ro[t]:Ro[e]?Ro[e]:e}function $o(r){let e=new Set,t=[];for(let n of r){let s=xk(n);e.has(s)||(e.add(s),t.push(n))}return t}var Ro,mc=y(()=>{"use strict";Ro={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(xk,"normalizeFrameworkName");l($o,"deduplicateTechStack")});import{z as xe}from"zod";function yp(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
417
- `);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=$o(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])=>vk[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(`
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=Yt.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 kk(r,e){let t=hp(e),n=new Map;for(let[p,g]of Object.entries(Sk)){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 nu;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=bk(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 hp(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 bk(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 fk,Sk,mc,Pk,yp,wp=w(()=>{"use strict";_s();jr();O();fk=3600*1e3;l(pp,"hashDescription");l(mp,"loadCache");l(pc,"saveCache");l(hk,"lookupCache");l(yk,"lookupPatterns");l(wk,"classifyWithLLM");Sk={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(kk,"classifyWithHeuristic");l(hp,"buildAvailableDomains");l(bk,"getFilePatterns");mc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=pp(e),i=await mp(n),a=hk(i,o,t);if(a)return{classification:a,source:"cache"};let c=yk(i,o);if(c)return{classification:c,source:"history"};let u=await wk(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await pc(n,i),{classification:u,source:"llm"};let d=kk(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await pc(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=pp(e),o=await mp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await pc(n,o))}},Pk=new mc,yp=Pk});import{exec as Ck}from"node:child_process";import sr from"node:fs/promises";import xk from"node:os";import vn from"node:path";import{promisify as vk}from"node:util";var Sp,kp,gc,Tk,Mo,fc=w(()=>{"use strict";ac();rt();de();Gn();Mt();cc();sp();dp();O();xn();wp();Kn();Sp=vk(Ck),kp=["database","backend","frontend","testing","devops"],gc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=E.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,He)=>{if(Se.status==="fulfilled")return Se.value;g.push(p[He]),console.warn(`Context tool "${p[He]}" failed: ${y(Se.reason)}`)}),[S,k,I]=f,j={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:k??null,velocityContext:I??null,contextDegradation:j}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),$o(e,t,{maxFiles:10,minScore:.15}),np(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await up(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
+ `);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([Sp("git branch --show-current",{cwd:e}),Sp("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 at.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 Xe.getAll(e);if(t.length===0)return null;let n=jo(t,Xt);return n.sprints.length===0?null:tp(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=vn.join(e,"analysis","repo-analysis.json"),n=await sr.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=E.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await F.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await yp.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=vn.join(e,"agents");return(await sr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=E.getGlobalProjectPath(t),s=vn.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=vn.join(s,u);try{let m=await sr.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=Ur(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=vn.join(xk.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=vn.join(t,`${i}.md`),c=vn.join(t,i,"SKILL.md");try{let u=await sr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await sr.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=kp.indexOf(a),d=kp.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 F.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?"...":""}`}},Tk=new gc,Mo=Tk});function Ek(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 hc,Ak,xe,bp=w(()=>{"use strict";kt();re();en();en();l(Ek,"generateApprovalPrompt");hc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return ka.includes(e)}isDestructive(e){return ba.includes(e)}isToolAllowedInPlanning(e){return ro.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>ro.includes(n)):t}startPlanning(e,t,n){let s={id:oe(),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 Ek(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`}},Ak=new hc,xe=Ak});function Ik(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Oo[t]?Oo[t]:Oo[e]?Oo[e]:e}function Fo(r){let e=new Set,t=[];for(let n of r){let s=Ik(n);e.has(s)||(e.add(s),t.push(n))}return t}var Oo,yc=w(()=>{"use strict";Oo={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(Ik,"normalizeFrameworkName");l(Fo,"deduplicateTechStack")});import{z as ve}from"zod";function Pp(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=Fo(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])=>Dk[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(`
418
461
  Context: ${r.fileCount} files in project.`),e.join(`
419
- `)}var e$,vk,wp=y(()=>{"use strict";mc();e$=xe.object({projectPath:xe.string(),language:xe.string().optional(),framework:xe.string().optional(),techStack:xe.array(xe.string()).default([]),domains:xe.object({hasFrontend:xe.boolean().default(!1),hasBackend:xe.boolean().default(!1),hasDatabase:xe.boolean().default(!1),hasTesting:xe.boolean().default(!1),hasDocker:xe.boolean().default(!1)}).optional(),fileCount:xe.number().optional(),availableAgents:xe.array(xe.string()).default([]),analysisLanguages:xe.array(xe.string()).default([]),analysisFrameworks:xe.array(xe.string()).default([]),analysisPackageManager:xe.string().optional()}),vk={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(yp,"buildAntiHallucinationBlock")});import{z as Tt}from"zod";var Tk,Sp,kp=y(()=>{"use strict";Tk=Tt.object({agents:Tt.boolean(),patterns:Tt.boolean(),checklist:Tt.boolean(),modules:Tt.array(Tt.string())}),Sp=Tt.object({version:Tt.string(),description:Tt.string().optional(),commands:Tt.record(Tt.string(),Tk).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function gc(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function bp(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=gc(o,Ek),a=gc(o,Ak),c=gc(o,Ik);return s.some(d=>Dk.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 Ek,Ak,Ik,Dk,Pp=y(()=>{"use strict";Ek=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Ak=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Ik=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],Dk=["Write","Edit","Bash"];l(gc,"countMatches");l(bp,"classifyCommand")});import fc from"node:fs/promises";import jk from"node:path";async function xp(){if(nr)return nr;let r=await fc.readFile(hc,"utf-8"),e=JSON.parse(r);return nr=Sp.parse(e),nr}function Rk(r){return vp.get(r)}function $k(r,e){vp.set(r,e)}function Ok(r,e){let t=r,n=Cp.get(t);return n&&_k(n.entry,e)?(n.count++,n.count>=Mk):(Cp.set(t,{entry:e,count:1}),!1)}async function Fk(r,e){let t=await fc.readFile(hc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await fc.writeFile(hc,`${JSON.stringify(n,null,2)}
420
- `,"utf-8"),nr=null}function _k(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 Tp(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Rk(e);if(n)return{entry:n,source:"cache"};if(t){let s=bp(e,t);return $k(e,s),Ok(e,s)&&Fk(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var hc,nr,vp,Cp,Mk,Ep=y(()=>{"use strict";kp();mn();Pp();hc=jk.join(Pe,"core/config/command-context.config.json"),nr=null;l(xp,"loadCommandContextConfig");vp=new Map;l(Rk,"getCachedClassification");l($k,"cacheClassification");Cp=new Map,Mk=3;l(Ok,"trackClassification");l(Fk,"persistClassification");l(_k,"isSameEntry");l(Tp,"resolveCommandContextFull")});import Nk from"node:os";import{z as _t}from"zod";function Lk(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Uk(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Ap(r){let e=r.platform??Nk.platform(),t=r.runtime??Lk(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
421
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Uk(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
462
+ `)}var a$,Dk,Cp=w(()=>{"use strict";yc();a$=ve.object({projectPath:ve.string(),language:ve.string().optional(),framework:ve.string().optional(),techStack:ve.array(ve.string()).default([]),domains:ve.object({hasFrontend:ve.boolean().default(!1),hasBackend:ve.boolean().default(!1),hasDatabase:ve.boolean().default(!1),hasTesting:ve.boolean().default(!1),hasDocker:ve.boolean().default(!1)}).optional(),fileCount:ve.number().optional(),availableAgents:ve.array(ve.string()).default([]),analysisLanguages:ve.array(ve.string()).default([]),analysisFrameworks:ve.array(ve.string()).default([]),analysisPackageManager:ve.string().optional()}),Dk={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Pp,"buildAntiHallucinationBlock")});import{z as Tt}from"zod";var jk,xp,vp=w(()=>{"use strict";jk=Tt.object({agents:Tt.boolean(),patterns:Tt.boolean(),checklist:Tt.boolean(),modules:Tt.array(Tt.string())}),xp=Tt.object({version:Tt.string(),description:Tt.string().optional(),commands:Tt.record(Tt.string(),jk).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function wc(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Tp(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=wc(o,Rk),a=wc(o,$k),c=wc(o,Mk);return s.some(d=>Ok.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 Rk,$k,Mk,Ok,Ep=w(()=>{"use strict";Rk=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],$k=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Mk=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],Ok=["Write","Edit","Bash"];l(wc,"countMatches");l(Tp,"classifyCommand")});import Sc from"node:fs/promises";import Fk from"node:path";async function Ip(){if(rr)return rr;let r=await Sc.readFile(kc,"utf-8"),e=JSON.parse(r);return rr=xp.parse(e),rr}function _k(r){return Dp.get(r)}function Nk(r,e){Dp.set(r,e)}function Uk(r,e){let t=r,n=Ap.get(t);return n&&Gk(n.entry,e)?(n.count++,n.count>=Lk):(Ap.set(t,{entry:e,count:1}),!1)}async function Hk(r,e){let t=await Sc.readFile(kc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Sc.writeFile(kc,`${JSON.stringify(n,null,2)}
463
+ `,"utf-8"),rr=null}function Gk(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 jp(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=_k(e);if(n)return{entry:n,source:"cache"};if(t){let s=Tp(e,t);return Nk(e,s),Uk(e,s)&&Hk(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var kc,rr,Dp,Ap,Lk,Rp=w(()=>{"use strict";vp();Qt();Ep();kc=Fk.join(Ce,"core/config/command-context.config.json"),rr=null;l(Ip,"loadCommandContextConfig");Dp=new Map;l(_k,"getCachedClassification");l(Nk,"cacheClassification");Ap=new Map,Lk=3;l(Uk,"trackClassification");l(Hk,"persistClassification");l(Gk,"isSameEntry");l(jp,"resolveCommandContextFull")});import zk from"node:os";import{z as _t}from"zod";function Wk(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Bk(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function $p(r){let e=r.platform??zk.platform(),t=r.runtime??Wk(),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",Bk(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
422
465
  `)}
423
- </env>`}var h$,Ip=y(()=>{"use strict";h$=_t.object({projectName:_t.string(),projectPath:_t.string(),isGitRepo:_t.boolean().default(!0),gitBranch:_t.string().optional(),platform:_t.string().optional(),runtime:_t.string().optional(),date:_t.string().optional(),model:_t.string().optional(),provider:_t.string().optional()});l(Lk,"detectRuntime");l(Uk,"normalizePlatform");l(Ap,"buildEnvironmentBlock")});function jp(r){let e=r.getAllocationFor("injection");return{...Oo,totalPrompt:e}}function Tn(r,e){let t=e*Rp;return r.length<=t?r:`${r.substring(0,t)}
424
- ... (truncated to ~${e} tokens)`}function Dp(r){return Math.ceil(r.length/Rp)}function $p(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Hk[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 Oo,Rp,Hk,Mo,Mp=y(()=>{"use strict";Oo={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(jp,"budgetsFromCoordinator");Rp=4;l(Tn,"truncateToTokenBudget");l(Dp,"estimateTokens");Hk={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($p,"filterSkillsByDomains");Mo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Oo,...e}}addSection(e,t){let n=Tn(e,t),s=Dp(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Tn(n,o);return this.used+=Dp(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 Op from"node:fs/promises";import En from"node:path";var yc,Gk,Fp,_p=y(()=>{"use strict";Mt();O();Me();mn();qa();wp();Ep();Ip();Mp();mc();qn();yc=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 Op.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){C(s)||console.error(`Template loading warning: ${w(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?jp(this._coordinator):Oo}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=Ae(`global/modules/${e}`);if(t)return t;let n=En.join(Pe,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=Jn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=Ae(s);if(o){let i=En.basename(s,".md");t[i]=o}}}else{let s=En.join(Pe,"templates","checklists");if(await M(s)){let o=(await Op.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=En.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){C(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([F.read(e),me.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 Wa.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: ${w(o)}`)}n.push("---"),n.push("");let s=n.join(`
425
- `);return Tn(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=En.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 b=await xp();p=Tp(b,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
466
+ </env>`}var C$,Mp=w(()=>{"use strict";C$=_t.object({projectName:_t.string(),projectPath:_t.string(),isGitRepo:_t.boolean().default(!0),gitBranch:_t.string().optional(),platform:_t.string().optional(),runtime:_t.string().optional(),date:_t.string().optional(),model:_t.string().optional(),provider:_t.string().optional()});l(Wk,"detectRuntime");l(Bk,"normalizePlatform");l($p,"buildEnvironmentBlock")});function Fp(r){let e=r.getAllocationFor("injection");return{...No,totalPrompt:e}}function Tn(r,e){let t=e*_p;return r.length<=t?r:`${r.substring(0,t)}
467
+ ... (truncated to ~${e} tokens)`}function Op(r){return Math.ceil(r.length/_p)}function Np(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Vk[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 No,_p,Vk,_o,Lp=w(()=>{"use strict";No={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Fp,"budgetsFromCoordinator");_p=4;l(Tn,"truncateToTokenBudget");l(Op,"estimateTokens");Vk={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(Np,"filterSkillsByDomains");_o=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...No,...e}}addSection(e,t){let n=Tn(e,t),s=Op(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Tn(n,o);return this.used+=Op(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 Up from"node:fs/promises";import En from"node:path";var bc,Jk,Hp,Gp=w(()=>{"use strict";Mt();O();Oe();Qt();Qa();Cp();Rp();Mp();Lp();yc();Kn();bc=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 Up.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?Fp(this._coordinator):No}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=Ie(`global/modules/${e}`);if(t)return t;let n=En.join(Ce,"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=En.basename(s,".md");t[i]=o}}}else{let s=En.join(Ce,"templates","checklists");if(await M(s)){let o=(await Up.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=En.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([F.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 qa.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 Tn(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=En.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 Ip();p=jp(P,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
426
469
  `),s.role&&d.push(`Role: ${s.role}
427
470
  `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
428
471
  `),d.push(`
@@ -431,31 +474,31 @@ Apply specialized expertise. Read agent file for details if needed.
431
474
  `)),d.push(`TASK: ${e.frontmatter.description}
432
475
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
433
476
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
434
- `);let S=t.projectPath;if(S){let b=u?.project?.id?En.basename(S):En.basename(S),A=Ap({projectName:b,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
477
+ `);let S=t.projectPath;if(S){let P=u?.project?.id?En.basename(S):En.basename(S),A=$p({projectName:P,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
435
478
  ${A}
436
- `)}if(u){let b=u.sealedAnalysis;if(d.push(`
479
+ `)}if(u){let P=u.sealedAnalysis;if(d.push(`
437
480
  ## PROJECT ANALYSIS (Sealed)
438
481
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
439
482
  `),d.push(`**Primary Domain**: ${u.primaryDomain}
440
483
  `),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
441
- `),b){if(b.languages?.length>0&&d.push(`**Languages**: ${b.languages.join(", ")}
442
- `),b.frameworks?.length>0&&d.push(`**Frameworks**: ${b.frameworks.join(", ")}
443
- `),b.packageManager&&d.push(`**Package Manager**: ${b.packageManager}
444
- `),b.sourceDir&&d.push(`**Source Dir**: ${b.sourceDir}
445
- `),b.testDir&&d.push(`**Test Dir**: ${b.testDir}
446
- `),d.push(`**Files Analyzed**: ${b.fileCount}
447
- `),d.push(`**Analysis Status**: ${b.status}${b.commitHash?` (commit: ${b.commitHash.slice(0,8)})`:""}
448
- `),b.patterns?.length>0){d.push(`
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(`
449
492
  ### Code Patterns (Follow These)
450
- `);for(let A of b.patterns)d.push(`- **${A.name}**: ${A.description}${A.location?` (${A.location})`:""}
451
- `)}if(b.antiPatterns?.length>0){d.push(`
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(`
452
495
  ### Anti-Patterns (Avoid These)
453
- `);for(let A of b.antiPatterns)d.push(`- **${A.issue}** in \`${A.file}\` \u2014 ${A.suggestion}
496
+ `);for(let A of P.antiPatterns)d.push(`- **${A.issue}** in \`${A.file}\` \u2014 ${A.suggestion}
454
497
  `)}}d.push(`
455
- `)}let P=p.patterns,I=n?.codePatterns||"";if(P&&I&&I.trim()){let b=this.extractPatternSummary(I);b&&(d.push(`## CODE PATTERNS
456
- `),d.push(b),d.push(`
498
+ `)}let k=p.patterns,I=n?.codePatterns||"";if(k&&I&&I.trim()){let P=this.extractPatternSummary(I);P&&(d.push(`## CODE PATTERNS
499
+ `),d.push(P),d.push(`
457
500
  Full patterns: Read analysis/patterns.md
458
- `))}let j=n?.analysis||"";if(P&&j&&j.trim()){let b=j.match(/Stack[:\s]+([^\n]+)/i)||j.match(/Technology[:\s]+([^\n]+)/i),A=b?b[1].trim():"detected";d.push(`
501
+ `))}let j=n?.analysis||"";if(k&&j&&j.trim()){let P=j.match(/Stack[:\s]+([^\n]+)/i)||j.match(/Technology[:\s]+([^\n]+)/i),A=P?P[1].trim():"detected";d.push(`
459
502
  ## STACK
460
503
  Stack: ${A}
461
504
  `),I||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
@@ -466,18 +509,18 @@ Stack: ${A}
466
509
  `),A.effort&&d.push(`Effort: ${A.effort}
467
510
  `),A.model&&d.push(`Model: ${A.model}
468
511
  `),A.skills.length>0&&d.push(`Skills: ${A.skills.join(", ")}
469
- `);let Se=Tn(A.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
470
- ${Se}
512
+ `);let ke=Tn(A.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
513
+ ${ke}
471
514
  \`\`\`
472
515
 
473
- `)}}let b=$p(u.skills,u.detectedDomains);if(b.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
516
+ `)}}let P=Np(u.skills,u.detectedDomains);if(P.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
474
517
 
475
- `);for(let A of b){d.push(`#### Skill: ${A.name}
476
- `);let Se=Tn(A.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
477
- ${Se}
518
+ `);for(let A of P){d.push(`#### Skill: ${A.name}
519
+ `);let ke=Tn(A.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
520
+ ${ke}
478
521
  \`\`\`
479
522
 
480
- `)}}}let V=this.getModulesForCommand(m,p);if(V.length>0)for(let b of V){let A=await this.loadModule(b);A&&(d.push(`
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(`
481
524
  `),d.push(A))}if(c?.isPlanning&&(d.push(`
482
525
  ## PLAN MODE
483
526
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
@@ -485,63 +528,63 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
485
528
  `)),c?.requiresApproval&&d.push(`
486
529
  ## APPROVAL REQUIRED
487
530
  Show changes, list affected files, ask for confirmation.
488
- `),S){let b=u?.sealedAnalysis,A=[...b?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Se={projectPath:S,language:u?.project?.ecosystem,framework:b?.frameworks?.[0],techStack:$o(A),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(an=>an.name)||[],analysisLanguages:b?.languages||[],analysisFrameworks:b?.frameworks||[],analysisPackageManager:b?.packageManager};d.push(`
489
- ${yp(Se)}
490
- `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let b=u.contextDegradation;d.push(`
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:Fo(A),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(cn=>cn.name)||[],analysisLanguages:P?.languages||[],analysisFrameworks:P?.frameworks||[],analysisPackageManager:P?.packageManager};d.push(`
532
+ ${Pp(ke)}
533
+ `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let P=u.contextDegradation;d.push(`
491
534
  ### CONTEXT DEGRADATION NOTICE
492
535
 
493
- `),d.push(`**Level**: ${b.level}
494
- `),d.push(`**Unavailable**: ${b.failedTools.join(", ")}
536
+ `),d.push(`**Level**: ${P.level}
537
+ `),d.push(`**Unavailable**: ${P.failedTools.join(", ")}
495
538
  `),d.push(`Some context tools failed. Explore the codebase manually for missing context.
496
539
 
497
- `)}if(u?.realContext){let b=u.realContext;if(d.push(`
540
+ `)}if(u?.realContext){let P=u.realContext;if(d.push(`
498
541
  ### CODEBASE CONTEXT
499
542
 
500
- `),d.push(`**Git State**: Branch \`${b.gitBranch}\` | ${b.gitStatus}
543
+ `),d.push(`**Git State**: Branch \`${P.gitBranch}\` | ${P.gitStatus}
501
544
 
502
- `),b.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
545
+ `),P.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
503
546
  `),d.push(`| Score | File | Why |
504
547
  `),d.push(`|-------|------|-----|
505
- `);for(let A of b.relevantFiles.slice(0,8))d.push(`| ${A.score} | ${A.path} | ${A.reason} |
548
+ `);for(let A of P.relevantFiles.slice(0,8))d.push(`| ${A.score} | ${A.path} | ${A.reason} |
506
549
  `);d.push(`
507
- `)}if(b.signatures.length>0){d.push(`**Code Signatures** (top files):
508
- `);for(let A of b.signatures)d.push(`\`\`\`typescript
550
+ `)}if(P.signatures.length>0){d.push(`**Code Signatures** (top files):
551
+ `);for(let A of P.signatures)d.push(`\`\`\`typescript
509
552
  // ${A.path}
510
553
  ${A.content}
511
554
  \`\`\`
512
555
  `);d.push(`
513
- `)}if(b.recentFiles.length>0){d.push("**Recently Changed**: ");let A=b.recentFiles.slice(0,5).map(Se=>`${Se.path} (${Se.lastChanged})`).join(", ");d.push(`${A}
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}
514
557
 
515
- `)}}let de=t.files||[];if(de.length>0){let b=de.slice(0,5).join(", ");d.push(`
516
- ## FILES: ${de.length} available. Top: ${b}
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}
517
560
  `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
518
561
 
519
562
  `)}else S&&d.push(`
520
563
  ## PROJECT: ${S}
521
564
  Read files before modifying.
522
565
 
523
- `);let we=this.filterRelevantState(n);if(we&&(d.push(`
566
+ `);let Se=this.filterRelevantState(n);if(Se&&(d.push(`
524
567
  ## PRJCT STATE (Project Management Data)
525
- `),d.push(we),d.push(`
568
+ `),d.push(Se),d.push(`
526
569
  `)),u?.velocityContext&&(d.push(`
527
570
  ### VELOCITY (Historical Estimation Data)
528
571
 
529
572
  `),d.push(u.velocityContext),d.push(`
530
573
 
531
- `)),o&&Object.keys(o).some(b=>o[b])){d.push(`
574
+ `)),o&&Object.keys(o).some(P=>o[P])){d.push(`
532
575
  ## PROJECT DEFAULTS (apply automatically)
533
- `);for(let[b,A]of Object.entries(o))A&&d.push(`- ${b}: ${A}
576
+ `);for(let[P,A]of Object.entries(o))A&&d.push(`- ${P}: ${A}
534
577
  `)}if(i?.plan&&i.plan.length>0){if(d.push(`
535
578
  ## THINK FIRST (reasoning from analysis)
536
579
  `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
537
- `);for(let b of i.conclusions)d.push(` \u2192 ${b}
580
+ `);for(let P of i.conclusions)d.push(` \u2192 ${P}
538
581
  `)}d.push(`Plan:
539
- `);for(let b=0;b<i.plan.length;b++)d.push(` ${b+1}. ${i.plan[b]}
582
+ `);for(let P=0;P<i.plan.length;P++)d.push(` ${P+1}. ${i.plan[P]}
540
583
  `);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
541
584
  `)}if(a&&a.length>0){d.push(`
542
585
  ## CONTEXT (apply these)
543
- `);for(let b of a)d.push(`- **${b.title}**: ${b.content}
544
- `),b.tags&&b.tags.length>0&&d.push(` Tags: ${b.tags.join(", ")}
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(", ")}
545
588
  `)}if(d.push(`
546
589
  ---
547
590
  `),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
@@ -549,34 +592,34 @@ Read files before modifying.
549
592
 
550
593
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
551
594
  `),d.push(`|---|--------|-------------|--------|
552
- `);for(let A of u.subtasks){let Se=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} | ${Se} |
553
- `)}let b=u.subtasks.find(A=>A.status==="in_progress");if(b&&(d.push(`
554
- **FOCUS ON SUBTASK #${b.order}**: ${b.description}
555
- `),d.push(`Agent: ${b.agent} | Domain: ${b.domain}
556
- `),b.dependsOn.length>0&&d.push(`Dependencies: ${b.dependsOn.join(", ")}
557
- `),b.handoff)){let A=b.handoff;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(`
558
601
  ### Previous Subtask Handoff
559
602
 
560
603
  `),d.push(`**From:** ${A.fromSubtask}
561
604
 
562
605
  `),d.push(`**What was done:**
563
- `);for(let Se of A.whatWasDone)d.push(`- ${Se}
606
+ `);for(let ke of A.whatWasDone)d.push(`- ${ke}
564
607
  `);if(A.filesChanged.length>0){d.push(`
565
608
  **Files changed:**
566
- `);for(let Se of A.filesChanged)d.push(`- \`${Se.path}\` (${Se.action})
609
+ `);for(let ke of A.filesChanged)d.push(`- \`${ke.path}\` (${ke.action})
567
610
  `)}d.push(`
568
611
  **Context for this subtask:**
569
612
  ${A.outputForNextAgent}
570
613
  `)}d.push(`
571
- `)}let Ue=this.getSchemaTypeForCommand(m);if(Ue){let{renderSchemaForPrompt:b}=await Promise.resolve().then(()=>(Ir(),cu)),A=b(Ue);A&&d.push(`
614
+ `)}let He=this.getSchemaTypeForCommand(m);if(He){let{renderSchemaForPrompt:P}=await Promise.resolve().then(()=>(jr(),du)),A=P(He);A&&d.push(`
572
615
  ${A}
573
- `)}if(p.checklist){let b=await this.loadChecklistRouting(),A=await this.loadChecklists();b&&Object.keys(A).length>0&&(d.push(`
616
+ `)}if(p.checklist){let P=await this.loadChecklistRouting(),A=await this.loadChecklists();P&&Object.keys(A).length>0&&(d.push(`
574
617
  ## QUALITY CHECKLISTS
575
618
  `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
576
619
  `),d.push(`Available: ${Object.keys(A).join(", ")}
577
620
  `),d.push(`Path: templates/checklists/{name}.md
578
621
  `),d.push(`Use Read tool to load checklists you determine are relevant.
579
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Mo({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}
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 _o({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}
580
623
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
581
624
 
582
625
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -610,7 +653,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
610
653
  - Prefer structured output (JSON) over free text when applicable.
611
654
 
612
655
  EXECUTE: Follow flow. Use tools. Decide.
613
- `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},Gk=new yc,Fp=Gk});import Np from"node:fs/promises";import mt from"node:path";var zk,Wk,wc,Sc,Fo,kc=y(()=>{"use strict";st();le();O();zk=["task","done","ship","resume","bug","enrich"],Wk=["init","sync","pause","next","dash","history","undo","redo"],wc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return mt.dirname(xs.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=E.getGlobalProjectPath(s),a=await(Je(),lt(tt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=mt.join(u,"templates")}catch{c=mt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await E.getAgentSettingsPath(),paths:{orchestrator:mt.join(c,"agentic","orchestrator.md"),agentRouting:mt.join(c,"agentic","agent-routing.md"),taskFragmentation:mt.join(c,"agentic","task-fragmentation.md"),commandTemplate:mt.join(c,"commands",`${e}.md`),repoAnalysis:mt.join(o,"analysis","repo-analysis.json"),agentsDir:mt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:mt.join(o,"storage","state.json")}}}requiresOrchestration(e){return zk.includes(e)?!0:!Wk.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=mt.join(E.getGlobalProjectPath(t),"agents");return(await Np.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return C(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=mt.join(E.getGlobalProjectPath(t),"agents");return(await Np.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
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}}}},Jk=new bc,Hp=Jk});import zp from"node:fs/promises";import mt from"node:path";var qk,Kk,Pc,Cc,Lo,xc=w(()=>{"use strict";rt();de();O();qk=["task","done","ship","resume","bug","enrich"],Kk=["init","sync","pause","next","dash","history","undo","redo"],Pc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return mt.dirname(vs.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=E.getGlobalProjectPath(s),a=await(qe(),ut(nt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=mt.join(u,"templates")}catch{c=mt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await E.getAgentSettingsPath(),paths:{orchestrator:mt.join(c,"agentic","orchestrator.md"),agentRouting:mt.join(c,"agentic","agent-routing.md"),taskFragmentation:mt.join(c,"agentic","task-fragmentation.md"),commandTemplate:mt.join(c,"commands",`${e}.md`),repoAnalysis:mt.join(o,"analysis","repo-analysis.json"),agentsDir:mt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:mt.join(o,"storage","state.json")}}}requiresOrchestration(e){return qk.includes(e)?!0:!Kk.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=mt.join(E.getGlobalProjectPath(t),"agents");return(await zp.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return C(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=mt.join(E.getGlobalProjectPath(t),"agents");return(await zp.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
614
657
  ## Agentic Execution Mode
615
658
 
616
659
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -693,13 +736,13 @@ When fragmenting tasks:
693
736
  2. Track progress: currentSubtaskIndex, subtaskProgress
694
737
  3. Each completed subtask generates a summary
695
738
  4. Pass summary to next agent for context handoff
696
- `,context:e,requiresOrchestration:t}}},Sc=new wc,Fo=Sc});import{exec as Bk}from"node:child_process";import Lp from"node:fs/promises";import{promisify as Vk}from"node:util";var Jk,An,$e,bc=y(()=>{"use strict";zr();Jk=Vk(Bk),An={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())}};An.register("Read",async r=>{try{return await Us.execute(async()=>await Lp.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Gr(e)||Ls(e),null}});An.register("Write",async(r,e)=>{try{return await Us.execute(async()=>await Lp.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Gr(t)||Ls(t),!1}});An.register("Bash",async r=>{try{return await Us.execute(async()=>await Jk(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});An.register("GetTimestamp",async()=>new Date().toISOString());An.register("GetDate",async()=>new Date().toISOString().split("T")[0]);An.register("GetDateTime",async()=>new Date().toISOString());$e=An});import Pc from"node:fs/promises";import qk from"node:os";import Up from"node:path";async function Kk(r){try{let e=Up.dirname(_o);await M(e)||await Pc.mkdir(e,{recursive:!0}),await Pc.writeFile(_o,`/p:${r}`)}catch{}}async function Yk(){try{await M(_o)&&await Pc.unlink(_o)}catch{}}var _o,Cc,Xk,No,xc=y(()=>{"use strict";O();Ad();Me();jd();$d();Xa();Vd();Jd();Gn();dc();hp();_p();kc();qn();bc();_o=Up.join(qk.homedir(),".prjct-cli",".running");l(Kk,"signalStart");l(Yk,"signalEnd");Cc=class{static{l(this,"CommandExecutor")}async signalStart(e){await Kk(e)}async signalEnd(){await Yk()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(ss.shouldEscalate(e,s)){let o=ss.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Qi.load(e),i=await Xe.build(n,t),a=Ce.requiresPlanning(e),c=Ce.isDestructive(e),u=Ce.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ce.startPlanning(i.projectId,e,t):u&&(d=Ce.getActivePlan(i.projectId));let m=null;if(Eo.requiresVerification(e)){let b=await Xe.loadStateForCommand(i,e);m=await Eo.verify(e,i,b),!m.verified&&m.warnings.length>0&&console.log(Eo.formatWarnings(m))}let p=null;if(To.requiresReasoning(e)){let b=await Xe.loadStateForCommand(i,e);p=await To.reason(e,i,b),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(To.formatPlan(p)))}let g=t.task||t.description||"",f=await Fo.buildContext(e,g,n),S=Fo.buildAgenticPrompt(f),P=null;if(Fo.requiresOrchestration(e)&&g)try{P=await jo.execute(e,g,n),P.detectedDomains.length>0&&vo.orchestrate(P.detectedDomains);for(let b of P.agents){let A=b.domain||b.name.replace(".md","");vo.startAgent(b.name,A,`Loading ${A} specialist...`),vo.endAgent(!0)}if(P.requiresFragmentation&&P.subtasks){let b=P.subtasks.map(A=>({id:A.id,domain:A.domain,description:A.description,status:A.status}));Dd(b)}}catch(b){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(b)}`)}let I={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},j=await Xe.loadState(i),V=null,de=null;i.projectId&&(V={commit_footer:await pe.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await pe.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await pe.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await pe.getSmartDecision(i.projectId,`preferred_agent_${e}`)},de=await pe.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let we={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ce.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Ue=await Fp.build(o,I,j,null,V,null,de,we,P);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),ss.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:j,prompt:Ue,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:de,orchestratorContext:P,memory:{create:l(b=>pe.createMemory(i.projectId,b),"create"),autoRemember:l((b,A,Se)=>pe.autoRemember(i.projectId,b,A,Se),"autoRemember"),search:l(b=>pe.searchMemories(i.projectId,b),"search"),findByTags:l(b=>pe.findByTags(i.projectId,b),"findByTags"),getStats:l(()=>pe.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(b=>Ce.recordGatheredInfo(i.projectId,b),"recordInfo"),setAnalysis:l(b=>Ce.setAnalysis(i.projectId,b),"setAnalysis"),propose:l(b=>Ce.proposePlan(i.projectId,b),"propose"),approve:l(b=>Ce.approvePlan(i.projectId,b),"approve"),reject:l(b=>Ce.rejectPlan(i.projectId,b),"reject"),getApprovalPrompt:l(()=>Ce.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ce.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ce.getNextStep(i.projectId),"getNextStep"),completeStep:l(b=>Ce.completeStep(i.projectId,b),"completeStep"),failStep:l(b=>Ce.failStep(i.projectId,b),"failStep"),abort:l(b=>Ce.abortPlan(i.projectId,b),"abort"),getStatus:l(()=>Ce.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ce.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=ss.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=ss.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!$e.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=$e.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Qi.load(e)).frontmatter["allowed-tools"]||[],i=await Xe.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:w(s)}}}},Xk=new Cc,No=Xk});import Lo from"node:fs/promises";import Qk from"node:https";import Zk from"node:os";import vc from"node:path";import Et from"chalk";var Tc,Hp,Gp=y(()=>{"use strict";O();Me();Tc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=vc.join(Zk.homedir(),".prjct-cli","config"),this.cacheFile=vc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=vc.join(__dirname,"..","..","package.json");return JSON.parse(await Lo.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=Qk.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 Lo.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await M(this.cacheDir)||await Lo.mkdir(this.cacheDir,{recursive:!0}),await Lo.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:`
739
+ `,context:e,requiresOrchestration:t}}},Cc=new Pc,Lo=Cc});import{exec as Yk}from"node:child_process";import Wp from"node:fs/promises";import{promisify as Xk}from"node:util";var Qk,An,Me,vc=w(()=>{"use strict";Br();Qk=Xk(Yk),An={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())}};An.register("Read",async r=>{try{return await Hs.execute(async()=>await Wp.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Wr(e)||Us(e),null}});An.register("Write",async(r,e)=>{try{return await Hs.execute(async()=>await Wp.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Wr(t)||Us(t),!1}});An.register("Bash",async r=>{try{return await Hs.execute(async()=>await Qk(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});An.register("GetTimestamp",async()=>new Date().toISOString());An.register("GetDate",async()=>new Date().toISOString().split("T")[0]);An.register("GetDateTime",async()=>new Date().toISOString());Me=An});import Tc from"node:fs/promises";import Zk from"node:os";import Bp from"node:path";async function eb(r){try{let e=Bp.dirname(Uo);await M(e)||await Tc.mkdir(e,{recursive:!0}),await Tc.writeFile(Uo,`/p:${r}`)}catch{}}async function tb(){try{await M(Uo)&&await Tc.unlink(Uo)}catch{}}var Uo,Ec,nb,Ho,Ac=w(()=>{"use strict";O();$d();Oe();Fd();Nd();tc();Xd();Qd();zn();fc();bp();Gp();xc();Kn();vc();Uo=Bp.join(Zk.homedir(),".prjct-cli",".running");l(eb,"signalStart");l(tb,"signalEnd");Ec=class{static{l(this,"CommandExecutor")}async signalStart(e){await eb(e)}async signalEnd(){await tb()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(rs.shouldEscalate(e,s)){let o=rs.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await na.load(e),i=await Qe.build(n,t),a=xe.requiresPlanning(e),c=xe.isDestructive(e),u=xe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=xe.startPlanning(i.projectId,e,t):u&&(d=xe.getActivePlan(i.projectId));let m=null;if(Do.requiresVerification(e)){let P=await Qe.loadStateForCommand(i,e);m=await Do.verify(e,i,P),!m.verified&&m.warnings.length>0&&console.log(Do.formatWarnings(m))}let p=null;if(Io.requiresReasoning(e)){let P=await Qe.loadStateForCommand(i,e);p=await Io.reason(e,i,P),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Io.formatPlan(p)))}let g=t.task||t.description||"",f=await Lo.buildContext(e,g,n),S=Lo.buildAgenticPrompt(f),k=null;if(Lo.requiresOrchestration(e)&&g)try{k=await Mo.execute(e,g,n),k.detectedDomains.length>0&&Ao.orchestrate(k.detectedDomains);for(let P of k.agents){let A=P.domain||P.name.replace(".md","");Ao.startAgent(P.name,A,`Loading ${A} specialist...`),Ao.endAgent(!0)}if(k.requiresFragmentation&&k.subtasks){let P=k.subtasks.map(A=>({id:A.id,domain:A.domain,description:A.description,status:A.status}));Od(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},j=await Qe.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:xe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},He=await Hp.build(o,I,j,null,V,null,me,Se,k);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),rs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:j,prompt:He,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:k,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=>xe.recordGatheredInfo(i.projectId,P),"recordInfo"),setAnalysis:l(P=>xe.setAnalysis(i.projectId,P),"setAnalysis"),propose:l(P=>xe.proposePlan(i.projectId,P),"propose"),approve:l(P=>xe.approvePlan(i.projectId,P),"approve"),reject:l(P=>xe.rejectPlan(i.projectId,P),"reject"),getApprovalPrompt:l(()=>xe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>xe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>xe.getNextStep(i.projectId),"getNextStep"),completeStep:l(P=>xe.completeStep(i.projectId,P),"completeStep"),failStep:l(P=>xe.failStep(i.projectId,P),"failStep"),abort:l(P=>xe.abortPlan(i.projectId,P),"abort"),getStatus:l(()=>xe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>xe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=rs.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=rs.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(!Me.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Me.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await na.load(e)).frontmatter["allowed-tools"]||[],i=await Qe.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)}}}},nb=new Ec,Ho=nb});import Go from"node:fs/promises";import sb from"node:https";import rb from"node:os";import Ic from"node:path";import Et from"chalk";var Dc,Vp,Jp=w(()=>{"use strict";O();Oe();Dc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Ic.join(rb.homedir(),".prjct-cli","config"),this.cacheFile=Ic.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Ic.join(__dirname,"..","..","package.json");return JSON.parse(await Go.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=sb.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 Go.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await M(this.cacheDir)||await Go.mkdir(this.cacheDir,{recursive:!0}),await Go.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:`
697
740
  `+Et.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
698
741
  `+Et.yellow("\u2502")+" "+Et.bold("Update available!")+" "+Et.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Et.yellow("\u2502")+`
699
742
  `+Et.yellow("\u2502")+" "+Et.yellow("\u2502")+`
700
743
  `+Et.yellow("\u2502")+" Run: "+Et.cyan("npm update -g prjct-cli")+" "+Et.yellow("\u2502")+`
701
744
  `+Et.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
702
- `}},Hp=Tc});var ae,ze=y(()=>{"use strict";xc();Xa();bc();st();le();Gp();rn();se();Me();Sn();ae=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Hp,this.updateNotificationShown=!1,this.commandExecutor=No}get agent(){return Yn.getAgent()}get agentInfo(){return Yn.getInfo()}get currentAuthor(){return sn.getCurrentAuthor()}async initializeAgent(){return Yn.initialize()}async ensureProjectInit(e){return sn.ensureInit(e)}async ensureAuthor(){return sn.ensureAuthor()}async getGlobalProjectPath(e){return sn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return qe.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return sn.isEmptyDirectory(e)}async _detectExistingCode(e){return sn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Xr.breakdownFeature(e)}_detectBugSeverity(e){return Xr.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Yn.assignForTask(e,t,n)}}});var zp={};Fn(zp,{PlanningCommands:()=>Dn});import In from"node:path";async function eb(){if(!Ec){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ho(),Wp));Ec=new r}return Ec}var Ec,Dn,Uo=y(()=>{"use strict";Br();fn();kt();Mt();O();es();ts();qa();ze();Ec=null;l(eb,"getAnalysisCommands");Dn=class extends ae{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new ns(t).runNonInteractive());else if(a=await new ns(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await Kn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await E.ensureProjectStructure(m);let p=E.getGlobalProjectPath(m),g={"core/now.md":`# NOW
745
+ `}},Vp=Dc});var le,We=w(()=>{"use strict";Ac();tc();vc();rt();de();Jp();on();re();Oe();Sn();le=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Vp,this.updateNotificationShown=!1,this.commandExecutor=Ho}get agent(){return Xn.getAgent()}get agentInfo(){return Xn.getInfo()}get currentAuthor(){return rn.getCurrentAuthor()}async initializeAgent(){return Xn.initialize()}async ensureProjectInit(e){return rn.ensureInit(e)}async ensureAuthor(){return rn.ensureAuthor()}async getGlobalProjectPath(e){return rn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return Ke.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return rn.isEmptyDirectory(e)}async _detectExistingCode(e){return rn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Zr.breakdownFeature(e)}_detectBugSeverity(e){return Zr.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Xn.assignForTask(e,t,n)}}});var qp={};_n(qp,{PlanningCommands:()=>Dn});import In from"node:path";async function ob(){if(!jc){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Wo(),Kp));jc=new r}return jc}var jc,Dn,zo=w(()=>{"use strict";Jr();fn();kt();Mt();O();ts();ns();Qa();We();jc=null;l(ob,"getAnalysisCommands");Dn=class extends le{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new ss(t).runNonInteractive());else if(a=await new ss(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await Yn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await E.ensureProjectStructure(m);let p=E.getGlobalProjectPath(m),g={"core/now.md":`# NOW
703
746
 
704
747
  No current task. Use \`/p:now\` to set focus.
705
748
  `,"core/next.md":`# NEXT
@@ -719,17 +762,17 @@ No current task. Use \`/p:now\` to set focus.
719
762
  `,"planning/roadmap.md":`# ROADMAP
720
763
 
721
764
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
722
- `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[I,j]of Object.entries(g))await $e.get("Write")(In.join(p,I),j);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let I=await eb();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 P=n.idea;if(f&&!S){if(!P)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=In.join(p,"planning","architect-session.md"),j=`# Architect Session
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,j]of Object.entries(g))await Me.get("Write")(In.join(p,I),j);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let I=await ob();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 k=n.idea;if(f&&!S){if(!k)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=In.join(p,"planning","architect-session.md"),j=`# Architect Session
723
766
 
724
767
  ## Idea
725
- ${P}
768
+ ${k}
726
769
 
727
770
  ## Status
728
771
  Initialized - awaiting stack recommendation
729
772
 
730
773
  Generated: ${new Date().toLocaleString()}
731
- `;return await $e.get("Write")(I,j),await He.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:P,wizard:a}}return await He.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await Xe.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=re(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await me.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(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await Xe.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 me.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(ge(Ge("Bug Reported",e),dt({Severity:a,Priority:m,Agent:u}),_e([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),at("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
732
- `);let s=await this.getGlobalProjectPath(t),o=In.join(s,"planning","architect-session.md"),i;try{i=await te.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
774
+ `;return await Me.get("Write")(I,j),await Ge.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:k,wizard:a}}return await Ge.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await Qe.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: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 R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await Qe.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:U.getTimestamp()}),n.md?console.log(ce(ze("Bug Reported",e),pt({Severity:a,Priority:m,Agent:u}),Ne([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),ct("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(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=In.join(s,"planning","architect-session.md"),i;try{i=await ne.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
733
776
 
734
777
  Create a plan first:
735
778
  1. Run /p:init in an empty directory
@@ -750,7 +793,7 @@ The architect plan is ready. Claude will now:
750
793
  4. Create starter files with boilerplate
751
794
  `),console.log(`
752
795
  \u{1F4A1} This command shows the plan.`),console.log(" For code generation, Claude Code will read this plan"),console.log(` and generate the structure automatically.
753
- `),await this.logToMemory(t,"architect_executed",{timestamp:U.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=E.getGlobalProjectPath(o),u=In.join(c,"planning","architect-session.md"),d=`# Architect Session
796
+ `),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 R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=E.getGlobalProjectPath(o),u=In.join(c,"planning","architect-session.md"),d=`# Architect Session
754
797
 
755
798
  ## Idea
756
799
  ${e}
@@ -765,14 +808,14 @@ Initialized - awaiting architecture design
765
808
  4. Generate roadmap
766
809
 
767
810
  Generated: ${new Date().toLocaleString()}
768
- `;return await $e.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(ge(Ge("Idea Captured",e),dt({Mode:"architecture"}),_e([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
811
+ `;return await Me.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(ce(ze("Idea Captured",e),pt({Mode:"architecture"}),Ne([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
769
812
  \u{1F4A1} Use /p:architect execute to continue planning
770
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Fe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(ge(Ge("Idea Captured",e),dt({Mode:"capture"}),_e([{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)}`),at("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=E.getGlobalProjectPath(s),m=In.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(`
813
+ `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await _e.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(ce(ze("Idea Captured",e),pt({Mode:"capture"}),Ne([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),ct("idea")),{success:!0,mode:"capture",idea:e}}catch(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 R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=E.getGlobalProjectPath(s),m=In.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(`
771
814
  \u{1F4A1} Create one with /p:spec "feature name"
772
815
  `),{success:!0,specs:[]}):(console.log(`
773
816
  \u{1F4CB} SPECIFICATIONS
774
- `),console.log("\u2550".repeat(50)),f.forEach((S,P)=>{let I=S.replace(".md","").replace(/-/g," ");console.log(` ${P+1}. ${I}`)}),console.log(`${"\u2550".repeat(50)}
775
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=E.getGlobalProjectPath(s),i=In.join(o,"planning","specs");await te.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=In.join(i,`${a}.md`),u=`# Specification: ${e}
817
+ `),console.log("\u2550".repeat(50)),f.forEach((S,k)=>{let I=S.replace(".md","").replace(/-/g," ");console.log(` ${k+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=E.getGlobalProjectPath(s),i=In.join(o,"planning","specs");await ne.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=In.join(i,`${a}.md`),u=`# Specification: ${e}
776
819
 
777
820
  ## Overview
778
821
  [Brief description of the feature]
@@ -802,28 +845,28 @@ Generated: ${new Date().toLocaleString()}
802
845
  ---
803
846
  Created: ${new Date().toLocaleString()}
804
847
  Status: Draft
805
- `;return await $e.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:U.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
848
+ `;return await Me.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:U.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
806
849
  \u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
807
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var Go,sn,Bp=y(()=>{"use strict";Ut();Br();st();le();O();Me();Sn();Go=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Uo(),zp)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw $r.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await E.ensureProjectStructure(t),E.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Kn();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 Un(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: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Un(e)).some(s=>t.includes(s))}catch(t){return C(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},sn=new Go});var tb,Vp,Jp,Ac,qp,Kp=y(()=>{"use strict";ue();se();tb=1800*1e3,Vp=50,Jp=200,Ac=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:tb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=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>Vp&&(s.current.commands=s.current.commands.slice(-Vp)),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>Jp&&(s.current.files=s.current.files.slice(-Jp)),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:Ts(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Ts(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}},qp=new Ac});import{exec as nb}from"node:child_process";import{promisify as sb}from"node:util";var Ic,rb,zo,sr,Yp=y(()=>{"use strict";ue();O();Kp();Ic=sb(nb),rb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},zo=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...rb,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=$.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Ic("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([Ic(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ic(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
808
- `).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
809
- `)}async getSessionInfo(e){return qp.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
850
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var Bo,rn,Yp=w(()=>{"use strict";Ut();Jr();rt();de();O();Oe();Sn();Bo=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(zo(),qp)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw Or.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await E.ensureProjectStructure(t),E.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Yn();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 Hn(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 Hn(e)).some(s=>t.includes(s))}catch(t){return C(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},rn=new Bo});var ib,Xp,Qp,Rc,Zp,em=w(()=>{"use strict";pe();re();ib=1800*1e3,Xp=50,Qp=200,Rc=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:ib}}}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>Xp&&(s.current.commands=s.current.commands.slice(-Xp)),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>Qp&&(s.current.files=s.current.files.slice(-Qp)),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:Es(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Es(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}},Zp=new Rc});import{exec as ab}from"node:child_process";import{promisify as cb}from"node:util";var $c,lb,Vo,or,tm=w(()=>{"use strict";pe();O();em();$c=cb(ab),lb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Vo=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...lb,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=$.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await $c("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([$c(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),$c(`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
+ `).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
+ `)}async getSessionInfo(e){return Zp.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
810
853
  `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
811
- `)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},sr=l((r,e)=>new zo(r,e),"createStalenessChecker")});import Xp from"node:fs/promises";import Wo from"node:path";function rr(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 cb(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...rr(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(...rr(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(...rr(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(...rr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...rr(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&&!ib.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function Qp(r,e){let t=[],n=await Xp.readdir(r,{withFileTypes:!0});for(let s of n){if(ab.has(s.name))continue;let o=Wo.join(r,s.name);if(s.isDirectory())t.push(...await Qp(o,e));else if(s.isFile()){let i=Wo.extname(s.name).toLowerCase();ob.has(i)&&t.push(Wo.relative(e,o))}}return t}async function lb(r){let e=await Qp(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 Xp.readFile(Wo.join(r,d),"utf-8"),p=cb(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 db(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,ub,t)}async function Zp(r,e){let t=await lb(r);return db(e,t),t}var ob,ib,ab,ub,em=y(()=>{"use strict";ue();ob=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ib=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"]),ab=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(rr,"splitIdentifier");l(cb,"tokenizeFile");l(Qp,"listFiles");l(lb,"buildIndex");ub="bm25-index";l(db,"saveIndex");l(Zp,"indexProject")});import Dc from"node:fs/promises";import Gt from"node:path";function hb(r){let e=[],t,n=new RegExp(fb.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function yb(r,e,t){let n;if(r.startsWith("@/"))n=Gt.join(t,"src",r.slice(2));else{let s=Gt.dirname(Gt.join(t,e));n=Gt.resolve(s,r)}for(let s of gb){let o=n+s;try{if((await Dc.stat(o)).isFile())return Gt.relative(t,o)}catch{}}return null}async function tm(r,e){let t=[],n=await Dc.readdir(r,{withFileTypes:!0});for(let s of n){if(mb.has(s.name))continue;let o=Gt.join(r,s.name);if(s.isDirectory())t.push(...await tm(o,e));else if(s.isFile()){let i=Gt.extname(s.name).toLowerCase();pb.has(i)&&t.push(Gt.relative(e,o))}}return t}async function wb(r){let e=await tm(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 Dc.readFile(Gt.join(r,u),"utf-8"),m=hb(d),p=[];for(let g of m){let f=await yb(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 Sb(r,e){G.setDoc(r,nm,e)}function sm(r){return G.getDoc(r,nm)}async function rm(r,e){let t=await wb(r);return Sb(e,t),t}var pb,mb,gb,fb,nm,jc=y(()=>{"use strict";ue();pb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),mb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),gb=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],fb=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(hb,"extractImportSources");l(yb,"resolveImport");l(tm,"listFiles");l(wb,"buildGraph");nm="import-graph";l(Sb,"saveGraph");l(sm,"loadGraph");l(rm,"indexImports")});function om(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=sm(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 im(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 am=y(()=>{"use strict";jc();l(om,"propagateChanges");l(im,"affectedDomains")});import Rc from"node:fs/promises";import Bo from"node:path";async function cm(r,e){let t=[],n=await Rc.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(bb.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Bo.join(r,o);if(s.isDirectory())t.push(...await cm(i,e));else if(s.isFile()){let a=Bo.extname(o).toLowerCase();kb.has(a)&&t.push(Bo.relative(e,i))}}return t}function Pb(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 Cb(r){let e=await cm(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=Bo.join(r,a),[u,d]=await Promise.all([Rc.readFile(c,"utf-8"),Rc.stat(c)]);return{path:a,hash:Pb(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 xb(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 $c(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 vb(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 Mc(r,e){let[t,n]=await Promise.all([Cb(r),Promise.resolve(vb(e))]);return{diff:xb(t,n),currentHashes:t}}function lm(r){return G.hasDoc(r,"file-hashes-meta")}var kb,bb,um=y(()=>{"use strict";ue();kb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),bb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(cm,"listProjectFiles");l(Pb,"hashContent");l(Cb,"computeHashes");l(xb,"diffHashes");l($c,"saveHashes");l(vb,"loadHashes");l(Mc,"detectChanges");l(lm,"hasHashRegistry")});import{exec as Tb}from"node:child_process";import{promisify as Eb}from"node:util";async function Db(r,e=100){try{let{stdout:t}=await Ab(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
812
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=pm&&n.push(s),s=new Set):i&&s&&jb(i)&&s.add(i)}return s&&s.size>0&&s.size<=pm&&n.push(s),n}catch{return[]}}function jb(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 Rb(r,e=100){let t=await Db(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=$b(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<dm||m<dm)continue;let p=d+m-a,g=p>0?a/p:0;g<Ib||(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 $b(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Ob(r,e){G.setDoc(r,Mb,e)}async function mm(r,e,t=100){let n=await Rb(r,t);return Ob(e,n),n}var Ab,Ib,dm,pm,Mb,gm=y(()=>{"use strict";ue();Ab=Eb(Tb),Ib=.1,dm=2,pm=30;l(Db,"parseGitLog");l(jb,"isSourceFile");l(Rb,"buildMatrix");l($b,"pairKey");Mb="cochange-index";l(Ob,"saveMatrix");l(mm,"indexCoChanges")});function gt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function jn(){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 Oc=y(()=>{"use strict";l(gt,"cite");l(jn,"defaultSources")});function or(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
813
- `)}function ir(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
814
- `)}function fm(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?`
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}},or=l((r,e)=>new Vo(r,e),"createStalenessChecker")});import nm from"node:fs/promises";import Jo from"node:path";function ir(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 mb(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ir(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(...ir(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(...ir(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(...ir(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ir(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&&!db.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function sm(r,e){let t=[],n=await nm.readdir(r,{withFileTypes:!0});for(let s of n){if(pb.has(s.name))continue;let o=Jo.join(r,s.name);if(s.isDirectory())t.push(...await sm(o,e));else if(s.isFile()){let i=Jo.extname(s.name).toLowerCase();ub.has(i)&&t.push(Jo.relative(e,o))}}return t}async function gb(r){let e=await sm(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 nm.readFile(Jo.join(r,d),"utf-8"),p=mb(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 hb(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,fb,t)}async function rm(r,e){let t=await gb(r);return hb(e,t),t}var ub,db,pb,fb,om=w(()=>{"use strict";pe();ub=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),db=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"]),pb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ir,"splitIdentifier");l(mb,"tokenizeFile");l(sm,"listFiles");l(gb,"buildIndex");fb="bm25-index";l(hb,"saveIndex");l(rm,"indexProject")});import Mc from"node:fs/promises";import Gt from"node:path";function bb(r){let e=[],t,n=new RegExp(kb.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Pb(r,e,t){let n;if(r.startsWith("@/"))n=Gt.join(t,"src",r.slice(2));else{let s=Gt.dirname(Gt.join(t,e));n=Gt.resolve(s,r)}for(let s of Sb){let o=n+s;try{if((await Mc.stat(o)).isFile())return Gt.relative(t,o)}catch{}}return null}async function im(r,e){let t=[],n=await Mc.readdir(r,{withFileTypes:!0});for(let s of n){if(wb.has(s.name))continue;let o=Gt.join(r,s.name);if(s.isDirectory())t.push(...await im(o,e));else if(s.isFile()){let i=Gt.extname(s.name).toLowerCase();yb.has(i)&&t.push(Gt.relative(e,o))}}return t}async function Cb(r){let e=await im(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 Mc.readFile(Gt.join(r,u),"utf-8"),m=bb(d),p=[];for(let g of m){let f=await Pb(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 xb(r,e){G.setDoc(r,am,e)}function cm(r){return G.getDoc(r,am)}async function lm(r,e){let t=await Cb(r);return xb(e,t),t}var yb,wb,Sb,kb,am,Oc=w(()=>{"use strict";pe();yb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),wb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Sb=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],kb=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(bb,"extractImportSources");l(Pb,"resolveImport");l(im,"listFiles");l(Cb,"buildGraph");am="import-graph";l(xb,"saveGraph");l(cm,"loadGraph");l(lm,"indexImports")});function um(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=cm(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 dm(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 pm=w(()=>{"use strict";Oc();l(um,"propagateChanges");l(dm,"affectedDomains")});import Fc from"node:fs/promises";import qo from"node:path";async function mm(r,e){let t=[],n=await Fc.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Tb.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=qo.join(r,o);if(s.isDirectory())t.push(...await mm(i,e));else if(s.isFile()){let a=qo.extname(o).toLowerCase();vb.has(a)&&t.push(qo.relative(e,i))}}return t}function Eb(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 Ab(r){let e=await mm(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=qo.join(r,a),[u,d]=await Promise.all([Fc.readFile(c,"utf-8"),Fc.stat(c)]);return{path:a,hash:Eb(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 Ib(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 _c(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 Db(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 Nc(r,e){let[t,n]=await Promise.all([Ab(r),Promise.resolve(Db(e))]);return{diff:Ib(t,n),currentHashes:t}}function gm(r){return G.hasDoc(r,"file-hashes-meta")}var vb,Tb,fm=w(()=>{"use strict";pe();vb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Tb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(mm,"listProjectFiles");l(Eb,"hashContent");l(Ab,"computeHashes");l(Ib,"diffHashes");l(_c,"saveHashes");l(Db,"loadHashes");l(Nc,"detectChanges");l(gm,"hasHashRegistry")});import{exec as jb}from"node:child_process";import{promisify as Rb}from"node:util";async function Ob(r,e=100){try{let{stdout:t}=await $b(`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<=ym&&n.push(s),s=new Set):i&&s&&Fb(i)&&s.add(i)}return s&&s.size>0&&s.size<=ym&&n.push(s),n}catch{return[]}}function Fb(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 _b(r,e=100){let t=await Ob(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=Nb(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<hm||m<hm)continue;let p=d+m-a,g=p>0?a/p:0;g<Mb||(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 Nb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Ub(r,e){G.setDoc(r,Lb,e)}async function wm(r,e,t=100){let n=await _b(r,t);return Ub(e,n),n}var $b,Mb,hm,ym,Lb,Sm=w(()=>{"use strict";pe();$b=Rb(jb),Mb=.1,hm=2,ym=30;l(Ob,"parseGitLog");l(Fb,"isSourceFile");l(_b,"buildMatrix");l(Nb,"pairKey");Lb="cochange-index";l(Ub,"saveMatrix");l(wm,"indexCoChanges")});function gt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function jn(){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 Lc=w(()=>{"use strict";l(gt,"cite");l(jn,"defaultSources")});function ar(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
856
+ `)}function cr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
857
+ `)}function km(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?`
815
858
  ### Project Structure
816
859
 
817
860
  ${e.join(`
818
861
  `)}
819
- `:""}function Fb(r){let e=[];return r.patterns?.length>0&&e.push(`
862
+ `:""}function Hb(r){let e=[];return r.patterns?.length>0&&e.push(`
820
863
  ### Code Patterns (Follow These)
821
864
 
822
- ${or(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
865
+ ${ar(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
823
866
  ### Anti-Patterns (Avoid These)
824
867
 
825
- ${ir(r.antiPatterns)}`),e.push(fm(r)),e.join(`
826
- `)}function _b(r,e){let t=r.sources||jn();return`# ${r.name} - Project Rules
868
+ ${cr(r.antiPatterns)}`),e.push(km(r)),e.join(`
869
+ `)}function Gb(r,e){let t=r.sources||jn();return`# ${r.name} - Project Rules
827
870
  <!-- projectId: ${r.projectId} -->
828
871
  <!-- Generated: ${new Date().toISOString()} -->
829
872
  <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
@@ -852,7 +895,7 @@ ${gt(t.languages)}
852
895
  - **Languages**: ${r.languages.join(", ")||"Not detected"}
853
896
  ${gt(t.frameworks)}
854
897
  - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
855
- ${r.analysis?Fb(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
898
+ ${r.analysis?Hb(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
856
899
  ---
857
900
 
858
901
  ## PRJCT RULES
@@ -896,13 +939,13 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
896
939
 
897
940
  **Workflow**: ${r.agents.workflow.join(", ")}
898
941
  **Domain**: ${r.agents.domain.join(", ")||"none"}
899
- `}function Nb(r,e){let t=r.sources||jn(),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(gt(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(gt(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(or(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(ir(r.analysis.antiPatterns)),n.push(""));let s=fm(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
900
- `)}function Lb(r,e){let t=r.sources||jn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(gt(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(or(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(ir(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(gt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
901
- `)}function Ub(r,e){let t=r.sources||jn(),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(gt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(gt(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(or(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(ir(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
902
- `)}function Hb(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(`
903
- `),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 Gb(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(or(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(ir(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(`
904
- `)}function hm(r){return{claude:_b,cursor:Nb,copilot:Lb,windsurf:Ub,continue:Hb,codex:Gb}[r]||null}var Fc=y(()=>{"use strict";Oc();l(or,"formatPatterns");l(ir,"formatAntiPatterns");l(fm,"formatStructure");l(Fb,"formatAnalysisForClaude");l(_b,"formatForClaude");l(Nb,"formatForCursor");l(Lb,"formatForCopilot");l(Ub,"formatForWindsurf");l(Hb,"formatForContinue");l(Gb,"formatForCodex");l(hm,"getFormatter")});import{exec as zb}from"node:child_process";import Wb from"node:os";import rs from"node:path";import{promisify as Bb}from"node:util";function ym(r){return Jo[r]||null}async function Vo(r){try{return await Vb(`which ${r}`),!0}catch{return!1}}async function qo(r=process.cwd()){let e=[];return await Vo("claude")&&e.push("claude"),(await Vo("cursor")||await M(rs.join(r,".cursor")))&&e.push("cursor"),await M(rs.join(r,".github"))&&e.push("copilot"),(await Vo("windsurf")||await M(rs.join(r,".windsurf")))&&e.push("windsurf"),(await M(rs.join(r,".continue"))||await M(rs.join(Wb.homedir(),".continue")))&&e.push("continue"),(await Vo("codex")||await M(rs.join(r,".agents")))&&e.push("codex"),e}async function wm(r,e=process.cwd()){if(r==="auto"){let t=await qo(e);return t.length>0?t:["claude"]}return r==="all"?Jb:r.filter(t=>Jo[t])}var Vb,Jo,ar,Jb,_c=y(()=>{"use strict";Me();Vb=Bb(zb),Jo={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"}},ar=["claude"],Jb=Object.keys(Jo);l(ym,"getAIToolConfig");l(Vo,"commandExists");l(qo,"detectInstalledTools");l(wm,"resolveToolIds")});import Nc from"node:fs/promises";import Lc from"node:path";async function Sm(r,e,t,n=ar){let s=[];for(let o of n){let i=ym(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await qb(r,i,e,t);s.push(a)}return s}async function qb(r,e,t,n){let s=hm(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=Lc.join(n,e.outputFile):i=Lc.join(t,"context",e.outputFile),await Nc.mkdir(Lc.dirname(i),{recursive:!0});try{let a=await Nc.readFile(i,"utf-8"),c=sa(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=na(o,a)}catch{}return await Nc.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var km=y(()=>{"use strict";O();ra();Fc();_c();l(Sm,"generateAIToolContexts");l(qb,"generateForTool")});var bm=y(()=>{"use strict";Fc();km();_c()});import cr from"node:fs/promises";import lr from"node:path";var Uc,Pm,Hc,Cm,xm=y(()=>{"use strict";O();Uc=".prjct/.prjct-state.md",Pm=".prjct-state.md",Hc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=lr.join(e,Uc);await cr.mkdir(lr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await cr.writeFile(n,s,"utf-8");try{let o=lr.join(e,Pm);await cr.unlink(o)}catch(o){if(!C(o))throw o}}async remove(e){for(let t of[Uc,Pm])try{await cr.unlink(lr.join(e,t))}catch(n){if(!C(n))throw n}}async exists(e){let t=lr.join(e,Uc);try{return await cr.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(`
905
- `)}},Cm=new Hc});import Gc from"node:fs/promises";import Kb from"node:os";import vm from"node:path";function zc(){return vm.join(Kb.homedir(),".prjct-cli","skills",Yb)}function Xb(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ur(){try{let r=await Gc.readFile(zc(),"utf-8");return JSON.parse(r)}catch{return Xb()}}async function Wc(r){let e=zc();await Gc.mkdir(vm.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Gc.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function Qb(r){let e=await ur();e.skills[r.name]=r,await Wc(e)}async function Zb(r){let e=await ur();return r in e.skills?(delete e.skills[r],await Wc(e),!0):!1}async function eP(r){return(await ur()).skills[r]||null}async function tP(){return(await ur()).skills}function nP(){return zc()}var Yb,dr,Tm=y(()=>{"use strict";Yb=".skill-lock.json";l(zc,"getLockFilePath");l(Xb,"createEmptyLockFile");l(ur,"read");l(Wc,"write");l(Qb,"addEntry");l(Zb,"removeEntry");l(eP,"getEntry");l(tP,"getAll");l(nP,"getPath");dr={read:ur,write:Wc,addEntry:Qb,removeEntry:Zb,getEntry:eP,getAll:tP,getPath:nP}});import{exec as sP}from"node:child_process";import zt from"node:fs/promises";import Vc from"node:os";import We from"node:path";import{promisify as rP}from"node:util";import{glob as Em}from"glob";function Im(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?We.join(Vc.homedir(),r.slice(1)):We.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 Dm(r){let e=[];try{let s=We.join(r,"SKILL.md");await zt.access(s);let o=We.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Em("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=We.basename(We.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Em("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=We.basename(We.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function oP(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()}
942
+ `}function zb(r,e){let t=r.sources||jn(),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(gt(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(gt(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(ar(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(cr(r.analysis.antiPatterns)),n.push(""));let s=km(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
943
+ `)}function Wb(r,e){let t=r.sources||jn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(gt(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(ar(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(cr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(gt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
944
+ `)}function Bb(r,e){let t=r.sources||jn(),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(gt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(gt(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(ar(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(cr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
945
+ `)}function Vb(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 Jb(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(ar(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(cr(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 bm(r){return{claude:Gb,cursor:zb,copilot:Wb,windsurf:Bb,continue:Vb,codex:Jb}[r]||null}var Uc=w(()=>{"use strict";Lc();l(ar,"formatPatterns");l(cr,"formatAntiPatterns");l(km,"formatStructure");l(Hb,"formatAnalysisForClaude");l(Gb,"formatForClaude");l(zb,"formatForCursor");l(Wb,"formatForCopilot");l(Bb,"formatForWindsurf");l(Vb,"formatForContinue");l(Jb,"formatForCodex");l(bm,"getFormatter")});import{exec as qb}from"node:child_process";import Kb from"node:os";import os from"node:path";import{promisify as Yb}from"node:util";function Pm(r){return Yo[r]||null}async function Ko(r){try{return await Xb(`which ${r}`),!0}catch{return!1}}async function Xo(r=process.cwd()){let e=[];return await Ko("claude")&&e.push("claude"),(await Ko("cursor")||await M(os.join(r,".cursor")))&&e.push("cursor"),await M(os.join(r,".github"))&&e.push("copilot"),(await Ko("windsurf")||await M(os.join(r,".windsurf")))&&e.push("windsurf"),(await M(os.join(r,".continue"))||await M(os.join(Kb.homedir(),".continue")))&&e.push("continue"),(await Ko("codex")||await M(os.join(r,".agents")))&&e.push("codex"),e}async function Cm(r,e=process.cwd()){if(r==="auto"){let t=await Xo(e);return t.length>0?t:["claude"]}return r==="all"?Qb:r.filter(t=>Yo[t])}var Xb,Yo,lr,Qb,Hc=w(()=>{"use strict";Oe();Xb=Yb(qb),Yo={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"}},lr=["claude"],Qb=Object.keys(Yo);l(Pm,"getAIToolConfig");l(Ko,"commandExists");l(Xo,"detectInstalledTools");l(Cm,"resolveToolIds")});import Gc from"node:fs/promises";import zc from"node:path";async function xm(r,e,t,n=lr){let s=[];for(let o of n){let i=Pm(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await Zb(r,i,e,t);s.push(a)}return s}async function Zb(r,e,t,n){let s=bm(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=zc.join(n,e.outputFile):i=zc.join(t,"context",e.outputFile),await Gc.mkdir(zc.dirname(i),{recursive:!0});try{let a=await Gc.readFile(i,"utf-8"),c=aa(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=ia(o,a)}catch{}return await Gc.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 vm=w(()=>{"use strict";O();ca();Uc();Hc();l(xm,"generateAIToolContexts");l(Zb,"generateForTool")});var Tm=w(()=>{"use strict";Uc();vm();Hc()});import ur from"node:fs/promises";import dr from"node:path";var Wc,Em,Bc,Am,Im=w(()=>{"use strict";O();Wc=".prjct/.prjct-state.md",Em=".prjct-state.md",Bc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=dr.join(e,Wc);await ur.mkdir(dr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await ur.writeFile(n,s,"utf-8");try{let o=dr.join(e,Em);await ur.unlink(o)}catch(o){if(!C(o))throw o}}async remove(e){for(let t of[Wc,Em])try{await ur.unlink(dr.join(e,t))}catch(n){if(!C(n))throw n}}async exists(e){let t=dr.join(e,Wc);try{return await ur.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
+ `)}},Am=new Bc});import Vc from"node:fs/promises";import eP from"node:os";import Dm from"node:path";function Jc(){return Dm.join(eP.homedir(),".prjct-cli","skills",tP)}function nP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function pr(){try{let r=await Vc.readFile(Jc(),"utf-8");return JSON.parse(r)}catch{return nP()}}async function qc(r){let e=Jc();await Vc.mkdir(Dm.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Vc.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function sP(r){let e=await pr();e.skills[r.name]=r,await qc(e)}async function rP(r){let e=await pr();return r in e.skills?(delete e.skills[r],await qc(e),!0):!1}async function oP(r){return(await pr()).skills[r]||null}async function iP(){return(await pr()).skills}function aP(){return Jc()}var tP,mr,jm=w(()=>{"use strict";tP=".skill-lock.json";l(Jc,"getLockFilePath");l(nP,"createEmptyLockFile");l(pr,"read");l(qc,"write");l(sP,"addEntry");l(rP,"removeEntry");l(oP,"getEntry");l(iP,"getAll");l(aP,"getPath");mr={read:pr,write:qc,addEntry:sP,removeEntry:rP,getEntry:oP,getAll:iP,getPath:aP}});import{exec as cP}from"node:child_process";import zt from"node:fs/promises";import Yc from"node:os";import Be from"node:path";import{promisify as lP}from"node:util";import{glob as Rm}from"glob";function Mm(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?Be.join(Yc.homedir(),r.slice(1)):Be.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 Om(r){let e=[];try{let s=Be.join(r,"SKILL.md");await zt.access(s);let o=Be.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Rm("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=Be.basename(Be.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Rm("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=Be.basename(Be.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function uP(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()}
906
949
  ${s.join(`
907
950
  `)}`;return r.replace(o,`---
908
951
  ${c}
@@ -911,10 +954,10 @@ ${s.join(`
911
954
  `)}
912
955
  ---
913
956
 
914
- ${r}`}function Jc(){return We.join(Vc.homedir(),".claude","skills")}async function Bc(r,e,t,n){let s=Jc(),o=We.join(s,e),i=We.join(o,"SKILL.md"),a=await zt.readFile(r,"utf-8"),c=oP(a,t,n);return await zt.mkdir(o,{recursive:!0}),await zt.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function iP(r){let e={installed:[],skipped:[],errors:[]};if(!co.isAvailable("git")){let n=co.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=We.join(Vc.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Am(`git clone --depth 1 ${n} ${t}`,{timeout:so("GIT_CLONE")});let s;try{let{stdout:a}=await Am("git rev-parse HEAD",{cwd:t,timeout:so("TOOL_CHECK")});s=a.trim()}catch{}let o=await Dm(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 Bc(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 dr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await zt.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function aP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await zt.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await zt.stat(t)).isFile()){let s=We.basename(We.dirname(t));try{let o=await Bc(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await dr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await Dm(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 Bc(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await dr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function cP(r){let e=Jc(),t=We.join(e,r);try{await zt.rm(t,{recursive:!0,force:!0})}catch{}let n=We.join(e,`${r}.md`);try{await zt.rm(n,{force:!0})}catch{}return dr.removeEntry(r)}async function lP(r){let e=Im(r);switch(e.type){case"github":return iP(e);case"local":return aP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Am,jm,Rm=y(()=>{"use strict";O();Zt();ba();Tm();Am=rP(sP);l(Im,"parseSource");l(Dm,"discoverSkills");l(oP,"injectSourceMetadata");l(Jc,"getInstallDir");l(Bc,"installSkillFile");l(iP,"installFromGitHub");l(aP,"installFromLocal");l(cP,"remove");l(lP,"install");jm={install:lP,remove:cP,parseSource:Im,getInstallDir:Jc}});import ft from"node:fs/promises";import uP from"node:os";import ct from"node:path";async function $m(r,e,t,n){let s=[],o=ct.join(r,"agents");try{let c=await ft.readdir(o);for(let u of c)u.endsWith(".md")&&await ft.unlink(ct.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=>dP(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=>pP(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 Mm(r){let e=ct.join(r,"agents"),t=[];try{let n=await ft.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 Om(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=Ae(`subagents/${o}.md`);if(!i){let a=ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await ft.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 dP(r,e){let t="";try{let n=ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await ft.readFile(n,"utf-8"),t=await Om(t)}catch(n){B.debug("Workflow agent template not found, generating minimal",{name:r,error:K(n)}),t=gP(r)}await ft.writeFile(ct.join(e,`${r}.md`),t,"utf-8")}async function pP(r,e,t,n,s){let o="";try{let i=ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await ft.readFile(i,"utf-8"),o=await Om(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=fP(r,t,n)}o=mP(o,r,s),await ft.writeFile(ct.join(e,`${r}.md`),o,"utf-8")}function mP(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=[`
957
+ ${r}`}function Xc(){return Be.join(Yc.homedir(),".claude","skills")}async function Kc(r,e,t,n){let s=Xc(),o=Be.join(s,e),i=Be.join(o,"SKILL.md"),a=await zt.readFile(r,"utf-8"),c=uP(a,t,n);return await zt.mkdir(o,{recursive:!0}),await zt.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function dP(r){let e={installed:[],skipped:[],errors:[]};if(!uo.isAvailable("git")){let n=uo.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=Be.join(Yc.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await $m(`git clone --depth 1 ${n} ${t}`,{timeout:oo("GIT_CLONE")});let s;try{let{stdout:a}=await $m("git rev-parse HEAD",{cwd:t,timeout:oo("TOOL_CHECK")});s=a.trim()}catch{}let o=await Om(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 Kc(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 mr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await zt.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function pP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await zt.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await zt.stat(t)).isFile()){let s=Be.basename(Be.dirname(t));try{let o=await Kc(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await mr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await Om(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 Kc(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await mr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function mP(r){let e=Xc(),t=Be.join(e,r);try{await zt.rm(t,{recursive:!0,force:!0})}catch{}let n=Be.join(e,`${r}.md`);try{await zt.rm(n,{force:!0})}catch{}return mr.removeEntry(r)}async function gP(r){let e=Mm(r);switch(e.type){case"github":return dP(e);case"local":return pP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var $m,Fm,_m=w(()=>{"use strict";O();en();va();jm();$m=lP(cP);l(Mm,"parseSource");l(Om,"discoverSkills");l(uP,"injectSourceMetadata");l(Xc,"getInstallDir");l(Kc,"installSkillFile");l(dP,"installFromGitHub");l(pP,"installFromLocal");l(mP,"remove");l(gP,"install");Fm={install:gP,remove:mP,parseSource:Mm,getInstallDir:Xc}});import ft from"node:fs/promises";import fP from"node:os";import lt from"node:path";async function Nm(r,e,t,n){let s=[],o=lt.join(r,"agents");try{let c=await ft.readdir(o);for(let u of c)u.endsWith(".md")&&await ft.unlink(lt.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=>hP(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=>yP(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 Lm(r){let e=lt.join(r,"agents"),t=[];try{let n=await ft.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 Um(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=lt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await ft.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 hP(r,e){let t="";try{let n=lt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await ft.readFile(n,"utf-8"),t=await Um(t)}catch(n){B.debug("Workflow agent template not found, generating minimal",{name:r,error:K(n)}),t=SP(r)}await ft.writeFile(lt.join(e,`${r}.md`),t,"utf-8")}async function yP(r,e,t,n,s){let o="";try{let i=lt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await ft.readFile(i,"utf-8"),o=await Um(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=kP(r,t,n)}o=wP(o,r,s),await ft.writeFile(lt.join(e,`${r}.md`),o,"utf-8")}function wP(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=[`
915
958
  ## Recent Learnings (from completed tasks)
916
959
  `];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(`
917
- `)}function gP(r){return`---
960
+ `)}function SP(r){return`---
918
961
  name: ${r}
919
962
  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"}
920
963
  tools: Read, Write, Glob
@@ -930,7 +973,7 @@ When invoked:
930
973
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
931
974
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
932
975
  3. Execute requested operation
933
- `}function fP(r,e,t){return`---
976
+ `}function kP(r,e,t){return`---
934
977
  name: ${r}
935
978
  description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
936
979
  tools: Read, Write, Glob, Grep
@@ -950,17 +993,17 @@ Domain specialist for ${r} tasks.
950
993
  ## Your Role
951
994
 
952
995
  You are the ${r} expert for this project. Apply best practices for the detected stack.
953
- `}function Fm(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 ft.writeFile(ct.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 _m(r){let e=[];try{let t=ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await ft.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=ct.join(uP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=ct.join(a,d,"SKILL.md"),p=ct.join(a,`${d}.md`),g=!1;try{await ft.access(m),g=!0}catch{try{await ft.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 P=await jm.install(S);P.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):P.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:P.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 Nm=y(()=>{"use strict";qn();Ut();se();Zn();Rm();l($m,"generateAgents");l(Mm,"loadExistingAgents");l(Om,"resolveTemplateIncludes");l(dP,"generateWorkflowAgent");l(pP,"generateDomainAgent");l(mP,"injectFeedbackSection");l(gP,"generateMinimalWorkflowAgent");l(fP,"generateMinimalDomainAgent");l(Fm,"configureSkills");l(_m,"autoInstallSkills")});import Lm from"node:fs/promises";import Um from"node:path";var Ko,Hm=y(()=>{"use strict";Ko=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=Um.join(this.projectPath,"package.json"),t=await Lm.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Lm.access(Um.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as hP}from"node:child_process";import Gm from"node:fs/promises";import qc from"node:path";import{promisify as yP}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 Rn("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Rn("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Rn("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Rn("git status --porcelain",{cwd:r}),i=o.trim().split(`
996
+ `}function Hm(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 ft.writeFile(lt.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 Gm(r){let e=[];try{let t=lt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await ft.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=lt.join(fP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=lt.join(a,d,"SKILL.md"),p=lt.join(a,`${d}.md`),g=!1;try{await ft.access(m),g=!0}catch{try{await ft.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 k=await Fm.install(S);k.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):k.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:k.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 zm=w(()=>{"use strict";Kn();Ut();re();es();_m();l(Nm,"generateAgents");l(Lm,"loadExistingAgents");l(Um,"resolveTemplateIncludes");l(hP,"generateWorkflowAgent");l(yP,"generateDomainAgent");l(wP,"injectFeedbackSection");l(SP,"generateMinimalWorkflowAgent");l(kP,"generateMinimalDomainAgent");l(Hm,"configureSkills");l(Gm,"autoInstallSkills")});import Wm from"node:fs/promises";import Bm from"node:path";var Qo,Vm=w(()=>{"use strict";Qo=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=Bm.join(this.projectPath,"package.json"),t=await Wm.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Wm.access(Bm.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as bP}from"node:child_process";import Jm from"node:fs/promises";import Qc from"node:path";import{promisify as PP}from"node:util";async function qm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Rn("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Rn("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Rn("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Rn("git status --porcelain",{cwd:r}),i=o.trim().split(`
954
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 Rn('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
955
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Rn('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 Nt(r,e){try{return await Gm.access(qc.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function Wm(r){let e={fileCount:0,version:"0.0.0",name:qc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Rn('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=qc.join(r,"package.json"),n=JSON.parse(await Gm.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 Nt(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 Nt(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Nt(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Nt(r,"requirements.txt")||await Nt(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 Bm(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 Nt(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 Nt(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 Nt(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 Nt(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 Nt(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 Vm(r,e){let t=jn(),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 Jm(r){return new Ko(r).detect()}var Rn,qm=y(()=>{"use strict";Ut();Oc();Zn();Hm();Rn=yP(hP);l(zm,"analyzeGit");l(Nt,"fileExists");l(Wm,"gatherStats");l(Bm,"detectCommands");l(Vm,"buildSources");l(Jm,"detectStack")});import{exec as wP}from"node:child_process";import Kc from"node:fs/promises";import Yo from"node:path";import{promisify as SP}from"node:util";var kP,Yc,Xc,Km,Ym=y(()=>{"use strict";Mt();O();kP=SP(wP),Yc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Yo.join(r,s);try{await Kc.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=Yo.basename(r);try{await F.read(n)}catch(s){C(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Yo.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 Kc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Kc.readFile(Yo.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: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Xc=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Yc.contextFilesExist(t),Yc.jsonFilesValid(t),Yc.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 kP(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}}}},Km=new Xc});import Xo from"node:fs/promises";import Qo from"node:path";var Zo,pr,Xm=y(()=>{"use strict";Gn();em();am();um();gm();jc();Ut();fn();st();le();ho();en();ue();zs();yo();So();Bs();Vs();qs();bm();se();Zn();Va();Ja();xm();Ca();Nm();qm();Ym();Zo=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 qo(e)).filter(i=>!ar.includes(i));s=[...ar,...o]}else t.aiTools[0]==="auto"?(s=await qo(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await wm("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=E.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Ws(this.projectId);try{let _=await wo(this.projectId);_>0&&B.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(_)})}let[i,a,c,u]=await Promise.all([zm(this.projectPath),Wm(this.projectPath),Bm(this.projectPath),Jm(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&lm(this.projectId))try{let{diff:_,currentHashes:Hg}=await Mc(this.projectPath,this.projectId),kl=_.added.length+_.modified.length+_.deleted.length;if(kl===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let yi=om(_,this.projectId);f=im(yi.allAffected);let Gg=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=yi.allAffected.some(cn=>{let zg=cn.substring(cn.lastIndexOf("."));return Gg.has(zg)}),g=yi.directlyChanged.some(cn=>cn==="package.json"||cn==="tsconfig.json"||cn.includes("Dockerfile")||cn.includes("docker-compose")),m={isIncremental:!0,filesChanged:kl,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}$c(this.projectId,Hg)}catch(_){B.debug("Incremental detection failed, falling back to full sync",{error:K(_)})}else try{let{currentHashes:_}=await Mc(this.projectPath,this.projectId);$c(this.projectId,_)}catch(_){B.debug("Hash computation failed (non-critical)",{error:K(_)})}if(p)try{await Promise.all([Zp(this.projectPath,this.projectId),rm(this.projectPath,this.projectId),mm(this.projectPath,this.projectId)])}catch(_){B.debug("File ranking index build failed (non-critical)",{error:K(_)})}let S;if(g)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(S=_)}catch{}let P=g?await $m(this.globalPath,u,a,S):await Mm(this.globalPath),I=Fm(P,this.projectId,this.globalPath),j=g?await _m(P):[],V=Vm(a,c),de=[],we;try{let _=await it.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(we={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let Ue={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:P.filter(_=>_.type==="workflow").map(_=>_.name),domain:P.filter(_=>_.type==="domain").map(_=>_.name)},sources:V,analysis:we},b=await Sm(Ue,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let A=Date.now()-n,Se=await this.recordSyncMetrics(a,de,P,A);await this.archiveStaleData(),await this.autoLearnFromHistory(),await He.installGlobalConfig(),await He.syncCommands();let an;try{let _=await R.readConfig(this.projectPath);an=await Km.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){B.debug("Verification failed (non-critical)",{error:K(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:P,skills:I,skillsInstalled:j,contextFiles:de,aiTools:b.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:Se,verification:an,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=>Xo.mkdir(Qo.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||k(),lastSync:k(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await F.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 F.write(this.projectId,s);try{await Cm.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:K(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=Qo.join(this.globalPath,m),g=await Xo.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=Qo.join(this.globalPath,"agents",`${m.name}.md`),g=await Xo.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 kn.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 F.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await it.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt: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([Ke.archiveOldShipped(this.projectId).catch(()=>0),Fe.markDormantIdeas(this.projectId).catch(()=>0),me.removeStaleCompleted(this.projectId).catch(()=>0),F.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=rt.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 F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new dn,n=await Ba.learnFromTaskHistory(this.projectId,e,t);try{let s=await Td.getFeatureOutcomes(this.projectId);s.length>0&&await Ba.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=Qo.join(__dirname,"..","..","package.json");return JSON.parse(await Xo.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:[]}}},pr=new Zo});var rn=y(()=>{"use strict";zu();Yu();Xu();td();sd();fa();id();Ca();ad();cd();Bp();Yp();Xm()});import Wt from"chalk";function Qm(r){return Math.ceil(r.length/bP)}function Zm(r){let e=r.split(`
998
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Rn('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 Nt(r,e){try{return await Jm.access(Qc.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function Km(r){let e={fileCount:0,version:"0.0.0",name:Qc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Rn('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=Qc.join(r,"package.json"),n=JSON.parse(await Jm.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 Nt(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 Nt(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Nt(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Nt(r,"requirements.txt")||await Nt(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 Ym(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 Nt(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 Nt(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 Nt(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 Nt(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 Nt(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 Xm(r,e){let t=jn(),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 Qm(r){return new Qo(r).detect()}var Rn,Zm=w(()=>{"use strict";Ut();Lc();es();Vm();Rn=PP(bP);l(qm,"analyzeGit");l(Nt,"fileExists");l(Km,"gatherStats");l(Ym,"detectCommands");l(Xm,"buildSources");l(Qm,"detectStack")});import{exec as CP}from"node:child_process";import Zc from"node:fs/promises";import Zo from"node:path";import{promisify as xP}from"node:util";var vP,el,tl,eg,tg=w(()=>{"use strict";Mt();O();vP=xP(CP),el={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Zo.join(r,s);try{await Zc.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=Zo.basename(r);try{await F.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=Zo.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 Zc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Zc.readFile(Zo.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}}},tl=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[el.contextFilesExist(t),el.jsonFilesValid(t),el.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 vP(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}}}},eg=new tl});import ei from"node:fs/promises";import ti from"node:path";var ni,gr,ng=w(()=>{"use strict";zn();om();pm();fm();Sm();Oc();Ut();fn();rt();de();wo();tn();pe();Bs();So();bo();Js();qs();Ys();Tm();re();es();Ya();Xa();Im();Ea();zm();Zm();tg();ni=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 Xo(e)).filter(i=>!lr.includes(i));s=[...lr,...o]}else t.aiTools[0]==="auto"?(s=await Xo(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Cm("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=E.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Vs(this.projectId);try{let _=await ko(this.projectId);_>0&&B.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(_)})}let[i,a,c,u]=await Promise.all([qm(this.projectPath),Km(this.projectPath),Ym(this.projectPath),Qm(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&gm(this.projectId))try{let{diff:_,currentHashes:Bg}=await Nc(this.projectPath,this.projectId),xl=_.added.length+_.modified.length+_.deleted.length;if(xl===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let ki=um(_,this.projectId);f=dm(ki.allAffected);let Vg=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=ki.allAffected.some(ln=>{let Jg=ln.substring(ln.lastIndexOf("."));return Vg.has(Jg)}),g=ki.directlyChanged.some(ln=>ln==="package.json"||ln==="tsconfig.json"||ln.includes("Dockerfile")||ln.includes("docker-compose")),m={isIncremental:!0,filesChanged:xl,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}_c(this.projectId,Bg)}catch(_){B.debug("Incremental detection failed, falling back to full sync",{error:K(_)})}else try{let{currentHashes:_}=await Nc(this.projectPath,this.projectId);_c(this.projectId,_)}catch(_){B.debug("Hash computation failed (non-critical)",{error:K(_)})}if(p)try{await Promise.all([rm(this.projectPath,this.projectId),lm(this.projectPath,this.projectId),wm(this.projectPath,this.projectId)])}catch(_){B.debug("File ranking index build failed (non-critical)",{error:K(_)})}let S;if(g)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(S=_)}catch{}let k=g?await Nm(this.globalPath,u,a,S):await Lm(this.globalPath),I=Hm(k,this.projectId,this.globalPath),j=g?await Gm(k):[],V=Xm(a,c),me=[],Se;try{let _=await at.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(Se={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let He={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:k.filter(_=>_.type==="workflow").map(_=>_.name),domain:k.filter(_=>_.type==="domain").map(_=>_.name)},sources:V,analysis:Se},P=await xm(He,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,k,A);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ge.installGlobalConfig(),await Ge.syncCommands();let cn;try{let _=await R.readConfig(this.projectPath);cn=await eg.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){B.debug("Verification failed (non-critical)",{error:K(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:k,skills:I,skillsInstalled:j,contextFiles:me,aiTools:P.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:ke,verification:cn,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=>ei.mkdir(ti.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await F.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 F.write(this.projectId,s);try{await Am.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:K(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=ti.join(this.globalPath,m),g=await ei.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=ti.join(this.globalPath,"agents",`${m.name}.md`),g=await ei.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 kn.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 F.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 at.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([Ye.archiveOldShipped(this.projectId).catch(()=>0),_e.markDormantIdeas(this.projectId).catch(()=>0),fe.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),Ke.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=ot.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 F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new pn,n=await Ka.learnFromTaskHistory(this.projectId,e,t);try{let s=await jd.getFeatureOutcomes(this.projectId);s.length>0&&await Ka.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=ti.join(__dirname,"..","..","package.json");return JSON.parse(await ei.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:[]}}},gr=new ni});var on=w(()=>{"use strict";Vu();td();nd();id();cd();Sa();dd();Ea();pd();md();Yp();tm();ng()});import Wt from"chalk";function sg(r){return Math.ceil(r.length/TP)}function rg(r){let e=r.split(`
956
999
  `),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+=`
957
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Qc(r){return r.includes("<!-- prjct:preserve")}function eg(r,e){let t=Zm(r),n=Zm(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Qm(r),tokensAfter:Qm(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)Qc(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
958
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Qc(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
1000
+ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function nl(r){return r.includes("<!-- prjct:preserve")}function og(r,e){let t=rg(r),n=rg(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:sg(r),tokensAfter:sg(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)nl(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1001
+ `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(nl(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
959
1002
  `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
960
- `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Qc(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
961
- `).length}),s.hasChanges=!0)}return s}function tg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Wt.green:p=>p,o=t?Wt.red:p=>p,i=t?Wt.yellow:p=>p,a=t?Wt.dim:p=>p,c=t?Wt.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1003
+ `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!nl(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 ig(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Wt.green:p=>p,o=t?Wt.red:p=>p,i=t?Wt.yellow:p=>p,a=t?Wt.dim:p=>p,c=t?Wt.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
962
1005
  `);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(`
963
- `)}function ng(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Wt.green:c=>c,o=t?Wt.red:c=>c,i=t?Wt.cyan:c=>c,a=t?Wt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1006
+ `)}function ag(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Wt.green:c=>c,o=t?Wt.red:c=>c,i=t?Wt.cyan:c=>c,a=t?Wt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
964
1007
  `))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(`
965
1008
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
966
1009
  `).length>5&&n.push(a(` ... ${c.before.split(`
@@ -971,11 +1014,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Qc(r){return r.incl
971
1014
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
972
1015
  `).length>5&&n.push(a(` ... ${c.before.split(`
973
1016
  `).length-5} more lines`))}n.push("")}return n.join(`
974
- `)}var bP,sg=y(()=>{"use strict";bP=4;l(Qm,"estimateTokens");l(Zm,"parseMarkdownSections");l(Qc,"isPreservedSection");l(eg,"generateSyncDiff");l(tg,"formatDiffPreview");l(ng,"formatFullDiff")});import PP from"node:path";async function Zc(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 He.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(`
975
- `));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 at("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function rg(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 mr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function el(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function og(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 ig(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 | ${mr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${Lr(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${el(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${mr(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(`
976
- `)}function ag(r,e){let t=[];t.push(`# Repository Analysis
1017
+ `)}var TP,cg=w(()=>{"use strict";TP=4;l(sg,"estimateTokens");l(rg,"parseMarkdownSections");l(nl,"isPreservedSection");l(og,"generateSyncDiff");l(ig,"formatDiffPreview");l(ag,"formatFullDiff")});import EP from"node:path";async function sl(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 Ge.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 ct("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function lg(r){try{let e=await Ke.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 fr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function rl(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function ug(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 dg(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 | ${fr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${Hr(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 | ${rl(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: ${fr(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
+ `)}function pg(r,e){let t=[];t.push(`# Repository Analysis
977
1020
  `),t.push(`Generated: ${new Date().toLocaleString()}
978
- `);let n=PP.basename(e);if(t.push(`## Project: ${n}
1021
+ `);let n=EP.basename(e);if(t.push(`## Project: ${n}
979
1022
  `),t.push(`## Stack Detected
980
1023
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
981
1024
  `),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
@@ -991,29 +1034,29 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Qc(r){return r.incl
991
1034
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
992
1035
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
993
1036
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
994
- `)}var cg=y(()=>{"use strict";fn();Ur();rn();ts();Sn();ze();l(Zc,"showSyncResult");l(rg,"getSessionActivity");l(mr,"formatTokens");l(el,"formatDuration");l(og,"generateSparkline");l(ig,"generateStatsMarkdown");l(ag,"generateAnalysisSummary")});var Wp={};Fn(Wp,{AnalysisCommands:()=>$n});import tl from"node:fs/promises";import lg from"node:path";import ug from"prompts";var $n,Ho=y(()=>{"use strict";Gn();ju();fn();Ur();rn();sg();ho();ue();yo();O();es();ts();Sn();cg();ze();$n=class extends ae{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
995
- `),Re.init(t);let n=await Xe.build(t,e),s={packageJson:await Re.readPackageJson(),cargoToml:await Re.readCargoToml(),goMod:await Re.readGoMod(),requirements:await Re.readRequirements(),directories:await Re.listDirectories(),fileCount:await Re.countFiles(),gitStats:await Re.getGitStats(),gitLog:await Re.getGitLog(20),hasDockerfile:await Re.fileExists("Dockerfile"),hasDockerCompose:await Re.fileExists("docker-compose.yml"),hasReadme:await Re.fileExists("README.md"),hasTsconfig:await Re.fileExists("tsconfig.json"),hasViteConfig:await Re.fileExists("vite.config.ts")||await Re.fileExists("vite.config.js"),hasNextConfig:await Re.fileExists("next.config.js")||await Re.fileExists("next.config.mjs")},o=ag(s,t),i=await R.getProjectId(t),a=n.paths.analysis||E.getFilePath(i,"analysis","repo-summary.md");await $e.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:U.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Je(),lt(tt)).getActiveProvider(),d=await He.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${E.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1037
+ `)}var mg=w(()=>{"use strict";fn();Gr();on();ns();Sn();We();l(sl,"showSyncResult");l(lg,"getSessionActivity");l(fr,"formatTokens");l(rl,"formatDuration");l(ug,"generateSparkline");l(dg,"generateStatsMarkdown");l(pg,"generateAnalysisSummary")});var Kp={};_n(Kp,{AnalysisCommands:()=>Mn});import ol from"node:fs/promises";import gg from"node:path";import*as $n from"@clack/prompts";var Mn,Wo=w(()=>{"use strict";zn();Mu();fn();Gr();on();cg();wo();pe();So();O();ts();ns();Sn();mg();We();Mn=class extends le{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 Qe.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=pg(s,t),i=await R.getProjectId(t),a=n.paths.analysis||E.getFilePath(i,"analysis","repo-summary.md");await Me.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:U.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(qe(),ut(nt)).getActiveProvider(),d=await Ge.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${E.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
996
1039
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
997
- `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=E.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await E.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 pr.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(Ot(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=lg.join(o,"context","CLAUDE.md"),c=null;try{c=await tl.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 pr.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(ge("## 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 tl.readFile(a,"utf-8")}catch{p=""}let g=eg(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(Ot("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 tl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let P=[];for(let j of g.added)P.push(`Added: ${j.name} (${j.lineCount} lines)`);for(let j of g.modified)P.push(`Modified: ${j.name} (${j.lineCount} lines)`);for(let j of g.removed)P.push(`Removed: ${j.name} (${j.lineCount} lines)`);let I=ge("## Sync Preview",P.length>0?Ge("Changes",ut(P),3):"No section changes.",dt({"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 P={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:P,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(tg(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await ug({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return S.action==="cancel"||!S.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):S.action==="diff"&&(console.log(`
998
- ${ng(g)}`),!(await ug({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Zc(m,i))}t.md||h.spin("Syncing project...");let d=await pr.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(ge("## 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(P=>P.success).length||0),g=d.agents.length,f=ko("sync"),S=ge(Ot("Sync Complete",dt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?kd("Uncommitted changes detected"):null,_e(f.map(P=>({label:P.desc,command:P.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Zc(d,i)}catch(n){return t.md?console.log(ge("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await kn.getSummary(s),i=await kn.getDailyStats(s,30),a=await rg(s),c=await pe.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await kn.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: ${mr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Lr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${el(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let 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=og(i);if(console.log(` ${p} ${mr(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=ig(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=sr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await it.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=lg.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=ge(`## Status: ${u}`,dt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Ge("Analysis",ut(p),3):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await it.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await it.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await it.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as NP}from"node:child_process";import{promisify as LP}from"node:util";async function ai(r){if(process.platform!=="darwin")return bg(r);try{let{stdout:e}=await UP(`security find-generic-password -s "${HP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return bg(r)}}function bg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var UP,HP,gl=y(()=>{"use strict";O();UP=LP(NP),HP="prjct-cli";l(ai,"getCredential");l(bg,"getEnvFallback")});import yt from"node:fs";import{createServer as $C}from"node:net";Si();Ho();rn();Mt();O();es();ze();import CP from"node:path";st();le();O();se();var ei=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:E.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:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp: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 ei;var os=class extends ae{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=CP.basename(t),a=await F.getCurrentTask(o),c=await me.getActiveTasks(o),u=await Ke.getRecent(o,5),d=await Fe.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 P=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",P).map(j=>({...JSON.parse(j.data),timestamp:j.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(P=>P.action==="task_completed").length,featuresShipped:g.filter(P=>P.action==="feature_shipped").length,totalActions:g.length};console.log(`
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 R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=E.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await E.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 gr.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(ce(Ot(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=gg.join(o,"context","CLAUDE.md"),c=null;try{c=await ol.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 gr.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(ce("## \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 ol.readFile(a,"utf-8")}catch{p=""}let g=og(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(ce(Ot("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 ol.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let k=[];for(let j of g.added)k.push(`Added: ${j.name} (${j.lineCount} lines)`);for(let j of g.modified)k.push(`Modified: ${j.name} (${j.lineCount} lines)`);for(let j of g.removed)k.push(`Removed: ${j.name} (${j.lineCount} lines)`);let I=ce("## \u26A1 Sync Preview",k.length>0?ze("Changes",dt(k)):"No section changes.",pt({"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 k={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:k,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(ig(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await $n.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if($n.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
+ ${ag(g)}`);let k=await $n.confirm({message:"Apply these changes?",initialValue:!0});if($n.isCancel(k)||!k)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),sl(m,i)}t.md||h.spin("Syncing project...");let d=await gr.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(ce("## \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(k=>k.success).length||0),g=d.agents.length,f=Po("sync"),S=ce(Ot("Sync Complete"),pt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),d.git.hasChanges?vd("Uncommitted changes detected"):null,Ne(f.map(k=>({label:k.desc,command:k.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return sl(d,i)}catch(n){return t.md?console.log(ce("## \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 R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await kn.getSummary(s),i=await kn.getDailyStats(s,30),a=await lg(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=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await kn.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: ${fr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Hr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${rl(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=ug(i);if(console.log(` ${p} ${fr(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=dg(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 R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=or(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await at.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=gg.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=ce(`## \u26A1 Status: ${u}`,pt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?ze("Analysis",dt(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 R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await at.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await at.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await at.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 zP}from"node:child_process";import{promisify as WP}from"node:util";async function ui(r){if(process.platform!=="darwin")return vg(r);try{let{stdout:e}=await BP(`security find-generic-password -s "${VP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return vg(r)}}function vg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var BP,VP,wl=w(()=>{"use strict";O();BP=WP(zP),VP="prjct-cli";l(ui,"getCredential");l(vg,"getEnvFallback")});import yt from"node:fs";import{createServer as NC}from"node:net";Pi();Wo();on();Mt();O();ts();We();import AP from"node:path";rt();de();O();re();var si=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:E.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 si;var is=class extends le{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=AP.basename(t),a=await F.getCurrentTask(o),c=await fe.getActiveTasks(o),u=await Ye.getRecent(o,5),d=await _e.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 k=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",k).map(j=>({...JSON.parse(j.data),timestamp:j.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(k=>k.action==="task_completed").length,featuresShipped:g.filter(k=>k.action==="feature_shipped").length,totalActions:g.length};console.log(`
999
1042
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1000
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(`
1001
1044
  Activity: ${S}
1002
- `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await Xe.build(t),p=await $e.get("Read")(m.paths.roadmap);if(console.log(`
1045
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await Qe.build(t),p=await Me.get("Read")(m.paths.roadmap);if(console.log(`
1003
1046
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1004
1047
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1005
- `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let P=f.split(`
1006
- `)[0].trim();console.log(` ${S+1}. ${P}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1007
- `),{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(S=>{let P=S.priority?` [${S.priority}]`:"";return`${S.description}${P}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let P=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${P?` (${P})`:""}`}):["Nothing shipped yet"],f=ge(`## Dashboard: ${i}`,Ge("Current Focus",m,3),Ge(`Queue (${c.length})`,ut(p,!0),3),Ge("Recent Ships",ut(g),3),Ge("Ideas",`${d.length} pending`,3),_e([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1048
+ `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let k=f.split(`
1049
+ `)[0].trim();console.log(` ${S+1}. ${k}`)}),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 ${U.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(S=>{let k=S.priority?` [${S.priority}]`:"";return`${S.description}${k}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let k=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${k?` (${k})`:""}`}):["Nothing shipped yet"],f=ce(`## \u26A1 Dashboard: ${i}`,ze("Current Focus",m),ze(`Queue (${c.length})`,dt(p,!0)),ze("Recent Ships",dt(g)),ze("Ideas",`${d.length} pending`),Ne([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1008
1051
  \u{1F4CA} DASHBOARD - ${i}
1009
- `),console.log("\u2550".repeat(50));let m=sr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1052
+ `),console.log("\u2550".repeat(50));let m=or(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1010
1053
  ${g}`),console.log(`
1011
1054
  \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(`
1012
- \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let P=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${P}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1055
+ \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let k=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${k}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1013
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(`
1014
1057
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1015
1058
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1016
- `)}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(w(s)),{success:!1,error:w(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1059
+ `)}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(`
1017
1060
  PRJCT COMMANDS
1018
1061
  `),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(`
1019
1062
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
@@ -1028,7 +1071,7 @@ ${"\u2550".repeat(50)}
1028
1071
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1029
1072
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1030
1073
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1031
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};dc();st();le();Mt();O();import xP from"node:fs/promises";import vP from"node:path";var Mn=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=E.getGlobalProjectPath(a),u=await F.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 jo.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=vP.join(e,"analysis","repo-analysis.json"),n=await xP.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}}},QN=new Mn;ze();rn();Mt();ue();O();ze();async function ti(r){let e=await R.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(ti,"cleanupMemory");async function ni(r){let e=await R.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(ni,"cleanupMemoryInternal");async function nl(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ti(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=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 Fe.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${w(a)}`)}try{let c=(await me.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${w(a)}`)}return await ni(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(w(t)),{success:!1,error:w(t)}}}l(nl,"cleanup");rn();O();ze();import dg from"node:path";async function sl(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=dg.join(E.getGlobalProjectPath(i),"planning","designs");await te.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
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("")}};fc();rt();de();Mt();O();import IP from"node:fs/promises";import DP from"node:path";var On=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=E.getGlobalProjectPath(a),u=await F.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 Mo.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=DP.join(e,"analysis","repo-analysis.json"),n=await IP.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return C(t),null}}},rL=new On;We();on();Mt();pe();O();We();async function ri(r){let e=await R.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(ri,"cleanupMemory");async function oi(r){let e=await R.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(oi,"cleanupMemoryInternal");async function il(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ri(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=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 _e.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 oi(e),await Ke.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(il,"cleanup");on();O();We();import fg from"node:path";async function al(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=fg.join(E.getGlobalProjectPath(i),"planning","designs");await ne.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1032
1075
 
1033
1076
  *Use templates/design/architecture.md for full design*
1034
1077
  `;break;case"api":c=`# API Design: ${o}
@@ -1043,12 +1086,12 @@ ${"\u2550".repeat(50)}
1043
1086
  `;break;case"flow":c=`# Flow Design: ${o}
1044
1087
 
1045
1088
  *Use templates/design/flow.md for full design*
1046
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=dg.join(a,u);return await te.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(w(n)),{success:!1,error:w(n)}}}l(sl,"design");rn();O();ze();import is from"node:path";async function rl(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=E.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await te.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(`
1089
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=fg.join(a,u);return await ne.writeFile(d,c),await Ke.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(al,"design");on();O();We();import as from"node:path";async function cl(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=E.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ne.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(`
1047
1090
  Found abandoned session:
1048
1091
  `),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(`
1049
1092
  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
1050
- `),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}l(rl,"recover");async function ol(r=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=is.join(E.getGlobalProjectPath(e),"snapshots");await te.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=is.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await te.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 te.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:w(s)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}l(ol,"undo");async function il(r=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=is.join(E.getGlobalProjectPath(e),"snapshots"),n=is.join(t,"history.json"),s;try{let i=await te.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(`
1051
- `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await te.writeFile(n,JSON.stringify(s,null,2)),await 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:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}l(il,"redo");async function al(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=is.join(E.getGlobalProjectPath(e),"snapshots"),n=is.join(t,"history.json"),s;try{let o=await te.readFile(n);s=JSON.parse(o)}catch(o){if(C(o)||o instanceof SyntaxError)return console.log(`
1093
+ `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(cl,"recover");async function ll(r=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=as.join(E.getGlobalProjectPath(e),"snapshots");await ne.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=as.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ne.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 ne.writeFile(a,JSON.stringify(c,null,2)),await Ke.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(ll,"undo");async function ul(r=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=as.join(E.getGlobalProjectPath(e),"snapshots"),n=as.join(t,"history.json"),s;try{let i=await ne.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 ne.writeFile(n,JSON.stringify(s,null,2)),await Ke.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(ul,"redo");async function dl(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=as.join(E.getGlobalProjectPath(e),"snapshots"),n=as.join(t,"history.json"),s;try{let o=await ne.readFile(n);s=JSON.parse(o)}catch(o){if(C(o)||o instanceof SyntaxError)return console.log(`
1052
1095
  SNAPSHOT HISTORY
1053
1096
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1054
1097
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1056,32 +1099,32 @@ ${"\u2550".repeat(50)}
1056
1099
  `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1057
1100
  `)):(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
1058
1101
  `)),console.log(`${"=".repeat(50)}
1059
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}l(al,"history");var as=class extends ae{static{l(this,"MaintenanceCommands")}_cleanupMemory=ti;_cleanupMemoryInternal=ni;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?nl(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?sl(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?rl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ol(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?il(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?al(e):t}};import he from"chalk";ue();var cl=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,P)=>S+P,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,P)=>S+P,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,P)=>S+P,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},TP=new cl,pg=TP;O();ze();var on={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function si(r,e,t){return t==="below"?r<=e?he.green("\u2713"):he.yellow("\u26A0"):r>=e?he.green("\u2713"):he.yellow("\u26A0")}l(si,"statusIcon");var cs=class extends ae{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await pg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1060
- ${he.dim("No performance data yet.")}`),console.log(`${he.dim("Metrics are collected automatically as you use the CLI.")}
1102
+ `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(dl,"history");var cs=class extends le{static{l(this,"MaintenanceCommands")}_cleanupMemory=ri;_cleanupMemoryInternal=oi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?il(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?al(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?cl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ll(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ul(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?dl(e):t}};import ye from"chalk";pe();var pl=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,k)=>S+k,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,k)=>S+k,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,k)=>S+k,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},jP=new pl,hg=jP;O();We();var an={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function ii(r,e,t){return t==="below"?r<=e?ye.green("\u2713"):ye.yellow("\u26A0"):r>=e?ye.green("\u2713"):ye.yellow("\u26A0")}l(ii,"statusIcon");var ls=class extends le{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await hg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1103
+ ${ye.dim("No performance data yet.")}`),console.log(`${ye.dim("Metrics are collected automatically as you use the CLI.")}
1061
1104
  `),{success:!0,message:"No data"};if(console.log(`
1062
- ${he.cyan("Performance Report")} ${he.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=si(i.startup.avg,on.startup.max,"below");console.log(` Startup: avg ${he.bold(`${i.startup.avg}ms`)} ${he.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${he.dim(`target: <${on.startup.max}ms`)}`)}if(i.memory){let c=si(i.memory.peakHeapMB,on.heapMB.max,"below");console.log(` Memory: avg ${he.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${he.dim(`target: <${on.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=si(i.contextCorrectness.rate,on.contextRate.min,"above");console.log(` Context: ${he.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${he.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${he.dim(`target: ${on.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=si(i.subtaskHandoff.rate,on.handoffRate.min,"above");console.log(` Handoff: ${he.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${he.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${he.dim(`target: ${on.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1063
- ${he.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${he.bold(`${u.avg}ms`)} ${he.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};Uo();fn();le();O();Me();mn();ze();import ll from"node:fs/promises";import EP from"node:path";import Z from"chalk";var ls=class extends ae{static{l(this,"SetupCommands")}async start(){let t=await(Je(),lt(tt)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1064
- `),!(await He.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1105
+ ${ye.cyan("Performance Report")} ${ye.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ii(i.startup.avg,an.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: <${an.startup.max}ms`)}`)}if(i.memory){let c=ii(i.memory.peakHeapMB,an.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: <${an.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ii(i.contextCorrectness.rate,an.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: ${an.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ii(i.subtaskHandoff.rate,an.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: ${an.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)}}}};zo();fn();de();O();Oe();Qt();We();import ml from"node:fs/promises";import RP from"node:path";import ee from"chalk";var us=class extends le{static{l(this,"SetupCommands")}async start(){let t=await(qe(),ut(nt)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1107
+ `),!(await Ge.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1065
1108
 
1066
1109
  Please install it first:
1067
- - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await He.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
1110
+ - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ge.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
1068
1111
  \u2705 Installed ${s.installed?.length??0} commands to:
1069
1112
  ${E.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
1070
1113
  \u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1071
1114
  \u{1F389} Setup complete!`),console.log(`
1072
1115
  Next steps:`),console.log(` 1. Open ${t.displayName}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: /p:init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1073
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await He.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await He.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1116
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ge.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ge.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1074
1117
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1075
1118
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
1076
- \u{1F4DD} Installing global configuration...`);let n=await He.installGlobalConfig(),s=n.path?E.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(Je(),lt(tt)).getActiveProvider()).name==="claude"){console.log(`
1119
+ \u{1F4DD} Installing global configuration...`);let n=await Ge.installGlobalConfig(),s=n.path?E.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(qe(),ut(nt)).getActiveProvider()).name==="claude"){console.log(`
1077
1120
  \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(`
1078
1121
  \u{1F389} Setup complete!
1079
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=E.getClaudeDir(),t=E.getClaudeSettingsPath(),n=EP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1122
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=E.getClaudeDir(),t=E.getClaudeSettingsPath(),n=RP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1080
1123
  # prjct Status Line for Claude Code
1081
1124
  # Shows version update notifications and current task
1082
1125
 
1083
1126
  # Current CLI version (embedded at install time)
1084
- CLI_VERSION="${Bn}"
1127
+ CLI_VERSION="${Vn}"
1085
1128
 
1086
1129
  # Read JSON context from stdin (provided by Claude Code)
1087
1130
  read -r json
@@ -1132,16 +1175,16 @@ fi
1132
1175
 
1133
1176
  # Default: show prjct branding
1134
1177
  echo "\u26A1 prjct"
1135
- `;await ll.writeFile(n,s,{mode:493});let o={};if(await M(t))try{o=JSON.parse(await ll.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await ll.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(Z.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(Z.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(Z.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(Z.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(Z.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(Z.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(Z.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${Z.bold.cyan("prjct")}${Z.magenta("/")}${Z.green("cli")} ${Z.dim.white(`v${Bn} installed`)}`),console.log(""),console.log(` ${Z.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${Z.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${Z.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(Z.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(Z.bold.cyan("\u{1F680} Quick Start")),console.log(Z.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${Z.bold("1.")} Initialize your project:`),console.log(` ${Z.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${Z.bold("2.")} Start your first task:`),console.log(` ${Z.green('prjct task "build auth"')}`),console.log(""),console.log(` ${Z.bold("3.")} Ship & celebrate:`),console.log(` ${Z.green('prjct ship "user login"')}`),console.log(""),console.log(Z.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${Z.dim("Documentation:")} ${Z.cyan("https://prjct.app")}`),console.log(` ${Z.dim("Report issues:")} ${Z.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(Z.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};Gn();Mt();O();es();ts();import yg from"node:path";Me();import Qe from"node:path";async function AP(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(Qe.join(r,"pnpm-lock.yaml"))?"pnpm":await M(Qe.join(r,"yarn.lock"))?"yarn":await M(Qe.join(r,"bun.lockb"))||await M(Qe.join(r,"bun.lock"))?"bun":(await M(Qe.join(r,"package-lock.json")),"npm")}l(AP,"detectPackageManager");function mg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(mg,"pmRun");function IP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(IP,"pmTest");async function ul(r){let e=Qe.join(r,"package.json"),t=await ln(e,null);if(t){let o=await AP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:mg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:mg(o,"typecheck")}),i.test&&(a.test={tool:o,command:IP(o)}),a}if(await M(Qe.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Ln(Qe.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await M(Qe.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await M(Qe.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Un(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await M(Qe.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await M(Qe.join(r,"gradlew"))&&(await M(Qe.join(r,"build.gradle"))||await M(Qe.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(ul,"detectProjectCommands");Gn();O();Zt();import{exec as DP}from"node:child_process";import{promisify as jP}from"node:util";import At from"chalk";var RP=jP(DP),ri=new Map,us=new Map;function gr(r,e){return`workflow:${r}_${e}`}l(gr,"prefKey");async function gg(r,e){let t=gr(e.hook,e.command);switch(e.scope){case"permanent":await pe.recordDecision(r,t,e.action,"workflow");break;case"session":ri.set(t,e);break;case"once":us.set(t,e);break}}l(gg,"setWorkflowPreference");async function $P(r,e){let t={};for(let n of["before","after","skip"]){let s=gr(n,e),o=us.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ri.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await pe.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l($P,"getWorkflowPreferences");async function Bt(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await $P(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=gr(e,t);us.has(i)&&us.delete(i),console.log(`
1136
- ${At.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await RP(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(`${At.green("\u2713")} ${At.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(At.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(At.dim(c.split(`
1137
- `)[0])),{success:!1,failed:o,output:c}}}l(Bt,"runWorkflowHooks");async function dl(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=gr(o,s),a=us.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=ri.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await pe.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(dl,"listWorkflowPreferences");async function fg(r,e,t){let n=gr(e,t);return us.delete(n),ri.delete(n),await pe.recordDecision(r,n,"","workflow:remove"),!0}l(fg,"removeWorkflowPreference");function hg(r){if(r.length===0)return`${At.dim(Gs.NO_PREFERENCES)}
1178
+ `;await ml.writeFile(n,s,{mode:493});let o={};if(await M(t))try{o=JSON.parse(await ml.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await ml.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${Vn} 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("")}};zn();Mt();O();ts();ns();import bg from"node:path";Oe();import Ze from"node:path";async function $P(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(Ze.join(r,"pnpm-lock.yaml"))?"pnpm":await M(Ze.join(r,"yarn.lock"))?"yarn":await M(Ze.join(r,"bun.lockb"))||await M(Ze.join(r,"bun.lock"))?"bun":(await M(Ze.join(r,"package-lock.json")),"npm")}l($P,"detectPackageManager");function yg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(yg,"pmRun");function MP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(MP,"pmTest");async function gl(r){let e=Ze.join(r,"package.json"),t=await un(e,null);if(t){let o=await $P(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:yg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:yg(o,"typecheck")}),i.test&&(a.test={tool:o,command:MP(o)}),a}if(await M(Ze.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Un(Ze.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await M(Ze.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await M(Ze.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Hn(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await M(Ze.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await M(Ze.join(r,"gradlew"))&&(await M(Ze.join(r,"build.gradle"))||await M(Ze.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(gl,"detectProjectCommands");zn();O();en();import{exec as OP}from"node:child_process";import{promisify as FP}from"node:util";import At from"chalk";var _P=FP(OP),ai=new Map,ds=new Map;function hr(r,e){return`workflow:${r}_${e}`}l(hr,"prefKey");async function wg(r,e){let t=hr(e.hook,e.command);switch(e.scope){case"permanent":await ge.recordDecision(r,t,e.action,"workflow");break;case"session":ai.set(t,e);break;case"once":ds.set(t,e);break}}l(wg,"setWorkflowPreference");async function NP(r,e){let t={};for(let n of["before","after","skip"]){let s=hr(n,e),o=ds.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ai.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(NP,"getWorkflowPreferences");async function Bt(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await NP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=hr(e,t);ds.has(i)&&ds.delete(i),console.log(`
1179
+ ${At.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await _P(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(`${At.green("\u2713")} ${At.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(At.red("\u2717 failed"));let c=y(a)||"Unknown error";return console.log(At.dim(c.split(`
1180
+ `)[0])),{success:!1,failed:o,output:c}}}l(Bt,"runWorkflowHooks");async function fl(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=hr(o,s),a=ds.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=ai.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(fl,"listWorkflowPreferences");async function Sg(r,e,t){let n=hr(e,t);return ds.delete(n),ai.delete(n),await ge.recordDecision(r,n,"","workflow:remove"),!0}l(Sg,"removeWorkflowPreference");function kg(r){if(r.length===0)return`${At.dim(Ws.NO_PREFERENCES)}
1138
1181
 
1139
- Set one: "${Gs.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"?At.green("permanent"):t.scope==="session"?At.yellow("session"):At.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(At.dim(`Modify: "${Gs.MODIFY_EXAMPLE}"`)),e.push(At.dim(`Remove: "${Gs.REMOVE_EXAMPLE}"`)),e.join(`
1140
- `)}l(hg,"formatWorkflowPreferences");ze();var ds=class extends ae{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=$e.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1182
+ Set one: "${Ws.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"?At.green("permanent"):t.scope==="session"?At.yellow("session"):At.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(At.dim(`Modify: "${Ws.MODIFY_EXAMPLE}"`)),e.push(At.dim(`Remove: "${Ws.REMOVE_EXAMPLE}"`)),e.join(`
1183
+ `)}l(kg,"formatWorkflowPreferences");We();var ps=class extends le{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Me.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1141
1184
  ${o.stderr}`.trim(),a=i.split(`
1142
1185
  `),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(`
1143
1186
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
1144
- `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await F.getCurrentTask(o))?.description||"current work");let a=await Bt(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 Ke.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:U.getTimestamp()}),await pe.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await pe.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await pe.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await Bt(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=ko("ship"),S=ge(Ot(`Shipped: ${i}`,`Version: ${d}`),Ge("Results",ut([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),_e(f.map(P=>({label:P.desc,command:P.cmd}))));console.log(S)}else h.done(`v${d} shipped`),at("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async _runLint(e){try{let t=await ul(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 ul(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=yg.join(e,"package.json"),n=await te.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await te.writeJson(t,n)),c}catch(t){if(C(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=yg.join(n,"CHANGELOG.md"),o=await te.readFile(s,`# Changelog
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 R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await F.getCurrentTask(o))?.description||"current work");let a=await Bt(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 Ye.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:U.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 Bt(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Po("ship"),S=ce(Ot(`Shipped: ${i}`,`Version: ${d}`),ze("Results",dt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`])),Ne(f.map(k=>({label:k.desc,command:k.cmd}))));console.log(S)}else h.done(`v${d} shipped`),ct("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 gl(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 gl(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=bg.join(e,"package.json"),n=await ne.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ne.writeJson(t,n)),c}catch(t){if(C(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=bg.join(n,"CHANGELOG.md"),o=await ne.readFile(s,`# Changelog
1145
1188
 
1146
1189
  `),i=`## [${t}] - ${U.formatDate(new Date)}
1147
1190
 
@@ -1152,32 +1195,32 @@ ${o.stderr}`.trim(),a=i.split(`
1152
1195
 
1153
1196
  `,`# Changelog
1154
1197
 
1155
- ${i}`);await te.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 $e.get("Bash")("git add .");let n=`feat: ${e}
1198
+ ${i}`);await ne.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 Me.get("Bash")("git add .");let n=`feat: ${e}
1156
1199
 
1157
- Generated with [p/](https://www.prjct.app/)`;return await $e.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 $e.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)"}}}};st();le();So();O();Sn();ze();import MP from"node:fs/promises";import OP from"node:path";import ps from"chalk";var ms=class extends ae{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(ps.dim(`[dry-run] Would update ${o.length} project(s)
1158
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${ps.dim("would update")} ${m}`);continue}try{let p=await Ws(d),g=await wo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${ps.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${ps.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${ps.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${ps.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=OP.join(E.getGlobalBasePath(),"projects");try{return(await MP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};sc();Hn();Ua();O();xn();ze();import ye from"chalk";var gs=class extends ae{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await Ye.getAll(s);if(i.length===0)return console.log(`
1159
- ${ye.dim("No velocity data yet.")}`),console.log(`${ye.dim("Complete tasks with estimates to build velocity history.")}
1160
- `),{success:!0,message:"No data"};let a=Ao(i,o);await La.saveMetrics(s,a),console.log(`
1161
- ${ye.cyan("Sprint Velocity")} ${ye.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?ye.green:m.estimationAccuracy>=60?ye.yellow:ye.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${ye.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?ye.green("\u2191"):a.velocityTrend==="declining"?ye.red("\u2193"):ye.dim("\u2192");if(console.log(` Average: ${ye.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${ye.bold(`${a.estimationAccuracy}%`)} ${ye.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1162
- ${ye.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${ye.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${ye.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${ye.green("\u2713")} ${m.category} tasks estimated within ${ye.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Kd(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1163
- ${ye.dim("Projection:")}`),console.log(` Backlog: ${ye.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${ye.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Xt,...n.velocity}}catch{}return Xt}};xc();kc();import KP from"node:fs/promises";import YP from"node:path";xn();var FP=[1,2,3,5,8,13,21],_P={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}},Sg=l(r=>FP.includes(r),"isValidPoint"),oi=l(r=>_P[r],"pointsToMinutes"),wg=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),kg=l(r=>{let e=oi(r);return`${wg(e.min)}\u2013${wg(e.max)}`},"pointsToTimeRange");le();fo();var ii=300*1e3,Le=new vt({ttl:ii,maxSize:100}),It=new vt({ttl:ii,maxSize:10}),fs=new vt({ttl:ii,maxSize:5}),hs=new vt({ttl:ii,maxSize:5});function pl(){Le.clear(),It.clear(),fs.clear(),hs.clear()}l(pl,"clearLinearCache");function ml(){return{issues:Le.stats(),assignedIssues:It.stats(),teams:fs.stats(),projects:hs.stats()}}l(ml,"getLinearCacheStats");O();gl();var GP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},zP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Pg={none:0,urgent:1,high:2,medium:3,low:4},ci=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 ai("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Pg[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=Pg[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:GP[t?.type||"backlog"]||"backlog",priority:zP[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):[]}},Ze=new ci;var li=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&Ze.isConfigured()}async initialize(e){this.initialized||(await Ze.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=It.get(t);if(n)return n;let s=await Ze.fetchAssignedIssues(e);It.set(t,s);for(let o of s)Le.set(`issue:${o.id}`,o),Le.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=It.get(n);if(s)return s;let o=await Ze.fetchTeamIssues(e,t);It.set(n,o);for(let i of o)Le.set(`issue:${i.id}`,i),Le.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Le.get(t);if(n)return n;let s=await Ze.fetchIssue(e);return s&&(Le.set(`issue:${s.id}`,s),Le.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await Ze.createIssue(e);return Le.set(`issue:${t.id}`,t),Le.set(`issue:${t.externalId}`,t),It.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await Ze.updateIssue(e,t);return Le.set(`issue:${n.id}`,n),Le.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await Ze.markInProgress(e),Le.delete(`issue:${e}`),It.clear()}async markDone(e){this.ensureInitialized(),await Ze.markDone(e),Le.delete(`issue:${e}`),It.clear()}async addComment(e,t){this.ensureInitialized(),await Ze.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=fs.get("teams");if(e)return e;let t=await Ze.getTeams();return fs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=hs.get("projects");if(e)return e;let t=await Ze.getProjects();return hs.set("projects",t),t}clearCache(){pl()}getCacheStats(){return ml()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},ht=new li;Li();ue();O();var Cg=1800*1e3,ui=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await ht.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:Cg,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await ht.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 ht.markInProgress(t):n==="done"&&await ht.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||Cg;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=su("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}}},WP=new ui;kt();Mt();rc();O();es();ts();O();Me();gl();import BP from"node:fs/promises";import VP from"node:os";import JP from"node:path";function qP(r){return JP.join(VP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(qP,"getCredentialsPath");async function di(r){let e=qP(r);if(!await M(e))return{};try{return JSON.parse(await BP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}l(di,"getProjectCredentials");async function fl(r){let e=await di(r);return e.linear?.apiKey?e.linear.apiKey:ai("linear-api-key")}l(fl,"getLinearApiKey");xn();ze();var ys=class extends ae{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Bt(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 di(o),S=await fl(o);if(S&&f.linear?.teamId){await ht.initializeFromApiKey(S,f.linear.teamId);let P=await ht.fetchIssue(e);P&&(a=e,c=`${e}: ${P.title}`,await ht.markInProgress(e))}}catch{}if(n.md){let f=await F.getCurrentTask(o);if(f)return Ht("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 F.startTask(o,{id:re(),description:c,sessionId:re(),linearId:a});let S=E.getGlobalProjectPath(o),[P,I,j,V]=await Promise.all([XP(),it.getActive(o).catch(()=>null),QP(S),Do(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),de=Ha({description:c,branch:P,linearId:a}),we=ZP(I,j),Ue=wd(V.files.map(an=>({path:an.path,description:an.reasons.join(", ")}))),b=eC(j),A=tC(I),Se=_e([{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(ge(de,we,Ue,b,A,Se)),await this.logToMemory(t,"task_started",{task:e,timestamp:U.getTimestamp()}),await Bt(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await No.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await F.startTask(o,{id:re(),description:c,sessionId:re(),linearId:a});let m=await Sc.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}),Ys("working"),at("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:U.getTimestamp()}),await Bt(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Sg,pointsToMinutes:oi,pointsToTimeRange:kg,storeEstimate:l(async f=>{let S=oi(f);return await F.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return n.md?Ht("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=Ha({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?yd(u,d):"",p=_e([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(ge(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=w(s);return n.md?o.includes("Cannot run")||o.includes("working state")?Ht("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await F.getCurrentTask(s);if(!o)return t.md?Ht("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 Bt(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=U.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await Ye.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:U.getTimestamp(),estimatedDuration:d?xg(d):"0m",actualDuration:c||"0m",variance:d?nC(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,P=f>=0?"+":"";p=` | est: ${m}pt (${xg(d)}) \u2192 ${P}${S}%`}await F.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await di(s),S=await fl(s);S&&f.linear?.teamId&&(await ht.initializeFromApiKey(S,f.linear.teamId),await ht.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(ge(Ot("Completed",`${a}${f}`),dt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),_e([{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}`),Ys("completed"),at("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:U.getTimestamp()}),await Bt(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await me.getActiveTasks(s);if(o.length===0)return t.md?Ht("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(ge(Ge("Queue",`${o.length} task${o.length!==1?"s":""}`),ut(i,!0),_e([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),at("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return n.md?Ht("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";if(i.startedAt&&(a=U.calculateDuration(new Date(i.startedAt))),await F.pauseTask(o,e),n.md)console.log(ge(Ot("Task Paused",`**Paused:** ${i.description}`),dt({Reason:e||void 0,"Duration worked":a||void 0}),_e([{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})`:""}`),Ys("paused"),at("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(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return n.md?Ht("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 F.resumeTask(o);return a?(n.md?console.log(ge(Ot("Task Resumed",`**Resumed:** ${a.description}`),_e([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Ys("working"),at("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:U.getTimestamp()}),{success:!0,task:a.description}):(n.md?Ht("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await dl(s);return console.log(hg(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await gg(s,{...o,createdAt:U.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await fg(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>dl(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};function xg(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(xg,"formatMinutesToDuration");async function XP(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(XP,"getGitBranch");async function QP(r){try{let e=YP.join(r,"analysis","repo-analysis.json"),t=await KP.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e),null}}l(QP,"loadRepoAnalysis");function ZP(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=dt(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
1164
- ${ut(g)}`}return[u?`Project
1200
+ Generated with [p/](https://www.prjct.app/)`;return await Me.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 Me.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)"}}}};rt();de();bo();O();Sn();We();import LP from"node:fs/promises";import UP from"node:path";import ms from"chalk";var gs=class extends le{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(ms.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(` ${ms.dim("would update")} ${m}`);continue}try{let p=await Vs(d),g=await ko(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${ms.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${ms.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${ms.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${ms.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 R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=UP.join(E.getGlobalBasePath(),"projects");try{return(await LP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};ac();Gn();Wa();O();xn();We();import we from"chalk";var fs=class extends le{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await Xe.getAll(s);if(i.length===0)return console.log(`
1202
+ ${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=jo(i,o);await za.saveMetrics(s,a),console.log(`
1204
+ ${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
+ ${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=ep(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 R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Xt,...n.velocity}}catch{}return Xt}};Ac();xc();import eC from"node:fs/promises";import tC from"node:path";xn();var HP=[1,2,3,5,8,13,21],GP={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}},Cg=l(r=>HP.includes(r),"isValidPoint"),ci=l(r=>GP[r],"pointsToMinutes"),Pg=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"),xg=l(r=>{let e=ci(r);return`${Pg(e.min)}\u2013${Pg(e.max)}`},"pointsToTimeRange");de();yo();var li=300*1e3,Ue=new vt({ttl:li,maxSize:100}),It=new vt({ttl:li,maxSize:10}),hs=new vt({ttl:li,maxSize:5}),ys=new vt({ttl:li,maxSize:5});function hl(){Ue.clear(),It.clear(),hs.clear(),ys.clear()}l(hl,"clearLinearCache");function yl(){return{issues:Ue.stats(),assignedIssues:It.stats(),teams:hs.stats(),projects:ys.stats()}}l(yl,"getLinearCacheStats");O();wl();var JP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},qP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Tg={none:0,urgent:1,high:2,medium:3,low:4},di=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 ui("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?Tg[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=Tg[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:JP[t?.type||"backlog"]||"backlog",priority:qP[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):[]}},et=new di;var pi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&et.isConfigured()}async initialize(e){this.initialized||(await et.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=It.get(t);if(n)return n;let s=await et.fetchAssignedIssues(e);It.set(t,s);for(let o of s)Ue.set(`issue:${o.id}`,o),Ue.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=It.get(n);if(s)return s;let o=await et.fetchTeamIssues(e,t);It.set(n,o);for(let i of o)Ue.set(`issue:${i.id}`,i),Ue.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Ue.get(t);if(n)return n;let s=await et.fetchIssue(e);return s&&(Ue.set(`issue:${s.id}`,s),Ue.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await et.createIssue(e);return Ue.set(`issue:${t.id}`,t),Ue.set(`issue:${t.externalId}`,t),It.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await et.updateIssue(e,t);return Ue.set(`issue:${n.id}`,n),Ue.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await et.markInProgress(e),Ue.delete(`issue:${e}`),It.clear()}async markDone(e){this.ensureInitialized(),await et.markDone(e),Ue.delete(`issue:${e}`),It.clear()}async addComment(e,t){this.ensureInitialized(),await et.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=hs.get("teams");if(e)return e;let t=await et.getTeams();return hs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=ys.get("projects");if(e)return e;let t=await et.getProjects();return ys.set("projects",t),t}clearCache(){hl()}getCacheStats(){return yl()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},ht=new pi;Gi();pe();O();var Eg=1800*1e3,mi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await ht.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:Eg,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error: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 ht.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 ht.markInProgress(t):n==="done"&&await ht.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||Eg;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=iu("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}}},KP=new mi;kt();Mt();cc();O();ts();ns();O();Oe();wl();import YP from"node:fs/promises";import XP from"node:os";import QP from"node:path";function ZP(r){return QP.join(XP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(ZP,"getCredentialsPath");async function gi(r){let e=ZP(r);if(!await M(e))return{};try{return JSON.parse(await YP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(gi,"getProjectCredentials");async function Sl(r){let e=await gi(r);return e.linear?.apiKey?e.linear.apiKey:ui("linear-api-key")}l(Sl,"getLinearApiKey");xn();We();var ws=class extends le{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Bt(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 gi(o),S=await Sl(o);if(S&&f.linear?.teamId){await ht.initializeFromApiKey(S,f.linear.teamId);let k=await ht.fetchIssue(e);k&&(a=e,c=`${e}: ${k.title}`,await ht.markInProgress(e))}}catch{}if(n.md){let f=await F.getCurrentTask(o);if(f)return Ht("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 F.startTask(o,{id:oe(),description:c,sessionId:oe(),linearId:a});let S=E.getGlobalProjectPath(o),[k,I,j,V]=await Promise.all([nC(),at.getActive(o).catch(()=>null),sC(S),$o(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),me=Va({description:c,branch:k,linearId:a}),Se=rC(I,j),He=Cd(V.files.map(cn=>({path:cn.path,description:cn.reasons.join(", ")}))),P=oC(j),A=iC(I),ke=Ne([{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(ce(me,Se,He,P,A,ke)),await this.logToMemory(t,"task_started",{task:e,timestamp:U.getTimestamp()}),await Bt(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Ho.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await F.startTask(o,{id:oe(),description:c,sessionId:oe(),linearId:a});let m=await Cc.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}),Qs("working"),ct("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:U.getTimestamp()}),await Bt(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Cg,pointsToMinutes:ci,pointsToTimeRange:xg,storeEstimate:l(async f=>{let S=ci(f);return await F.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return n.md?Ht("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=Va({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?Pd(u,d):"",p=Ne([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(ce(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")?Ht("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await F.getCurrentTask(s);if(!o)return t.md?Ht("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 Bt(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=U.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await Xe.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:U.getTimestamp(),estimatedDuration:d?Ag(d):"0m",actualDuration:c||"0m",variance:d?aC(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,k=f>=0?"+":"";p=` | est: ${m}pt (${Ag(d)}) \u2192 ${k}${S}%`}await F.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await gi(s),S=await Sl(s);S&&f.linear?.teamId&&(await ht.initializeFromApiKey(S,f.linear.teamId),await ht.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(ce(Ot("Completed",`${a}${f}`),pt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Ne([{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}`),Qs("completed"),ct("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:U.getTimestamp()}),await Bt(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 R.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?Ht("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(ce(ze("Queue",`${o.length} task${o.length!==1?"s":""}`),dt(i,!0),Ne([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),ct("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(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 R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return n.md?Ht("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";if(i.startedAt&&(a=U.calculateDuration(new Date(i.startedAt))),await F.pauseTask(o,e),n.md)console.log(ce(Ot("Task Paused",`**Paused:** ${i.description}`),pt({Reason:e||void 0,"Duration worked":a||void 0}),Ne([{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})`:""}`),Qs("paused"),ct("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 R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return n.md?Ht("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 F.resumeTask(o);return a?(n.md?console.log(ce(Ot("Task Resumed",`**Resumed:** ${a.description}`),Ne([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Qs("working"),ct("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:U.getTimestamp()}),{success:!0,task:a.description}):(n.md?Ht("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 R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await fl(s);return console.log(kg(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await wg(s,{...o,createdAt:U.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await Sg(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>fl(s),"listWorkflowPreferences")}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Ag(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(Ag,"formatMinutesToDuration");async function nC(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(nC,"getGitBranch");async function sC(r){try{let e=tC.join(r,"analysis","repo-analysis.json"),t=await eC.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e),null}}l(sC,"loadRepoAnalysis");function rC(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=pt(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
1207
+ ${dt(g)}`}return[u?`### Project
1165
1208
  ${u}`:null,m].filter(Boolean).join(`
1166
1209
 
1167
- `)||null}l(ZP,"buildProjectContext");function eC(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 Sd(e)}l(eC,"buildRules");function tC(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)
1210
+ `)||null}l(rC,"buildProjectContext");function oC(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 xd(e)}l(oC,"buildRules");function iC(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)
1168
1211
  ${s.join(`
1169
- `)}`)}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)
1212
+ `)}`)}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)
1170
1213
  ${s.join(`
1171
1214
  `)}`)}return e.length>0?e.join(`
1172
1215
 
1173
- `):null}l(tC,"buildPatterns");function nC(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(nC,"formatVariance");var On=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new ys,this.planning=new Dn,this.shipping=new ds,this.analytics=new os,this.performanceCmds=new cs,this.maintenance=new as,this.analysis=new $n,this.setupCmds=new ls,this.updateCmds=new ms,this.velocityCmds=new gs,this.contextCmds=new Mn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},X1=new On;Ho();var vg={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}},Tg=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Uo();fn();le();O();Me();ze();import{execSync as pi}from"node:child_process";import et from"node:fs/promises";import sC from"node:os";import Vt from"node:path";import rC from"node:readline";import ce from"chalk";var mi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",fr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function hl(r){let e=0;try{let t=await et.readdir(r,{withFileTypes:!0});for(let n of t){let s=Vt.join(r,n.name);if(n.isDirectory())e+=await hl(s);else try{let o=await et.stat(s);e+=o.size}catch{}}}catch{}return e}l(hl,"getDirectorySize");function Eg(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(Eg,"formatSize");async function oC(r){try{return(await et.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(oC,"countDirectoryItems");function iC(){let r={homebrew:!1,npm:!1};try{pi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{pi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(iC,"detectInstallation");async function aC(){let r=[],e=Ou(),t=E.getGlobalBasePath(),n=await M(t),s=n?await oC(Vt.join(t,"projects")):0,o=n?await hl(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=Vt.join(e.claude.config,"CLAUDE.md"),a=await M(i),c=!1;if(a)try{let we=await et.readFile(i,"utf-8");c=we.includes(mi)&&we.includes(fr)}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 hl(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=Vt.join(e.claude.config,"prjct-statusline.sh"),S=await M(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let P=e.gemini.router,I=await M(P);r.push({path:P,type:"file",description:"Gemini router",exists:I});let j=Vt.join(e.gemini.config,"GEMINI.md"),V=await M(j),de=!1;if(V)try{let we=await et.readFile(j,"utf-8");de=we.includes(mi)&&we.includes(fr)}catch{}return V&&de&&r.push({path:j,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(aC,"gatherUninstallItems");async function cC(r){try{let e=await et.readFile(r,"utf-8");if(!e.includes(mi)||!e.includes(fr))return!1;let t=e.indexOf(mi),n=e.indexOf(fr)+fr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1216
+ `):null}l(iC,"buildPatterns");function aC(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(aC,"formatVariance");var Fn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new ws,this.planning=new Dn,this.shipping=new ps,this.analytics=new is,this.performanceCmds=new ls,this.maintenance=new cs,this.analysis=new Mn,this.setupCmds=new us,this.updateCmds=new gs,this.velocityCmds=new fs,this.contextCmds=new On,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},sH=new Fn;Wo();var Ig={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}},Dg=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];zo();fn();de();O();Oe();We();import{execSync as fi}from"node:child_process";import tt from"node:fs/promises";import cC from"node:os";import Vt from"node:path";import lC from"node:readline";import ue from"chalk";var hi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",yr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function kl(r){let e=0;try{let t=await tt.readdir(r,{withFileTypes:!0});for(let n of t){let s=Vt.join(r,n.name);if(n.isDirectory())e+=await kl(s);else try{let o=await tt.stat(s);e+=o.size}catch{}}}catch{}return e}l(kl,"getDirectorySize");function jg(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(jg,"formatSize");async function uC(r){try{return(await tt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(uC,"countDirectoryItems");function dC(){let r={homebrew:!1,npm:!1};try{fi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(dC,"detectInstallation");async function pC(){let r=[],e=Nu(),t=E.getGlobalBasePath(),n=await M(t),s=n?await uC(Vt.join(t,"projects")):0,o=n?await kl(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=Vt.join(e.claude.config,"CLAUDE.md"),a=await M(i),c=!1;if(a)try{let Se=await tt.readFile(i,"utf-8");c=Se.includes(hi)&&Se.includes(yr)}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 kl(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=Vt.join(e.claude.config,"prjct-statusline.sh"),S=await M(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let k=e.gemini.router,I=await M(k);r.push({path:k,type:"file",description:"Gemini router",exists:I});let j=Vt.join(e.gemini.config,"GEMINI.md"),V=await M(j),me=!1;if(V)try{let Se=await tt.readFile(j,"utf-8");me=Se.includes(hi)&&Se.includes(yr)}catch{}return V&&me&&r.push({path:j,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(pC,"gatherUninstallItems");async function mC(r){try{let e=await tt.readFile(r,"utf-8");if(!e.includes(hi)||!e.includes(yr))return!1;let t=e.indexOf(hi),n=e.indexOf(yr)+yr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1174
1217
 
1175
- `).trim(),!s||s.trim().length===0?await et.unlink(r):await et.writeFile(r,`${s}
1176
- `,"utf-8"),!0}catch{return!1}}l(cC,"removePrjctSection");async function lC(){let r=sC.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Vt.join(r,`.prjct-backup-${e}`);try{await et.mkdir(t,{recursive:!0});let n=E.getGlobalBasePath();return await M(n)&&await Ag(n,Vt.join(t,".prjct-cli")),t}catch{return null}}l(lC,"createBackup");async function Ag(r,e){await et.mkdir(e,{recursive:!0});let t=await et.readdir(r,{withFileTypes:!0});for(let n of t){let s=Vt.join(r,n.name),o=Vt.join(e,n.name);n.isDirectory()?await Ag(s,o):await et.copyFile(s,o)}}l(Ag,"copyDirectory");async function uC(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await cC(o.path)&&n.push(o.path):o.type==="directory"?(await et.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await et.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||pi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||pi("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}l(uC,"performUninstall");async function dC(r){let e=rC.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(dC,"promptConfirmation");async function pC(r={},e=process.cwd()){let t=await aC(),n=iC(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ce.yellow(`
1177
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ce.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=E.getDisplayPath(c.path),d="";c.type==="section"?d=ce.dim("(section only)"):c.size&&(d=ce.dim(`(${Eg(c.size)})`)),console.log(` ${ce.cyan(u.padEnd(35))} ${d}`),console.log(` ${ce.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ce.cyan("Homebrew".padEnd(35))} ${ce.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ce.cyan("npm global".padEnd(35))} ${ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ce.dim(` Total size: ${Eg(o)}`)),console.log("")),r.dryRun)return console.log(ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ce.blue("Creating backup..."));let c=await lC();c?(console.log(ce.green(`Backup created: ${E.getDisplayPath(c)}`)),console.log("")):console.log(ce.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ce.yellow('Type "uninstall" to confirm:')),!await dC("> ")))return console.log(ce.yellow(`
1178
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await uC(t,n,r);if(console.log(""),i.length>0&&console.log(ce.green(`Removed ${i.length} items`)),a.length>0){console.log(ce.yellow(`
1179
- ${a.length} errors:`));for(let c of a)console.log(ce.red(` - ${c}`))}return console.log(""),console.log(ce.green("prjct has been uninstalled.")),console.log(ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(pC,"uninstall");var gi=class extends ae{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return pC(e,t)}};var ws=new ys,fi=new Dn,mC=new ds,Ig=new os,gC=new cs,Ss=new as,ks=new $n,Dg=new ls,fC=new Mn,hC=new gs,yC=new gi,wC=new ms;function SC(){for(let[r,e]of Object.entries(vg))H.registerCategory(r,e)}l(SC,"registerCategories");function jg(){if(H.has("work"))return;SC();let r=l(e=>Tg.find(t=>t.name===e),"getMeta");H.registerMethod("task",ws,"now",r("task")),H.registerMethod("done",ws,"done",r("done")),H.registerMethod("next",ws,"next",r("next")),H.registerMethod("pause",ws,"pause",r("pause")),H.registerMethod("resume",ws,"resume",r("resume")),H.registerMethod("workflow",ws,"workflow",r("workflow")),H.registerMethod("init",fi,"init",r("init")),H.registerMethod("bug",fi,"bug",r("bug")),H.registerMethod("idea",fi,"idea",r("idea")),H.registerMethod("spec",fi,"spec",r("spec")),H.registerMethod("ship",mC,"ship",r("ship")),H.registerMethod("dash",Ig,"dash",r("dash")),H.registerMethod("help",Ig,"help",r("help")),H.registerMethod("perf",gC,"perf",r("perf")),H.registerMethod("velocity",hC,"velocity",r("velocity")),H.registerMethod("cleanup",Ss,"cleanup",r("cleanup")),H.registerMethod("design",Ss,"design",r("design")),H.registerMethod("recover",Ss,"recover",r("recover")),H.registerMethod("undo",Ss,"undo",r("undo")),H.registerMethod("redo",Ss,"redo",r("redo")),H.registerMethod("history",Ss,"history",r("history")),H.registerMethod("analyze",ks,"analyze",r("analyze")),H.registerMethod("sync",ks,"sync",r("sync")),H.registerMethod("stats",ks,"stats",r("stats")),H.registerMethod("status",ks,"status",r("status")),H.registerMethod("seal",ks,"seal",r("seal")),H.registerMethod("verify",ks,"verify",r("verify")),H.registerMethod("start",Dg,"start",r("start")),H.registerMethod("setup",Dg,"setup",r("setup")),H.registerMethod("uninstall",yC,"uninstall",r("uninstall")),H.registerMethod("update",wC,"update",r("update")),H.registerMethod("context",fC,"context",r("context"))}l(jg,"registerAllCommands");jg();st();Di();import{Hono as DC}from"hono";import{cors as jC}from"hono/cors";import{logger as RC}from"hono/logger";le();ue();zs();Bs();Vs();qs();O();Zn();import kC from"node:fs/promises";import bC from"node:path";import{Hono as PC}from"hono";function CC(r){return E.getGlobalProjectPath(r)}l(CC,"getProjectDataPath");function Rg(r,e){let t=new PC,n=CC(r);return t.get("/state",async s=>{let o=await F.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await me.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Fe.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Ke.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([F.read(r),me.read(r),Fe.read(r),Ke.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await F.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=bC.join(n,"context",`${o}.md`),c=await kC.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return C(a)||B.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Rg,"createRoutes");le();ue();zs();Bs();Vs();qs();import bs from"node:fs/promises";import xC from"node:path";import{Hono as vC}from"hono";var TC=E.getGlobalBasePath(),Ps=xC.join(TC,"projects");function hi(r){return $.getDoc(r,"project")}l(hi,"getProjectConfig");async function yl(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(yl,"calculateDuration");function $g(){let r=new vC;return r.get("/projects",async e=>{try{await bs.mkdir(Ps,{recursive:!0});let n=(await bs.readdir(Ps,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=hi(o),a=await F.read(o),c=await me.read(o),u=await Fe.read(o),d=await Ke.read(o),m=a?.currentTask,p=await yl(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(hi(t)),F.read(t),me.read(t),Fe.read(t),Ke.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await yl(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 F.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 F.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 F.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 F.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 F.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 F.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([F.read(t),me.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 F.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 Fe.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 bs.mkdir(Ps,{recursive:!0});let n=(await bs.readdir(Ps,{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 F.read(c),d=await me.read(c),m=await Fe.read(c),p=await Ke.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 bs.mkdir(Ps,{recursive:!0});let s=(await bs.readdir(Ps,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=hi(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 F.read(d),p=hi(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await yl(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($g,"createExtendedRoutes");wi();import{streamSSE as EC}from"hono/streaming";var Mg=3600*1e3,AC=300*1e3,IC=3e4;function Og(){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()>Mg&&t(i)},AC),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 EC(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)}},IC),p=setTimeout(()=>{t(a)},Mg);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(Og,"createSSEManager");function Fg(r){let e=new DC,t=Og();r.enableCors!==!1&&e.use("*",jC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",RC()),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=Rg(r.projectId,r.projectPath);e.route("/api",n);let s=$g();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(Ds())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: ${Ds()?"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(Fg,"createServer");var _g=3478;var Lt={runDir:l(()=>`${process.env.HOME||xs("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Lt.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Lt.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Lt.runDir()}/daemon.log`,"log")},Ng=1800*1e3;function wl(r){return Buffer.from(`${JSON.stringify(r)}
1180
- `)}l(wl,"encodeMessage");var Cs=null,hr=null,ve=null,De=null;async function Lg(r){let e=Lt.socket(),t=Lt.pid(),n=Lt.runDir();if(yt.mkdirSync(n,{recursive:!0}),yt.existsSync(t)){let s=parseInt(yt.readFileSync(t,"utf-8").trim(),10);NC(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),yt.unlinkSync(t)}if(yt.existsSync(e)&&yt.unlinkSync(e),De={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ng,idleTimer:null},ve=new On,Cs=$C(s=>MC(s)),Cs.listen(e,()=>{yt.chmodSync(e,384),yt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Ug()}),Cs.on("error",s=>{console.error("Daemon socket error:",s.message),yr(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||_g;hr=Fg({port:i,projectId:o,projectPath:s,enableLogging:!1}),await hr.start()}}catch{}if(process.on("SIGTERM",()=>yr(0)),process.on("SIGINT",()=>yr(0)),process.on("SIGHUP",()=>{ve=new On,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Lg,"startDaemon");function MC(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1181
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await OC(o);r.write(wl(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(wl(i))}}}),r.on("error",()=>{})}l(MC,"handleConnection");async function OC(r){if(!De||!ve)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Ug(),De.commandsServed++,De.lastActivity=Date.now(),r.command==="daemon")return _C(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 FC(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1218
+ `).trim(),!s||s.trim().length===0?await tt.unlink(r):await tt.writeFile(r,`${s}
1219
+ `,"utf-8"),!0}catch{return!1}}l(mC,"removePrjctSection");async function gC(){let r=cC.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Vt.join(r,`.prjct-backup-${e}`);try{await tt.mkdir(t,{recursive:!0});let n=E.getGlobalBasePath();return await M(n)&&await Rg(n,Vt.join(t,".prjct-cli")),t}catch{return null}}l(gC,"createBackup");async function Rg(r,e){await tt.mkdir(e,{recursive:!0});let t=await tt.readdir(r,{withFileTypes:!0});for(let n of t){let s=Vt.join(r,n.name),o=Vt.join(e,n.name);n.isDirectory()?await Rg(s,o):await tt.copyFile(s,o)}}l(Rg,"copyDirectory");async function fC(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await mC(o.path)&&n.push(o.path):o.type==="directory"?(await tt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await tt.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||fi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||fi("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(fC,"performUninstall");async function hC(r){let e=lC.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(hC,"promptConfirmation");async function yC(r={},e=process.cwd()){let t=await pC(),n=dC(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ue.yellow(`
1220
+ 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(ue.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ue.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=E.getDisplayPath(c.path),d="";c.type==="section"?d=ue.dim("(section only)"):c.size&&(d=ue.dim(`(${jg(c.size)})`)),console.log(` ${ue.cyan(u.padEnd(35))} ${d}`),console.log(` ${ue.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ue.cyan("Homebrew".padEnd(35))} ${ue.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ue.cyan("npm global".padEnd(35))} ${ue.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ue.dim(` Total size: ${jg(o)}`)),console.log("")),r.dryRun)return console.log(ue.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ue.blue("Creating backup..."));let c=await gC();c?(console.log(ue.green(`Backup created: ${E.getDisplayPath(c)}`)),console.log("")):console.log(ue.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ue.yellow('Type "uninstall" to confirm:')),!await hC("> ")))return console.log(ue.yellow(`
1221
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ue.blue("Removing prjct..."));let{deleted:i,errors:a}=await fC(t,n,r);if(console.log(""),i.length>0&&console.log(ue.green(`Removed ${i.length} items`)),a.length>0){console.log(ue.yellow(`
1222
+ ${a.length} errors:`));for(let c of a)console.log(ue.red(` - ${c}`))}return console.log(""),console.log(ue.green("prjct has been uninstalled.")),console.log(ue.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(yC,"uninstall");var yi=class extends le{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return yC(e,t)}};var Ss=new ws,wi=new Dn,wC=new ps,$g=new is,SC=new ls,ks=new cs,bs=new Mn,Mg=new us,kC=new On,bC=new fs,PC=new yi,CC=new gs;function xC(){for(let[r,e]of Object.entries(Ig))H.registerCategory(r,e)}l(xC,"registerCategories");function Og(){if(H.has("work"))return;xC();let r=l(e=>Dg.find(t=>t.name===e),"getMeta");H.registerMethod("task",Ss,"now",r("task")),H.registerMethod("done",Ss,"done",r("done")),H.registerMethod("next",Ss,"next",r("next")),H.registerMethod("pause",Ss,"pause",r("pause")),H.registerMethod("resume",Ss,"resume",r("resume")),H.registerMethod("workflow",Ss,"workflow",r("workflow")),H.registerMethod("init",wi,"init",r("init")),H.registerMethod("bug",wi,"bug",r("bug")),H.registerMethod("idea",wi,"idea",r("idea")),H.registerMethod("spec",wi,"spec",r("spec")),H.registerMethod("ship",wC,"ship",r("ship")),H.registerMethod("dash",$g,"dash",r("dash")),H.registerMethod("help",$g,"help",r("help")),H.registerMethod("perf",SC,"perf",r("perf")),H.registerMethod("velocity",bC,"velocity",r("velocity")),H.registerMethod("cleanup",ks,"cleanup",r("cleanup")),H.registerMethod("design",ks,"design",r("design")),H.registerMethod("recover",ks,"recover",r("recover")),H.registerMethod("undo",ks,"undo",r("undo")),H.registerMethod("redo",ks,"redo",r("redo")),H.registerMethod("history",ks,"history",r("history")),H.registerMethod("analyze",bs,"analyze",r("analyze")),H.registerMethod("sync",bs,"sync",r("sync")),H.registerMethod("stats",bs,"stats",r("stats")),H.registerMethod("status",bs,"status",r("status")),H.registerMethod("seal",bs,"seal",r("seal")),H.registerMethod("verify",bs,"verify",r("verify")),H.registerMethod("start",Mg,"start",r("start")),H.registerMethod("setup",Mg,"setup",r("setup")),H.registerMethod("uninstall",PC,"uninstall",r("uninstall")),H.registerMethod("update",CC,"update",r("update")),H.registerMethod("context",kC,"context",r("context"))}l(Og,"registerAllCommands");Og();rt();$i();import{Hono as OC}from"hono";import{cors as FC}from"hono/cors";import{logger as _C}from"hono/logger";de();pe();Bs();Js();qs();Ys();O();es();import vC from"node:fs/promises";import TC from"node:path";import{Hono as EC}from"hono";function AC(r){return E.getGlobalProjectPath(r)}l(AC,"getProjectDataPath");function Fg(r,e){let t=new EC,n=AC(r);return t.get("/state",async s=>{let o=await F.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 _e.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Ye.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([F.read(r),fe.read(r),_e.read(r),Ye.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await F.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=TC.join(n,"context",`${o}.md`),c=await vC.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(Fg,"createRoutes");de();pe();Bs();Js();qs();Ys();import Ps from"node:fs/promises";import IC from"node:path";import{Hono as DC}from"hono";var jC=E.getGlobalBasePath(),Cs=IC.join(jC,"projects");function Si(r){return $.getDoc(r,"project")}l(Si,"getProjectConfig");async function bl(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(bl,"calculateDuration");function _g(){let r=new DC;return r.get("/projects",async e=>{try{await Ps.mkdir(Cs,{recursive:!0});let n=(await Ps.readdir(Cs,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=Si(o),a=await F.read(o),c=await fe.read(o),u=await _e.read(o),d=await Ye.read(o),m=a?.currentTask,p=await bl(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(Si(t)),F.read(t),fe.read(t),_e.read(t),Ye.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await bl(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 F.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 F.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 F.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 F.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 F.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 F.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([F.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 F.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 _e.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 Ps.mkdir(Cs,{recursive:!0});let n=(await Ps.readdir(Cs,{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 F.read(c),d=await fe.read(c),m=await _e.read(c),p=await Ye.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 Ps.mkdir(Cs,{recursive:!0});let s=(await Ps.readdir(Cs,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=Si(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 F.read(d),p=Si(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await bl(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(_g,"createExtendedRoutes");bi();import{streamSSE as RC}from"hono/streaming";var Ng=3600*1e3,$C=300*1e3,MC=3e4;function Lg(){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()>Ng&&t(i)},$C),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 RC(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)}},MC),p=setTimeout(()=>{t(a)},Ng);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(Lg,"createSSEManager");function Ug(r){let e=new OC,t=Lg();r.enableCors!==!1&&e.use("*",FC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",_C()),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=Fg(r.projectId,r.projectPath);e.route("/api",n);let s=_g();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(js())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: ${js()?"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(Ug,"createServer");var Hg=3478;var Lt={runDir:l(()=>`${process.env.HOME||vs("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Lt.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Lt.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Lt.runDir()}/daemon.log`,"log")},Gg=1800*1e3;function Pl(r){return Buffer.from(`${JSON.stringify(r)}
1223
+ `)}l(Pl,"encodeMessage");var xs=null,wr=null,Te=null,je=null;async function zg(r){let e=Lt.socket(),t=Lt.pid(),n=Lt.runDir();if(yt.mkdirSync(n,{recursive:!0}),yt.existsSync(t)){let s=parseInt(yt.readFileSync(t,"utf-8").trim(),10);zC(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),yt.unlinkSync(t)}if(yt.existsSync(e)&&yt.unlinkSync(e),je={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Gg,idleTimer:null},Te=new Fn,xs=NC(s=>LC(s)),xs.listen(e,()=>{yt.chmodSync(e,384),yt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Wg()}),xs.on("error",s=>{console.error("Daemon socket error:",s.message),Sr(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||Hg;wr=Ug({port:i,projectId:o,projectPath:s,enableLogging:!1}),await wr.start()}}catch{}if(process.on("SIGTERM",()=>Sr(0)),process.on("SIGINT",()=>Sr(0)),process.on("SIGHUP",()=>{Te=new Fn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(zg,"startDaemon");function LC(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1224
+ `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await UC(o);r.write(Pl(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Pl(i))}}}),r.on("error",()=>{})}l(LC,"handleConnection");async function UC(r){if(!je||!Te)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Wg(),je.commandsServed++,je.lastActivity=Date.now(),r.command==="daemon")return GC(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 HC(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1182
1225
  `)||o.message||void 0,stderr:t.join(`
1183
- `)||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(OC,"handleRequest");async function FC(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return ve.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 ve.status(r.cwd,{json:t.json===!0,md:n});case"stats":return ve.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return ve.seal(r.cwd,{json:t.json===!0});case"verify":return ve.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ve.task(e,r.cwd,{md:n});case"done":return ve.done(r.cwd,{md:n});case"next":return ve.next(r.cwd,{md:n});case"pause":return ve.pause(e||"",r.cwd,{md:n});case"resume":return ve.resume(e,r.cwd,{md:n});case"bug":return ve.bug(e||"",r.cwd,{md:n});case"idea":return ve.idea(e||"",r.cwd,{md:n});case"ship":return ve.ship(e,r.cwd,{md:n});case"dash":return ve.dash(e||"default",r.cwd,{md:n});case"design":return ve.design(e||"",t);case"analyze":return ve.analyze(t);case"cleanup":return ve.cleanup(t);default:return H.execute(r.command,e,r.cwd)}}l(FC,"executeCommand");function _C(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Lt.socket(),uptime:De?Date.now()-De.startedAt:0,commandsServed:De?.commandsServed??0,lastActivity:De?new Date(De.lastActivity).toISOString():null,registeredCommands:H.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>yr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(_C,"handleDaemonCommand");function Ug(){De&&(De.idleTimer&&clearTimeout(De.idleTimer),De.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${De.idleTimeoutMs/1e3/60} minutes, shutting down`),yr(0)},De.idleTimeoutMs),De.idleTimer.unref&&De.idleTimer.unref())}l(Ug,"resetIdleTimer");function yr(r){console.log("Daemon shutting down..."),De?.idleTimer&&clearTimeout(De.idleTimer),hr&&(hr.stop(),hr=null),Cs&&(Cs.close(),Cs=null);let e=Lt.socket(),t=Lt.pid();try{yt.existsSync(e)&&yt.unlinkSync(e)}catch{}try{yt.existsSync(t)&&yt.unlinkSync(t)}catch{}process.exit(r)}l(yr,"shutdown");function NC(r){try{return process.kill(r,0),!0}catch{return!1}}l(NC,"isProcessRunning");var Sl=process.argv.slice(2),LC=parseInt(Sl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,UC=Sl.includes("--no-http"),HC=Sl.includes("--foreground");Lg({port:LC,noHttp:UC,foreground:HC}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1226
+ `)||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(UC,"handleRequest");async function HC(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Te.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 Te.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Te.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Te.seal(r.cwd,{json:t.json===!0});case"verify":return Te.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Te.task(e,r.cwd,{md:n});case"done":return Te.done(r.cwd,{md:n});case"next":return Te.next(r.cwd,{md:n});case"pause":return Te.pause(e||"",r.cwd,{md:n});case"resume":return Te.resume(e,r.cwd,{md:n});case"bug":return Te.bug(e||"",r.cwd,{md:n});case"idea":return Te.idea(e||"",r.cwd,{md:n});case"ship":return Te.ship(e,r.cwd,{md:n});case"dash":return Te.dash(e||"default",r.cwd,{md:n});case"design":return Te.design(e||"",t);case"analyze":return Te.analyze(t);case"cleanup":return Te.cleanup(t);default:return H.execute(r.command,e,r.cwd)}}l(HC,"executeCommand");function GC(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Lt.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(()=>Sr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(GC,"handleDaemonCommand");function Wg(){je&&(je.idleTimer&&clearTimeout(je.idleTimer),je.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${je.idleTimeoutMs/1e3/60} minutes, shutting down`),Sr(0)},je.idleTimeoutMs),je.idleTimer.unref&&je.idleTimer.unref())}l(Wg,"resetIdleTimer");function Sr(r){console.log("Daemon shutting down..."),je?.idleTimer&&clearTimeout(je.idleTimer),wr&&(wr.stop(),wr=null),xs&&(xs.close(),xs=null);let e=Lt.socket(),t=Lt.pid();try{yt.existsSync(e)&&yt.unlinkSync(e)}catch{}try{yt.existsSync(t)&&yt.unlinkSync(t)}catch{}process.exit(r)}l(Sr,"shutdown");function zC(r){try{return process.kill(r,0),!0}catch{return!1}}l(zC,"isProcessRunning");var Cl=process.argv.slice(2),WC=parseInt(Cl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,BC=Cl.includes("--no-http"),VC=Cl.includes("--foreground");zg({port:WC,noHttp:BC,foreground:VC}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});