prjct-cli 1.28.0 → 1.30.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.
@@ -1,13 +1,15 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
2
3
  import { fileURLToPath as __fileURLToPath } from 'url';
3
4
  import { dirname as __pathDirname } from 'path';
4
- const __filename = __fileURLToPath(import.meta.url);
5
- const __dirname = __pathDirname(__filename);
6
- var mr=Object.defineProperty;var Og=Object.getOwnPropertyDescriptor;var Fg=Object.getOwnPropertyNames;var _g=Object.prototype.hasOwnProperty;var l=(r,e)=>mr(r,"name",{value:e,configurable:!0}),Ps=(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')}),hl=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var Mn=(r,e)=>{for(var t in e)mr(r,t,{get:e[t],enumerable:!0})},Ng=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Fg(e))!_g.call(r,s)&&s!==t&&mr(r,s,{get:()=>e[s],enumerable:!(n=Og(e,s))||n.enumerable});return r};var at=r=>Ng(mr({},"__esModule",{value:!0}),r);var yl=w(()=>{"use strict"});var gr,wl=w(()=>{"use strict";gr={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 Cs,fr=w(()=>{"use strict";Cs={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 Sl(r){return r instanceof Error&&"code"in r}function C(r){return Sl(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(Sl,"isNodeError");l(C,"isNotFoundError");l(y,"getErrorMessage")});var kl=w(()=>{"use strict"});var bl=w(()=>{"use strict";kl()});function hr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var I,Pl,On=w(()=>{"use strict";I={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"},Pl=["frontend","backend","devops","docs","testing","database","general"];l(hr,"calculateConfidence")});var di=w(()=>{"use strict"});var pi=w(()=>{"use strict";yl();wl();fr();O();bl();On();di()});var H={};Mn(H,{calculateDuration:()=>Yg,formatDate:()=>yr,formatDuration:()=>xs,formatMonth:()=>Gg,getDateKey:()=>Wg,getDateRange:()=>Jg,getDaysAgo:()=>Bt,getDaysFromNow:()=>Vg,getEndOfDay:()=>Qg,getStartOfDay:()=>Xg,getTimestamp:()=>k,getTodayKey:()=>Cl,getYearMonthDay:()=>mi,isToday:()=>qg,isWithinLastDays:()=>Kg,parseDate:()=>Bg,toRelative:()=>Zg});import{formatDistanceToNowStrict as zg}from"date-fns";function yr(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 Gg(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Cl(){return yr(new Date)}function Wg(r){return yr(r)}function mi(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Bg(r){return new Date(r)}function k(){return new Date().toISOString()}function Bt(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Vg(r){let e=new Date;return e.setDate(e.getDate()+r),e}function Jg(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 qg(r){return yr(r)===Cl()}function Kg(r,e){let t=Bt(e);return r>=t}function xs(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 Yg(r,e=new Date){let t=e.getTime()-r.getTime();return xs(t)}function Xg(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Qg(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Zg(r){let e=typeof r=="string"?new Date(r):r;return zg(e,{addSuffix:!0})}var se=w(()=>{"use strict";l(yr,"formatDate");l(Gg,"formatMonth");l(Cl,"getTodayKey");l(Wg,"getDateKey");l(mi,"getYearMonthDay");l(Bg,"parseDate");l(k,"getTimestamp");l(Bt,"getDaysAgo");l(Vg,"getDaysFromNow");l(Jg,"getDateRange");l(qg,"isToday");l(Kg,"isWithinLastDays");l(xs,"formatDuration");l(Yg,"calculateDuration");l(Xg,"getStartOfDay");l(Qg,"getEndOfDay");l(Zg,"toRelative")});import Tl from"node:fs/promises";async function El(r,e){let t;try{t=await Tl.readFile(r,"utf-8")}catch(o){if(C(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await xl(r,t),vl(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await xl(r,t),vl(r,ef(s.error)),null)}async function xl(r,e){let t=`${r}.backup`;try{await Tl.writeFile(t,e,"utf-8")}catch{}}function vl(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 ef(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Al=w(()=>{"use strict";O();l(El,"safeRead");l(xl,"createBackup");l(vl,"logCorruption");l(ef,"formatZodError")});var te={};Mn(te,{appendLine:()=>gi,appendToFile:()=>nf,atomicWrite:()=>tf,copyFile:()=>lf,deleteDir:()=>of,deleteFile:()=>rf,dirExists:()=>wr,ensureDir:()=>ft,fileExists:()=>M,getFileExtension:()=>mf,getFileModifiedTime:()=>cf,getFileNameWithoutExtension:()=>gf,getFileSize:()=>af,listFiles:()=>Nn,moveFile:()=>uf,prependToFile:()=>sf,readFile:()=>_n,readJson:()=>an,readLines:()=>df,writeFile:()=>Il,writeJson:()=>vs,writeLines:()=>pf});import re from"node:fs/promises";import Fn from"node:path";async function an(r,e=null,t){if(t)return await El(r,t)??e;try{let n=await re.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(C(n))return e;throw n}}async function vs(r,e,t=2){let n=JSON.stringify(e,null,t);await re.writeFile(r,n,"utf-8")}async function _n(r,e=""){try{return await re.readFile(r,"utf-8")}catch(t){if(C(t))return e;throw t}}async function Il(r,e){let t=Fn.dirname(r);await re.mkdir(t,{recursive:!0}),await re.writeFile(r,e,"utf-8")}async function tf(r,e){let t=Fn.dirname(r);await re.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await re.writeFile(n,e,"utf-8"),await re.rename(n,r)}async function nf(r,e){await re.appendFile(r,e,"utf-8")}async function gi(r,e){let t=Fn.dirname(r);await re.mkdir(t,{recursive:!0}),await re.appendFile(r,`${e}
7
- `,"utf-8")}async function sf(r,e){try{let t=await re.readFile(r,"utf-8");await re.writeFile(r,e+t,"utf-8")}catch(t){if(C(t))await re.writeFile(r,e,"utf-8");else throw t}}async function M(r){try{return await re.access(r),!0}catch(e){if(C(e))return!1;throw e}}async function wr(r){try{return(await re.stat(r)).isDirectory()}catch(e){if(C(e))return!1;throw e}}async function ft(r){await re.mkdir(r,{recursive:!0})}async function rf(r){try{return await re.unlink(r),!0}catch(e){if(C(e))return!1;throw e}}async function of(r){try{return await re.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(C(e))return!1;throw e}}async function Nn(r,e={}){try{let n=await re.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(C(t))return[];throw t}}async function af(r){return(await re.stat(r)).size}async function cf(r){return(await re.stat(r)).mtime}async function lf(r,e){await re.copyFile(r,e)}async function uf(r,e){await re.rename(r,e)}async function df(r){return(await _n(r,"")).split(`
8
- `)}async function pf(r,e){let t=e.join(`
9
- `);await Il(r,t)}function mf(r){return Fn.extname(r)}function gf(r){return Fn.basename(r,Fn.extname(r))}var je=w(()=>{"use strict";Al();O();l(an,"readJson");l(vs,"writeJson");l(_n,"readFile");l(Il,"writeFile");l(tf,"atomicWrite");l(nf,"appendToFile");l(gi,"appendLine");l(sf,"prependToFile");l(M,"fileExists");l(wr,"dirExists");l(ft,"ensureDir");l(rf,"deleteFile");l(of,"deleteDir");l(Nn,"listFiles");l(af,"getFileSize");l(cf,"getFileModifiedTime");l(lf,"copyFile");l(uf,"moveFile");l(df,"readLines");l(pf,"writeLines");l(mf,"getFileExtension");l(gf,"getFileNameWithoutExtension")});import{z as It}from"zod";function Dl(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 ux,dx,px,Ts,mx,Es=w(()=>{"use strict";ux=It.enum(["opus","sonnet","haiku"]),dx=It.enum(["2.5-pro","2.5-flash","2.0-flash"]),px=It.string().min(1),Ts=It.object({provider:It.string(),model:It.string(),cliVersion:It.string().optional(),recordedAt:It.string()}),mx=It.object({preferredModel:It.string().optional(),lastAnalysisModel:Ts.optional()});l(Dl,"compareSemver")});import fi from"node:fs/promises";import ff from"node:os";import Rl from"node:path";async function Ml(){try{let r=await fi.readFile($l,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>hf?null:e.detection}catch{return null}}async function Ol(r){let e={timestamp:new Date().toISOString(),detection:r};await fi.mkdir(jl,{recursive:!0}),await fi.writeFile($l,JSON.stringify(e,null,2))}var jl,$l,hf,Fl=w(()=>{"use strict";jl=Rl.join(ff.homedir(),".prjct-cli","cache"),$l=Rl.join(jl,"providers.json"),hf=600*1e3;l(Ml,"readProviderCache");l(Ol,"writeProviderCache")});var et={};Mn(et,{AntigravityProvider:()=>wi,ClaudeProvider:()=>Sr,CursorProvider:()=>Ll,GeminiProvider:()=>yi,Providers:()=>ht,WindsurfProvider:()=>Ul,detectAllProviders:()=>Si,detectAntigravity:()=>vf,detectCursorProject:()=>zl,detectProvider:()=>hi,detectWindsurfProject:()=>Gl,getActiveProvider:()=>bf,getCommandsDir:()=>If,getGlobalContextPath:()=>Tf,getGlobalSettingsPath:()=>Ef,getProjectCommandsPath:()=>Df,getProviderBranding:()=>kr,getSkillsPath:()=>Af,hasProviderConfig:()=>Pf,needsCursorRouterRegeneration:()=>Cf,needsWindsurfRouterRegeneration:()=>xf,selectProvider:()=>Rf,validateCliVersion:()=>Hl});import{exec as yf}from"node:child_process";import Ln from"node:os";import Ne from"node:path";import{promisify as wf}from"node:util";async function Sf(r){try{let{stdout:e}=await _l(`which ${r}`,{timeout:Nl});return e.trim()}catch{return null}}async function kf(r){try{let{stdout:e}=await _l(`${r} --version`,{timeout:Nl}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function hi(r){let e=ht[r];if(!e.cliCommand)return{installed:!1};let t=await Sf(e.cliCommand);if(!t)return{installed:!1};let n=await kf(e.cliCommand),s=Hl(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Hl(r,e){let t=ht[r];return!t.minCliVersion||!e?null:Dl(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 Si(r=!1){if(!r){let s=await Ml();if(s)return s}let[e,t]=await Promise.all([hi("claude"),hi("gemini")]),n={claude:e,gemini:t};return await Ol(n).catch(()=>{}),n}async function bf(r){if(r&&ht[r])return ht[r];let e=await Si();return e.claude.installed&&!e.gemini.installed?Sr:e.gemini.installed&&!e.claude.installed?yi:Sr}async function Pf(r){let e=ht[r];return e.configDir?M(e.configDir):!1}function kr(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf"}[r]||"\u26A1 prjct"}}async function zl(r){let e=Ne.join(r,".cursor"),t=Ne.join(e,"rules"),n=Ne.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 Cf(r){let e=await zl(r);return e.detected&&!e.routerInstalled}async function Gl(r){let e=Ne.join(r,".windsurf"),t=Ne.join(e,"rules"),n=Ne.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 xf(r){let e=await Gl(r);return e.detected&&!e.routerInstalled}async function vf(){let r=wi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ne.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}}function Tf(r){let e=ht[r];return e.configDir?Ne.join(e.configDir,e.contextFile):null}function Ef(r){let e=ht[r];return!e.configDir||!e.settingsFile?null:Ne.join(e.configDir,e.settingsFile)}function Af(r){return ht[r].skillsDir}function If(r){return ht[r].commandsDir}function Df(r,e){let t=ht[r];return Ne.join(e,t.commandsDir)}async function Rf(){let r=await Si(),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 _l,Nl,Sr,yi,wi,Ll,Ul,ht,Ve=w(()=>{"use strict";Es();je();Fl();_l=wf(yf),Nl=2e3,Sr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ne.join(Ln.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ne.join(Ln.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"},yi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ne.join(Ln.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ne.join(Ln.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"},wi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ne.join(Ln.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ne.join(Ln.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},Ll={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},Ul={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},ht={claude:Sr,gemini:yi,cursor:Ll,antigravity:wi,windsurf:Ul};l(Sf,"whichCommand");l(kf,"getCliVersion");l(hi,"detectProvider");l(Hl,"validateCliVersion");l(Si,"detectAllProviders");l(bf,"getActiveProvider");l(Pf,"hasProviderConfig");l(kr,"getProviderBranding");l(zl,"detectCursorProject");l(Cf,"needsCursorRouterRegeneration");l(Gl,"detectWindsurfProject");l(xf,"needsWindsurfRouterRegeneration");l(vf,"detectAntigravity");l(Tf,"getGlobalContextPath");l(Ef,"getGlobalSettingsPath");l(Af,"getSkillsPath");l(If,"getCommandsDir");l(Df,"getProjectCommandsPath");l(Rf,"selectProvider")});import jf from"node:crypto";import Dt from"node:fs/promises";import ki from"node:os";import _ from"node:path";import{globSync as $f}from"glob";var bi,Mf,E,ue=w(()=>{"use strict";se();je();bi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?_.resolve(e):_.join(ki.homedir(),".prjct-cli"),this.globalProjectsDir=_.join(this.globalBaseDir,"projects"),this.globalConfigDir=_.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=_.resolve(e),this.globalProjectsDir=_.join(this.globalBaseDir,"projects"),this.globalConfigDir=_.join(this.globalBaseDir,"config")}generateProjectId(e){return jf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return _.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return _.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return _.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return _.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await wr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await ft(this.globalBaseDir),await ft(this.globalProjectsDir),await ft(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 ft(_.join(t,s));return await ft(_.join(t,"planning","tasks")),await ft(_.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=mi(t);return _.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 ft(n),n}async listSessions(e,t=null,n=null){let s=_.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Dt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=_.join(s,a.name),u=await Dt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=_.join(c,d.name),p=await Dt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:_.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 _.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Dt.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 wr(t)}getDisplayPath(e){let t=ki.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return _.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return _.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return _.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return _.join(this.globalBaseDir,".running")}getDocsPath(){return _.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Ve(),at(et)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ve(),at(et)).getActiveProvider();return(Ve(),at(et)).getGlobalSettingsPath(e.name)}getClaudeDir(){return _.join(ki.homedir(),".claude")}getClaudeSettingsPath(){return _.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?_.join(this.getGlobalProjectPath(e),"agents"):_.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return _.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return _.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=_.join(e,s.file);if(await M(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=_.join(e,"package.json");if(await M(s))try{let o=await Dt.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 Dt.readFile(_.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
10
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=_.join(e,"package.json"),i=await Dt.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=_.join(e,"lerna.json");if(await M(c)){let u=await Dt.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=_.join(e,"package.json"),i=await Dt.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=$f(o,{cwd:e,absolute:!1});for(let a of i){let c=_.join(e,a),u=_.join(c,"package.json");if(await M(u))try{let d=await Dt.readFile(u,"utf-8"),m=JSON.parse(d),p=_.join(c,"PRJCT.md");n.push({name:m.name||_.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=_.resolve(e);for(let s of t.packages){let o=_.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=_.resolve(e),n=_.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=_.dirname(t)}return null}},Mf=new bi,E=Mf});function Of(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function As(){return Of()==="bun"}var Pi=w(()=>{"use strict";l(Of,"detectRuntime");l(As,"isBun")});import Ci from"node:fs";import Wl from"node:path";function Ff(r){if(As()){let{Database:s}=Ps("bun:sqlite");return new s(r,{create:!0})}let e=Ps("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var _f,br,$,z,le=w(()=>{"use strict";ue();Pi();l(Ff,"openDatabase");_f=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
5
+ var require = __createRequire(import.meta.url);
6
+ var __filename = __fileURLToPath(import.meta.url);
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(`
11
13
  -- =======================================================================
12
14
  -- Document storage (backward-compatible with JSON file pattern)
13
15
  -- =======================================================================
@@ -238,13 +240,13 @@ var mr=Object.defineProperty;var Og=Object.getOwnPropertyDescriptor;var Fg=Objec
238
240
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
239
241
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
240
242
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
241
- `)},"up")}],br=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Wl.join(E.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Wl.dirname(n);Ci.existsSync(s)||Ci.mkdirSync(s,{recursive:!0});let o=Ff(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 Ci.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")}],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(`
242
244
  CREATE TABLE IF NOT EXISTS _migrations (
243
245
  version INTEGER PRIMARY KEY,
244
246
  name TEXT NOT NULL,
245
247
  applied_at TEXT NOT NULL
246
248
  )
247
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of _f)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 br,z=$});function vi(r){if(Pl.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Pr))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 xi,Pr,cn,Is,Ds,Rs=w(()=>{"use strict";le();On();se();xi={frontend:[I.CODE_STYLE,I.FILE_STRUCTURE,I.ARCHITECTURE,I.TECH_STACK],backend:[I.CODE_STYLE,I.ARCHITECTURE,I.DEPENDENCIES,I.TECH_STACK],devops:[I.SHIP_WORKFLOW,I.TEST_BEHAVIOR,I.DEPENDENCIES,I.ARCHITECTURE],docs:[I.CODE_STYLE,I.NAMING_CONVENTION,I.FILE_STRUCTURE],testing:[I.TEST_BEHAVIOR,I.CODE_STYLE,I.DEPENDENCIES],database:[I.ARCHITECTURE,I.NAMING_CONVENTION,I.TECH_STACK,I.DEPENDENCIES],general:Object.values(I)},Pr={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(vi,"resolveCanonicalDomains");cn=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=z.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();z.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}},Is=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()}},Ds=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:k(),...t,type:t.type};z.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return z.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 js,Ti=w(()=>{"use strict";le();On();se();Rs();js=class r extends cn{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=hr(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=hr(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:hr(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=z.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return z.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Bl=w(()=>{"use strict"});import $s from"node:fs/promises";import Vt from"node:path";import{z as ee}from"zod";async function zf(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=Vt.join(e,"package.json"),s=await $s.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 Gf(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 Jf(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Hf[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 Wf(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=Vt.join(e,a);try{await $s.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 Bf(r,e){let t=Date.now();try{let n=await qf(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 Vf(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=Vt.join(e,o.file);try{await $s.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 Vl(r,e){let t=Date.now(),n=await Promise.all([zf(r,e),Gf(r,e),Wf(r,e),Bf(r,e),Vf(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 Jf(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await $s.readdir(s,{withFileTypes:!0});for(let i of o){let a=Vt.join(s,i.name),c=Vt.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Vt.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function qf(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await $s.readdir(s,{withFileTypes:!0});for(let i of o){let a=Vt.join(s,i.name),c=Vt.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 Nf,Lf,Uf,Ei,av,Hf,Ai=w(()=>{"use strict";O();Es();Nf=ee.enum(["draft","verified","sealed"]),Lf=ee.object({name:ee.string(),description:ee.string(),location:ee.string().optional()}),Uf=ee.object({issue:ee.string(),file:ee.string(),suggestion:ee.string()}),Ei=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(Lf),antiPatterns:ee.array(Uf),analyzedAt:ee.string(),modelMetadata:Ts.optional(),status:Nf.default("draft"),commitHash:ee.string().optional(),signature:ee.string().optional(),sealedAt:ee.string().optional(),verifiedAt:ee.string().optional()}),av={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Hf={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(zf,"verifyFrameworks");l(Gf,"verifyLanguages");l(Wf,"verifyPatternLocations");l(Bf,"verifyFileCount");l(Vf,"verifyAntiPatternFiles");l(Vl,"semanticVerify");l(Jf,"getProjectExtensions");l(qf,"countProjectFiles")});import{z as ye}from"zod";var Cr,Jt,Kf,dv,Ii,Jl,Ms=w(()=>{"use strict";Cr=ye.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Jt=ye.object({primaryDomain:Cr,secondaryDomains:ye.array(Cr),confidence:ye.number().min(0).max(1),filePatterns:ye.array(ye.string()),relevantAgents:ye.array(ye.string())}),Kf=ye.object({classification:Jt,classifiedAt:ye.string(),source:ye.enum(["cache","history","llm","heuristic"]),descriptionHash:ye.string(),projectId:ye.string()}),dv=ye.object({entries:ye.record(ye.string(),Kf),confirmedPatterns:ye.array(ye.object({descriptionHash:ye.string(),classification:Jt,confirmedAt:ye.string(),taskDescription:ye.string()}))}),Ii={entries:{},confirmedPatterns:[]},Jl={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as N}from"zod";var Yf,Xf,ql,Qf,Zf,eh,th,nh,Kl,gv,Di=w(()=>{"use strict";Yf=N.enum(["low","medium","high"]),Xf=N.enum(["pending","converted","completed","archived","dormant"]),ql=N.enum(["high","medium","low"]),Qf=N.object({impact:ql,effort:ql}),Zf=N.object({frontend:N.string().optional(),backend:N.string().optional(),payments:N.string().optional(),ai:N.string().optional(),deploy:N.string().optional(),other:N.array(N.string()).optional()}),eh=N.object({name:N.string(),description:N.string()}),th=N.object({name:N.string(),description:N.string().optional()}),nh=N.object({id:N.string(),text:N.string(),details:N.string().optional(),priority:Yf,status:Xf,tags:N.array(N.string()),addedAt:N.string(),completedAt:N.string().optional(),convertedTo:N.string().optional(),source:N.string().optional(),sourceFiles:N.array(N.string()).optional(),painPoints:N.array(N.string()).optional(),solutions:N.array(N.string()).optional(),filesAffected:N.array(N.string()).optional(),impactEffort:Qf.optional(),implementationNotes:N.string().optional(),stack:Zf.optional(),modules:N.array(eh).optional(),roles:N.array(th).optional(),risks:N.array(N.string()).optional(),risksCount:N.number().optional()}),Kl=N.object({ideas:N.array(nh),lastUpdated:N.string()}),gv={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as G}from"zod";function Xl(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Yl,sh,rh,oh,ih,wv,Sv,Ri=w(()=>{"use strict";Yl=G.enum(["linear","jira","github","monday","asana","none"]),sh=G.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),rh=G.enum(["none","urgent","high","medium","low"]),oh=G.enum(["feature","bug","improvement","task","chore","epic"]),ih=G.object({id:G.string(),identifier:G.string(),title:G.string(),description:G.string().optional(),status:sh,priority:rh,type:oh.optional(),assignee:G.object({id:G.string(),name:G.string(),email:G.string().optional()}).optional(),labels:G.array(G.string()).default([]),team:G.object({id:G.string(),name:G.string(),key:G.string().optional()}).optional(),project:G.object({id:G.string(),name:G.string()}).optional(),url:G.string(),createdAt:G.string(),updatedAt:G.string(),fetchedAt:G.string()}),wv=G.object({provider:Yl,lastSync:G.string(),staleAfter:G.number().default(18e5),issues:G.record(G.string(),ih)}),Sv=G.object({provider:Yl,fetched:G.number(),updated:G.number(),errors:G.array(G.object({issueId:G.string(),error:G.string()})),timestamp:G.string()});l(Xl,"createEmptyIssues")});var nu={};Mn(nu,{AgentAssignmentSchema:()=>Ql,OUTPUT_SCHEMAS:()=>eu,SubtaskBreakdownSchema:()=>Zl,TaskClassificationSchema:()=>Jt,renderSchemaForPrompt:()=>ji});import{z as Ae}from"zod";function ji(r){let e=eu[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 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
248
250
 
249
251
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
250
252
 
@@ -253,15 +255,15 @@ ${e.example}
253
255
  \`\`\`
254
256
 
255
257
  Fields:
256
- ${ah(e.schema)}`:null}function ah(r){if(r instanceof Ae.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${tu(n)}`).join(`
257
- `)}return"(see example above)"}function tu(r){return r instanceof Ae.ZodString?"string":r instanceof Ae.ZodNumber?"number":r instanceof Ae.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ae.ZodArray?`array of ${tu(r.element)}`:r instanceof Ae.ZodObject?"object":"any"}var Ql,Zl,eu,xr=w(()=>{"use strict";Ms();Ms();Ql=Ae.object({agentName:Ae.string(),reasoning:Ae.string(),confidence:Ae.number().min(0).max(1)}),Zl=Ae.object({subtasks:Ae.array(Ae.object({description:Ae.string(),domain:Cr,agent:Ae.string(),dependsOn:Ae.array(Ae.number())})),effort:Ae.enum(["low","medium","high"])}),eu={classification:{schema:Jt,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Ql,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Zl,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(ji,"renderSchemaForPrompt");l(ah,"describeSchema");l(tu,"describeField")});import{z as v}from"zod";var su,ch,lh,ru,uh,dh,ph,mh,gh,fh,hh,ou,yh,wh,Ev,iu,au,cu,lu,Sh,vr,$i=w(()=>{"use strict";su=v.number().min(1).max(5),ch=v.enum(["exceeded","met","partial","failed"]),lh=v.enum(["definitely","probably","maybe","no"]),ru=v.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),uh=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:ru.optional(),explanation:v.string().optional()})}),dh=v.object({name:v.string(),baseline:v.number().nullable(),target:v.number(),actual:v.number(),unit:v.string(),achieved:v.boolean(),percentOfTarget:v.number()}),ph=v.object({criteria:v.string(),met:v.boolean(),notes:v.string().optional()}),mh=v.object({metrics:v.array(dh),acceptanceCriteria:v.array(ph),overallSuccess:ch,successScore:v.number().min(0).max(100)}),gh=v.object({category:v.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:v.string(),actionable:v.boolean(),action:v.string().optional()}),fh=v.object({whatWorked:v.array(v.string()),whatDidnt:v.array(v.string()),surprises:v.array(v.string()),recommendations:v.array(gh)}),hh=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:lh,worthItReason:v.string().optional(),alternativeConsidered:v.string().optional(),betterAlternativeExists:v.boolean().optional()}),ou=v.object({id:v.string(),taskId:v.string(),description:v.string(),estimatedMinutes:v.number().optional(),actualMinutes:v.number(),completedAsPlanned:v.boolean(),qualityScore:su,blockers:v.array(v.string()),agentUsed:v.string().optional(),skillsUsed:v.array(v.string()).optional(),startedAt:v.string(),completedAt:v.string()}),yh=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:uh,success:mh.optional(),learnings:fh,roi:hh,rating:su,taskOutcomes:v.array(ou).optional(),startedAt:v.string(),shippedAt:v.string(),reviewedAt:v.string().optional(),reviewedBy:v.string().optional(),legacy:v.boolean().optional()}),wh=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:ru,count:v.number(),averageVariance:v.number()})),topLearnings:v.array(v.object({insight:v.string(),frequency:v.number()}))}),Ev=v.object({outcomes:v.array(yh),taskOutcomes:v.array(ou).optional(),aggregates:wh.optional(),lastUpdated:v.string(),lastAggregated:v.string().optional()}),iu={outcomes:[],taskOutcomes:[],lastUpdated:""},au=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"),cu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),lu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Sh=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),vr=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=>Sh(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 xe}from"zod";function vh(){let r={};for(let e of Ph)r[e]="allow";for(let e of Ch)r[e]="ask";for(let e of xh)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Tr,Rv,kh,Mi,bh,jv,Ph,Ch,xh,$v,uu=w(()=>{"use strict";Tr=xe.enum(["allow","deny","ask"]),Rv=xe.enum(["read","write","delete","create"]),kh=xe.record(xe.string(),Tr),Mi=xe.record(xe.string(),Tr),bh=xe.object({enabled:xe.boolean().default(!0),allowedDomains:xe.array(xe.string()).optional(),blockedDomains:xe.array(xe.string()).optional()}),jv=xe.object({bash:kh.optional(),files:xe.object({read:Mi.optional(),write:Mi.optional(),delete:Mi.optional()}).optional(),web:bh.optional(),skills:xe.record(xe.string(),Tr).optional(),doomLoop:xe.object({enabled:xe.boolean().default(!0),maxRetries:xe.number().default(3)}).optional(),externalDirectories:Tr.default("ask")}),Ph=["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*"],Ch=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],xh=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(vh,"buildDefaultPermissions");$v=vh()});import{z as Ge}from"zod";var _v,Nv,du=w(()=>{"use strict";_v=Ge.object({projectId:Ge.string(),name:Ge.string(),repoPath:Ge.string(),description:Ge.string().optional(),version:Ge.string().optional(),cliVersion:Ge.string().optional(),techStack:Ge.array(Ge.string()),fileCount:Ge.number(),commitCount:Ge.number(),createdAt:Ge.string(),lastSync:Ge.string(),lastSyncCommit:Ge.string().optional(),lastSyncBranch:Ge.string().optional()}),Nv={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as T}from"zod";var Th,Eh,Ah,Ih,Dh,Rh,jh,$h,Mh,Oh,Fh,_h,Nh,Lh,Uh,Hh,zh,Gh,zv,Gv,pu=w(()=>{"use strict";Th=T.enum(["planned","active","completed","shipped"]),Eh=T.enum(["low","medium","high"]),Ah=T.enum(["feature","breaking_change","refactor","infrastructure"]),Ih=T.enum(["completed","active","planned"]),Dh=T.enum(["planned","active","completed"]),Rh=T.enum(["git","git-branch","manual","prd"]),jh=T.object({id:T.string(),description:T.string(),completed:T.boolean(),completedAt:T.string().optional()}),$h=T.object({id:T.string(),name:T.string(),status:Ih,completedAt:T.string().optional()}),Mh=T.object({goal:T.string(),phases:T.array($h),successMetrics:T.array(T.string()).optional()}),Oh=T.object({hours:T.number(),minutes:T.number(),totalMinutes:T.number(),display:T.string().optional()}),Fh=T.object({hash:T.string(),message:T.string(),date:T.string(),author:T.string().optional()}),_h=T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),breakdown:T.array(T.object({area:T.string(),hours:T.number()})).optional()}),Nh=T.object({hours:T.number().optional(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional()}),Lh=T.object({estimated:_h.nullable(),actual:Nh.nullable()}),Uh=T.object({totalHours:T.number(),allocatedHours:T.number(),bufferPercent:T.number().optional()}),Hh=T.object({id:T.string(),name:T.string(),theme:T.string().optional(),goals:T.array(T.string()).optional(),features:T.array(T.string()),capacity:Uh.optional(),status:Dh,startDate:T.string().optional(),endDate:T.string().optional()}),zh=T.object({id:T.string(),name:T.string(),description:T.string().optional(),date:T.string(),status:Th,impact:Eh,effort:T.string().optional(),progress:T.number(),type:Ah.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(jh),createdAt:T.string(),shippedAt:T.string().optional(),version:T.string().optional(),duration:Oh.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:Rh.optional(),quarter:T.string().nullable().optional(),dependencies:T.array(T.string()).optional(),blockedBy:T.array(T.string()).optional(),effortTracking:Lh.optional(),valueScore:T.number().optional(),commits:T.array(Fh).optional(),branch:T.string().optional(),commitsAhead:T.number().optional()}),Gh=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()}),zv=T.object({strategy:Mh.nullable().optional(),features:T.array(zh),backlog:T.array(T.union([T.string(),Gh])),lastUpdated:T.string(),quarters:T.array(Hh).optional(),generatedFrom:T.enum(["git-history","manual","prd"]).optional(),generatedAt:T.string().optional()}),Gv={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 Wh from"node:crypto";import{homedir as Bh}from"node:os";import{join as Vh}from"node:path";function oe(){return Wh.randomUUID()}var Jh,mu=w(()=>{"use strict";l(oe,"generateUUID");Jh=Vh(Bh(),".prjct-cli","projects")});import{z as V}from"zod";var qh,gu,Kh,Yh,Xh,Qh,Zh,ey,ty,fu,Oi=w(()=>{"use strict";qh=V.enum(["feature","fix","improvement","refactor"]),gu=V.enum(["pass","warning","fail","skipped"]),Kh=V.enum(["added","changed","fixed","removed"]),Yh=V.object({hours:V.number(),minutes:V.number(),totalMinutes:V.number()}),Xh=V.object({filesChanged:V.number().nullable().optional(),linesAdded:V.number().nullable().optional(),linesRemoved:V.number().nullable().optional(),commits:V.number().nullable().optional()}),Qh=V.object({description:V.string(),type:Kh.optional()}),Zh=V.object({lintStatus:gu.nullable().optional(),lintDetails:V.string().optional(),testStatus:gu.nullable().optional(),testDetails:V.string().optional()}),ey=V.object({hash:V.string().optional(),message:V.string().optional(),branch:V.string().optional()}),ty=V.object({id:V.string(),name:V.string(),version:V.string().nullable().optional(),type:qh,agent:V.string().optional(),description:V.string().optional(),changes:V.array(Qh).optional(),codeSnippets:V.array(V.string()).optional(),commit:ey.optional(),codeMetrics:Xh.optional(),qualityMetrics:Zh.optional(),quantitativeImpact:V.string().optional(),duration:Yh.optional(),tasksCompleted:V.number().nullable().optional(),shippedAt:V.string(),featureId:V.string().optional()}),fu=V.object({shipped:V.array(ty),lastUpdated:V.string()})});import{z as x}from"zod";var ny,yu,sy,ry,oy,Fi,wu,iy,ay,Su,hu,cy,ly,ku,bu,Pu,uy,dy,nT,Er=w(()=>{"use strict";Es();ny=x.enum(["low","medium","high","critical"]),yu=x.enum(["feature","bug","improvement","chore"]),sy=x.enum(["active","backlog","previously_active"]),ry=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),oy=x.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Fi=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()}),wu=x.object({output:x.string().min(1,"Subtask output is required"),summary:Fi}),iy=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:ry,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:Fi.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),ay=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),Su=x.object({id:x.string(),description:x.string(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(iy).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:ay.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:Ts.optional()}),hu=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional()}),cy=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()}),ly=x.object({taskId:x.string(),title:x.string(),classification:yu,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(Fi),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:cy.optional()}),ku=x.object({currentTask:Su.nullable(),previousTask:hu.nullable().optional(),pausedTasks:x.array(hu).optional(),taskHistory:x.array(ly).optional(),lastUpdated:x.string()}),bu=x.object({id:x.string(),description:x.string(),priority:ny,type:yu,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:sy,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),Pu=x.object({tasks:x.array(bu),lastUpdated:x.string()}),uy=x.object({tasksToday:x.number(),tasksThisWeek:x.number(),streak:x.number(),velocity:x.string(),avgDuration:x.string()}),dy=x.object({type:oy,description:x.string(),timestamp:x.string(),duration:x.string().optional()}),nT=x.object({projectId:x.string(),currentTask:Su.nullable(),queue:x.array(bu),stats:uy,recentActivity:x.array(dy),lastSync:x.string()})});import{z as Q}from"zod";var py,my,Cu,iT,aT,cT,qt,xu,Un=w(()=>{"use strict";py=Q.enum(["improving","stable","declining"]),my=Q.object({sprintNumber:Q.number(),startDate:Q.string(),endDate:Q.string(),pointsCompleted:Q.number(),tasksCompleted:Q.number(),avgVariance:Q.number(),estimationAccuracy:Q.number()}),Cu=Q.object({category:Q.string(),avgVariance:Q.number(),taskCount:Q.number()}),iT=Q.object({totalPoints:Q.number(),sprints:Q.number(),estimatedDate:Q.string()}),aT=Q.object({sprints:Q.array(my),averageVelocity:Q.number(),velocityTrend:py,estimationAccuracy:Q.number(),overEstimated:Q.array(Cu),underEstimated:Q.array(Cu),lastUpdated:Q.string()}),cT=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)}),qt={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},xu={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var yt=w(()=>{"use strict";Bl();Ai();Ms();Di();Ri();xr();Es();$i();uu();du();pu();mu();Oi();Er();Un()});var ln,_i=w(()=>{"use strict";yt();On();se();Rs();ln=class extends cn{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(I),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(I);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(I));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=k(),u={id:oe(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=k(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),j=(p.tags||[]).filter(q=>D.includes(q));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 D=this._extractKeywordsFromText(t.taskDescription),j=0;for(let q of D)p.content.toLowerCase().includes(q)&&(j+=2),p.title.toLowerCase().includes(q)&&(j+=3);g.keywords=Math.min(15,j)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=xi[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Pr[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 vi(e)}_getCommandTags(e){return{ship:[I.COMMIT_STYLE,I.SHIP_WORKFLOW,I.TEST_BEHAVIOR],feature:[I.ARCHITECTURE,I.CODE_STYLE],done:[I.SHIP_WORKFLOW],analyze:[I.TECH_STACK,I.ARCHITECTURE],spec:[I.ARCHITECTURE,I.CODE_STYLE],task:[I.BRANCH_NAMING,I.CODE_STYLE],sync:[I.TECH_STACK,I.ARCHITECTURE,I.DEPENDENCIES],test:[I.TEST_BEHAVIOR],bug:[I.CODE_STYLE,I.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:[I.COMMIT_STYLE,I.SHIP_WORKFLOW,I.TEST_BEHAVIOR],feature:[I.ARCHITECTURE,I.CODE_STYLE],done:[I.SHIP_WORKFLOW],analyze:[I.TECH_STACK,I.ARCHITECTURE],spec:[I.ARCHITECTURE,I.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:[I.COMMIT_STYLE],branch_naming:[I.BRANCH_NAMING],test_before_ship:[I.TEST_BEHAVIOR,I.SHIP_WORKFLOW],preferred_agent:[I.AGENT_PREFERENCE],code_style:[I.CODE_STYLE],verbosity:[I.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?`
258
- 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 Ni,gy,de,Hn=w(()=>{"use strict";Rs();Ti();_i();Rs();Ti();_i();Ni=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new ln,this._patternStore=new js,this._historyStore=new Ds,this._sessionStore=new Is}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()}},gy=new Ni,de=gy});import{exec as fy}from"node:child_process";import tt from"node:fs/promises";import wt from"node:path";import{promisify as hy}from"node:util";var un,Li,yy,Ie,vu=w(()=>{"use strict";O();un=hy(fy),Li=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=wt.join(this.projectPath,"package.json"),t=await tt.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=wt.join(this.projectPath,"Cargo.toml");return await tt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readRequirements(){try{let e=wt.join(this.projectPath,"requirements.txt");return await tt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGoMod(){try{let e=wt.join(this.projectPath,"go.mod");return await tt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGemfile(){try{let e=wt.join(this.projectPath,"Gemfile");return await tt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readMixExs(){try{let e=wt.join(this.projectPath,"mix.exs");return await tt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readPomXml(){try{let e=wt.join(this.projectPath,"pom.xml");return await tt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readComposerJson(){try{let e=wt.join(this.projectPath,"composer.json"),t=await tt.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=wt.join(this.projectPath,"pyproject.toml");return await tt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await un('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(`
259
- `).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 tt.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 tt.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 un(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await un("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await un('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await un('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 un('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 tt.access(wt.join(this.projectPath,e)),!0}catch(t){if(C(t))return!1;throw t}}async readFile(e){try{let t=wt.join(this.projectPath,e);return await tt.readFile(t,"utf-8")}catch(t){if(C(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await un(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
260
- `).filter(Boolean)}catch{return[]}}},yy=new Li,Ie=yy});import{z as ie}from"zod";function wy(r){return r instanceof zn}function K(r){return wy(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Gn,tE,nE,sE,rE,oE,iE,zn,Ar,Ir,Os,Ut=w(()=>{"use strict";Gn={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}},tE=Gn.create("FileError",ie.object({path:ie.string(),operation:ie.enum(["read","write","delete","create","copy"]),reason:ie.string().optional()})),nE=Gn.create("ValidationError",ie.object({field:ie.string(),expected:ie.string(),received:ie.string().optional(),message:ie.string().optional()})),sE=Gn.create("PermissionError",ie.object({action:ie.string(),resource:ie.string(),reason:ie.string().optional()})),rE=Gn.create("TaskError",ie.object({taskId:ie.string().optional(),operation:ie.enum(["create","update","complete","pause","resume","delete"]),reason:ie.string()})),oE=Gn.create("SessionError",ie.object({sessionId:ie.string().optional(),reason:ie.string()})),iE=Gn.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)}},Ar=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")}},Ir=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")}},Os=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(wy,"isPrjctError");l(K,"getErrorMessage")});import Ui from"node:fs";import Rr from"node:path";function Tu(){if(Fs)return Fs;let r=__dirname;for(let e=0;e<5;e++){let t=Rr.join(r,"package.json");if(Ui.existsSync(t))try{if(JSON.parse(Ui.readFileSync(t,"utf-8")).name==="prjct-cli")return Fs=r,r}catch{}r=Rr.dirname(r)}return Fs=Rr.join(__dirname,"..","..",".."),Fs}function ky(){if(Dr)return Dr;try{let r=Rr.join(Tu(),"package.json"),e=JSON.parse(Ui.readFileSync(r,"utf-8"));return Dr=e.version,Sy=e,Dr}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var Dr,Sy,Fs,Wn,ke,dn=w(()=>{"use strict";O();Dr=null,Sy=null,Fs=null;l(Tu,"getPackageRoot");l(ky,"getVersion");Wn=ky(),ke=Tu()});import zi from"node:fs";import by from"node:fs/promises";import jr from"node:path";function Gi(){if(Eu)return Hi;Eu=!0;let r=jr.join(ke,"dist","templates.json");try{let e=zi.readFileSync(r,"utf-8");return Hi=JSON.parse(e),Hi}catch{return null}}function Cy(r){let e=pn.indexOf(r);e>-1&&pn.splice(e,1),pn.push(r)}function xy(){for(;Bn.size>=Py&&pn.length>0;){let r=pn.shift();r&&Bn.delete(r)}}function $r(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(`
261
- `).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 Au(r){if(Bn.has(r))return Cy(r),Bn.get(r);let e,t=Gi();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=jr.join(ke,"templates","commands",`${r}.md`);try{e=await by.readFile(s,"utf-8")}catch{throw Ir.notFound(r)}}let n=$r(e);return xy(),Bn.set(r,n),pn.push(r),n}async function vy(r){return(await Au(r)).frontmatter["allowed-tools"]||[]}function Ty(){Bn.clear(),pn.length=0}function ve(r){let e=Gi();if(e?.[r])return e[r];let t=jr.join(ke,"templates",r);try{return zi.readFileSync(t,"utf-8")}catch{return null}}function Vn(r){let e=Gi();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=jr.join(ke,"templates",r);try{return zi.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Py,Bn,pn,Hi,Eu,Ey,Wi,Jn=w(()=>{"use strict";Ut();dn();Py=50,Bn=new Map,pn=[],Hi=null,Eu=!1;l(Gi,"loadBundle");l(Cy,"updateLruOrder");l(xy,"evictLru");l($r,"parseFrontmatter");l(Au,"load");l(vy,"getAllowedTools");l(Ty,"clearCache");l(ve,"getTemplateContent");l(Vn,"listTemplates");Ey={load:Au,parseFrontmatter:$r,getAllowedTools:vy,clearCache:Ty,getTemplateContent:ve,listTemplates:Vn},Wi=Ey});import W from"node:fs/promises";import Vi from"node:os";import J from"node:path";async function Ay(){try{let r=ve("global/modules/module-config.json");if(r)return JSON.parse(r);let e=J.join(ke,"templates/global/modules/module-config.json"),t=await W.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Iy(r){let e=await Ay();if(!e){let i=ve("global/CLAUDE.md");if(i)return i;let a=J.join(ke,"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=ve("global/CLAUDE.md");if(a)return a;let c=J.join(ke,"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=ve(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=J.join(ke,"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(`
262
- `)}async function Dy(){try{let r=J.join(Vi.homedir(),".prjct-cli","docs");await W.mkdir(r,{recursive:!0});let e=Vn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ve(s);if(o){let i=J.basename(s);await W.writeFile(J.join(r,i),o,"utf-8")}}return{success:!0}}let t=J.join(ke,"templates/global/docs"),n=await W.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=J.join(t,s),i=J.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 Ry(){let r=(Ve(),at(et)),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=J.join(e.configDir,e.contextFile),o=J.join(ke,"templates","global",e.contextFile),i="";try{let u=ve(`global/${e.contextFile}`);u?i=u:i=await W.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Iy()}catch{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=J.join(ke,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}}else{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=J.join(ke,"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
+ ${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}
263
265
 
264
- ${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 Iu(){let r=Vi.homedir();return{claude:{commands:J.join(r,".claude","commands","p"),config:J.join(r,".claude"),router:J.join(r,".claude","commands","p.md")},gemini:{commands:J.join(r,".gemini","commands"),config:J.join(r,".gemini"),router:J.join(r,".gemini","commands","p.toml")}}}var Bi,jy,Le,mn=w(()=>{"use strict";Jn();O();dn();l(Ay,"loadModuleConfig");l(Iy,"composeGlobalTemplate");l(Dy,"installDocs");l(Ry,"installGlobalConfig");Bi=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Vi.homedir(),this.templatesDir=J.join(ke,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ve(),at(et)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=J.join(t.configDir,"commands"):this.claudeCommandsPath=J.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=Vn("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(Ve(),at(et)).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=J.join(this.claudeCommandsPath,a),u=ve(`commands/${a}`);if(u)await W.writeFile(c,u,"utf-8");else{let d=J.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=J.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(ve(`commands/${e}.md`))return!0;try{let n=J.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(Ve(),at(et)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=J.join(t.configDir,"commands",n);await W.mkdir(J.dirname(s),{recursive:!0});let o=ve(`commands/${n}`);if(o)return await W.writeFile(s,o,"utf-8"),!0;let i=J.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(Ve(),at(et)).getActiveProvider(),n=J.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(J.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=J.join(this.claudeCommandsPath,o),a=n.includes(o),c=ve(`commands/${o}`);if(c)await W.writeFile(i,c,"utf-8");else{let u=J.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 Ry()}async installDocs(){return Dy()}};l(Iu,"getProviderPaths");jy=new Bi,Le=jy});import{z as we}from"zod";function $u(r,e="default"){let t=Du[e]||Du.default;return r/1e3*t}function Mr(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var $y,My,Ru,ju,Du,Or=w(()=>{"use strict";$y=we.object({date:we.string(),tokensSaved:we.number(),syncs:we.number(),avgCompressionRate:we.number(),totalDuration:we.number()}),My=we.object({agentName:we.string(),usageCount:we.number(),tokensSaved:we.number()}),Ru=we.object({totalTokensSaved:we.number(),avgCompressionRate:we.number(),syncCount:we.number(),watchTriggers:we.number(),avgSyncDuration:we.number(),totalSyncDuration:we.number(),agentUsage:we.array(My),dailyStats:we.array($y),firstSync:we.string(),lastUpdated:we.string()}),ju={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Du={"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($u,"estimateCostSaved");l(Mr,"formatCost")});function Oy(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Fy(r){let e=[],t=Oy(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Ji,o+i.length);if(c===-1)continue;let u=c+Ji.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function qi(r,e){let t=Fy(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: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+=`
265
267
 
266
268
  ---
267
269
 
@@ -272,11 +274,11 @@ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
272
274
  `;for(let s of t)n+=s.content,n+=`
273
275
 
274
276
  `;return`${n.trimEnd()}
275
- `}function Ki(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(`
276
- `);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(Ji)&&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 Ji,Yi=w(()=>{"use strict";Ji="<!-- /prjct:preserve -->";l(Oy,"createPreserveStartRegex");l(Fy,"extractPreservedSections");l(qi,"mergePreservedSections");l(Ki,"validatePreserveBlocks")});function _s(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&_y.has(e.code))return!0;if(e.code&&Ou.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 _r(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Ou.has(e.code))}function Mu(r,e,t){let n=Kt.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Kt.delete(r),!1):!0:!1}function Xi(r,e){let t=Kt.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Kt.set(r,t)}function Ny(r){Kt.delete(r)}var _y,Ou,Kt,Fr,Fu,Ns,Nr=w(()=>{"use strict";_y=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Ou=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(_s,"isTransientError");l(_r,"isPermanentError");Kt=new Map;l(Mu,"isCircuitOpen");l(Xi,"recordFailure");l(Ny,"recordSuccess");Fr=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(Mu(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 Ny(t),o}catch(o){if(n=o,s++,_r(o))throw Xi(t,this.options.circuitBreakerThreshold),o;if(!(_s(o)&&s<this.options.maxAttempts))throw Xi(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 Xi(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return _s(e)}isCircuitOpen(e){return Mu(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Kt.get(e)}resetCircuit(e){Kt.delete(e)}resetAllCircuits(){Kt.clear()}},Fu=new Fr({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Ns=new Fr({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var _u=w(()=>{"use strict";Yi();Nr()});import{exec as Ly}from"node:child_process";import{promisify as Uy}from"node:util";async function Lr(r){try{let{stdout:e}=await Hy(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function zy(){let r=await Lr("gh api user --jq .login");return r.success&&r.output||(r=await Lr("git config --global github.user"),r.success&&r.output)?r.output:null}async function Gy(){let r=await Lr("git config user.name");return r.success&&r.output?r.output:null}async function Wy(){let r=await Lr("git config user.email");return r.success&&r.output?r.output:null}async function qn(){let[r,e,t]=await Promise.all([zy(),Gy(),Wy()]);return{github:r,email:t,name:e||r||"Unknown"}}var Hy,Ur=w(()=>{"use strict";Hy=Uy(Ly);l(Lr,"execCommand");l(zy,"detectGitHubUsername");l(Gy,"detectGitName");l(Wy,"detectGitEmail");l(qn,"detect")});import gn from"node:fs/promises";import By from"node:path";import*as Hr from"jsonc-parser";function Nu(r){let e=[],t=Hr.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}: ${Hr.printParseErrorCode(n.error)}`)}return t}var Zi,Vy,R,nt=w(()=>{"use strict";Ut();O();se();dn();Ur();ue();l(Nu,"parseJsonc");Zi=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=E.getLocalConfigPath(e),n=await gn.readFile(t,"utf-8");return Nu(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 gn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await gn.writeFile(n,`${o}
277
- `,"utf-8")}async readGlobalConfig(e){try{let t=E.getGlobalProjectConfigPath(e),n=await gn.readFile(t,"utf-8");return Nu(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 gn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await gn.writeFile(n,`${o}
278
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=k();t={projectId:e,authors:[],version:Wn,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:Wn,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 gn.readdir(By.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 qn(),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))}}},Vy=new Zi,R=Vy});import zr from"node:fs/promises";import ea from"node:path";var ta,Lu,Uu=w(()=>{"use strict";nt();ue();O();ta=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 zr.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await zr.readFile(ea.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=ea.join(this.agentsPath,`${e}.md`),n=await zr.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=ea.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})}
279
- `;await zr.appendFile(s,o)}catch(s){C(s)||console.error(`Agent usage log error: ${y(s)}`)}}},Lu=ta});import Hu from"node:path";async function Ky(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await M(Hu.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await M(Hu.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Yy(){return{...Jy}}function Xy(){return{...qy}}async function zu(){return Gr||(Gr=await Ky()?Yy():Xy(),Gr)}var Gr,Jy,qy,Gu=w(()=>{"use strict";je();Gr=null,Jy={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}},qy={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(Ky,"isClaudeEnvironment");l(Yy,"getClaudeAgent");l(Xy,"getTerminalAgent");l(zu,"detect")});var Zy,na=w(()=>{Zy=hl({})});var ew,Wr,Kn,Wu=w(()=>{"use strict";Uu();Ut();Gu();Nr();na();ew=["claude"],Wr=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Lu}async initialize(){return this.agent?this.agent:await Fu.execute(async()=>{if(this.agentInfo=await zu(),!this.agentInfo?.isSupported)throw Os.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!ew.includes(e))throw Os.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Zy(`../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 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:`
280
282
  AGENTIC EXECUTION:
281
283
  - Read: templates/agentic/orchestrator.md
282
284
  - Analyze task: "${e}"
@@ -284,14 +286,14 @@ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
284
286
  - Claude decides which agent(s) to use
285
287
  - Always prefer specialists over generalist
286
288
  - Fragment complex tasks into subtasks
287
- `}}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}},Kn=new Wr});var Br,Vr,Bu=w(()=>{"use strict";Br=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"}},Vr=new Br});import tw from"node:crypto";import Jr from"node:fs/promises";import Vu from"node:path";function Ju(){return{version:St,lastUpdated:"",checksums:{}}}var St,sa,$e,Ls=w(()=>{"use strict";ue();O();se();le();St="1.0.0";l(Ju,"getDefaultChecksums");sa=class{static{l(this,"IndexStorage")}getIndexPath(e){return Vu.join(E.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Jr.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==St?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return Ju()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Jr.readFile(e);return tw.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:St,lastUpdated:k(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await Jr.readdir(t);await Promise.all(n.map(s=>Jr.unlink(Vu.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!==St?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==St?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.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)}},$e=new sa});var qu,nw,qr,sw,Ku=w(()=>{"use strict";Ls();qu=8e4,nw={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"]},qr=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||qu,[c,u,d]=await Promise.all([$e.readIndex(t),$e.readDomains(t),$e.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let j of m){let q=d.domainIndex[j]||[];for(let Re of q)p.add(Re)}if(i&&d.domainIndex.general){let j=d.domainIndex.general.slice(0,10);for(let q of j)p.add(q)}let g=c.relevantFiles.filter(j=>p.has(j.path)&&j.score>=o);g.sort((j,q)=>q.score-j.score);let f=0,S=[];for(let j of g){let q=Math.ceil(j.size/this.CHARS_PER_TOKEN);if(f+q>a||S.length>=s)break;S.push(j),f+=q}let b=Math.ceil(c.relevantFiles.reduce((j,q)=>j+q.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(nw))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await $e.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await $e.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return $e.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||qu,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)}},sw=new qr});import Yu from"node:path";var ra,Kr,rw,Xu=w(()=>{"use strict";Ls();se();ra=[{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"}],Kr=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 ra)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Yu.dirname(i.path);n.get(u).add(`**/${Yu.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=ra.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 ra)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:St,projectId:e,domains:t,discoveredAt:s};await $e.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:St,lastUpdate:s,fileCategories:n,domainIndex:i};await $e.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([$e.readDomains(e),$e.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await $e.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await $e.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:St,lastUpdate:k(),fileCategories:u,domainIndex:d};await $e.writeCategories(e,m)}return o}},rw=new Kr});import oa from"node:path";var ia,ow,iw,Yr,Qu,aa=w(()=>{"use strict";ia=30,ow=[/^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$/],iw=[/^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],Yr=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=ia){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=oa.basename(e.path);for(let n of ow)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=oa.basename(e.path);for(let s of iw)if(s.test(t))return 15;let n=oa.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}},Qu=new Yr});function Qr(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 aw[r]}var Y,ca,la,Xr,aw,kt,Zu,Us,Yt=w(()=>{"use strict";Y={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},ca=["feature","spec","design","refactor","migrate"],la=["ship","cleanup","git","migrate"],Xr=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],aw={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Qr,"getTimeout");kt={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},Zu={HISTORY_MAX:100},Us={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 ua(r,e){return{...Cs[r],...e}}function Zr(r,e,t){return{message:r,hint:e,...t}}var eo=w(()=>{"use strict";fr();fr();l(ua,"getError");l(Zr,"createError")});import{execSync as da}from"node:child_process";var to,pa,no,so,ma=w(()=>{"use strict";eo();to={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"}},pa=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=to[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=to[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new no(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=to[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
288
- `);throw new no({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
289
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(to),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=da(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:Zr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return da(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return da(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Zr(`${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())}},no=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}},so=new pa});import{exec as cw}from"node:child_process";import{promisify as lw}from"node:util";var ZA,ed=w(()=>{"use strict";Yt();ma();ZA=lw(cw)});var Rt,ga,st,Xt=w(()=>{"use strict";yt();se();le();Rt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ga=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=oe(),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(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}},st=new ga});var ro,Je,fa=w(()=>{"use strict";nt();Xt();le();ro=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;z.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?z.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?z.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;z.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 z.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=z.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=z.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);st.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&&z.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}}},Je=new ro});var td=w(()=>{"use strict";ue();je()});import{exec as dw}from"node:child_process";import{promisify as pw}from"node:util";var kI,nd=w(()=>{"use strict";Ls();se();aa();kI=pw(dw)});import fn from"chalk";var sd,mw,gw,bt,rd=w(()=>{"use strict";Ve();sd=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],mw=80,gw={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:sd,speed:mw},cli:{header:l(()=>`${fn.cyan.bold("\u26A1")} ${fn.cyan("prjct")}`,"header"),footer:l(()=>fn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${fn.cyan("\u26A1")} ${fn.cyan("prjct")} ${fn.cyan(sd[r%10])} ${fn.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")=>kr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>kr(r).signature,"getSignature")},bt=gw});import X from"chalk";function yw(){return fw[hw]}var RI,ha,fw,hw,hn,Yn,ya,rt,Qt,ww,Sw,h,yn=w(()=>{"use strict";rd();Yt();eo();eo();RI=bt.spinner.frames,ha=bt.spinner.speed,fw={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}},hw="compact";l(yw,"getTierConfig");hn={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")},Yn=null,ya=0,rt=!1,Qt=l((r,e)=>{let t=e??(yw().maxCharsPerLine||kt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),ww=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(kt.CLEAR_WIDTH)}\r`):!0,"clear"),Sw={start(){return rt||console.log(bt.cli.header()),this},end(){return rt||console.log(bt.cli.footer()),this},spin(r){return rt?this:(this.stop(),process.stdout.isTTY?(Yn=setInterval(()=>{process.stdout.write(`\r${bt.cli.spin(ya++,Qt(r,kt.SPINNER_MSG))}`)},ha),this):(process.stdout.write(`${bt.cli.spin(0,Qt(r,kt.SPINNER_MSG))}
290
- `),this))},done(r,e){if(this.stop(),!rt){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(`${hn.success} ${Qt(r,kt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${hn.fail} ${Qt(r,kt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?ua(r):r;return console.error(),console.error(`${hn.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(),rt||console.log(`${hn.warn} ${Qt(r,kt.WARN_MSG)}`),this},info(r){return this.stop(),rt||console.log(`${hn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!rt&&e&&console.log(`${hn.debug} ${X.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),rt)return this;let t=e.bullet||hn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),rt||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(),rt)return this;let t=e.split(`
291
- `),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(),rt?this:(console.log(`
292
- ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){return Yn&&(clearInterval(Yn),Yn=null,ww()),this},step(r,e,t){if(rt)return this;this.stop();let n=X.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Yn=setInterval(()=>{process.stdout.write(`\r${bt.cli.spin(ya++,`${n} ${Qt(t,kt.STEP_MSG)}`)}`)},ha),this):(process.stdout.write(`${bt.cli.spin(0,`${n} ${Qt(t,kt.STEP_MSG)}`)}
293
- `),this)},progress(r,e,t){if(rt)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?` ${Qt(t,kt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Yn=setInterval(()=>{process.stdout.write(`\r${bt.cli.spin(ya++,`[${i}] ${n}%${a}`)}`)},ha),this):(process.stdout.write(`${bt.cli.spin(0,`[${i}] ${n}%${a}`)}
294
- `),this)}},h=Sw});function bw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(kw.has(r)||r.includes("prjct"))return{level:Xn.debug,name:"debug"};let e=Xn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function oo(r,e,t){return od>=r?(...n)=>console[t](e,...n):Cw}var Xn,kw,od,Pw,Cw,xw,B,Qn=w(()=>{"use strict";Xn={error:0,warn:1,info:2,debug:3},kw=new Set(["1","true","*"]);l(bw,"getLogLevel");({level:od,name:Pw}=bw()),Cw=l(()=>{},"noop");l(oo,"createLogMethod");xw={error:oo(Xn.error,"[prjct:error]","error"),warn:oo(Xn.warn,"[prjct:warn]","warn"),info:oo(Xn.info,"[prjct:info]","log"),debug:oo(Xn.debug,"[prjct:debug]","log"),isEnabled:l(()=>od>=0,"isEnabled"),level:l(()=>Pw,"level")},B=xw});var io,vw,id=w(()=>{"use strict";Ut();le();pi();Yt();Qn();io=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Zu.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(gr.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(gr.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())}},vw=new io});var ao,co,ad=w(()=>{"use strict";ue();se();je();ao=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await an(t,[])??[];n.push(e),await vs(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await an(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await vs(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:k(),success:!0};await vs(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await an(t,null)}},co=new ao});var wa=w(()=>{"use strict";id();ad()});var Pt,lo=w(()=>{"use strict";Pt=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 Te,jt=w(()=>{"use strict";wa();lo();se();le();Te=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Pt({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 co.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 Ew}from"node:crypto";var Sa,$t,uo=w(()=>{"use strict";Ai();se();jt();Sa=class extends Te{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"};Ei.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 Ei.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 Vl(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 Ew("sha256").update(JSON.stringify(t)).digest("hex")}},$t=new Sa});var ka,Me,Hs=w(()=>{"use strict";yt();Di();se();Xt();jt();ka=class extends Te{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Kl)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:oe(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:k()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:k()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:k()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:k()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:k()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:k()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:k()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:k()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Bt(Rt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;st.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}},Me=new ka});var ba,wn,po=w(()=>{"use strict";Or();se();jt();ba=class extends Te{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Ru)}getDefault(){return{...ju}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],S=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let j=b.findIndex(q=>q.agentName===D);j>=0?b[j]={...b[j],usageCount:b[j].usageCount+1,tokensSaved:b[j].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats: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:$u(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)}},wn=new ba});import We from"node:fs/promises";import ne from"node:path";async function zs(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 Aw(s,o,i),$.getDb(r);for(let{filename:a,key:c}of xa){let u=ne.join(s,a),d=await Sn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),cd(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Ca){let u=ne.join(o,a),d=await Sn(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()),ld(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Fw(r,o,t),await _w(r,o,t),await Nw(r,i,t),await Lw(r,i,t),t.errors.length===0&&await Uw(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 Aw(r,e,t){let n=ne.join(r,"backup");return await We.mkdir(n,{recursive:!0}),await We.mkdir(ne.join(n,"index"),{recursive:!0}),await We.mkdir(ne.join(n,"memory"),{recursive:!0}),await Pa(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Pa(e,ne.join(n,"index")),await Pa(t,ne.join(n,"memory")),n}async function Pa(r,e,t){try{let n=await We.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 We.copyFile(o,i)}}catch(n){if(!C(n))throw n}}function cd(r,e,t){switch(e){case"state":Iw(r,t);break;case"queue":Dw(r,t);break;case"ideas":Rw(r,t);break;case"shipped":jw(r,t);break;case"metrics":$w(r,t);break;case"analysis":Mw(r,t);break}}function Iw(r,e){let t=$.getDb(r),n=t.prepare(`
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(`
295
297
  INSERT OR REPLACE INTO tasks
296
298
  (id, description, type, status, parent_description, branch, linear_id,
297
299
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -302,79 +304,81 @@ ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){retur
302
304
  (id, task_id, description, status, domain, agent, sort_order,
303
305
  depends_on, started_at, completed_at, output, summary)
304
306
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
305
- `),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 Dw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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(`
306
308
  INSERT OR REPLACE INTO queue_tasks
307
309
  (id, description, type, priority, section, created_at, completed, completed_at,
308
310
  feature_id, feature_name)
309
311
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
310
- `);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 Rw(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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(`
311
313
  INSERT OR REPLACE INTO ideas
312
314
  (id, text, status, priority, tags, added_at, converted_to, details, data)
313
315
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
314
- `);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 jw(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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(`
315
317
  INSERT OR REPLACE INTO shipped_features
316
318
  (id, name, shipped_at, version, description, type, duration, data)
317
319
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
318
- `);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 $w(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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(`
319
321
  INSERT OR REPLACE INTO metrics_daily
320
322
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
321
323
  VALUES (?, ?, ?, ?, ?)
322
- `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Mw(r,e){let n=$.getDb(r).prepare(`
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(`
323
325
  INSERT OR REPLACE INTO analysis
324
326
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
325
327
  VALUES (?, ?, ?, ?, ?, ?, ?)
326
- `),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 ld(r,e,t){e==="categories-cache"&&Ow(r,t)}function Ow(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
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(`
327
329
  INSERT OR REPLACE INTO index_files
328
330
  (path, categories, domain, score, size, mtime, language)
329
331
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
330
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Fw(r,e,t){let n=ne.join(e,"checksums.json"),s=await Sn(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 _w(r,e,t){let n=ne.join(e,"file-scores.json"),s=await Sn(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(`
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(`
331
333
  INSERT OR REPLACE INTO index_files
332
334
  (path, score, size, mtime, language, categories, domain)
333
335
  VALUES (?, ?, ?, ?, NULL,
334
336
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
335
337
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
336
- `);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 Nw(r,e,t){let n=ne.join(e,"events.jsonl");try{let o=(await We.readFile(n,"utf-8")).split(`
337
- `).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 Lw(r,e,t){let n=ne.join(e,"learnings.jsonl");try{let o=(await We.readFile(n,"utf-8")).split(`
338
- `).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 Uw(r,e,t,n){let s=l(async(i,a)=>{try{await We.unlink(i)}catch(c){C(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of xa)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 Sn(r){try{let e=await We.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function mo(r){let e=E.getGlobalProjectPath(r),t=ne.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of xa){let m=ne.join(t,u),p=await Sn(m);if(p!==null){$.setDoc(r,d,p),cd(r,d,p);try{await We.unlink(m)}catch{}n++}}let s=ne.join(e,"project.json"),o=await Sn(s);if(o!==null){$.setDoc(r,"project",o);try{await We.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 We.readFile(d,"utf-8")).split(`
339
- `).filter(f=>f.trim());if(p.length===0){await We.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 b=JSON.parse(S);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,S,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S),D=`learning:${b.taskId??b.timestamp??Date.now()}`,j=b.tags;f.run(D,j?.[0]??null,S,1,b.timestamp??new Date().toISOString())}catch{}})()}await We.unlink(d),n++}catch{}}let a=ne.join(e,"index"),c=[...Ca.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=ne.join(a,u),m=await Sn(d);if(m===null)continue;let p=Ca.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()),ld(r,p.key,m));try{await We.unlink(d)}catch{}n++}return n}var xa,Ca,go=w(()=>{"use strict";ue();O();le();xa=[{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"}],Ca=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(zs,"migrateJsonToSqlite");l(Aw,"createBackup");l(Pa,"copyFiles");l(cd,"populateNormalized");l(Iw,"populateTasksFromState");l(Dw,"populateQueueTasks");l(Rw,"populateIdeas");l(jw,"populateShippedFeatures");l($w,"populateMetricsDaily");l(Mw,"populateAnalysis");l(ld,"populateIndexTables");l(Ow,"populateCategoriesIndex");l(Fw,"migrateChecksums");l(_w,"migrateFileScores");l(Nw,"migrateEventsJsonl");l(Lw,"migrateLearningsJsonl");l(Uw,"cleanupJsonFiles");l(Sn,"readJsonSafe");l(mo,"sweepLegacyJson")});var va,pe,Gs=w(()=>{"use strict";yt();Er();se();Xt();jt();va=class extends Te{static{l(this,"QueueStorage")}constructor(){super("queue.json",Pu)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:oe(),createdAt:k(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:k()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=k(),s=t.map(o=>({...o,id:oe(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:k()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:k()},n):i),lastUpdated:k()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:k()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:k()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:k()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Bt(Rt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;st.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()})}},pe=new va});var Ta,qe,Ws=w(()=>{"use strict";yt();Oi();se();Xt();jt();Ta=class extends Te{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",fu)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:oe(),shippedAt:k()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:k()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Bt(Rt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;st.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}},qe=new Ta});var Bs,Ea,kn,Aa=w(()=>{"use strict";Bs={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"}},Ea=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=Bs[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 Bs[e]}getPrompt(e){return Bs[e].prompt}getValidCommands(e){return Bs[e].transitions}formatNextSteps(e){return Bs[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}`}})}},kn=new Ea});var Ia,F,Vs=w(()=>{"use strict";yt();Er();se();Aa();Xt();jt();Ia=class extends Te{static{l(this,"StateStorage")}constructor(){super("state.json",ku)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=kn.getCurrentState(e),s=kn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:k()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:k()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:k()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=k(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:k(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:k()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:k(),sessionId:oe()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:k()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];st.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=wu.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:
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:
340
342
  ${f.join(`
341
- `)}`)}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 Ia});var ud=w(()=>{"use strict";wa();O()});var Da,Ra,ja=w(()=>{"use strict";Un();jt();Da=class extends Te{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:xu,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}},Ra=new Da});var Mt=w(()=>{"use strict";uo();Xt();le();Hs();Ls();po();go();Gs();Ws();Vs();ud();jt();ja()});function Ue(r,e,t=2){return`${"#".repeat(t)} ${r}
342
- ${e}`}function Ct(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
343
- `)}function $a(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?`
344
- ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Ma(r,e){return`### Subtasks
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
345
347
  ${r.map((n,s)=>{let o=n.status==="completed",i=s===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
346
- `)}`}function dd(r){return`### Rules
347
- ${Ct(r)}`}function Oe(r){return`### Next
348
- ${r.map(t=>`- ${t.label}: \`${t.command}\``).join(`
349
- `)}`}function xt(r){let e=[];for(let[t,n]of Object.entries(r))n!=null&&e.push(`- **${t}:** ${n}`);return e.join(`
350
- `)}function Ot(r,e){return e?`## ${r} \u2713
351
- ${e}`:`## ${r} \u2713`}function Zt(r){return`> \u26A0\uFE0F ${r}`}function me(...r){return r.filter(Boolean).join(`
352
-
353
- `)}var Zn=w(()=>{"use strict";l(Ue,"mdSection");l(Ct,"mdList");l($a,"mdTaskHeader");l(Ma,"mdSubtasks");l(dd,"mdRules");l(Oe,"mdNextSteps");l(xt,"mdStats");l(Ot,"mdDone");l(Zt,"mdWarn");l(me,"mdJoin")});import Js from"chalk";function ot(r,e={}){if(e.quiet)return;let t=md[r]||"idle",n=kn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:pd[o]||o}));console.log(Js.dim(`
354
- Next:`));for(let o of s){let i=Js.cyan(o.cmd.padEnd(12));console.log(Js.dim(` ${i} \u2192 ${o.desc}`))}}function fo(r){let e=md[r]||"idle";return kn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:pd[n]||n}))}function qs(r){let e=kn.getStateInfo(r);console.log(Js.dim(`\u{1F4CD} State: ${Js.white(r.toUpperCase())} - ${e.description}`))}var pd,md,es=w(()=>{"use strict";Aa();pd={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"},md={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(ot,"showNextSteps");l(fo,"getNextSteps");l(qs,"showStateInfo")});import ct from"chalk";import bn from"prompts";var Oa,gd,ts,fd=w(()=>{"use strict";yn();Oa=[{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."}],gd=[{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"}],ts=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,bn.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 bn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:Oa.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:Oa.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 bn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:gd.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(ct.dim(`
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(`
355
359
  Detected: ${e}
356
- `));let t=await bn({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 bn([{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 bn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(ct.bold(" Configuration Summary")),console.log(ct.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${ct.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${ct.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${ct.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${ct.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${ct.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await bn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(ct.bold.cyan(" Welcome to prjct-cli!")),console.log(ct.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(ct.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(ct.yellow(`
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(`
357
361
  Setup cancelled. Run again anytime.
358
- `))}getProjectTypeLabel(e){return Oa.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return gd.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 Fa from"node:path";var Hw,zw,ho,Gw,Ke,Pn=w(()=>{"use strict";ue();yt();je();Hw="outcomes",zw="outcomes.jsonl",ho=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=E.getGlobalProjectPath(e);return Fa.join(t,Hw)}getOutcomesPath(e){return Fa.join(this.getOutcomesDir(e),zw)}async record(e,t){let n={...t,id:oe()},s=this.getOutcomesPath(e);return await ft(Fa.dirname(s)),await gi(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await M(t))return[];let n=await _n(t);return n.trim()?n.trim().split(`
359
- `).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}},Gw=new ho,Ke=Gw});var yo,Ww,_a,hd=w(()=>{"use strict";Pn();yo=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await Ke.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 Ke.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 Ke.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,b)=>S+b.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let b=this.parseVariance(S.variance),D=this.parseDuration(S.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(b=>b.completedAsPlanned))for(let b of S.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((S,b)=>b[1]-S[1]).slice(0,3).map(([S])=>S);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await Ke.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 Ke.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}},Ww=new yo,_a=Ww});var Ks,wo,Na,La=w(()=>{"use strict";On();se();Ks=3,wo=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>=Ks){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}/${Ks} 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>=Ks){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}/${Ks} 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>=Ks&&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:[I.FILE_STRUCTURE,I.ARCHITECTURE],tech_stack:[I.TECH_STACK],architecture:[I.ARCHITECTURE,I.CODE_STYLE],estimation:[I.SHIP_WORKFLOW],workflow:[I.SHIP_WORKFLOW,I.CODE_STYLE],gotcha:[I.TEST_BEHAVIOR,I.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(`
360
- `)}},Na=new wo});var So,yd,Ua=w(()=>{"use strict";$i();jt();se();So=class extends Te{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...iu,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:vr([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?vr(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:vr(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=au(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=cu(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:lu(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}},yd=new So});var Ha=w(()=>{"use strict";fd();hd();La();Pn();Ua()});import Ft from"chalk";function Bw(r){return wd[r.toLowerCase()]||wd.default}var wd,za,ko,Sd=w(()=>{"use strict";wd={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(Bw,"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(`
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(`
361
365
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
362
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=Bw(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})`)}
363
- `),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`}},ko=new za});import Fe from"chalk";function Vw(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%kd.length;return kd[t]}function Jw(r,e,t="\u25B6"){let n=Fe.dim(String(r+1).padStart(2)),o=Vw(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=Fe.green("\u2713 Complete");break;case"in_progress":a=Fe.yellow(`${t} Working...`);break;case"pending":a=Fe.gray("\u25CB Pending");break;case"failed":a=Fe.red("\u2717 Failed");break;case"blocked":a=Fe.gray("\u2298 Blocked");break;default:a=Fe.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function qw(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Fe.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Fe.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Jw(t,r[t]));return e.push(""),e.join(`
364
- `)}function bd(r){console.log(qw(r))}var kd,Pd=w(()=>{"use strict";kd=[Fe.cyan,Fe.magenta,Fe.yellow,Fe.blue,Fe.green,Fe.redBright,Fe.magentaBright,Fe.cyanBright];l(Vw,"getDomainColor");l(Jw,"formatSubtaskLine");l(qw,"renderSubtaskProgress");l(bd,"printSubtaskProgress")});function Kw(r){return Cd.includes(r)}async function Yw(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 Xw(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(`
365
- `)}var Cd,Qw,bo,xd=w(()=>{"use strict";Cd=["ship","feature","spec","cleanup","migrate"];l(Kw,"requiresReasoning");l(Yw,"reason");l(Xw,"formatPlan");Qw={requiresReasoning:Kw,reason:Yw,formatPlan:Xw,REASONING_REQUIRED_COMMANDS:Cd},bo=Qw});import Ys from"node:fs/promises";var Ga,Zw,Ye,Wa=w(()=>{"use strict";nt();ue();O();lo();Ga=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Pt({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 Ys.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([Ys.readFile(d,"utf-8"),Ys.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 Ys.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 Ys.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Zw=new Ga,Ye=Zw});import{exec as eS}from"node:child_process";import ge from"node:fs/promises";import vd from"node:os";import en from"node:path";import{promisify as tS}from"node:util";function Td(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 Ba(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function sS(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
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:
366
370
  `;return r.warnings.forEach(t=>{e+=` - ${t}
367
371
  `}),r.recommendations.length>0&&(e+=`
368
372
  Recommendations:
369
373
  `,r.recommendations.forEach(t=>{e+=` -> ${t}
370
- `})),e}async function Ed(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await ge.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=Td(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 ge.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 ge.access(en.dirname(i),ge.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 Ad(r){let e=[],t=[],n={};try{let{stdout:i}=await nS("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
371
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=en.join(r.projectPath,"package.json");try{let i=await ge.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 ge.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}.*${Ba(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 ge.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 Id(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await ge.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 ge.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Ba(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 ge.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 Dd(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await ge.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 ge.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 Rd(r){let e=[],t=[],n={},s=en.join(r.projectPath,".prjct/prjct.config.json");try{let i=await ge.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=en.join(vd.homedir(),".prjct-cli");try{await ge.access(o,ge.constants.W_OK),n.globalPathWritable=!0}catch(i){if(C(i))try{await ge.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 jd(r){let e=[],t=[],n={},s=en.join(r.projectPath,".prjct/prjct.config.json");try{let a=await ge.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=en.join(vd.homedir(),".prjct-cli/projects",o||"");try{await ge.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 $d(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 ge.access(en.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 ge.stat(en.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 Md(r){let e=[],t=[],n={},s=r.paths.specs;try{await ge.access(s),n.specsExists=!0;let i=await ge.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 Fd(r,e,t){let n=Od[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 rS(r,e,t){let n=await Fd(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function oS(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var nS,Od,iS,Po,_d=w(()=>{"use strict";O();nS=tS(eS);l(Td,"formatDuration");l(Ba,"escapeRegex");l(sS,"formatWarnings");l(Ed,"verifyDone");l(Ad,"verifyShip");l(Id,"verifyFeature");l(Dd,"verifyNow");l(Rd,"verifyInit");l(jd,"verifySync");l($d,"verifyAnalyze");l(Md,"verifySpec");Od={done:Ed,ship:Ad,feature:Id,now:Dd,init:Rd,sync:jd,analyze:$d,spec:Md};l(Fd,"verify");l(rS,"prepareCommand");l(oS,"requiresVerification");iS={verify:Fd,prepareCommand:rS,requiresVerification:oS,verifiers:Od,formatWarnings:sS,formatDuration:Td,escapeRegex:Ba,verifyDone:Ed,verifyShip:Ad,verifyFeature:Id,verifyNow:Dd,verifyInit:Rd,verifySync:jd,verifyAnalyze:$d,verifySpec:Md},Po=iS});function cS(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 lS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of aS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:cS(t)};return{detected:!1}}function uS(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 dS(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 pS(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 mS(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 aS,Va,gS,ns,Nd=w(()=>{"use strict";aS=[{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(cS,"getHallucinationSuggestion");l(lS,"detectHallucination");l(uS,"isSimilarError");l(dS,"analyzeErrorPattern");l(pS,"generateEscalationMessage");l(mS,"generateSuggestion");Va=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=>uS(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=dS(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:pS(e,o,this.maxAttempts),suggestion:mS(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 lS(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}}},gS=new Va,ns=gS});function Ja(r,e){let t=Xs(e),n=fS[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 hS(r,e){let t=Xs(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function yS(r,e,t){let n=Xs(t),s=Ja(r,t),o=Ja(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Co(r,e=qt){let t=Xs(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=wS(r,e),s=SS(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=PS(o),a=kS(o),c=bS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=CS(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Ud(r,e,t=qt){let n=Xs(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 wS(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=yS(i,s,e);if(!t.has(a)){let c=Ja(i,e),u=hS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function SS(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+xS(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Ka(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 kS(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 bS(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=Ka(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function PS(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 CS(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=Ka(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 Ka(r){if(!r.variance)return 0;let e=qa(r.estimatedDuration),t=qa(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function qa(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 Hd(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(`
372
- `)}function xS(r){if(!r.estimatedDuration)return 0;let e=qa(r.estimatedDuration);if(e<=0)return 0;let t=Ld[0],n=Number.POSITIVE_INFINITY;for(let s of Ld){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Xs(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var fS,Ld,Ya=w(()=>{"use strict";Un();fS={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Ja,"getSprintStart");l(hS,"getSprintEnd");l(yS,"getSprintNumber");l(Co,"calculateVelocity");l(Ud,"projectCompletion");l(wS,"bucketBySprint");l(SS,"buildSprintVelocities");l(kS,"detectTrend");l(bS,"calculateOverallAccuracy");l(PS,"calculateAverageVelocity");l(CS,"detectEstimationPatterns");l(Ka,"parseVariancePercent");l(qa,"parseDurationMinutes");l(Hd,"formatVelocityContext");Ld=[{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(xS,"derivePoints");l(Xs,"resolveConfig")});import{exec as vS}from"node:child_process";import TS from"node:fs/promises";import xo from"node:path";import{promisify as ES}from"node:util";async function zd(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=jS(r),c=await $S(e),u=await MS(e),d=[];for(let p of c){if(!i&&FS(p))continue;let g=OS(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 jS(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 $S(r){let e=[];async function t(n,s=""){try{let o=await TS.readdir(n,{withFileTypes:!0});for(let i of o){let a=xo.join(n,i.name),c=xo.join(s,i.name);if(i.isDirectory()){if(RS.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=xo.extname(i.name).toLowerCase();DS.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(r),e}async function MS(r){let e=new Map;try{let{stdout:t}=await AS(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
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 '
373
377
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
374
378
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
375
379
  END { for (f in files) print files[f], lastmod[f], f }
376
380
  '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
377
- `).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 OS(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(IS))for(let S of f)if(c.includes(S)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=xo.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 FS(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 AS,IS,DS,RS,Gd=w(()=>{"use strict";O();AS=ES(vS),IS={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"]},DS=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),RS=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(zd,"findRelevantFiles");l(jS,"extractKeywords");l($S,"getAllCodeFiles");l(MS,"getGitRecency");l(OS,"scoreFile");l(FS,"isTestFile")});import{exec as _S}from"node:child_process";import{promisify as NS}from"node:util";async function Wd(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 HS(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await US(r,t);return o=o.filter(c=>!zS(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 US(r,e){let{stdout:t}=await Qs(`git log -${e} --pretty=format:"%ct" --name-only | awk '
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 '
378
382
  /^[0-9]+$/ { timestamp=$1; next }
379
383
  NF {
380
384
  count[$0]++
@@ -384,8 +388,8 @@ Recommendations:
384
388
  for (f in count) print count[f], lastmod[f], f
385
389
  }
386
390
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
387
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),S=Math.max(0,1-g/30),b=u/i,D=S*.6+b*.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(D*100)/100,lastChanged:j,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function HS(r){let{stdout:e}=await Qs("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Qs("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Qs(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
388
- `).filter(Boolean),{stdout:i}=await Qs(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
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 '
389
393
  /^[0-9]+$/ { timestamp=$1; next }
390
394
  NF {
391
395
  count[$0]++
@@ -395,10 +399,10 @@ Recommendations:
395
399
  for (f in count) print count[f], lastmod[f], f
396
400
  }
397
401
  '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
398
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),S=p[3],b=u-f,D=Math.floor(b/86400),j=Math.floor(b/3600),q=Math.max(0,1-D/14),Re=g/d,Be=q*.5+Re*.5,gt;j<1?gt="just now":j<24?gt=`${j}h ago`:gt=`${D}d ago`,a.push({path:S,changes:g,heatScore:Math.round(Be*100)/100,lastChanged:gt,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function zS(r){let e=r.split("/").pop()||"";for(let t of LS)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Qs,LS,Bd=w(()=>{"use strict";Qs=NS(_S),LS=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Wd,"getRecentFiles");l(US,"getHotFilesFromCommits");l(HS,"getBranchOnlyFiles");l(zS,"shouldIgnore")});function Xa(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Vd(r,e){let t=GS[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function BS(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function qd(r,e){let t=Xa(r),n=Xa(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=Vd(s,WS),a=Jd.map(c=>({model:c,...Vd(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:BS(i.total),byModel:a}}}function Qa(r){let e=Xa(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Jd.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var GS,WS,Jd,Kd=w(()=>{"use strict";GS={"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}},WS="claude-sonnet-4.5";l(Xa,"countTokens");Jd=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Vd,"calculateModelCost");l(BS,"formatCostSaved");l(qd,"measureCompression");l(Qa,"noCompression")});import VS from"node:fs/promises";import Za from"node:path";async function Qd(r,e=process.cwd()){let t=Za.isAbsolute(r)?r:Za.join(e,r),n;try{n=await VS.readFile(t,"utf-8")}catch(u){if(C(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Qa("")};throw u}let s=Za.extname(r).toLowerCase(),o=JS[s]||"unknown",i=XS[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:Qa(n)};let a=QS(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
399
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:qd(n,c)}}function QS(r,e){let t=[],n=r.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(`
400
404
  `),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(`
401
- `).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:ZS(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function ZS(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var JS,Yd,qS,KS,YS,Xd,XS,Zd=w(()=>{"use strict";O();Kd();JS={".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"},Yd=[{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}],qS=[{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}],KS=[{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}],YS=[{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}],Xd=[{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}],XS={typescript:Yd,javascript:Yd,python:qS,go:KS,rust:YS,java:Xd,csharp:Xd,php:[],ruby:[],unknown:[]};l(Qd,"extractSignatures");l(QS,"extractFromContent");l(ZS,"cleanSignature")});import{createHash as ek}from"node:crypto";import np from"node:fs/promises";import sp from"node:path";function ep(r){return ek("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function tp(r){try{let e=sp.join(r,"storage","classification-cache.json"),t=await np.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e)?Ii:(console.warn("[classifier] Failed to load cache:",y(e)),Ii)}}async function ec(r,e){try{let t=sp.join(r,"storage","classification-cache.json");await np.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function nk(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>tk?null:n.classification}function sk(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function rk(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=rp(e),s=ji("classification")||"",o=`Classify this software engineering task into a domain.
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.
402
406
 
403
407
  Task: "${r}"
404
408
 
@@ -406,19 +410,19 @@ Available domains in this project: ${n.join(", ")}
406
410
  Available agents: ${e.agents.join(", ")||"none"}
407
411
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
408
412
 
409
- ${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=Jt.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 ik(r,e){let t=rp(e),n=new Map;for(let[p,g]of Object.entries(ok)){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 Jl;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=ak(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 rp(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 ak(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 tk,ok,tc,ck,op,ip=w(()=>{"use strict";Ms();xr();O();tk=3600*1e3;l(ep,"hashDescription");l(tp,"loadCache");l(ec,"saveCache");l(nk,"lookupCache");l(sk,"lookupPatterns");l(rk,"classifyWithLLM");ok={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(ik,"classifyWithHeuristic");l(rp,"buildAvailableDomains");l(ak,"getFilePatterns");tc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=ep(e),i=await tp(n),a=nk(i,o,t);if(a)return{classification:a,source:"cache"};let c=sk(i,o);if(c)return{classification:c,source:"history"};let u=await rk(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await ec(n,i),{classification:u,source:"llm"};let d=ik(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await ec(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=ep(e),o=await tp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await ec(n,o))}},ck=new tc,op=ck});import{exec as lk}from"node:child_process";import Zs from"node:fs/promises";import uk from"node:os";import Cn from"node:path";import{promisify as dk}from"node:util";var ap,cp,nc,pk,vo,sc=w(()=>{"use strict";Ya();nt();ue();Un();Mt();Gd();Bd();Zd();O();Pn();ip();Jn();ap=dk(lk),cp=["database","backend","frontend","testing","devops"],nc=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,p,g]=await Promise.all([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),f=this.shouldFragment(a,t),S=null;return f&&e==="task"&&(S=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:f,subtasks:S,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:p,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),zd(e,t,{maxFiles:10,minScore:.15}),Wd(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Qd(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(`
410
- `);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([ap("git branch --show-current",{cwd:e}),ap("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
411
- `).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 $t.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await Ke.getAll(e);if(t.length===0)return null;let n=Co(t,qt);return n.sprints.length===0?null:Hd(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Cn.join(e,"analysis","repo-analysis.json"),n=await Zs.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 op.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=Cn.join(e,"agents");return(await Zs.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=E.getGlobalProjectPath(t),s=Cn.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=Cn.join(s,u);try{let m=await Zs.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=$r(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=Cn.join(uk.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=Cn.join(t,`${i}.md`),c=Cn.join(t,i,"SKILL.md");try{let u=await Zs.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await Zs.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=cp.indexOf(a),d=cp.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?"...":""}`}},pk=new nc,vo=pk});function mk(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 rc,gk,be,lp=w(()=>{"use strict";yt();se();Yt();Yt();l(mk,"generateApprovalPrompt");rc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return ca.includes(e)}isDestructive(e){return la.includes(e)}isToolAllowedInPlanning(e){return Xr.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Xr.includes(n)):t}startPlanning(e,t,n){let s={id:oe(),projectId:e,command:t,params:n,status:Y.GATHERING,startedAt:k(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[Y.GATHERING,Y.ANALYZING,Y.PROPOSING,Y.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:k()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===Y.APPROVED?n.approvedAt=k():t===Y.EXECUTING?n.executionStartedAt=k():(t===Y.COMPLETED||t===Y.ABORTED)&&(n.completedAt=k()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=Y.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=Y.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==Y.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=Y.APPROVED,n.approvedAt=k(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=Y.REJECTED,n.userFeedback=t,n.completedAt=k(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==Y.APPROVED?null:(t.status=Y.EXECUTING,t.executionStartedAt=k(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==Y.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==Y.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=k(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=Y.COMPLETED,t.completedAt=k();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=Y.ABORTED,n.completedAt=k(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return mk(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(`
412
- `)}_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`}},gk=new rc,be=gk});function fk(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return To[t]?To[t]:To[e]?To[e]:e}function Eo(r){let e=new Set,t=[];for(let n of r){let s=fk(n);e.has(s)||(e.add(s),t.push(n))}return t}var To,oc=w(()=>{"use strict";To={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(fk,"normalizeFrameworkName");l(Eo,"deduplicateTechStack")});import{z as Pe}from"zod";function up(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
413
- `);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=Eo(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])=>hk[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(`
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,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(`
414
418
  Context: ${r.fileCount} files in project.`),e.join(`
415
- `)}var Fj,hk,dp=w(()=>{"use strict";oc();Fj=Pe.object({projectPath:Pe.string(),language:Pe.string().optional(),framework:Pe.string().optional(),techStack:Pe.array(Pe.string()).default([]),domains:Pe.object({hasFrontend:Pe.boolean().default(!1),hasBackend:Pe.boolean().default(!1),hasDatabase:Pe.boolean().default(!1),hasTesting:Pe.boolean().default(!1),hasDocker:Pe.boolean().default(!1)}).optional(),fileCount:Pe.number().optional(),availableAgents:Pe.array(Pe.string()).default([]),analysisLanguages:Pe.array(Pe.string()).default([]),analysisFrameworks:Pe.array(Pe.string()).default([]),analysisPackageManager:Pe.string().optional()}),hk={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(up,"buildAntiHallucinationBlock")});import{z as vt}from"zod";var yk,pp,mp=w(()=>{"use strict";yk=vt.object({agents:vt.boolean(),patterns:vt.boolean(),checklist:vt.boolean(),modules:vt.array(vt.string())}),pp=vt.object({version:vt.string(),description:vt.string().optional(),commands:vt.record(vt.string(),yk).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function ic(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function gp(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=ic(o,wk),a=ic(o,Sk),c=ic(o,kk);return s.some(d=>bk.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 wk,Sk,kk,bk,fp=w(()=>{"use strict";wk=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Sk=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],kk=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],bk=["Write","Edit","Bash"];l(ic,"countMatches");l(gp,"classifyCommand")});import ac from"node:fs/promises";import Pk from"node:path";async function yp(){if(er)return er;let r=await ac.readFile(cc,"utf-8"),e=JSON.parse(r);return er=pp.parse(e),er}function Ck(r){return wp.get(r)}function xk(r,e){wp.set(r,e)}function Tk(r,e){let t=r,n=hp.get(t);return n&&Ak(n.entry,e)?(n.count++,n.count>=vk):(hp.set(t,{entry:e,count:1}),!1)}async function Ek(r,e){let t=await ac.readFile(cc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await ac.writeFile(cc,`${JSON.stringify(n,null,2)}
416
- `,"utf-8"),er=null}function Ak(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 Sp(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Ck(e);if(n)return{entry:n,source:"cache"};if(t){let s=gp(e,t);return xk(e,s),Tk(e,s)&&Ek(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var cc,er,wp,hp,vk,kp=w(()=>{"use strict";mp();dn();fp();cc=Pk.join(ke,"core/config/command-context.config.json"),er=null;l(yp,"loadCommandContextConfig");wp=new Map;l(Ck,"getCachedClassification");l(xk,"cacheClassification");hp=new Map,vk=3;l(Tk,"trackClassification");l(Ek,"persistClassification");l(Ak,"isSameEntry");l(Sp,"resolveCommandContextFull")});import Ik from"node:os";import{z as _t}from"zod";function Dk(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Rk(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function bp(r){let e=r.platform??Ik.platform(),t=r.runtime??Dk(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
417
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Rk(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).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(`
418
422
  `)}
419
- </env>`}var Qj,Pp=w(()=>{"use strict";Qj=_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(Dk,"detectRuntime");l(Rk,"normalizePlatform");l(bp,"buildEnvironmentBlock")});function xp(r){let e=r.getAllocationFor("injection");return{...Io,totalPrompt:e}}function xn(r,e){let t=e*vp;return r.length<=t?r:`${r.substring(0,t)}
420
- ... (truncated to ~${e} tokens)`}function Cp(r){return Math.ceil(r.length/vp)}function Tp(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=jk[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 Io,vp,jk,Ao,Ep=w(()=>{"use strict";Io={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(xp,"budgetsFromCoordinator");vp=4;l(xn,"truncateToTokenBudget");l(Cp,"estimateTokens");jk={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(Tp,"filterSkillsByDomains");Ao=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Io,...e}}addSection(e,t){let n=xn(e,t),s=Cp(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=xn(n,o);return this.used+=Cp(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 Ap from"node:fs/promises";import vn from"node:path";var lc,$k,Ip,Dp=w(()=>{"use strict";Mt();O();je();dn();Ha();dp();kp();Pp();Ep();oc();Jn();lc=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 Ap.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?xp(this._coordinator):Io}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ve(`global/modules/${e}`);if(t)return t;let n=vn.join(ke,"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=Vn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ve(s);if(o){let i=vn.basename(s,".md");t[i]=o}}}else{let s=vn.join(ke,"templates","checklists");if(await M(s)){let o=(await Ap.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=vn.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),pe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(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 _a.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(`
421
- `);return xn(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=vn.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 yp();p=Sp(P,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
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}
422
426
  `),s.role&&d.push(`Role: ${s.role}
423
427
  `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
424
428
  `),d.push(`
@@ -427,34 +431,34 @@ Apply specialized expertise. Read agent file for details if needed.
427
431
  `)),d.push(`TASK: ${e.frontmatter.description}
428
432
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
429
433
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
430
- `);let S=t.projectPath;if(S){let P=u?.project?.id?vn.basename(S):vn.basename(S),A=bp({projectName:P,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
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(`
431
435
  ${A}
432
- `)}if(u){let P=u.sealedAnalysis;if(d.push(`
436
+ `)}if(u){let b=u.sealedAnalysis;if(d.push(`
433
437
  ## PROJECT ANALYSIS (Sealed)
434
438
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
435
439
  `),d.push(`**Primary Domain**: ${u.primaryDomain}
436
440
  `),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
437
- `),P){if(P.languages.length>0&&d.push(`**Languages**: ${P.languages.join(", ")}
438
- `),P.frameworks.length>0&&d.push(`**Frameworks**: ${P.frameworks.join(", ")}
439
- `),P.packageManager&&d.push(`**Package Manager**: ${P.packageManager}
440
- `),P.sourceDir&&d.push(`**Source Dir**: ${P.sourceDir}
441
- `),P.testDir&&d.push(`**Test Dir**: ${P.testDir}
442
- `),d.push(`**Files Analyzed**: ${P.fileCount}
443
- `),d.push(`**Analysis Status**: ${P.status}${P.commitHash?` (commit: ${P.commitHash.slice(0,8)})`:""}
444
- `),P.patterns.length>0){d.push(`
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(`
445
449
  ### Code Patterns (Follow These)
446
- `);for(let A of P.patterns)d.push(`- **${A.name}**: ${A.description}${A.location?` (${A.location})`:""}
447
- `)}if(P.antiPatterns.length>0){d.push(`
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(`
448
452
  ### Anti-Patterns (Avoid These)
449
- `);for(let A of P.antiPatterns)d.push(`- **${A.issue}** in \`${A.file}\` \u2014 ${A.suggestion}
453
+ `);for(let A of b.antiPatterns)d.push(`- **${A.issue}** in \`${A.file}\` \u2014 ${A.suggestion}
450
454
  `)}}d.push(`
451
- `)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let P=this.extractPatternSummary(D);P&&(d.push(`## CODE PATTERNS
452
- `),d.push(P),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(`
453
457
  Full patterns: Read analysis/patterns.md
454
- `))}let j=n?.analysis||"";if(b&&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(`
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(`
455
459
  ## STACK
456
460
  Stack: ${A}
457
- `),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
461
+ `),I||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
458
462
  `)}if(u){if(u.agents.length>0){d.push(`
459
463
  ### LOADED AGENTS (Project-Specific Specialists)
460
464
 
@@ -462,18 +466,18 @@ Stack: ${A}
462
466
  `),A.effort&&d.push(`Effort: ${A.effort}
463
467
  `),A.model&&d.push(`Model: ${A.model}
464
468
  `),A.skills.length>0&&d.push(`Skills: ${A.skills.join(", ")}
465
- `);let Se=xn(A.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
469
+ `);let Se=Tn(A.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
466
470
  ${Se}
467
471
  \`\`\`
468
472
 
469
- `)}}let P=Tp(u.skills,u.detectedDomains);if(P.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
473
+ `)}}let b=$p(u.skills,u.detectedDomains);if(b.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
470
474
 
471
- `);for(let A of P){d.push(`#### Skill: ${A.name}
472
- `);let Se=xn(A.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
475
+ `);for(let A of b){d.push(`#### Skill: ${A.name}
476
+ `);let Se=Tn(A.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
473
477
  ${Se}
474
478
  \`\`\`
475
479
 
476
- `)}}}let q=this.getModulesForCommand(m,p);if(q.length>0)for(let P of q){let A=await this.loadModule(P);A&&(d.push(`
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(`
477
481
  `),d.push(A))}if(c?.isPlanning&&(d.push(`
478
482
  ## PLAN MODE
479
483
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
@@ -481,56 +485,63 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
481
485
  `)),c?.requiresApproval&&d.push(`
482
486
  ## APPROVAL REQUIRED
483
487
  Show changes, list affected files, ask for confirmation.
484
- `),S){let P=u?.sealedAnalysis,A=[...P?.frameworks||[],...u?.project?.conventions||[]],Se={projectPath:S,language:u?.project?.ecosystem,framework:P?.frameworks?.[0],techStack:Eo(A),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(U=>U.name)||[],analysisLanguages:P?.languages||[],analysisFrameworks:P?.frameworks||[],analysisPackageManager:P?.packageManager};d.push(`
485
- ${up(Se)}
486
- `)}else d.push(this.buildCriticalRules());if(u?.realContext){let P=u.realContext;if(d.push(`
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(`
491
+ ### CONTEXT DEGRADATION NOTICE
492
+
493
+ `),d.push(`**Level**: ${b.level}
494
+ `),d.push(`**Unavailable**: ${b.failedTools.join(", ")}
495
+ `),d.push(`Some context tools failed. Explore the codebase manually for missing context.
496
+
497
+ `)}if(u?.realContext){let b=u.realContext;if(d.push(`
487
498
  ### CODEBASE CONTEXT
488
499
 
489
- `),d.push(`**Git State**: Branch \`${P.gitBranch}\` | ${P.gitStatus}
500
+ `),d.push(`**Git State**: Branch \`${b.gitBranch}\` | ${b.gitStatus}
490
501
 
491
- `),P.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
502
+ `),b.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
492
503
  `),d.push(`| Score | File | Why |
493
504
  `),d.push(`|-------|------|-----|
494
- `);for(let A of P.relevantFiles.slice(0,8))d.push(`| ${A.score} | ${A.path} | ${A.reason} |
505
+ `);for(let A of b.relevantFiles.slice(0,8))d.push(`| ${A.score} | ${A.path} | ${A.reason} |
495
506
  `);d.push(`
496
- `)}if(P.signatures.length>0){d.push(`**Code Signatures** (top files):
497
- `);for(let A of P.signatures)d.push(`\`\`\`typescript
507
+ `)}if(b.signatures.length>0){d.push(`**Code Signatures** (top files):
508
+ `);for(let A of b.signatures)d.push(`\`\`\`typescript
498
509
  // ${A.path}
499
510
  ${A.content}
500
511
  \`\`\`
501
512
  `);d.push(`
502
- `)}if(P.recentFiles.length>0){d.push("**Recently Changed**: ");let A=P.recentFiles.slice(0,5).map(Se=>`${Se.path} (${Se.lastChanged})`).join(", ");d.push(`${A}
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}
503
514
 
504
- `)}}let Re=t.files||[];if(Re.length>0){let P=Re.slice(0,5).join(", ");d.push(`
505
- ## FILES: ${Re.length} available. Top: ${P}
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}
506
517
  `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
507
518
 
508
519
  `)}else S&&d.push(`
509
520
  ## PROJECT: ${S}
510
521
  Read files before modifying.
511
522
 
512
- `);let Be=this.filterRelevantState(n);if(Be&&(d.push(`
523
+ `);let we=this.filterRelevantState(n);if(we&&(d.push(`
513
524
  ## PRJCT STATE (Project Management Data)
514
- `),d.push(Be),d.push(`
525
+ `),d.push(we),d.push(`
515
526
  `)),u?.velocityContext&&(d.push(`
516
527
  ### VELOCITY (Historical Estimation Data)
517
528
 
518
529
  `),d.push(u.velocityContext),d.push(`
519
530
 
520
- `)),o&&Object.keys(o).some(P=>o[P])){d.push(`
531
+ `)),o&&Object.keys(o).some(b=>o[b])){d.push(`
521
532
  ## PROJECT DEFAULTS (apply automatically)
522
- `);for(let[P,A]of Object.entries(o))A&&d.push(`- ${P}: ${A}
533
+ `);for(let[b,A]of Object.entries(o))A&&d.push(`- ${b}: ${A}
523
534
  `)}if(i?.plan&&i.plan.length>0){if(d.push(`
524
535
  ## THINK FIRST (reasoning from analysis)
525
536
  `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
526
- `);for(let P of i.conclusions)d.push(` \u2192 ${P}
537
+ `);for(let b of i.conclusions)d.push(` \u2192 ${b}
527
538
  `)}d.push(`Plan:
528
- `);for(let P=0;P<i.plan.length;P++)d.push(` ${P+1}. ${i.plan[P]}
539
+ `);for(let b=0;b<i.plan.length;b++)d.push(` ${b+1}. ${i.plan[b]}
529
540
  `);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
530
541
  `)}if(a&&a.length>0){d.push(`
531
542
  ## CONTEXT (apply these)
532
- `);for(let P of a)d.push(`- **${P.title}**: ${P.content}
533
- `),P.tags&&P.tags.length>0&&d.push(` Tags: ${P.tags.join(", ")}
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(", ")}
534
545
  `)}if(d.push(`
535
546
  ---
536
547
  `),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
@@ -539,11 +550,11 @@ Read files before modifying.
539
550
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
540
551
  `),d.push(`|---|--------|-------------|--------|
541
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} |
542
- `)}let P=u.subtasks.find(A=>A.status==="in_progress");if(P&&(d.push(`
543
- **FOCUS ON SUBTASK #${P.order}**: ${P.description}
544
- `),d.push(`Agent: ${P.agent} | Domain: ${P.domain}
545
- `),P.dependsOn.length>0&&d.push(`Dependencies: ${P.dependsOn.join(", ")}
546
- `),P.handoff)){let A=P.handoff;d.push(`
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(`
547
558
  ### Previous Subtask Handoff
548
559
 
549
560
  `),d.push(`**From:** ${A.fromSubtask}
@@ -557,15 +568,15 @@ Read files before modifying.
557
568
  **Context for this subtask:**
558
569
  ${A.outputForNextAgent}
559
570
  `)}d.push(`
560
- `)}let gt=this.getSchemaTypeForCommand(m);if(gt){let{renderSchemaForPrompt:P}=await Promise.resolve().then(()=>(xr(),nu)),A=P(gt);A&&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(`
561
572
  ${A}
562
- `)}if(p.checklist){let P=await this.loadChecklistRouting(),A=await this.loadChecklists();P&&Object.keys(A).length>0&&(d.push(`
573
+ `)}if(p.checklist){let b=await this.loadChecklistRouting(),A=await this.loadChecklists();b&&Object.keys(A).length>0&&(d.push(`
563
574
  ## QUALITY CHECKLISTS
564
575
  `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
565
576
  `),d.push(`Available: ${Object.keys(A).join(", ")}
566
577
  `),d.push(`Path: templates/checklists/{name}.md
567
578
  `),d.push(`Use Read tool to load checklists you determine are relevant.
568
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Ao({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}
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}
569
580
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
570
581
 
571
582
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -582,7 +593,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
582
593
  `);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
583
594
  Avoid:
584
595
  ${a}`)}let o=t.join(`
585
- `);return xn(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
596
+ `);return Tn(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
586
597
  ## RULES (CRITICAL)
587
598
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
588
599
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -599,7 +610,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
599
610
  - Prefer structured output (JSON) over free text when applicable.
600
611
 
601
612
  EXECUTE: Follow flow. Use tools. Decide.
602
- `}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}}}},$k=new lc,Ip=$k});import Rp from"node:fs/promises";import lt from"node:path";var Mk,Ok,uc,dc,Do,pc=w(()=>{"use strict";nt();ue();O();Mk=["task","done","ship","resume","bug","enrich"],Ok=["init","sync","pause","next","dash","history","undo","redo"],uc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return lt.dirname(Ps.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(Ve(),at(et)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=lt.join(u,"templates")}catch{c=lt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await E.getAgentSettingsPath(),paths:{orchestrator:lt.join(c,"agentic","orchestrator.md"),agentRouting:lt.join(c,"agentic","agent-routing.md"),taskFragmentation:lt.join(c,"agentic","task-fragmentation.md"),commandTemplate:lt.join(c,"commands",`${e}.md`),repoAnalysis:lt.join(o,"analysis","repo-analysis.json"),agentsDir:lt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:lt.join(o,"storage","state.json")}}}requiresOrchestration(e){return Mk.includes(e)?!0:!Ok.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=lt.join(E.getGlobalProjectPath(t),"agents");return(await Rp.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return C(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=lt.join(E.getGlobalProjectPath(t),"agents");return(await Rp.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
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:`
603
614
  ## Agentic Execution Mode
604
615
 
605
616
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -682,13 +693,13 @@ When fragmenting tasks:
682
693
  2. Track progress: currentSubtaskIndex, subtaskProgress
683
694
  3. Each completed subtask generates a summary
684
695
  4. Pass summary to next agent for context handoff
685
- `,context:e,requiresOrchestration:t}}},dc=new uc,Do=dc});import{exec as Fk}from"node:child_process";import jp from"node:fs/promises";import{promisify as _k}from"node:util";var Nk,Tn,De,mc=w(()=>{"use strict";Nr();Nk=_k(Fk),Tn={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())}};Tn.register("Read",async r=>{try{return await Ns.execute(async()=>await jp.readFile(r,"utf-8"),`read-${r}`)}catch(e){return _r(e)||_s(e),null}});Tn.register("Write",async(r,e)=>{try{return await Ns.execute(async()=>await jp.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return _r(t)||_s(t),!1}});Tn.register("Bash",async r=>{try{return await Ns.execute(async()=>await Nk(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Tn.register("GetTimestamp",async()=>new Date().toISOString());Tn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Tn.register("GetDateTime",async()=>new Date().toISOString());De=Tn});import gc from"node:fs/promises";import Lk from"node:os";import $p from"node:path";async function Uk(r){try{let e=$p.dirname(Ro);await M(e)||await gc.mkdir(e,{recursive:!0}),await gc.writeFile(Ro,`/p:${r}`)}catch{}}async function Hk(){try{await M(Ro)&&await gc.unlink(Ro)}catch{}}var Ro,fc,zk,jo,hc=w(()=>{"use strict";O();Sd();je();Pd();xd();Wa();_d();Nd();Hn();sc();lp();Dp();pc();Jn();mc();Ro=$p.join(Lk.homedir(),".prjct-cli",".running");l(Uk,"signalStart");l(Hk,"signalEnd");fc=class{static{l(this,"CommandExecutor")}async signalStart(e){await Uk(e)}async signalEnd(){await Hk()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(ns.shouldEscalate(e,s)){let o=ns.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Wi.load(e),i=await Ye.build(n,t),a=be.requiresPlanning(e),c=be.isDestructive(e),u=be.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=be.startPlanning(i.projectId,e,t):u&&(d=be.getActivePlan(i.projectId));let m=null;if(Po.requiresVerification(e)){let P=await Ye.loadStateForCommand(i,e);m=await Po.verify(e,i,P),!m.verified&&m.warnings.length>0&&console.log(Po.formatWarnings(m))}let p=null;if(bo.requiresReasoning(e)){let P=await Ye.loadStateForCommand(i,e);p=await bo.reason(e,i,P),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(bo.formatPlan(p)))}let g=t.task||t.description||"",f=await Do.buildContext(e,g,n),S=Do.buildAgenticPrompt(f),b=null;if(Do.requiresOrchestration(e)&&g)try{b=await vo.execute(e,g,n),b.detectedDomains.length>0&&ko.orchestrate(b.detectedDomains);for(let P of b.agents){let A=P.domain||P.name.replace(".md","");ko.startAgent(P.name,A,`Loading ${A} specialist...`),ko.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let P=b.subtasks.map(A=>({id:A.id,domain:A.domain,description:A.description,status:A.status}));bd(P)}}catch(P){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(P)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},j=await Ye.loadState(i),q=null,Re=null;i.projectId&&(q={commit_footer:await de.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await de.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await de.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await de.getSmartDecision(i.projectId,`preferred_agent_${e}`)},Re=await de.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Be={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:be.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},gt=await Ip.build(o,D,j,null,q,null,Re,Be,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),ns.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:j,prompt:gt,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:S.prompt,requiresOrchestration:S.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:q,relevantMemories:Re,orchestratorContext:b,memory:{create:l(P=>de.createMemory(i.projectId,P),"create"),autoRemember:l((P,A,Se)=>de.autoRemember(i.projectId,P,A,Se),"autoRemember"),search:l(P=>de.searchMemories(i.projectId,P),"search"),findByTags:l(P=>de.findByTags(i.projectId,P),"findByTags"),getStats:l(()=>de.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(P=>be.recordGatheredInfo(i.projectId,P),"recordInfo"),setAnalysis:l(P=>be.setAnalysis(i.projectId,P),"setAnalysis"),propose:l(P=>be.proposePlan(i.projectId,P),"propose"),approve:l(P=>be.approvePlan(i.projectId,P),"approve"),reject:l(P=>be.rejectPlan(i.projectId,P),"reject"),getApprovalPrompt:l(()=>be.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>be.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>be.getNextStep(i.projectId),"getNextStep"),completeStep:l(P=>be.completeStep(i.projectId,P),"completeStep"),failStep:l(P=>be.failStep(i.projectId,P),"failStep"),abort:l(P=>be.abortPlan(i.projectId,P),"abort"),getStatus:l(()=>be.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>be.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=ns.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=ns.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(!De.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=De.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Wi.load(e)).frontmatter["allowed-tools"]||[],i=await Ye.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)}}}},zk=new fc,jo=zk});import $o from"node:fs/promises";import Gk from"node:https";import Wk from"node:os";import yc from"node:path";import Tt from"chalk";var wc,Mp,Op=w(()=>{"use strict";O();je();wc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=yc.join(Wk.homedir(),".prjct-cli","config"),this.cacheFile=yc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=yc.join(__dirname,"..","..","package.json");return JSON.parse(await $o.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=Gk.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 $o.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await M(this.cacheDir)||await $o.mkdir(this.cacheDir,{recursive:!0}),await $o.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:`
686
- `+Tt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
687
- `+Tt.yellow("\u2502")+" "+Tt.bold("Update available!")+" "+Tt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Tt.yellow("\u2502")+`
688
- `+Tt.yellow("\u2502")+" "+Tt.yellow("\u2502")+`
689
- `+Tt.yellow("\u2502")+" Run: "+Tt.cyan("npm update -g prjct-cli")+" "+Tt.yellow("\u2502")+`
690
- `+Tt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
691
- `}},Mp=wc});var ae,He=w(()=>{"use strict";hc();Wa();mc();nt();ue();Op();nn();se();je();yn();ae=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Mp,this.updateNotificationShown=!1,this.commandExecutor=jo}get agent(){return Kn.getAgent()}get agentInfo(){return Kn.getInfo()}get currentAuthor(){return tn.getCurrentAuthor()}async initializeAgent(){return Kn.initialize()}async ensureProjectInit(e){return tn.ensureInit(e)}async ensureAuthor(){return tn.ensureAuthor()}async getGlobalProjectPath(e){return tn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return Je.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return tn.isEmptyDirectory(e)}async _detectExistingCode(e){return tn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Vr.breakdownFeature(e)}_detectBugSeverity(e){return Vr.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Kn.assignForTask(e,t,n)}}});var Fp={};Mn(Fp,{PlanningCommands:()=>An});import En from"node:path";async function Bk(){if(!Sc){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Oo(),_p));Sc=new r}return Sc}var Sc,An,Mo=w(()=>{"use strict";Ur();mn();yt();Mt();O();Zn();es();Ha();He();Sc=null;l(Bk,"getAnalysisCommands");An=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 ts(t).runNonInteractive());else if(a=await new ts(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await qn(),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
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:`
697
+ `+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
+ `+Et.yellow("\u2502")+" "+Et.bold("Update available!")+" "+Et.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Et.yellow("\u2502")+`
699
+ `+Et.yellow("\u2502")+" "+Et.yellow("\u2502")+`
700
+ `+Et.yellow("\u2502")+" Run: "+Et.cyan("npm update -g prjct-cli")+" "+Et.yellow("\u2502")+`
701
+ `+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
692
703
 
693
704
  No current task. Use \`/p:now\` to set focus.
694
705
  `,"core/next.md":`# NEXT
@@ -708,17 +719,17 @@ No current task. Use \`/p:now\` to set focus.
708
719
  `,"planning/roadmap.md":`# ROADMAP
709
720
 
710
721
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
711
- `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[D,j]of Object.entries(g))await De.get("Write")(En.join(p,D),j);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let D=await Bk();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!S){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=En.join(p,"planning","architect-session.md"),j=`# Architect Session
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
712
723
 
713
724
  ## Idea
714
- ${b}
725
+ ${P}
715
726
 
716
727
  ## Status
717
728
  Initialized - awaiting stack recommendation
718
729
 
719
730
  Generated: ${new Date().toLocaleString()}
720
- `;return await De.get("Write")(D,j),await Le.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Le.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 Ye.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 pe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:H.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 Ye.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await pe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:H.getTimestamp()}),n.md?console.log(me(Ue("Bug Reported",e),xt({Severity:a,Priority:m,Agent:u}),Oe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),ot("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
721
- `);let s=await this.getGlobalProjectPath(t),o=En.join(s,"planning","architect-session.md"),i;try{i=await te.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
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.
722
733
 
723
734
  Create a plan first:
724
735
  1. Run /p:init in an empty directory
@@ -739,7 +750,7 @@ The architect plan is ready. Claude will now:
739
750
  4. Create starter files with boilerplate
740
751
  `),console.log(`
741
752
  \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.
742
- `),await this.logToMemory(t,"architect_executed",{timestamp:H.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=En.join(c,"planning","architect-session.md"),d=`# Architect Session
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
743
754
 
744
755
  ## Idea
745
756
  ${e}
@@ -754,14 +765,14 @@ Initialized - awaiting architecture design
754
765
  4. Generate roadmap
755
766
 
756
767
  Generated: ${new Date().toLocaleString()}
757
- `;return await De.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:H.getTimestamp()}),n.md?console.log(me(Ue("Idea Captured",e),xt({Mode:"architecture"}),Oe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
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(`
758
769
  \u{1F4A1} Use /p:architect execute to continue planning
759
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Me.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:H.getTimestamp()}),n.md?console.log(me(Ue("Idea Captured",e),xt({Mode:"capture"}),Oe([{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)}`),ot("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=En.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(`
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(`
760
771
  \u{1F4A1} Create one with /p:spec "feature name"
761
772
  `),{success:!0,specs:[]}):(console.log(`
762
773
  \u{1F4CB} SPECIFICATIONS
763
- `),console.log("\u2550".repeat(50)),f.forEach((S,b)=>{let D=S.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
764
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=E.getGlobalProjectPath(s),i=En.join(o,"planning","specs");await te.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=En.join(i,`${a}.md`),u=`# Specification: ${e}
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}
765
776
 
766
777
  ## Overview
767
778
  [Brief description of the feature]
@@ -791,27 +802,41 @@ Generated: ${new Date().toLocaleString()}
791
802
  ---
792
803
  Created: ${new Date().toLocaleString()}
793
804
  Status: Draft
794
- `;return await De.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:H.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
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(`
795
806
  \u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
796
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var Fo,tn,Np=w(()=>{"use strict";Ut();Ur();nt();ue();O();je();yn();Fo=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(()=>(Mo(),Fp)),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 Ar.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 qn();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 Nn(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 Nn(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)}},tn=new Fo});var Vk,Lp,Up,kc,Hp,zp=w(()=>{"use strict";le();se();Vk=1800*1e3,Lp=50,Up=200,kc=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:Vk}}}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>Lp&&(s.current.commands=s.current.commands.slice(-Lp)),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>Up&&(s.current.files=s.current.files.slice(-Up)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:xs(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:xs(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}},Hp=new kc});import{exec as Jk}from"node:child_process";import{promisify as qk}from"node:util";var bc,Kk,_o,tr,Gp=w(()=>{"use strict";le();O();zp();bc=qk(Jk),Kk={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},_o=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Kk,...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 bc("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([bc(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),bc(`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(`
797
- `).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(`
798
- `)}async getSessionInfo(e){return Hp.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
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(`
799
810
  `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
800
- `)}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}},tr=l((r,e)=>new _o(r,e),"createStalenessChecker")});import Wp from"node:fs/promises";import No from"node:path";function nr(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 Zk(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...nr(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(...nr(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(...nr(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(...nr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...nr(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&&!Xk.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function Bp(r,e){let t=[],n=await Wp.readdir(r,{withFileTypes:!0});for(let s of n){if(Qk.has(s.name))continue;let o=No.join(r,s.name);if(s.isDirectory())t.push(...await Bp(o,e));else if(s.isFile()){let i=No.extname(s.name).toLowerCase();Yk.has(i)&&t.push(No.relative(e,o))}}return t}async function eb(r){let e=await Bp(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 Wp.readFile(No.join(r,d),"utf-8"),p=Zk(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 nb(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]))};z.setDoc(r,tb,t)}async function Vp(r,e){let t=await eb(r);return nb(e,t),t}var Yk,Xk,Qk,tb,Jp=w(()=>{"use strict";le();Yk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Xk=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"]),Qk=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(nr,"splitIdentifier");l(Zk,"tokenizeFile");l(Bp,"listFiles");l(eb,"buildIndex");tb="bm25-index";l(nb,"saveIndex");l(Vp,"indexProject")});import Pc from"node:fs/promises";import Ht from"node:path";function ab(r){let e=[],t,n=new RegExp(ib.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function cb(r,e,t){let n;if(r.startsWith("@/"))n=Ht.join(t,"src",r.slice(2));else{let s=Ht.dirname(Ht.join(t,e));n=Ht.resolve(s,r)}for(let s of ob){let o=n+s;try{if((await Pc.stat(o)).isFile())return Ht.relative(t,o)}catch{}}return null}async function qp(r,e){let t=[],n=await Pc.readdir(r,{withFileTypes:!0});for(let s of n){if(rb.has(s.name))continue;let o=Ht.join(r,s.name);if(s.isDirectory())t.push(...await qp(o,e));else if(s.isFile()){let i=Ht.extname(s.name).toLowerCase();sb.has(i)&&t.push(Ht.relative(e,o))}}return t}async function lb(r){let e=await qp(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 Pc.readFile(Ht.join(r,u),"utf-8"),m=ab(d),p=[];for(let g of m){let f=await cb(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 ub(r,e){z.setDoc(r,Kp,e)}function Yp(r){return z.getDoc(r,Kp)}async function Xp(r,e){let t=await lb(r);return ub(e,t),t}var sb,rb,ob,ib,Kp,Cc=w(()=>{"use strict";le();sb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),rb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),ob=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ib=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(ab,"extractImportSources");l(cb,"resolveImport");l(qp,"listFiles");l(lb,"buildGraph");Kp="import-graph";l(ub,"saveGraph");l(Yp,"loadGraph");l(Xp,"indexImports")});function Qp(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Yp(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 Zp(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 em=w(()=>{"use strict";Cc();l(Qp,"propagateChanges");l(Zp,"affectedDomains")});import xc from"node:fs/promises";import Lo from"node:path";async function tm(r,e){let t=[],n=await xc.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(pb.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Lo.join(r,o);if(s.isDirectory())t.push(...await tm(i,e));else if(s.isFile()){let a=Lo.extname(o).toLowerCase();db.has(a)&&t.push(Lo.relative(e,i))}}return t}function mb(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 gb(r){let e=await tm(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=Lo.join(r,a),[u,d]=await Promise.all([xc.readFile(c,"utf-8"),xc.stat(c)]);return{path:a,hash:mb(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 fb(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 vc(r,e){let t=z.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)})(),z.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function hb(r){let e=new Map;try{let t=z.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 Tc(r,e){let[t,n]=await Promise.all([gb(r),Promise.resolve(hb(e))]);return{diff:fb(t,n),currentHashes:t}}function nm(r){return z.hasDoc(r,"file-hashes-meta")}var db,pb,sm=w(()=>{"use strict";le();db=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),pb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(tm,"listProjectFiles");l(mb,"hashContent");l(gb,"computeHashes");l(fb,"diffHashes");l(vc,"saveHashes");l(hb,"loadHashes");l(Tc,"detectChanges");l(nm,"hasHashRegistry")});import{exec as yb}from"node:child_process";import{promisify as wb}from"node:util";async function bb(r,e=100){try{let{stdout:t}=await Sb(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
801
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=om&&n.push(s),s=new Set):i&&s&&Pb(i)&&s.add(i)}return s&&s.size>0&&s.size<=om&&n.push(s),n}catch{return[]}}function Pb(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 Cb(r,e=100){let t=await bb(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=xb(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<rm||m<rm)continue;let p=d+m-a,g=p>0?a/p:0;g<kb||(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 xb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Tb(r,e){z.setDoc(r,vb,e)}async function im(r,e,t=100){let n=await Cb(r,t);return Tb(e,n),n}var Sb,kb,rm,om,vb,am=w(()=>{"use strict";le();Sb=wb(yb),kb=.1,rm=2,om=30;l(bb,"parseGitLog");l(Pb,"isSourceFile");l(Cb,"buildMatrix");l(xb,"pairKey");vb="cochange-index";l(Tb,"saveMatrix");l(im,"indexCoChanges")});function ut(r){return`<!-- source: ${r.file}, ${r.type} -->`}function In(){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 Ec=w(()=>{"use strict";l(ut,"cite");l(In,"defaultSources")});function Eb(r,e){let t=r.sources||In();return`# ${r.name} - Project Rules
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?`
815
+ ### Project Structure
816
+
817
+ ${e.join(`
818
+ `)}
819
+ `:""}function Fb(r){let e=[];return r.patterns.length>0&&e.push(`
820
+ ### Code Patterns (Follow These)
821
+
822
+ ${or(r.patterns)}`),r.antiPatterns.length>0&&e.push(`
823
+ ### Anti-Patterns (Avoid These)
824
+
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
802
827
  <!-- projectId: ${r.projectId} -->
803
828
  <!-- Generated: ${new Date().toISOString()} -->
804
829
  <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
805
830
 
806
831
  ## THIS PROJECT (${r.ecosystem})
807
832
 
808
- ${ut(t.ecosystem)}
833
+ ${gt(t.ecosystem)}
809
834
  **Type:** ${r.projectType}
810
835
  **Path:** ${r.repoPath}
811
836
 
812
837
  ### Commands (USE THESE, NOT OTHERS)
813
838
 
814
- ${ut(t.commands)}
839
+ ${gt(t.commands)}
815
840
  | Action | Command |
816
841
  |--------|---------|
817
842
  | Install dependencies | \`${r.commands.install}\` |
@@ -823,11 +848,11 @@ ${ut(t.commands)}
823
848
 
824
849
  ### Code Conventions
825
850
 
826
- ${ut(t.languages)}
851
+ ${gt(t.languages)}
827
852
  - **Languages**: ${r.languages.join(", ")||"Not detected"}
828
- ${ut(t.frameworks)}
853
+ ${gt(t.frameworks)}
829
854
  - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
830
-
855
+ ${r.analysis?Fb(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
831
856
  ---
832
857
 
833
858
  ## PRJCT RULES
@@ -853,7 +878,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
853
878
 
854
879
  ## PROJECT STATE
855
880
 
856
- ${ut(t.name)}
881
+ ${gt(t.name)}
857
882
  | Field | Value |
858
883
  |-------|-------|
859
884
  | Name | ${r.name} |
@@ -871,12 +896,13 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
871
896
 
872
897
  **Workflow**: ${r.agents.workflow.join(", ")}
873
898
  **Domain**: ${r.agents.domain.join(", ")||"none"}
874
- `}function Ab(r,e){let t=r.sources||In(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(ut(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(ut(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push("## Code Style"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns in this project"),n.push("- Use idiomatic constructs for the language"),n.push(""),n.push("## Best Practices"),n.push("- Write clean, readable code"),n.push("- Add comments only for complex logic"),n.push("- Keep functions small and focused"),n.push("- Handle errors appropriately"),n.push("- Write tests for new functionality"),n.join(`
875
- `)}function Ib(r,e){let t=r.sources||In(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(ut(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),n.push("## Conventions"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns"),n.push("- Keep code clean and readable"),n.push(""),n.push(ut(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
876
- `)}function Db(r,e){let t=r.sources||In(),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(ut(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(ut(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),n.push("## Rules"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing project patterns"),n.push("- Clean code, minimal comments"),n.push("- Test new functionality"),n.join(`
877
- `)}function Rb(r,e){let n={systemMessage:[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`,"",`Follow ${r.ecosystem} conventions. Match existing code patterns.`].join(`
878
- `),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(n,null,2)}function cm(r){return{claude:Eb,cursor:Ab,copilot:Ib,windsurf:Db,continue:Rb}[r]||null}var Ac=w(()=>{"use strict";Ec();l(Eb,"formatForClaude");l(Ab,"formatForCursor");l(Ib,"formatForCopilot");l(Db,"formatForWindsurf");l(Rb,"formatForContinue");l(cm,"getFormatter")});import{exec as jb}from"node:child_process";import $b from"node:os";import sr from"node:path";import{promisify as Mb}from"node:util";function lm(r){return Uo[r]||null}async function Ic(r){try{return await Ob(`which ${r}`),!0}catch{return!1}}async function Ho(r=process.cwd()){let e=[];return await Ic("claude")&&e.push("claude"),(await Ic("cursor")||await M(sr.join(r,".cursor")))&&e.push("cursor"),await M(sr.join(r,".github"))&&e.push("copilot"),(await Ic("windsurf")||await M(sr.join(r,".windsurf")))&&e.push("windsurf"),(await M(sr.join(r,".continue"))||await M(sr.join($b.homedir(),".continue")))&&e.push("continue"),e}async function um(r,e=process.cwd()){if(r==="auto"){let t=await Ho(e);return t.length>0?t:["claude"]}return r==="all"?Fb:r.filter(t=>Uo[t])}var Ob,Uo,rr,Fb,Dc=w(()=>{"use strict";je();Ob=Mb(jb),Uo={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"}},rr=["claude"],Fb=Object.keys(Uo);l(lm,"getAIToolConfig");l(Ic,"commandExists");l(Ho,"detectInstalledTools");l(um,"resolveToolIds")});import Rc from"node:fs/promises";import jc from"node:path";async function dm(r,e,t,n=rr){let s=[];for(let o of n){let i=lm(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await _b(r,i,e,t);s.push(a)}return s}async function _b(r,e,t,n){let s=cm(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=jc.join(n,e.outputFile):i=jc.join(t,"context",e.outputFile),await Rc.mkdir(jc.dirname(i),{recursive:!0});try{let a=await Rc.readFile(i,"utf-8"),c=Ki(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=qi(o,a)}catch{}return await Rc.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 pm=w(()=>{"use strict";O();Yi();Ac();Dc();l(dm,"generateAIToolContexts");l(_b,"generateForTool")});var mm=w(()=>{"use strict";Ac();pm();Dc()});import $c from"node:fs/promises";import Mc from"node:path";var Oc,Fc,gm,fm=w(()=>{"use strict";O();Oc=".prjct-state.md",Fc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=Mc.join(e,Oc),s=this.toMarkdown(t);await $c.writeFile(n,s,"utf-8")}async remove(e){let t=Mc.join(e,Oc);try{await $c.unlink(t)}catch(n){if(!C(n))throw n}}async exists(e){let t=Mc.join(e,Oc);try{return await $c.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(`
879
- `)}},gm=new Fc});import _c from"node:fs/promises";import Nb from"node:os";import hm from"node:path";function Nc(){return hm.join(Nb.homedir(),".prjct-cli","skills",Lb)}function Ub(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function or(){try{let r=await _c.readFile(Nc(),"utf-8");return JSON.parse(r)}catch{return Ub()}}async function Lc(r){let e=Nc();await _c.mkdir(hm.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await _c.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function Hb(r){let e=await or();e.skills[r.name]=r,await Lc(e)}async function zb(r){let e=await or();return r in e.skills?(delete e.skills[r],await Lc(e),!0):!1}async function Gb(r){return(await or()).skills[r]||null}async function Wb(){return(await or()).skills}function Bb(){return Nc()}var Lb,ir,ym=w(()=>{"use strict";Lb=".skill-lock.json";l(Nc,"getLockFilePath");l(Ub,"createEmptyLockFile");l(or,"read");l(Lc,"write");l(Hb,"addEntry");l(zb,"removeEntry");l(Gb,"getEntry");l(Wb,"getAll");l(Bb,"getPath");ir={read:or,write:Lc,addEntry:Hb,removeEntry:zb,getEntry:Gb,getAll:Wb,getPath:Bb}});import{exec as Vb}from"node:child_process";import zt from"node:fs/promises";import Hc from"node:os";import ze from"node:path";import{promisify as Jb}from"node:util";import{glob as wm}from"glob";function km(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ze.join(Hc.homedir(),r.slice(1)):ze.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 bm(r){let e=[];try{let s=ze.join(r,"SKILL.md");await zt.access(s);let o=ze.basename(r);e.push({name:o,filePath:s})}catch{}let t=await wm("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ze.basename(ze.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await wm("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ze.basename(ze.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function qb(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()}
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()}
880
906
  ${s.join(`
881
907
  `)}`;return r.replace(o,`---
882
908
  ${c}
@@ -885,10 +911,10 @@ ${s.join(`
885
911
  `)}
886
912
  ---
887
913
 
888
- ${r}`}function zc(){return ze.join(Hc.homedir(),".claude","skills")}async function Uc(r,e,t,n){let s=zc(),o=ze.join(s,e),i=ze.join(o,"SKILL.md"),a=await zt.readFile(r,"utf-8"),c=qb(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 Kb(r){let e={installed:[],skipped:[],errors:[]};if(!so.isAvailable("git")){let n=so.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=ze.join(Hc.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Sm(`git clone --depth 1 ${n} ${t}`,{timeout:Qr("GIT_CLONE")});let s;try{let{stdout:a}=await Sm("git rev-parse HEAD",{cwd:t,timeout:Qr("TOOL_CHECK")});s=a.trim()}catch{}let o=await bm(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 Uc(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 ir.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 Yb(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=ze.basename(ze.dirname(t));try{let o=await Uc(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await ir.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await bm(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 Uc(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await ir.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function Xb(r){let e=zc(),t=ze.join(e,r);try{await zt.rm(t,{recursive:!0,force:!0})}catch{}let n=ze.join(e,`${r}.md`);try{await zt.rm(n,{force:!0})}catch{}return ir.removeEntry(r)}async function Qb(r){let e=km(r);switch(e.type){case"github":return Kb(e);case"local":return Yb(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Sm,Pm,Cm=w(()=>{"use strict";O();Yt();ma();ym();Sm=Jb(Vb);l(km,"parseSource");l(bm,"discoverSkills");l(qb,"injectSourceMetadata");l(zc,"getInstallDir");l(Uc,"installSkillFile");l(Kb,"installFromGitHub");l(Yb,"installFromLocal");l(Xb,"remove");l(Qb,"install");Pm={install:Qb,remove:Xb,parseSource:km,getInstallDir:zc}});import dt from"node:fs/promises";import Zb from"node:os";import it from"node:path";async function xm(r,e,t,n){let s=[],o=it.join(r,"agents");try{let c=await dt.readdir(o);for(let u of c)u.endsWith(".md")&&await dt.unlink(it.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=>eP(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=>tP(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 vm(r){let e=it.join(r,"agents"),t=[];try{let n=await dt.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 Tm(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=ve(`subagents/${o}.md`);if(!i){let a=it.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await dt.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 eP(r,e){let t="";try{let n=it.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await dt.readFile(n,"utf-8"),t=await Tm(t)}catch(n){B.debug("Workflow agent template not found, generating minimal",{name:r,error:K(n)}),t=sP(r)}await dt.writeFile(it.join(e,`${r}.md`),t,"utf-8")}async function tP(r,e,t,n,s){let o="";try{let i=it.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await dt.readFile(i,"utf-8"),o=await Tm(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=rP(r,t,n)}o=nP(o,r,s),await dt.writeFile(it.join(e,`${r}.md`),o,"utf-8")}function nP(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=[`
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=[`
889
915
  ## Recent Learnings (from completed tasks)
890
916
  `];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(`
891
- `)}function sP(r){return`---
917
+ `)}function gP(r){return`---
892
918
  name: ${r}
893
919
  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"}
894
920
  tools: Read, Write, Glob
@@ -904,7 +930,7 @@ When invoked:
904
930
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
905
931
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
906
932
  3. Execute requested operation
907
- `}function rP(r,e,t){return`---
933
+ `}function fP(r,e,t){return`---
908
934
  name: ${r}
909
935
  description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
910
936
  tools: Read, Write, Glob, Grep
@@ -924,17 +950,17 @@ Domain specialist for ${r} tasks.
924
950
  ## Your Role
925
951
 
926
952
  You are the ${r} expert for this project. Apply best practices for the detected stack.
927
- `}function Em(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 dt.writeFile(it.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 Am(r){let e=[];try{let t=it.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await dt.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=it.join(Zb.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=it.join(a,d,"SKILL.md"),p=it.join(a,`${d}.md`),g=!1;try{await dt.access(m),g=!0}catch{try{await dt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),S;f.length===3?S=`${f[0]}/${f[1]}@${f[2]}`:S=c;let b=await Pm.install(S);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),B.debug(`Skill install error for ${d}`,{error:K(f)})}}}catch(t){B.debug("Skill auto-installation failed (non-critical)",{error:K(t)})}return e}var Im=w(()=>{"use strict";Jn();Ut();se();Qn();Cm();l(xm,"generateAgents");l(vm,"loadExistingAgents");l(Tm,"resolveTemplateIncludes");l(eP,"generateWorkflowAgent");l(tP,"generateDomainAgent");l(nP,"injectFeedbackSection");l(sP,"generateMinimalWorkflowAgent");l(rP,"generateMinimalDomainAgent");l(Em,"configureSkills");l(Am,"autoInstallSkills")});import Dm from"node:fs/promises";import Rm from"node:path";var zo,jm=w(()=>{"use strict";zo=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=Rm.join(this.projectPath,"package.json"),t=await Dm.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Dm.access(Rm.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as oP}from"node:child_process";import $m from"node:fs/promises";import Gc from"node:path";import{promisify as iP}from"node:util";async function Mm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Dn("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Dn("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Dn("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Dn("git status --porcelain",{cwd:r}),i=o.trim().split(`
928
- `).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 Dn('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
929
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Dn('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 $m.access(Gc.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function Om(r){let e={fileCount:0,version:"0.0.0",name:Gc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Dn('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=Gc.join(r,"package.json"),n=JSON.parse(await $m.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 Fm(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 _m(r,e){let t=In(),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 Nm(r){return new zo(r).detect()}var Dn,Lm=w(()=>{"use strict";Ut();Ec();Qn();jm();Dn=iP(oP);l(Mm,"analyzeGit");l(Nt,"fileExists");l(Om,"gatherStats");l(Fm,"detectCommands");l(_m,"buildSources");l(Nm,"detectStack")});import{exec as aP}from"node:child_process";import Wc from"node:fs/promises";import Go from"node:path";import{promisify as cP}from"node:util";var lP,Bc,Vc,Um,Hm=w(()=>{"use strict";Mt();O();lP=cP(aP),Bc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Go.join(r,s);try{await Wc.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=Go.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=Go.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 Wc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Wc.readFile(Go.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}}},Vc=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Bc.contextFilesExist(t),Bc.jsonFilesValid(t),Bc.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 lP(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}}}},Um=new Vc});import Wo from"node:fs/promises";import Bo from"node:path";var Vo,ar,zm=w(()=>{"use strict";Hn();Jp();em();sm();am();Cc();Ut();mn();nt();ue();uo();Xt();le();Hs();po();go();Gs();Ws();Vs();mm();se();Qn();La();Ua();fm();fa();Im();Lm();Hm();Vo=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 Ho(e)).filter(i=>!rr.includes(i));s=[...rr,...o]}else t.aiTools[0]==="auto"?(s=await Ho(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await um("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 zs(this.projectId);try{let U=await mo(this.projectId);U>0&&B.info("Swept legacy JSON files into SQLite",{swept:U})}catch(U){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(U)})}let[i,a,c,u]=await Promise.all([Mm(this.projectPath),Om(this.projectPath),Fm(this.projectPath),Nm(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&nm(this.projectId))try{let{diff:U,currentHashes:jg}=await Tc(this.projectPath,this.projectId),fl=U.added.length+U.modified.length+U.deleted.length;if(fl===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:U.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let ui=Qp(U,this.projectId);f=Zp(ui.allAffected);let $g=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=ui.allAffected.some(on=>{let Mg=on.substring(on.lastIndexOf("."));return $g.has(Mg)}),g=ui.directlyChanged.some(on=>on==="package.json"||on==="tsconfig.json"||on.includes("Dockerfile")||on.includes("docker-compose")),m={isIncremental:!0,filesChanged:fl,filesUnchanged:U.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}vc(this.projectId,jg)}catch(U){B.debug("Incremental detection failed, falling back to full sync",{error:K(U)})}else try{let{currentHashes:U}=await Tc(this.projectPath,this.projectId);vc(this.projectId,U)}catch(U){B.debug("Hash computation failed (non-critical)",{error:K(U)})}if(p)try{await Promise.all([Vp(this.projectPath,this.projectId),Xp(this.projectPath,this.projectId),im(this.projectPath,this.projectId)])}catch(U){B.debug("File ranking index build failed (non-critical)",{error:K(U)})}let S;if(g)try{let U=await F.getAggregatedFeedback(this.projectId);(U.patternsDiscovered.length>0||U.knownGotchas.length>0||U.agentAccuracy.length>0)&&(S=U)}catch{}let b=g?await xm(this.globalPath,u,a,S):await vm(this.globalPath),D=Em(b,this.projectId,this.globalPath),j=g?await Am(b):[],q=_m(a,c),Re=[],Be={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(U=>U.type==="workflow").map(U=>U.name),domain:b.filter(U=>U.type==="domain").map(U=>U.name)},sources:q},gt=await dm(Be,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 P=Date.now()-n,A=await this.recordSyncMetrics(a,Re,b,P);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Le.installGlobalConfig(),await Le.syncCommands();let Se;try{let U=await R.readConfig(this.projectPath);Se=await Um.verify(this.projectPath,this.globalPath,U?.verification)}catch(U){B.debug("Verification failed (non-critical)",{error:K(U)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:j,contextFiles:Re,aiTools:gt.map(U=>({toolId:U.toolId,outputFile:U.outputFile,success:U.success})),syncMetrics:A,verification:Se,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=>Wo.mkdir(Bo.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 gm.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=Bo.join(this.globalPath,m),g=await Wo.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=Bo.join(this.globalPath,"agents",`${m.name}.md`),g=await Wo.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 wn.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 $t.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:k(),status:"draft",commitHash:s??void 0})}catch(s){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([qe.archiveOldShipped(this.projectId).catch(()=>0),Me.markDormantIdeas(this.projectId).catch(()=>0),pe.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),Je.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=st.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 ln,n=await Na.learnFromTaskHistory(this.projectId,e,t);try{let s=await yd.getFeatureOutcomes(this.projectId);s.length>0&&await Na.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=Bo.join(__dirname,"..","..","package.json");return JSON.parse(await Wo.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:[]}}},ar=new Vo});var nn=w(()=>{"use strict";_u();Wu();Bu();Ku();Xu();aa();ed();fa();td();nd();Np();Gp();zm()});import Gt from"chalk";function Gm(r){return Math.ceil(r.length/uP)}function Wm(r){let e=r.split(`
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(`
954
+ `).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(`
930
956
  `),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+=`
931
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Jc(r){return r.includes("<!-- prjct:preserve")}function Bm(r,e){let t=Wm(r),n=Wm(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Gm(r),tokensAfter:Gm(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)Jc(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
932
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Jc(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
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(`
933
959
  `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
934
- `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Jc(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
935
- `).length}),s.hasChanges=!0)}return s}function Vm(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Gt.green:p=>p,o=t?Gt.red:p=>p,i=t?Gt.yellow:p=>p,a=t?Gt.dim:p=>p,c=t?Gt.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
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(`
936
962
  `);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(`
937
- `)}function Jm(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Gt.green:c=>c,o=t?Gt.red:c=>c,i=t?Gt.cyan:c=>c,a=t?Gt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
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(`
938
964
  `))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(`
939
965
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
940
966
  `).length>5&&n.push(a(` ... ${c.before.split(`
@@ -945,11 +971,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Jc(r){return r.incl
945
971
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
946
972
  `).length>5&&n.push(a(` ... ${c.before.split(`
947
973
  `).length-5} more lines`))}n.push("")}return n.join(`
948
- `)}var uP,qm=w(()=>{"use strict";uP=4;l(Gm,"estimateTokens");l(Wm,"parseMarkdownSections");l(Jc,"isPreservedSection");l(Bm,"generateSyncDiff");l(Vm,"formatDiffPreview");l(Jm,"formatFullDiff")});import dP from"node:path";async function qc(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 Le.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(`
949
- `));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 ot("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Km(r){try{let e=await Je.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(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=H.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 cr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Kc(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Ym(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 Xm(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 | ${cr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${Mr(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 | ${Kc(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: ${cr(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(`
950
- `)}function Qm(r,e){let t=[];t.push(`# Repository Analysis
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
951
977
  `),t.push(`Generated: ${new Date().toLocaleString()}
952
- `);let n=dP.basename(e);if(t.push(`## Project: ${n}
978
+ `);let n=PP.basename(e);if(t.push(`## Project: ${n}
953
979
  `),t.push(`## Stack Detected
954
980
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
955
981
  `),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
@@ -965,34 +991,34 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Jc(r){return r.incl
965
991
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
966
992
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
967
993
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
968
- `)}var Zm=w(()=>{"use strict";mn();Or();nn();es();yn();He();l(qc,"showSyncResult");l(Km,"getSessionActivity");l(cr,"formatTokens");l(Kc,"formatDuration");l(Ym,"generateSparkline");l(Xm,"generateStatsMarkdown");l(Qm,"generateAnalysisSummary")});var _p={};Mn(_p,{AnalysisCommands:()=>Rn});import Yc from"node:fs/promises";import eg from"node:path";import tg from"prompts";var Rn,Oo=w(()=>{"use strict";Hn();vu();mn();Or();nn();qm();uo();le();po();O();Zn();es();yn();Zm();He();Rn=class extends ae{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
969
- `),Ie.init(t);let n=await Ye.build(t,e),s={packageJson:await Ie.readPackageJson(),cargoToml:await Ie.readCargoToml(),goMod:await Ie.readGoMod(),requirements:await Ie.readRequirements(),directories:await Ie.listDirectories(),fileCount:await Ie.countFiles(),gitStats:await Ie.getGitStats(),gitLog:await Ie.getGitLog(20),hasDockerfile:await Ie.fileExists("Dockerfile"),hasDockerCompose:await Ie.fileExists("docker-compose.yml"),hasReadme:await Ie.fileExists("README.md"),hasTsconfig:await Ie.fileExists("tsconfig.json"),hasViteConfig:await Ie.fileExists("vite.config.ts")||await Ie.fileExists("vite.config.js"),hasNextConfig:await Ie.fileExists("next.config.js")||await Ie.fileExists("next.config.mjs")},o=Qm(s,t),i=await R.getProjectId(t),a=n.paths.analysis||E.getFilePath(i,"analysis","repo-summary.md");await De.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:H.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ve(),at(et)).getActiveProvider(),d=await Le.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${E.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
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!
970
996
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
971
- `),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 ar.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=eg.join(o,"context","CLAUDE.md"),c=null;try{c=await Yc.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 ar.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(me("## 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 Yc.readFile(a,"utf-8")}catch{p=""}let g=Bm(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 Yc.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let j of g.added)b.push(`Added: ${j.name} (${j.lineCount} lines)`);for(let j of g.modified)b.push(`Modified: ${j.name} (${j.lineCount} lines)`);for(let j of g.removed)b.push(`Removed: ${j.name} (${j.lineCount} lines)`);let D=me("## Sync Preview",b.length>0?Ue("Changes",Ct(b),3):"No section changes.",xt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:b,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Vm(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await tg({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(`
972
- ${Jm(g)}`),!(await tg({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"),qc(m,i))}t.md||h.spin("Syncing project...");let d=await ar.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(me("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=fo("sync"),S=me(Ot("Sync Complete",xt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Zt("Uncommitted changes detected"):null,Oe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return qc(d,i)}catch(n){return t.md?console.log(me("## 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 wn.getSummary(s),i=await wn.getDailyStats(s,30),a=await Km(s),c=await de.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 wn.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: ${cr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Mr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Kc(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=Ym(i);if(console.log(` ${p} ${cr(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=Xm(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=tr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await $t.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=eg.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=me(`## Status: ${u}`,xt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Ue("Analysis",Ct(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=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await $t.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await $t.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await $t.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 EP}from"node:child_process";import{promisify as AP}from"node:util";async function ei(r){if(process.platform!=="darwin")return pg(r);try{let{stdout:e}=await IP(`security find-generic-password -s "${DP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return pg(r)}}function pg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var IP,DP,ll=w(()=>{"use strict";O();IP=AP(EP),DP="prjct-cli";l(ei,"getCredential");l(pg,"getEnvFallback")});import mt from"node:fs";import{createServer as fC}from"node:net";pi();Oo();nn();Mt();O();Zn();He();import pP from"node:path";nt();ue();O();se();var Jo=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:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:k()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:k()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},L=new Jo;var ss=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=pP.basename(t),a=await F.getCurrentTask(o),c=await pe.getActiveTasks(o),u=await qe.getRecent(o,5),d=await Me.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=H.getDaysAgo(m),g=[];try{let b=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(j=>({...JSON.parse(j.data),timestamp:j.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
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(`
973
999
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
974
1000
  `),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(`
975
1001
  Activity: ${S}
976
- `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await Ye.build(t),p=await De.get("Read")(m.paths.roadmap);if(console.log(`
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(`
977
1003
  \u{1F5FA}\uFE0F ROADMAP - ${i}
978
1004
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
979
- `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let b=f.split(`
980
- `)[0].trim();console.log(` ${S+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
981
- `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${H.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(S=>{let b=S.priority?` [${S.priority}]`:"";return`${S.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let b=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=me(`## Dashboard: ${i}`,Ue("Current Focus",m,3),Ue(`Queue (${c.length})`,Ct(p,!0),3),Ue("Recent Ships",Ct(g),3),Ue("Ideas",`${d.length} pending`,3),Oe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
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(`
982
1008
  \u{1F4CA} DASHBOARD - ${i}
983
- `),console.log("\u2550".repeat(50));let m=tr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1009
+ `),console.log("\u2550".repeat(50));let m=sr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
984
1010
  ${g}`),console.log(`
985
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=H.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
986
- \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1011
+ \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(`
987
1013
  \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(`
988
1014
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
989
1015
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
990
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:H.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(`
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(`
991
1017
  PRJCT COMMANDS
992
- `),console.log("=".repeat(50));let i=L.getAllCategories(),a=L.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1018
+ `),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(`
993
1019
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
994
1020
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
995
- `),{success:!0,topic:"overview"}}let n=L.getByName(e);if(n){if(console.log(`
1021
+ `),{success:!0,topic:"overview"}}let n=H.getByName(e);if(n){if(console.log(`
996
1022
  \u{1F4DA} HELP: /p:${n.name}
997
1023
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
998
1024
  Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
@@ -1002,7 +1028,7 @@ ${"\u2550".repeat(50)}
1002
1028
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1003
1029
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1004
1030
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1005
- `),{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("")}};sc();nt();ue();Mt();O();import mP from"node:fs/promises";import gP from"node:path";var jn=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 vo.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=gP.join(e,"analysis","repo-analysis.json"),n=await mP.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}}},MN=new jn;He();nn();Mt();le();O();He();async function qo(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=z.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;z.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(qo,"cleanupMemory");async function Ko(r){let e=await R.getProjectId(r);if(!e)return;let n=z.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;z.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(Ko,"cleanupMemoryInternal");async function Xc(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await qo(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=z.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;z.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 Me.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 pe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await Ko(e),await Je.log(e,"cleanup_performed",{items:s.length,timestamp:H.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(Xc,"cleanup");nn();O();He();import ng from"node:path";async function Qc(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=ng.join(E.getGlobalProjectPath(i),"planning","designs");await te.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
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}
1006
1032
 
1007
1033
  *Use templates/design/architecture.md for full design*
1008
1034
  `;break;case"api":c=`# API Design: ${o}
@@ -1017,12 +1043,12 @@ ${"\u2550".repeat(50)}
1017
1043
  `;break;case"flow":c=`# Flow Design: ${o}
1018
1044
 
1019
1045
  *Use templates/design/flow.md for full design*
1020
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=ng.join(a,u);return await te.writeFile(d,c),await Je.log(t,"design_created",{type:n,target:o,timestamp:H.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(Qc,"design");nn();O();He();import rs from"node:path";async function Zc(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(`
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(`
1021
1047
  Found abandoned session:
1022
- `),console.log(` Task: ${n.task}`),n.startedAt){let s=H.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1048
+ `),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(`
1023
1049
  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
1024
- `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Zc,"recover");async function el(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=rs.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=rs.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 Je.log(r,"undo_performed",{snapshotId:i,timestamp:H.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(el,"undo");async function tl(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=rs.join(E.getGlobalProjectPath(e),"snapshots"),n=rs.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(`
1025
- `).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 Je.log(r,"redo_performed",{timestamp:H.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(tl,"redo");async function nl(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=rs.join(E.getGlobalProjectPath(e),"snapshots"),n=rs.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(`
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(`
1026
1052
  SNAPSHOT HISTORY
1027
1053
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1028
1054
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1030,32 +1056,32 @@ ${"\u2550".repeat(50)}
1030
1056
  `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1031
1057
  `)):(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
1032
1058
  `)),console.log(`${"=".repeat(50)}
1033
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(nl,"history");var os=class extends ae{static{l(this,"MaintenanceCommands")}_cleanupMemory=qo;_cleanupMemoryInternal=Ko;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Xc(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Qc(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Zc(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?el(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?tl(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?nl(e):t}};import fe from"chalk";le();var sl=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){z.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)z.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){z.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){z.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 z.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),f=c.map(S=>S.value);o.memory={avgHeapMB:p(g.reduce((S,b)=>S+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,b)=>S+b,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((S,b)=>S+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},fP=new sl,sg=fP;O();He();var sn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Yo(r,e,t){return t==="below"?r<=e?fe.green("\u2713"):fe.yellow("\u26A0"):r>=e?fe.green("\u2713"):fe.yellow("\u26A0")}l(Yo,"statusIcon");var is=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 sg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1034
- ${fe.dim("No performance data yet.")}`),console.log(`${fe.dim("Metrics are collected automatically as you use the CLI.")}
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.")}
1035
1061
  `),{success:!0,message:"No data"};if(console.log(`
1036
- ${fe.cyan("Performance Report")} ${fe.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Yo(i.startup.avg,sn.startup.max,"below");console.log(` Startup: avg ${fe.bold(`${i.startup.avg}ms`)} ${fe.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${fe.dim(`target: <${sn.startup.max}ms`)}`)}if(i.memory){let c=Yo(i.memory.peakHeapMB,sn.heapMB.max,"below");console.log(` Memory: avg ${fe.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${fe.dim(`target: <${sn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Yo(i.contextCorrectness.rate,sn.contextRate.min,"above");console.log(` Context: ${fe.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${fe.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${fe.dim(`target: ${sn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Yo(i.subtaskHandoff.rate,sn.handoffRate.min,"above");console.log(` Handoff: ${fe.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${fe.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${fe.dim(`target: ${sn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1037
- ${fe.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${fe.bold(`${u.avg}ms`)} ${fe.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)}}}};Mo();mn();ue();O();je();dn();He();import rl from"node:fs/promises";import hP from"node:path";import Z from"chalk";var as=class extends ae{static{l(this,"SetupCommands")}async start(){let t=await(Ve(),at(et)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1038
- `),!(await Le.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
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.
1039
1065
 
1040
1066
  Please install it first:
1041
- - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Le.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
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(`
1042
1068
  \u2705 Installed ${s.installed?.length??0} commands to:
1043
1069
  ${E.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
1044
1070
  \u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1045
1071
  \u{1F389} Setup complete!`),console.log(`
1046
1072
  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...
1047
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Le.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Le.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
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(`
1048
1074
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1049
1075
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
1050
- \u{1F4DD} Installing global configuration...`);let n=await Le.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(Ve(),at(et)).getActiveProvider()).name==="claude"){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(`
1051
1077
  \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(`
1052
1078
  \u{1F389} Setup complete!
1053
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=E.getClaudeDir(),t=E.getClaudeSettingsPath(),n=hP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
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
1054
1080
  # prjct Status Line for Claude Code
1055
1081
  # Shows version update notifications and current task
1056
1082
 
1057
1083
  # Current CLI version (embedded at install time)
1058
- CLI_VERSION="${Wn}"
1084
+ CLI_VERSION="${Bn}"
1059
1085
 
1060
1086
  # Read JSON context from stdin (provided by Claude Code)
1061
1087
  read -r json
@@ -1106,18 +1132,18 @@ fi
1106
1132
 
1107
1133
  # Default: show prjct branding
1108
1134
  echo "\u26A1 prjct"
1109
- `;await rl.writeFile(n,s,{mode:493});let o={};if(await M(t))try{o=JSON.parse(await rl.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await rl.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(Z.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(Z.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(Z.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(Z.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(Z.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(Z.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(Z.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${Z.bold.cyan("prjct")}${Z.magenta("/")}${Z.green("cli")} ${Z.dim.white(`v${Wn} 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("")}};Hn();Mt();O();Zn();es();import cg from"node:path";je();import Xe from"node:path";async function yP(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(Xe.join(r,"pnpm-lock.yaml"))?"pnpm":await M(Xe.join(r,"yarn.lock"))?"yarn":await M(Xe.join(r,"bun.lockb"))||await M(Xe.join(r,"bun.lock"))?"bun":(await M(Xe.join(r,"package-lock.json")),"npm")}l(yP,"detectPackageManager");function rg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(rg,"pmRun");function wP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(wP,"pmTest");async function ol(r){let e=Xe.join(r,"package.json"),t=await an(e,null);if(t){let o=await yP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:rg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:rg(o,"typecheck")}),i.test&&(a.test={tool:o,command:wP(o)}),a}if(await M(Xe.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await _n(Xe.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await M(Xe.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await M(Xe.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Nn(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await M(Xe.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await M(Xe.join(r,"gradlew"))&&(await M(Xe.join(r,"build.gradle"))||await M(Xe.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(ol,"detectProjectCommands");Hn();O();Yt();import{exec as SP}from"node:child_process";import{promisify as kP}from"node:util";import Et from"chalk";var bP=kP(SP),Xo=new Map,cs=new Map;function lr(r,e){return`workflow:${r}_${e}`}l(lr,"prefKey");async function og(r,e){let t=lr(e.hook,e.command);switch(e.scope){case"permanent":await de.recordDecision(r,t,e.action,"workflow");break;case"session":Xo.set(t,e);break;case"once":cs.set(t,e);break}}l(og,"setWorkflowPreference");async function PP(r,e){let t={};for(let n of["before","after","skip"]){let s=lr(n,e),o=cs.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Xo.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await de.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(PP,"getWorkflowPreferences");async function rn(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await PP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=lr(e,t);cs.has(i)&&cs.delete(i),console.log(`
1110
- ${Et.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await bP(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${Et.green("\u2713")} ${Et.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Et.red("\u2717 failed"));let c=y(a)||"Unknown error";return console.log(Et.dim(c.split(`
1111
- `)[0])),{success:!1,failed:o,output:c}}}l(rn,"runWorkflowHooks");async function il(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=lr(o,s),a=cs.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Xo.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await de.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(il,"listWorkflowPreferences");async function ig(r,e,t){let n=lr(e,t);return cs.delete(n),Xo.delete(n),await de.recordDecision(r,n,"","workflow:remove"),!0}l(ig,"removeWorkflowPreference");function ag(r){if(r.length===0)return`${Et.dim(Us.NO_PREFERENCES)}
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)}
1112
1138
 
1113
- Set one: "${Us.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];for(let t of r){let n=t.scope==="permanent"?Et.green("permanent"):t.scope==="session"?Et.yellow("session"):Et.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Et.dim(`Modify: "${Us.MODIFY_EXAMPLE}"`)),e.push(Et.dim(`Remove: "${Us.REMOVE_EXAMPLE}"`)),e.join(`
1114
- `)}l(ag,"formatWorkflowPreferences");He();var ls=class extends ae{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=De.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
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}
1115
1141
  ${o.stderr}`.trim(),a=i.split(`
1116
1142
  `),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(`
1117
1143
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
1118
- `).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 rn(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 qe.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:H.getTimestamp()}),await de.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await de.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await de.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await rn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=fo("ship"),S=me(Ot(`Shipped: ${i}`,`Version: ${d}`),Ue("Results",Ct([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),Oe(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(S)}else h.done(`v${d} shipped`),ot("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 ol(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return C(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await ol(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return C(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=cg.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=cg.join(n,"CHANGELOG.md"),o=await te.readFile(s,`# Changelog
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
1119
1145
 
1120
- `),i=`## [${t}] - ${H.formatDate(new Date)}
1146
+ `),i=`## [${t}] - ${U.formatDate(new Date)}
1121
1147
 
1122
1148
  ### Added
1123
1149
  - ${e}
@@ -1126,22 +1152,32 @@ ${o.stderr}`.trim(),a=i.split(`
1126
1152
 
1127
1153
  `,`# Changelog
1128
1154
 
1129
- ${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 De.get("Bash")("git add .");let n=`feat: ${e}
1130
-
1131
- Generated with [p/](https://www.prjct.app/)`;return await De.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 De.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)"}}}};nt();ue();go();O();yn();He();import CP from"node:fs/promises";import xP from"node:path";import us from"chalk";var ds=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(us.dim(`[dry-run] Would update ${o.length} project(s)
1132
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${us.dim("would update")} ${m}`);continue}try{let p=await zs(d),g=await mo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${us.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${us.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${us.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${us.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=xP.join(E.getGlobalBasePath(),"projects");try{return(await CP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};Ya();Un();ja();O();Pn();He();import he from"chalk";var ps=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 Ke.getAll(s);if(i.length===0)return console.log(`
1133
- ${he.dim("No velocity data yet.")}`),console.log(`${he.dim("Complete tasks with estimates to build velocity history.")}
1134
- `),{success:!0,message:"No data"};let a=Co(i,o);await Ra.saveMetrics(s,a),console.log(`
1135
- ${he.cyan("Sprint Velocity")} ${he.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?he.green:m.estimationAccuracy>=60?he.yellow:he.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${he.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?he.green("\u2191"):a.velocityTrend==="declining"?he.red("\u2193"):he.dim("\u2192");if(console.log(` Average: ${he.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${he.bold(`${a.estimationAccuracy}%`)} ${he.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1136
- ${he.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${he.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${he.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${he.green("\u2713")} ${m.category} tasks estimated within ${he.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Ud(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1137
- ${he.dim("Projection:")}`),console.log(` Backlog: ${he.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${he.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{...qt,...n.velocity}}catch{}return qt}};hc();pc();Pn();var vP=[1,2,3,5,8,13,21],TP={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}},ug=l(r=>vP.includes(r),"isValidPoint"),Qo=l(r=>TP[r],"pointsToMinutes"),lg=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"),dg=l(r=>{let e=Qo(r);return`${lg(e.min)}\u2013${lg(e.max)}`},"pointsToTimeRange");lo();var Zo=300*1e3,_e=new Pt({ttl:Zo,maxSize:100}),At=new Pt({ttl:Zo,maxSize:10}),ms=new Pt({ttl:Zo,maxSize:5}),gs=new Pt({ttl:Zo,maxSize:5});function al(){_e.clear(),At.clear(),ms.clear(),gs.clear()}l(al,"clearLinearCache");function cl(){return{issues:_e.stats(),assignedIssues:At.stats(),teams:ms.stats(),projects:gs.stats()}}l(cl,"getLinearCacheStats");O();ll();var RP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},jP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},mg={none:0,urgent:1,high:2,medium:3,low:4},ti=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 ei("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?mg[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=mg[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:RP[t?.type||"backlog"]||"backlog",priority:jP[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},Qe=new ti;var ni=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&Qe.isConfigured()}async initialize(e){this.initialized||(await Qe.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=At.get(t);if(n)return n;let s=await Qe.fetchAssignedIssues(e);At.set(t,s);for(let o of s)_e.set(`issue:${o.id}`,o),_e.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=At.get(n);if(s)return s;let o=await Qe.fetchTeamIssues(e,t);At.set(n,o);for(let i of o)_e.set(`issue:${i.id}`,i),_e.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=_e.get(t);if(n)return n;let s=await Qe.fetchIssue(e);return s&&(_e.set(`issue:${s.id}`,s),_e.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await Qe.createIssue(e);return _e.set(`issue:${t.id}`,t),_e.set(`issue:${t.externalId}`,t),At.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await Qe.updateIssue(e,t);return _e.set(`issue:${n.id}`,n),_e.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await Qe.markInProgress(e),_e.delete(`issue:${e}`),At.clear()}async markDone(e){this.ensureInitialized(),await Qe.markDone(e),_e.delete(`issue:${e}`),At.clear()}async addComment(e,t){this.ensureInitialized(),await Qe.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ms.get("teams");if(e)return e;let t=await Qe.getTeams();return ms.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=gs.get("projects");if(e)return e;let t=await Qe.getProjects();return gs.set("projects",t),t}clearCache(){al()}getCacheStats(){return cl()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},pt=new ni;Ri();le();O();var gg=1800*1e3,si=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await pt.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:gg,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 pt.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 pt.markInProgress(t):n==="done"&&await pt.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||gg;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=Xl("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}}},$P=new si;yt();Mt();O();Zn();es();O();je();ll();import MP from"node:fs/promises";import OP from"node:os";import FP from"node:path";function _P(r){return FP.join(OP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(_P,"getCredentialsPath");async function ri(r){let e=_P(r);if(!await M(e))return{};try{return JSON.parse(await MP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(ri,"getProjectCredentials");async function ul(r){let e=await ri(r);return e.linear?.apiKey?e.linear.apiKey:ei("linear-api-key")}l(ul,"getLinearApiKey");Pn();He();var fs=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 rn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await jo.execute("task",{task:e},t);if(!a.success)return n.md||h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await ri(o),S=await ul(o);if(S&&f.linear?.teamId){await pt.initializeFromApiKey(S,f.linear.teamId);let b=await pt.fetchIssue(e);b&&(c=e,u=`${e}: ${b.title}`,await pt.markInProgress(e))}}catch{}await F.startTask(o,{id:oe(),description:u,sessionId:oe(),linearId:c});let m=await dc.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;if(n.md){let f=a.subtasks||[],S=$a({description:u,branch:a.branch,linearId:c,type:a.type}),b=f.length>0?Ma(f,0):"",D=dd(["All commits must include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"]),j=Oe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(me(S,b,D,j))}else h.done(`${e}`,{agents:g>0?g:void 0}),qs("working"),ot("task");return await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:H.getTimestamp()}),await rn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:ug,pointsToMinutes:Qo,pointsToTimeRange:dg,storeEstimate:l(async f=>{let S=Qo(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?console.log(Zt("No active task")):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?H.calculateDuration(new Date(i.startedAt)):void 0,c=$a({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?Ma(u,d):"",p=Oe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(me(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await F.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await rn(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=H.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await Ke.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:H.getTimestamp(),estimatedDuration:d?fg(d):"0m",actualDuration:c||"0m",variance:d?NP(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,S=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${fg(d)}) \u2192 ${b}${S}%`}await F.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await ri(s),S=await ul(s);S&&f.linear?.teamId&&(await pt.initializeFromApiKey(S,f.linear.teamId),await pt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(me(Ot("Subtask Complete",`**Completed:** ${a}${f}`),xt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Oe([{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"),ot("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:H.getTimestamp()}),await rn(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 pe.getActiveTasks(s);if(o.length===0)return t.md?console.log(Zt("Queue is empty")):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(me(Ue("Queue",`${o.length} task${o.length!==1?"s":""}`),Ct(i,!0),Oe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),ot("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?console.log(Zt("No active task to pause")):h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};let a="";if(i.startedAt&&(a=H.calculateDuration(new Date(i.startedAt))),await F.pauseTask(o,e),n.md)console.log(me(Ot("Task Paused",`**Paused:** ${i.description}`),xt({Reason:e||void 0,"Duration worked":a||void 0}),Oe([{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"),ot("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:H.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?console.log(Zt(`Already working on: ${i.description}`)):h.warn("already working on a task"),{success:!1,message:`Already working on: ${i.description}`};let a=await F.resumeTask(o);return a?(n.md?console.log(me(Ot("Task Resumed",`**Resumed:** ${a.description}`),Oe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),qs("working"),ot("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:H.getTimestamp()}),{success:!0,task:a.description}):(n.md?console.log(Zt("No paused task found")):h.warn("no paused task to resume"),{success:!1,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 il(s);return console.log(ag(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await og(s,{...o,createdAt:H.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await ig(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>il(s),"listWorkflowPreferences")}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function fg(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}l(fg,"formatMinutesToDuration");function NP(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(NP,"formatVariance");var $n=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new fs,this.planning=new An,this.shipping=new ls,this.analytics=new ss,this.performanceCmds=new is,this.maintenance=new os,this.analysis=new Rn,this.setupCmds=new as,this.updateCmds=new ds,this.velocityCmds=new ps,this.contextCmds=new jn,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)}},I1=new $n;Oo();var hg={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}},yg=[{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"]}];Mo();mn();ue();O();je();He();import{execSync as oi}from"node:child_process";import Ze from"node:fs/promises";import LP from"node:os";import Wt from"node:path";import UP from"node:readline";import ce from"chalk";var ii="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",ur="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function dl(r){let e=0;try{let t=await Ze.readdir(r,{withFileTypes:!0});for(let n of t){let s=Wt.join(r,n.name);if(n.isDirectory())e+=await dl(s);else try{let o=await Ze.stat(s);e+=o.size}catch{}}}catch{}return e}l(dl,"getDirectorySize");function wg(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(wg,"formatSize");async function HP(r){try{return(await Ze.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(HP,"countDirectoryItems");function zP(){let r={homebrew:!1,npm:!1};try{oi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{oi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(zP,"detectInstallation");async function GP(){let r=[],e=Iu(),t=E.getGlobalBasePath(),n=await M(t),s=n?await HP(Wt.join(t,"projects")):0,o=n?await dl(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=Wt.join(e.claude.config,"CLAUDE.md"),a=await M(i),c=!1;if(a)try{let Be=await Ze.readFile(i,"utf-8");c=Be.includes(ii)&&Be.includes(ur)}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 dl(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=Wt.join(e.claude.config,"prjct-statusline.sh"),S=await M(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let b=e.gemini.router,D=await M(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let j=Wt.join(e.gemini.config,"GEMINI.md"),q=await M(j),Re=!1;if(q)try{let Be=await Ze.readFile(j,"utf-8");Re=Be.includes(ii)&&Be.includes(ur)}catch{}return q&&Re&&r.push({path:j,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(GP,"gatherUninstallItems");async function WP(r){try{let e=await Ze.readFile(r,"utf-8");if(!e.includes(ii)||!e.includes(ur))return!1;let t=e.indexOf(ii),n=e.indexOf(ur)+ur.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1138
-
1139
- `).trim(),!s||s.trim().length===0?await Ze.unlink(r):await Ze.writeFile(r,`${s}
1140
- `,"utf-8"),!0}catch{return!1}}l(WP,"removePrjctSection");async function BP(){let r=LP.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Wt.join(r,`.prjct-backup-${e}`);try{await Ze.mkdir(t,{recursive:!0});let n=E.getGlobalBasePath();return await M(n)&&await Sg(n,Wt.join(t,".prjct-cli")),t}catch{return null}}l(BP,"createBackup");async function Sg(r,e){await Ze.mkdir(e,{recursive:!0});let t=await Ze.readdir(r,{withFileTypes:!0});for(let n of t){let s=Wt.join(r,n.name),o=Wt.join(e,n.name);n.isDirectory()?await Sg(s,o):await Ze.copyFile(s,o)}}l(Sg,"copyDirectory");async function VP(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await WP(o.path)&&n.push(o.path):o.type==="directory"?(await Ze.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await Ze.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||oi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||oi("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(VP,"performUninstall");async function JP(r){let e=UP.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(JP,"promptConfirmation");async function qP(r={},e=process.cwd()){let t=await GP(),n=zP(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ce.yellow(`
1141
- 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(`(${wg(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: ${wg(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 BP();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 JP("> ")))return console.log(ce.yellow(`
1142
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await VP(t,n,r);if(console.log(""),i.length>0&&console.log(ce.green(`Removed ${i.length} items`)),a.length>0){console.log(ce.yellow(`
1143
- ${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(qP,"uninstall");var ai=class extends ae{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return qP(e,t)}};var hs=new fs,ci=new An,KP=new ls,kg=new ss,YP=new is,ys=new os,ws=new Rn,bg=new as,XP=new jn,QP=new ps,ZP=new ai,eC=new ds;function tC(){for(let[r,e]of Object.entries(hg))L.registerCategory(r,e)}l(tC,"registerCategories");function Pg(){if(L.has("work"))return;tC();let r=l(e=>yg.find(t=>t.name===e),"getMeta");L.registerMethod("task",hs,"now",r("task")),L.registerMethod("done",hs,"done",r("done")),L.registerMethod("next",hs,"next",r("next")),L.registerMethod("pause",hs,"pause",r("pause")),L.registerMethod("resume",hs,"resume",r("resume")),L.registerMethod("workflow",hs,"workflow",r("workflow")),L.registerMethod("init",ci,"init",r("init")),L.registerMethod("bug",ci,"bug",r("bug")),L.registerMethod("idea",ci,"idea",r("idea")),L.registerMethod("spec",ci,"spec",r("spec")),L.registerMethod("ship",KP,"ship",r("ship")),L.registerMethod("dash",kg,"dash",r("dash")),L.registerMethod("help",kg,"help",r("help")),L.registerMethod("perf",YP,"perf",r("perf")),L.registerMethod("velocity",QP,"velocity",r("velocity")),L.registerMethod("cleanup",ys,"cleanup",r("cleanup")),L.registerMethod("design",ys,"design",r("design")),L.registerMethod("recover",ys,"recover",r("recover")),L.registerMethod("undo",ys,"undo",r("undo")),L.registerMethod("redo",ys,"redo",r("redo")),L.registerMethod("history",ys,"history",r("history")),L.registerMethod("analyze",ws,"analyze",r("analyze")),L.registerMethod("sync",ws,"sync",r("sync")),L.registerMethod("stats",ws,"stats",r("stats")),L.registerMethod("status",ws,"status",r("status")),L.registerMethod("seal",ws,"seal",r("seal")),L.registerMethod("verify",ws,"verify",r("verify")),L.registerMethod("start",bg,"start",r("start")),L.registerMethod("setup",bg,"setup",r("setup")),L.registerMethod("uninstall",ZP,"uninstall",r("uninstall")),L.registerMethod("update",eC,"update",r("update")),L.registerMethod("context",XP,"context",r("context"))}l(Pg,"registerAllCommands");Pg();nt();Pi();import{Hono as pC}from"hono";import{cors as mC}from"hono/cors";import{logger as gC}from"hono/logger";ue();le();Hs();Gs();Ws();Vs();O();Qn();import nC from"node:fs/promises";import sC from"node:path";import{Hono as rC}from"hono";function oC(r){return E.getGlobalProjectPath(r)}l(oC,"getProjectDataPath");function Cg(r,e){let t=new rC,n=oC(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 pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Me.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 qe.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([F.read(r),pe.read(r),Me.read(r),qe.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=sC.join(n,"context",`${o}.md`),c=await nC.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(Cg,"createRoutes");ue();le();Hs();Gs();Ws();Vs();import Ss from"node:fs/promises";import iC from"node:path";import{Hono as aC}from"hono";var cC=E.getGlobalBasePath(),ks=iC.join(cC,"projects");function li(r){return $.getDoc(r,"project")}l(li,"getProjectConfig");async function pl(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(pl,"calculateDuration");function xg(){let r=new aC;return r.get("/projects",async e=>{try{await Ss.mkdir(ks,{recursive:!0});let n=(await Ss.readdir(ks,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=li(o),a=await F.read(o),c=await pe.read(o),u=await Me.read(o),d=await qe.read(o),m=a?.currentTask,p=await pl(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(li(t)),F.read(t),pe.read(t),Me.read(t),qe.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await pl(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),pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await 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 Me.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 Ss.mkdir(ks,{recursive:!0});let n=(await Ss.readdir(ks,{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 pe.read(c),m=await Me.read(c),p=await qe.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 Ss.mkdir(ks,{recursive:!0});let s=(await Ss.readdir(ks,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=li(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=li(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await pl(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(xg,"createExtendedRoutes");di();import{streamSSE as lC}from"hono/streaming";var vg=3600*1e3,uC=300*1e3,dC=3e4;function Tg(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>vg&&t(i)},uC),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 lC(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)}},dC),p=setTimeout(()=>{t(a)},vg);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}l(Tg,"createSSEManager");function Eg(r){let e=new pC,t=Tg();r.enableCors!==!1&&e.use("*",mC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",gC()),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=Cg(r.projectId,r.projectPath);e.route("/api",n);let s=xg();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(As())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: ${As()?"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(Eg,"createServer");var Ag=3478;var Lt={runDir:l(()=>`${process.env.HOME||Ps("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")},Ig=1800*1e3;function ml(r){return Buffer.from(`${JSON.stringify(r)}
1144
- `)}l(ml,"encodeMessage");var bs=null,dr=null,Ce=null,Ee=null;async function Dg(r){let e=Lt.socket(),t=Lt.pid(),n=Lt.runDir();if(mt.mkdirSync(n,{recursive:!0}),mt.existsSync(t)){let s=parseInt(mt.readFileSync(t,"utf-8").trim(),10);kC(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),mt.unlinkSync(t)}if(mt.existsSync(e)&&mt.unlinkSync(e),Ee={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ig,idleTimer:null},Ce=new $n,bs=fC(s=>hC(s)),bs.listen(e,()=>{mt.chmodSync(e,384),mt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Rg()}),bs.on("error",s=>{console.error("Daemon socket error:",s.message),pr(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||Ag;dr=Eg({port:i,projectId:o,projectPath:s,enableLogging:!1}),await dr.start()}}catch{}if(process.on("SIGTERM",()=>pr(0)),process.on("SIGINT",()=>pr(0)),process.on("SIGHUP",()=>{Ce=new $n,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Dg,"startDaemon");function hC(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1145
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await yC(o);r.write(ml(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ml(i))}}}),r.on("error",()=>{})}l(hC,"handleConnection");async function yC(r){if(!Ee||!Ce)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Rg(),Ee.commandsServed++,Ee.lastActivity=Date.now(),r.command==="daemon")return SC(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 wC(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
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}
1156
+
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
1165
+ ${u}`:null,m].filter(Boolean).join(`
1166
+
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)
1168
+ ${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)
1170
+ ${s.join(`
1171
+ `)}`)}return e.length>0?e.join(`
1172
+
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,`
1174
+
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(`
1146
1182
  `)||o.message||void 0,stderr:t.join(`
1147
- `)||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(yC,"handleRequest");async function wC(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Ce.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Ce.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Ce.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Ce.seal(r.cwd,{json:t.json===!0});case"verify":return Ce.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Ce.task(e,r.cwd,{md:n});case"done":return Ce.done(r.cwd,{md:n});case"next":return Ce.next(r.cwd,{md:n});case"pause":return Ce.pause(e||"",r.cwd,{md:n});case"resume":return Ce.resume(e,r.cwd,{md:n});case"bug":return Ce.bug(e||"",r.cwd,{md:n});case"idea":return Ce.idea(e||"",r.cwd,{md:n});case"ship":return Ce.ship(e,r.cwd,{md:n});case"dash":return Ce.dash(e||"default",r.cwd,{md:n});case"design":return Ce.design(e||"",t);case"analyze":return Ce.analyze(t);case"cleanup":return Ce.cleanup(t);default:return L.execute(r.command,e,r.cwd)}}l(wC,"executeCommand");function SC(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:Ee?Date.now()-Ee.startedAt:0,commandsServed:Ee?.commandsServed??0,lastActivity:Ee?new Date(Ee.lastActivity).toISOString():null,registeredCommands:L.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>pr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(SC,"handleDaemonCommand");function Rg(){Ee&&(Ee.idleTimer&&clearTimeout(Ee.idleTimer),Ee.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ee.idleTimeoutMs/1e3/60} minutes, shutting down`),pr(0)},Ee.idleTimeoutMs),Ee.idleTimer.unref&&Ee.idleTimer.unref())}l(Rg,"resetIdleTimer");function pr(r){console.log("Daemon shutting down..."),Ee?.idleTimer&&clearTimeout(Ee.idleTimer),dr&&(dr.stop(),dr=null),bs&&(bs.close(),bs=null);let e=Lt.socket(),t=Lt.pid();try{mt.existsSync(e)&&mt.unlinkSync(e)}catch{}try{mt.existsSync(t)&&mt.unlinkSync(t)}catch{}process.exit(r)}l(pr,"shutdown");function kC(r){try{return process.kill(r,0),!0}catch{return!1}}l(kC,"isProcessRunning");var gl=process.argv.slice(2),bC=parseInt(gl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,PC=gl.includes("--no-http"),CC=gl.includes("--foreground");Dg({port:bC,noHttp:PC,foreground:CC}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
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)});