prjct-cli 1.38.7 → 1.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,11 @@ import { dirname as __pathDirname } from 'path';
5
5
  var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
- var Kr=Object.defineProperty;var Kh=Object.getOwnPropertyDescriptor;var Xh=Object.getOwnPropertyNames;var Yh=Object.prototype.hasOwnProperty;var l=(r,e)=>Kr(r,"name",{value:e,configurable:!0}),jn=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var Dn=(r,e)=>{for(var t in e)Kr(r,t,{get:e[t],enumerable:!0})},Qh=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Xh(e))!Yh.call(r,s)&&s!==t&&Kr(r,s,{get:()=>e[s],enumerable:!(n=Kh(e,s))||n.enumerable});return r};var lt=r=>Qh(Kr({},"__esModule",{value:!0}),r);var _u=w(()=>{"use strict"});var Xr,Nu=w(()=>{"use strict";Xr={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var sr,Yr=w(()=>{"use strict";sr={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 Lu(r){return r instanceof Error&&"code"in r}function C(r){return Lu(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=w(()=>{"use strict";l(Lu,"isNodeError");l(C,"isNotFoundError");l(y,"getErrorMessage")});var Uu=w(()=>{"use strict"});var Hu=w(()=>{"use strict";Uu()});function Qr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Gu,ls=w(()=>{"use strict";M={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"},Gu=["frontend","backend","devops","docs","testing","database","general"];l(Qr,"calculateConfidence")});var ia=w(()=>{"use strict"});var aa=w(()=>{"use strict";_u();Nu();Yr();F();Hu();ls();ia()});var z={};Dn(z,{calculateDuration:()=>uy,formatDate:()=>us,formatDuration:()=>nn,formatMonth:()=>sy,getDateKey:()=>ry,getDateRange:()=>ay,getDaysAgo:()=>mn,getDaysFromNow:()=>iy,getEndOfDay:()=>py,getStartOfDay:()=>dy,getTimestamp:()=>b,getTodayKey:()=>zu,getYearMonthDay:()=>ca,isToday:()=>cy,isWithinLastDays:()=>ly,parseDate:()=>oy,toRelative:()=>my});import{formatDistanceToNowStrict as ny}from"date-fns";function us(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 sy(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function zu(){return us(new Date)}function ry(r){return us(r)}function ca(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function oy(r){return new Date(r)}function b(){return new Date().toISOString()}function mn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function iy(r){let e=new Date;return e.setDate(e.getDate()+r),e}function ay(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 cy(r){return us(r)===zu()}function ly(r,e){let t=mn(e);return r>=t}function nn(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 uy(r,e=new Date){let t=e.getTime()-r.getTime();return nn(t)}function dy(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function py(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function my(r){let e=typeof r=="string"?new Date(r):r;return ny(e,{addSuffix:!0})}var se=w(()=>{"use strict";l(us,"formatDate");l(sy,"formatMonth");l(zu,"getTodayKey");l(ry,"getDateKey");l(ca,"getYearMonthDay");l(oy,"parseDate");l(b,"getTimestamp");l(mn,"getDaysAgo");l(iy,"getDaysFromNow");l(ay,"getDateRange");l(cy,"isToday");l(ly,"isWithinLastDays");l(nn,"formatDuration");l(uy,"calculateDuration");l(dy,"getStartOfDay");l(py,"getEndOfDay");l(my,"toRelative")});import Bu from"node:fs/promises";async function Ju(r,e){let t;try{t=await Bu.readFile(r,"utf-8")}catch(o){if(C(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Wu(r,t),Vu(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Wu(r,t),Vu(r,gy(s.error)),null)}async function Wu(r,e){let t=`${r}.backup`;try{await Bu.writeFile(t,e,"utf-8")}catch{}}function Vu(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 gy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var qu=w(()=>{"use strict";F();l(Ju,"safeRead");l(Wu,"createBackup");l(Vu,"logCorruption");l(gy,"formatZodError")});var we={};Dn(we,{appendLine:()=>la,appendToFile:()=>hy,atomicWrite:()=>fy,copyFile:()=>vy,deleteDir:()=>ky,deleteFile:()=>wy,dirExists:()=>Zr,ensureDir:()=>Rt,fileExists:()=>R,getFileExtension:()=>Ty,getFileModifiedTime:()=>by,getFileNameWithoutExtension:()=>Ey,getFileSize:()=>Sy,listFiles:()=>sn,moveFile:()=>Cy,prependToFile:()=>yy,readFile:()=>Ye,readJson:()=>zt,readLines:()=>Py,writeFile:()=>Wt,writeJson:()=>$n,writeLines:()=>xy});import ye from"node:fs/promises";import ds from"node:path";async function zt(r,e=null,t){if(t)return await Ju(r,t)??e;try{let n=await ye.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(C(n))return e;throw n}}async function $n(r,e,t=2){let n=JSON.stringify(e,null,t);await ye.writeFile(r,n,"utf-8")}async function Ye(r,e=""){try{return await ye.readFile(r,"utf-8")}catch(t){if(C(t))return e;throw t}}async function Wt(r,e){let t=ds.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.writeFile(r,e,"utf-8")}async function fy(r,e){let t=ds.dirname(r);await ye.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ye.writeFile(n,e,"utf-8"),await ye.rename(n,r)}async function hy(r,e){await ye.appendFile(r,e,"utf-8")}async function la(r,e){let t=ds.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.appendFile(r,`${e}
9
- `,"utf-8")}async function yy(r,e){try{let t=await ye.readFile(r,"utf-8");await ye.writeFile(r,e+t,"utf-8")}catch(t){if(C(t))await ye.writeFile(r,e,"utf-8");else throw t}}async function R(r){try{return await ye.access(r),!0}catch(e){if(C(e))return!1;throw e}}async function Zr(r){try{return(await ye.stat(r)).isDirectory()}catch(e){if(C(e))return!1;throw e}}async function Rt(r){await ye.mkdir(r,{recursive:!0})}async function wy(r){try{return await ye.unlink(r),!0}catch(e){if(C(e))return!1;throw e}}async function ky(r){try{return await ye.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(C(e))return!1;throw e}}async function sn(r,e={}){try{let n=await ye.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 Sy(r){return(await ye.stat(r)).size}async function by(r){return(await ye.stat(r)).mtime}async function vy(r,e){await ye.copyFile(r,e)}async function Cy(r,e){await ye.rename(r,e)}async function Py(r){return(await Ye(r,"")).split(`
10
- `)}async function xy(r,e){let t=e.join(`
11
- `);await Wt(r,t)}function Ty(r){return ds.extname(r)}function Ey(r){return ds.basename(r,ds.extname(r))}var De=w(()=>{"use strict";qu();F();l(zt,"readJson");l($n,"writeJson");l(Ye,"readFile");l(Wt,"writeFile");l(fy,"atomicWrite");l(hy,"appendToFile");l(la,"appendLine");l(yy,"prependToFile");l(R,"fileExists");l(Zr,"dirExists");l(Rt,"ensureDir");l(wy,"deleteFile");l(ky,"deleteDir");l(sn,"listFiles");l(Sy,"getFileSize");l(by,"getFileModifiedTime");l(vy,"copyFile");l(Cy,"moveFile");l(Py,"readLines");l(xy,"writeLines");l(Ty,"getFileExtension");l(Ey,"getFileNameWithoutExtension")});import{z as Vt}from"zod";function Ku(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 LE,UE,HE,rr,GE,or=w(()=>{"use strict";LE=Vt.enum(["opus","sonnet","haiku"]),UE=Vt.enum(["2.5-pro","2.5-flash","2.0-flash"]),HE=Vt.string().min(1),rr=Vt.object({provider:Vt.string(),model:Vt.string(),cliVersion:Vt.string().optional(),recordedAt:Vt.string()}),GE=Vt.object({preferredModel:Vt.string().optional(),lastAnalysisModel:rr.optional()});l(Ku,"compareSemver")});import ua from"node:fs/promises";import Ay from"node:os";import Xu from"node:path";async function Zu(){try{let r=await ua.readFile(Qu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Iy?null:e.detection}catch{return null}}async function ed(r){let e={timestamp:new Date().toISOString(),detection:r};await ua.mkdir(Yu,{recursive:!0}),await ua.writeFile(Qu,JSON.stringify(e,null,2))}var Yu,Qu,Iy,td=w(()=>{"use strict";Yu=Xu.join(Ay.homedir(),".prjct-cli","cache"),Qu=Xu.join(Yu,"providers.json"),Iy=600*1e3;l(Zu,"readProviderCache");l(ed,"writeProviderCache")});var rt={};Dn(rt,{AntigravityProvider:()=>pa,ClaudeProvider:()=>eo,CodexProvider:()=>ma,CursorProvider:()=>rd,GeminiProvider:()=>da,Providers:()=>st,WindsurfProvider:()=>od,detectAllProviders:()=>ir,detectAntigravity:()=>so,detectCodex:()=>Mn,detectCursorProject:()=>cd,detectProvider:()=>to,detectWindsurfProject:()=>ld,getActiveProvider:()=>$y,getCommandsDir:()=>Uy,getGlobalContextPath:()=>_y,getGlobalSettingsPath:()=>Ny,getProjectCommandsPath:()=>Hy,getProviderBranding:()=>no,getSkillsPath:()=>Ly,hasProviderConfig:()=>My,needsCursorRouterRegeneration:()=>Oy,needsWindsurfRouterRegeneration:()=>Fy,selectProvider:()=>ga,validateCliVersion:()=>ad});import{exec as Ry}from"node:child_process";import gn from"node:os";import _e from"node:path";import{promisify as jy}from"node:util";async function id(r){try{let{stdout:e}=await nd(`which ${r}`,{timeout:sd});return e.trim()}catch{return null}}async function Dy(r){try{let{stdout:e}=await nd(`${r} --version`,{timeout:sd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function to(r){let e=st[r];if(!e.cliCommand)return{installed:!1};let t=await id(e.cliCommand);if(!t)return{installed:!1};let n=await Dy(e.cliCommand),s=ad(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function ad(r,e){let t=st[r];return!t.minCliVersion||!e?null:Ku(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 ir(r=!1){if(!r){let i=await Zu();if(i)return i}let[e,t,n]=await Promise.all([to("claude"),to("gemini"),Mn()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await ed(o).catch(()=>{}),o}async function $y(r){if(r&&st[r])return st[r];let e=await ir();return e.claude.installed&&!e.gemini.installed?eo:e.gemini.installed&&!e.claude.installed?da:eo}async function My(r){let e=st[r];return e.configDir?R(e.configDir):!1}function no(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 cd(r){let e=_e.join(r,".cursor"),t=_e.join(e,"rules"),n=_e.join(t,"prjct.mdc"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Oy(r){let e=await cd(r);return e.detected&&!e.routerInstalled}async function ld(r){let e=_e.join(r,".windsurf"),t=_e.join(e,"rules"),n=_e.join(t,"prjct.md"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Fy(r){let e=await ld(r);return e.detected&&!e.routerInstalled}async function so(){let r=pa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=_e.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([R(r),R(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Mn(){let r=ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await id("codex"),t=_e.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([R(r),R(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function _y(r){let e=st[r];return e.configDir?_e.join(e.configDir,e.contextFile):null}function Ny(r){let e=st[r];return!e.configDir||!e.settingsFile?null:_e.join(e.configDir,e.settingsFile)}function Ly(r){return st[r].skillsDir}function Uy(r){return st[r].commandsDir}function Hy(r,e){let t=st[r];return _e.join(e,t.commandsDir)}async function ga(){let r=await ir(),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 nd,sd,eo,da,pa,rd,od,ma,st,Ge=w(()=>{"use strict";or();De();td();nd=jy(Ry),sd=2e3,eo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:_e.join(gn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:_e.join(gn.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"},da={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:_e.join(gn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:_e.join(gn.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"},pa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:_e.join(gn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:_e.join(gn.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},rd={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},od={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},ma={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:_e.join(gn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:_e.join(gn.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:eo,gemini:da,cursor:rd,antigravity:pa,windsurf:od,codex:ma};l(id,"whichCommand");l(Dy,"getCliVersion");l(to,"detectProvider");l(ad,"validateCliVersion");l(ir,"detectAllProviders");l($y,"getActiveProvider");l(My,"hasProviderConfig");l(no,"getProviderBranding");l(cd,"detectCursorProject");l(Oy,"needsCursorRouterRegeneration");l(ld,"detectWindsurfProject");l(Fy,"needsWindsurfRouterRegeneration");l(so,"detectAntigravity");l(Mn,"detectCodex");l(_y,"getGlobalContextPath");l(Ny,"getGlobalSettingsPath");l(Ly,"getSkillsPath");l(Uy,"getCommandsDir");l(Hy,"getProjectCommandsPath");l(ga,"selectProvider")});import Gy from"node:crypto";import Bt from"node:fs/promises";import fa from"node:os";import H from"node:path";import{globSync as zy}from"glob";var ha,Wy,x,ke=w(()=>{"use strict";se();De();ha=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?H.resolve(e):H.join(fa.homedir(),".prjct-cli"),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=H.resolve(e),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}generateProjectId(e){return Gy.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return H.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return H.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return H.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return H.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Zr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await R(t)}async ensureGlobalStructure(){await Rt(this.globalBaseDir),await Rt(this.globalProjectsDir),await Rt(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 Rt(H.join(t,s));return await Rt(H.join(t,"planning","tasks")),await Rt(H.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=ca(t);return H.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 Rt(n),n}async listSessions(e,t=null,n=null){let s=H.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Bt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=H.join(s,a.name),u=await Bt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=H.join(c,d.name),p=await Bt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:H.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 H.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Bt.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 Zr(t)}getDisplayPath(e){let t=fa.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return H.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return H.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return H.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return H.join(this.globalBaseDir,".running")}getDocsPath(){return H.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Ge(),lt(rt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ge(),lt(rt)).getActiveProvider();return(Ge(),lt(rt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return H.join(fa.homedir(),".claude")}getClaudeSettingsPath(){return H.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?H.join(this.getGlobalProjectPath(e),"agents"):H.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return H.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return H.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=H.join(e,s.file);if(await R(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=H.join(e,"package.json");if(await R(s))try{let o=await Bt.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 Bt.readFile(H.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=H.join(e,"package.json"),i=await Bt.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=H.join(e,"lerna.json");if(await R(c)){let u=await Bt.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=H.join(e,"package.json"),i=await Bt.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=zy(o,{cwd:e,absolute:!1});for(let a of i){let c=H.join(e,a),u=H.join(c,"package.json");if(await R(u))try{let d=await Bt.readFile(u,"utf-8"),m=JSON.parse(d),p=H.join(c,"PRJCT.md");n.push({name:m.name||H.basename(a),path:c,relativePath:a,hasPrjctMd:await R(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=H.resolve(e);for(let s of t.packages){let o=H.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=H.resolve(e),n=H.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=H.dirname(t)}return null}},Wy=new ha,x=Wy});function Vy(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function ar(){return Vy()==="bun"}var ya=w(()=>{"use strict";l(Vy,"detectRuntime");l(ar,"isBun")});import wa from"node:fs";import ud from"node:path";function By(r){if(ar()){let{Database:s}=jn("bun:sqlite");return new s(r,{create:!0})}let e=jn("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Jy,ro,A,L,ee=w(()=>{"use strict";ke();ya();l(By,"openDatabase");Jy=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
8
+ var eo=Object.defineProperty;var ay=Object.getOwnPropertyDescriptor;var cy=Object.getOwnPropertyNames;var ly=Object.prototype.hasOwnProperty;var l=(r,e)=>eo(r,"name",{value:e,configurable:!0}),fn=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var hn=(r,e)=>{for(var t in e)eo(r,t,{get:e[t],enumerable:!0})},uy=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of cy(e))!ly.call(r,s)&&s!==t&&eo(r,s,{get:()=>e[s],enumerable:!(n=ay(e,s))||n.enumerable});return r};var pt=r=>uy(eo({},"__esModule",{value:!0}),r);var Gu=w(()=>{"use strict"});var to,zu=w(()=>{"use strict";to={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 or,no=w(()=>{"use strict";or={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 Wu(r){return r instanceof Error&&"code"in r}function P(r){return Wu(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=w(()=>{"use strict";l(Wu,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var Vu=w(()=>{"use strict"});var Bu=w(()=>{"use strict";Vu()});function so(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Ju,us=w(()=>{"use strict";M={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"},Ju=["frontend","backend","devops","docs","testing","database","general"];l(so,"calculateConfidence")});var pa=w(()=>{"use strict"});var ma=w(()=>{"use strict";Gu();zu();no();F();Bu();us();pa()});var W={};hn(W,{calculateDuration:()=>vy,formatDate:()=>ds,formatDuration:()=>sn,formatMonth:()=>fy,getDateKey:()=>hy,getDateRange:()=>ky,getDaysAgo:()=>yn,getDaysFromNow:()=>wy,getEndOfDay:()=>Cy,getStartOfDay:()=>Py,getTimestamp:()=>b,getTodayKey:()=>qu,getYearMonthDay:()=>ga,isToday:()=>Sy,isWithinLastDays:()=>by,parseDate:()=>yy,toRelative:()=>xy});import{formatDistanceToNowStrict as gy}from"date-fns";function ds(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 fy(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function qu(){return ds(new Date)}function hy(r){return ds(r)}function ga(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function yy(r){return new Date(r)}function b(){return new Date().toISOString()}function yn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function wy(r){let e=new Date;return e.setDate(e.getDate()+r),e}function ky(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 Sy(r){return ds(r)===qu()}function by(r,e){let t=yn(e);return r>=t}function sn(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 vy(r,e=new Date){let t=e.getTime()-r.getTime();return sn(t)}function Py(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Cy(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function xy(r){let e=typeof r=="string"?new Date(r):r;return gy(e,{addSuffix:!0})}var se=w(()=>{"use strict";l(ds,"formatDate");l(fy,"formatMonth");l(qu,"getTodayKey");l(hy,"getDateKey");l(ga,"getYearMonthDay");l(yy,"parseDate");l(b,"getTimestamp");l(yn,"getDaysAgo");l(wy,"getDaysFromNow");l(ky,"getDateRange");l(Sy,"isToday");l(by,"isWithinLastDays");l(sn,"formatDuration");l(vy,"calculateDuration");l(Py,"getStartOfDay");l(Cy,"getEndOfDay");l(xy,"toRelative")});import Yu from"node:fs/promises";async function Qu(r,e){let t;try{t=await Yu.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Ku(r,t),Xu(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Ku(r,t),Xu(r,Ty(s.error)),null)}async function Ku(r,e){let t=`${r}.backup`;try{await Yu.writeFile(t,e,"utf-8")}catch{}}function Xu(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 Ty(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Zu=w(()=>{"use strict";F();l(Qu,"safeRead");l(Ku,"createBackup");l(Xu,"logCorruption");l(Ty,"formatZodError")});var we={};hn(we,{appendLine:()=>fa,appendToFile:()=>Ay,atomicWrite:()=>Ey,copyFile:()=>My,deleteDir:()=>Dy,deleteFile:()=>Iy,dirExists:()=>ro,ensureDir:()=>jt,fileExists:()=>D,getFileExtension:()=>Ny,getFileModifiedTime:()=>$y,getFileNameWithoutExtension:()=>Ly,getFileSize:()=>jy,listFiles:()=>rn,moveFile:()=>Oy,prependToFile:()=>Ry,readFile:()=>tt,readJson:()=>Vt,readLines:()=>Fy,writeFile:()=>Bt,writeJson:()=>Mn,writeLines:()=>_y});import ye from"node:fs/promises";import ps from"node:path";async function Vt(r,e=null,t){if(t)return await Qu(r,t)??e;try{let n=await ye.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function Mn(r,e,t=2){let n=JSON.stringify(e,null,t);await ye.writeFile(r,n,"utf-8")}async function tt(r,e=""){try{return await ye.readFile(r,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Bt(r,e){let t=ps.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.writeFile(r,e,"utf-8")}async function Ey(r,e){let t=ps.dirname(r);await ye.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ye.writeFile(n,e,"utf-8"),await ye.rename(n,r)}async function Ay(r,e){await ye.appendFile(r,e,"utf-8")}async function fa(r,e){let t=ps.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.appendFile(r,`${e}
9
+ `,"utf-8")}async function Ry(r,e){try{let t=await ye.readFile(r,"utf-8");await ye.writeFile(r,e+t,"utf-8")}catch(t){if(P(t))await ye.writeFile(r,e,"utf-8");else throw t}}async function D(r){try{return await ye.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function ro(r){try{return(await ye.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function jt(r){await ye.mkdir(r,{recursive:!0})}async function Iy(r){try{return await ye.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function Dy(r){try{return await ye.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function rn(r,e={}){try{let n=await ye.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(P(t))return[];throw t}}async function jy(r){return(await ye.stat(r)).size}async function $y(r){return(await ye.stat(r)).mtime}async function My(r,e){await ye.copyFile(r,e)}async function Oy(r,e){await ye.rename(r,e)}async function Fy(r){return(await tt(r,"")).split(`
10
+ `)}async function _y(r,e){let t=e.join(`
11
+ `);await Bt(r,t)}function Ny(r){return ps.extname(r)}function Ly(r){return ps.basename(r,ps.extname(r))}var Me=w(()=>{"use strict";Zu();F();l(Vt,"readJson");l(Mn,"writeJson");l(tt,"readFile");l(Bt,"writeFile");l(Ey,"atomicWrite");l(Ay,"appendToFile");l(fa,"appendLine");l(Ry,"prependToFile");l(D,"fileExists");l(ro,"dirExists");l(jt,"ensureDir");l(Iy,"deleteFile");l(Dy,"deleteDir");l(rn,"listFiles");l(jy,"getFileSize");l($y,"getFileModifiedTime");l(My,"copyFile");l(Oy,"moveFile");l(Fy,"readLines");l(_y,"writeLines");l(Ny,"getFileExtension");l(Ly,"getFileNameWithoutExtension")});import{z as Jt}from"zod";function ed(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 sA,rA,oA,ir,iA,ar=w(()=>{"use strict";sA=Jt.enum(["opus","sonnet","haiku"]),rA=Jt.enum(["2.5-pro","2.5-flash","2.0-flash"]),oA=Jt.string().min(1),ir=Jt.object({provider:Jt.string(),model:Jt.string(),cliVersion:Jt.string().optional(),recordedAt:Jt.string()}),iA=Jt.object({preferredModel:Jt.string().optional(),lastAnalysisModel:ir.optional()});l(ed,"compareSemver")});import ha from"node:fs/promises";import Uy from"node:os";import td from"node:path";async function rd(){try{let r=await ha.readFile(sd,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Hy?null:e.detection}catch{return null}}async function od(r){let e={timestamp:new Date().toISOString(),detection:r};await ha.mkdir(nd,{recursive:!0}),await ha.writeFile(sd,JSON.stringify(e,null,2))}var nd,sd,Hy,id=w(()=>{"use strict";nd=td.join(Uy.homedir(),".prjct-cli","cache"),sd=td.join(nd,"providers.json"),Hy=600*1e3;l(rd,"readProviderCache");l(od,"writeProviderCache")});var ct={};hn(ct,{AntigravityProvider:()=>wa,ClaudeProvider:()=>oo,CodexProvider:()=>ka,CursorProvider:()=>ld,GeminiProvider:()=>ya,Providers:()=>at,WindsurfProvider:()=>ud,detectAllProviders:()=>cr,detectAntigravity:()=>co,detectCodex:()=>On,detectCursorProject:()=>md,detectProvider:()=>io,detectWindsurfProject:()=>gd,getActiveProvider:()=>Vy,getCommandsDir:()=>Qy,getGlobalContextPath:()=>Ky,getGlobalSettingsPath:()=>Xy,getProjectCommandsPath:()=>Zy,getProviderBranding:()=>ao,getSkillsPath:()=>Yy,hasProviderConfig:()=>By,needsCursorRouterRegeneration:()=>Jy,needsWindsurfRouterRegeneration:()=>qy,selectProvider:()=>Sa,validateCliVersion:()=>pd});import{exec as Gy}from"node:child_process";import wn from"node:os";import Le from"node:path";import{promisify as zy}from"node:util";async function dd(r){try{let{stdout:e}=await ad(`which ${r}`,{timeout:cd});return e.trim()}catch{return null}}async function Wy(r){try{let{stdout:e}=await ad(`${r} --version`,{timeout:cd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function io(r){let e=at[r];if(!e.cliCommand)return{installed:!1};let t=await dd(e.cliCommand);if(!t)return{installed:!1};let n=await Wy(e.cliCommand),s=pd(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function pd(r,e){let t=at[r];return!t.minCliVersion||!e?null:ed(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 cr(r=!1){if(!r){let i=await rd();if(i)return i}let[e,t,n]=await Promise.all([io("claude"),io("gemini"),On()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await od(o).catch(()=>{}),o}async function Vy(r){if(r&&at[r])return at[r];let e=await cr();return e.claude.installed&&!e.gemini.installed?oo:e.gemini.installed&&!e.claude.installed?ya:oo}async function By(r){let e=at[r];return e.configDir?D(e.configDir):!1}function ao(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 md(r){let e=Le.join(r,".cursor"),t=Le.join(e,"rules"),n=Le.join(t,"prjct.mdc"),[s,o]=await Promise.all([D(e),D(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Jy(r){let e=await md(r);return e.detected&&!e.routerInstalled}async function gd(r){let e=Le.join(r,".windsurf"),t=Le.join(e,"rules"),n=Le.join(t,"prjct.md"),[s,o]=await Promise.all([D(e),D(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function qy(r){let e=await gd(r);return e.detected&&!e.routerInstalled}async function co(){let r=wa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Le.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([D(r),D(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function On(){let r=ka.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await dd("codex"),t=Le.join(r,"skills","prjct","SKILL.md"),n=await D(t),s=!!e;return{installed:s,skillInstalled:n,configPath:s?r:void 0}}function Ky(r){let e=at[r];return e.configDir?Le.join(e.configDir,e.contextFile):null}function Xy(r){let e=at[r];return!e.configDir||!e.settingsFile?null:Le.join(e.configDir,e.settingsFile)}function Yy(r){return at[r].skillsDir}function Qy(r){return at[r].commandsDir}function Zy(r,e){let t=at[r];return Le.join(e,t.commandsDir)}async function Sa(){let r=await cr(),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 ad,cd,oo,ya,wa,ld,ud,ka,at,ze=w(()=>{"use strict";ar();Me();id();ad=zy(Gy),cd=2e3,oo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Le.join(wn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Le.join(wn.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"},ya={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Le.join(wn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Le.join(wn.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"},wa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Le.join(wn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Le.join(wn.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},ld={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},ud={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},ka={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Le.join(wn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Le.join(wn.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},at={claude:oo,gemini:ya,cursor:ld,antigravity:wa,windsurf:ud,codex:ka};l(dd,"whichCommand");l(Wy,"getCliVersion");l(io,"detectProvider");l(pd,"validateCliVersion");l(cr,"detectAllProviders");l(Vy,"getActiveProvider");l(By,"hasProviderConfig");l(ao,"getProviderBranding");l(md,"detectCursorProject");l(Jy,"needsCursorRouterRegeneration");l(gd,"detectWindsurfProject");l(qy,"needsWindsurfRouterRegeneration");l(co,"detectAntigravity");l(On,"detectCodex");l(Ky,"getGlobalContextPath");l(Xy,"getGlobalSettingsPath");l(Yy,"getSkillsPath");l(Qy,"getCommandsDir");l(Zy,"getProjectCommandsPath");l(Sa,"selectProvider")});import ew from"node:crypto";import qt from"node:fs/promises";import ba from"node:os";import H from"node:path";import{globSync as tw}from"glob";var va,nw,x,ke=w(()=>{"use strict";se();Me();va=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?H.resolve(e):H.join(ba.homedir(),".prjct-cli"),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=H.resolve(e),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}generateProjectId(e){return ew.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return H.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return H.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return H.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return H.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await ro(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await D(t)}async ensureGlobalStructure(){await jt(this.globalBaseDir),await jt(this.globalProjectsDir),await jt(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 jt(H.join(t,s));return await jt(H.join(t,"planning","tasks")),await jt(H.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=ga(t);return H.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 jt(n),n}async listSessions(e,t=null,n=null){let s=H.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await qt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=H.join(s,a.name),u=await qt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=H.join(c,d.name),p=await qt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:H.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 H.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await qt.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 ro(t)}getDisplayPath(e){let t=ba.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return H.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return H.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return H.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return H.join(this.globalBaseDir,".running")}getDocsPath(){return H.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(ze(),pt(ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(ze(),pt(ct)).getActiveProvider();return(ze(),pt(ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return H.join(ba.homedir(),".claude")}getClaudeSettingsPath(){return H.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?H.join(this.getGlobalProjectPath(e),"agents"):H.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return H.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return H.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=H.join(e,s.file);if(await D(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=H.join(e,"package.json");if(await D(s))try{let o=await qt.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 qt.readFile(H.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=H.join(e,"package.json"),i=await qt.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=H.join(e,"lerna.json");if(await D(c)){let u=await qt.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=H.join(e,"package.json"),i=await qt.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=tw(o,{cwd:e,absolute:!1});for(let a of i){let c=H.join(e,a),u=H.join(c,"package.json");if(await D(u))try{let d=await qt.readFile(u,"utf-8"),m=JSON.parse(d),p=H.join(c,"PRJCT.md");n.push({name:m.name||H.basename(a),path:c,relativePath:a,hasPrjctMd:await D(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=H.resolve(e);for(let s of t.packages){let o=H.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=H.resolve(e),n=H.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=H.dirname(t)}return null}},nw=new va,x=nw});function sw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function lr(){return sw()==="bun"}var Pa=w(()=>{"use strict";l(sw,"detectRuntime");l(lr,"isBun")});import Ca from"node:fs";import fd from"node:path";function rw(r){if(lr()){let{Database:s}=fn("bun:sqlite");return new s(r,{create:!0})}let e=fn("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var ow,lo,A,U,ee=w(()=>{"use strict";ke();Pa();l(rw,"openDatabase");ow=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
13
13
  -- =======================================================================
14
14
  -- Document storage (backward-compatible with JSON file pattern)
15
15
  -- =======================================================================
@@ -299,13 +299,13 @@ var Kr=Object.defineProperty;var Kh=Object.getOwnPropertyDescriptor;var Xh=Objec
299
299
 
300
300
  CREATE INDEX idx_llm_analysis_status ON llm_analysis(status);
301
301
  CREATE INDEX idx_llm_analysis_commit ON llm_analysis(commit_hash);
302
- `)},"up")}],ro=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return ud.join(x.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=ud.dirname(n);wa.existsSync(s)||wa.mkdirSync(s,{recursive:!0});let o=By(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 wa.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(`
302
+ `)},"up")}],lo=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return fd.join(x.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=fd.dirname(n);Ca.existsSync(s)||Ca.mkdirSync(s,{recursive:!0});let o=rw(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 Ca.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(`
303
303
  CREATE TABLE IF NOT EXISTS _migrations (
304
304
  version INTEGER PRIMARY KEY,
305
305
  name TEXT NOT NULL,
306
306
  applied_at TEXT NOT NULL
307
307
  )
308
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Jy)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},A=new ro,L=A});function Sa(r){if(Gu.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(oo))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 ka,oo,On,cr,lr,ur=w(()=>{"use strict";ee();ls();se();ka={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},oo={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(Sa,"resolveCanonicalDomains");On=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=L.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();L.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}},cr=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()}},lr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};L.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return L.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 dr,ba=w(()=>{"use strict";ee();ls();se();ur();dr=class r extends On{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Qr(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=b();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Qr(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:b(),confidence:Qr(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=L.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return L.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var dd=w(()=>{"use strict"});import pr from"node:fs/promises";import fn from"node:path";import{z as J}from"zod";async function Qy(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=fn.join(e,"package.json"),s=await pr.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 Zy(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 sw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Yy[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 ew(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=fn.join(e,a);try{await pr.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 tw(r,e){let t=Date.now();try{let n=await rw(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 nw(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=fn.join(e,o.file);try{await pr.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 pd(r,e){let t=Date.now(),n=await Promise.all([Qy(r,e),Zy(r,e),ew(r,e),tw(r,e),nw(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 sw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await pr.readdir(s,{withFileTypes:!0});for(let i of o){let a=fn.join(s,i.name),c=fn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=fn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function rw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await pr.readdir(s,{withFileTypes:!0});for(let i of o){let a=fn.join(s,i.name),c=fn.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 qy,Ky,Xy,va,FA,Yy,Ca=w(()=>{"use strict";F();or();qy=J.enum(["draft","verified","sealed"]),Ky=J.object({name:J.string(),description:J.string(),location:J.string().optional(),severity:J.enum(["low","medium","high"]).optional(),language:J.string().optional(),framework:J.string().optional(),source:J.enum(["baseline","repo","context7","feedback"]).optional(),confidence:J.number().min(0).max(1).optional()}),Xy=J.object({issue:J.string(),file:J.string(),suggestion:J.string(),severity:J.enum(["low","medium","high"]).optional(),language:J.string().optional(),framework:J.string().optional(),source:J.enum(["baseline","repo","context7","feedback"]).optional(),confidence:J.number().min(0).max(1).optional()}),va=J.object({projectId:J.string(),languages:J.array(J.string()),frameworks:J.array(J.string()),packageManager:J.string().optional(),sourceDir:J.string().optional(),testDir:J.string().optional(),configFiles:J.array(J.string()),fileCount:J.number(),patterns:J.array(Ky),antiPatterns:J.array(Xy),analyzedAt:J.string(),modelMetadata:rr.optional(),status:qy.default("draft"),commitHash:J.string().optional(),signature:J.string().optional(),sealedAt:J.string().optional(),verifiedAt:J.string().optional()}),FA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Yy={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(Qy,"verifyFrameworks");l(Zy,"verifyLanguages");l(ew,"verifyPatternLocations");l(tw,"verifyFileCount");l(nw,"verifyAntiPatternFiles");l(pd,"semanticVerify");l(sw,"getProjectExtensions");l(rw,"countProjectFiles")});import{z as Re}from"zod";var io,hn,ow,UA,Pa,md,mr=w(()=>{"use strict";io=Re.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),hn=Re.object({primaryDomain:io,secondaryDomains:Re.array(io),confidence:Re.number().min(0).max(1),filePatterns:Re.array(Re.string()),relevantAgents:Re.array(Re.string())}),ow=Re.object({classification:hn,classifiedAt:Re.string(),source:Re.enum(["cache","history","llm","heuristic"]),descriptionHash:Re.string(),projectId:Re.string()}),UA=Re.object({entries:Re.record(Re.string(),ow),confirmedPatterns:Re.array(Re.object({descriptionHash:Re.string(),classification:hn,confirmedAt:Re.string(),taskDescription:Re.string()}))}),Pa={entries:{},confirmedPatterns:[]},md={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as G}from"zod";var iw,aw,gd,cw,lw,uw,dw,pw,fd,zA,xa=w(()=>{"use strict";iw=G.enum(["low","medium","high"]),aw=G.enum(["pending","converted","completed","archived","dormant"]),gd=G.enum(["high","medium","low"]),cw=G.object({impact:gd,effort:gd}),lw=G.object({frontend:G.string().optional(),backend:G.string().optional(),payments:G.string().optional(),ai:G.string().optional(),deploy:G.string().optional(),other:G.array(G.string()).optional()}),uw=G.object({name:G.string(),description:G.string()}),dw=G.object({name:G.string(),description:G.string().optional()}),pw=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:iw,status:aw,tags:G.array(G.string()),addedAt:G.string(),completedAt:G.string().optional(),convertedTo:G.string().optional(),source:G.string().optional(),sourceFiles:G.array(G.string()).optional(),painPoints:G.array(G.string()).optional(),solutions:G.array(G.string()).optional(),filesAffected:G.array(G.string()).optional(),impactEffort:cw.optional(),implementationNotes:G.string().optional(),stack:lw.optional(),modules:G.array(uw).optional(),roles:G.array(dw).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),fd=G.object({ideas:G.array(pw),lastUpdated:G.string()}),zA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as B}from"zod";function yd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var hd,mw,gw,fw,hw,JA,qA,Ta=w(()=>{"use strict";hd=B.enum(["linear","jira","github","monday","asana","none"]),mw=B.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),gw=B.enum(["none","urgent","high","medium","low"]),fw=B.enum(["feature","bug","improvement","task","chore","epic"]),hw=B.object({id:B.string(),identifier:B.string(),title:B.string(),description:B.string().optional(),status:mw,priority:gw,type:fw.optional(),assignee:B.object({id:B.string(),name:B.string(),email:B.string().optional()}).optional(),labels:B.array(B.string()).default([]),team:B.object({id:B.string(),name:B.string(),key:B.string().optional()}).optional(),project:B.object({id:B.string(),name:B.string()}).optional(),url:B.string(),createdAt:B.string(),updatedAt:B.string(),fetchedAt:B.string()}),JA=B.object({provider:hd,lastSync:B.string(),staleAfter:B.number().default(18e5),issues:B.record(B.string(),hw)}),qA=B.object({provider:hd,fetched:B.number(),updated:B.number(),errors:B.array(B.object({issueId:B.string(),error:B.string()})),timestamp:B.string()});l(yd,"createEmptyIssues")});var vd={};Dn(vd,{AgentAssignmentSchema:()=>wd,OUTPUT_SCHEMAS:()=>Sd,SubtaskBreakdownSchema:()=>kd,TaskClassificationSchema:()=>hn,renderSchemaForPrompt:()=>Ea});import{z as ze}from"zod";function Ea(r){let e=Sd[r];return e?`## OUTPUT FORMAT
308
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of ow)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},A=new lo,U=A});function Ta(r){if(Ju.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(uo))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 xa,uo,Fn,ur,dr,pr=w(()=>{"use strict";ee();us();se();xa={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},uo={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(Ta,"resolveCanonicalDomains");Fn=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=U.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();U.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}},ur=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()}},dr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};U.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return U.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 mr,Ea=w(()=>{"use strict";ee();us();se();pr();mr=class r extends Fn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=so(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=b();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=so(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:b(),confidence:so(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=U.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return U.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var hd=w(()=>{"use strict"});import gr from"node:fs/promises";import kn from"node:path";import{z as q}from"zod";async function uw(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=kn.join(e,"package.json"),s=await gr.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function dw(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 fw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=lw[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 pw(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=kn.join(e,a);try{await gr.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 mw(r,e){let t=Date.now();try{let n=await hw(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 gw(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=kn.join(e,o.file);try{await gr.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 yd(r,e){let t=Date.now(),n=await Promise.all([uw(r,e),dw(r,e),pw(r,e),mw(r,e),gw(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 fw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await gr.readdir(s,{withFileTypes:!0});for(let i of o){let a=kn.join(s,i.name),c=kn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=kn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function hw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await gr.readdir(s,{withFileTypes:!0});for(let i of o){let a=kn.join(s,i.name),c=kn.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 iw,aw,cw,Aa,eR,lw,Ra=w(()=>{"use strict";F();ar();iw=q.enum(["draft","verified","sealed"]),aw=q.object({name:q.string(),description:q.string(),location:q.string().optional(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),cw=q.object({issue:q.string(),file:q.string(),suggestion:q.string(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),Aa=q.object({projectId:q.string(),languages:q.array(q.string()),frameworks:q.array(q.string()),packageManager:q.string().optional(),sourceDir:q.string().optional(),testDir:q.string().optional(),configFiles:q.array(q.string()),fileCount:q.number(),patterns:q.array(aw),antiPatterns:q.array(cw),analyzedAt:q.string(),modelMetadata:ir.optional(),status:iw.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),eR={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},lw={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(uw,"verifyFrameworks");l(dw,"verifyLanguages");l(pw,"verifyPatternLocations");l(mw,"verifyFileCount");l(gw,"verifyAntiPatternFiles");l(yd,"semanticVerify");l(fw,"getProjectExtensions");l(hw,"countProjectFiles")});import{z as De}from"zod";var po,Sn,yw,rR,Ia,wd,fr=w(()=>{"use strict";po=De.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Sn=De.object({primaryDomain:po,secondaryDomains:De.array(po),confidence:De.number().min(0).max(1),filePatterns:De.array(De.string()),relevantAgents:De.array(De.string())}),yw=De.object({classification:Sn,classifiedAt:De.string(),source:De.enum(["cache","history","llm","heuristic"]),descriptionHash:De.string(),projectId:De.string()}),rR=De.object({entries:De.record(De.string(),yw),confirmedPatterns:De.array(De.object({descriptionHash:De.string(),classification:Sn,confirmedAt:De.string(),taskDescription:De.string()}))}),Ia={entries:{},confirmedPatterns:[]},wd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var ww,kw,kd,Sw,bw,vw,Pw,Cw,Sd,aR,Da=w(()=>{"use strict";ww=z.enum(["low","medium","high"]),kw=z.enum(["pending","converted","completed","archived","dormant"]),kd=z.enum(["high","medium","low"]),Sw=z.object({impact:kd,effort:kd}),bw=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),vw=z.object({name:z.string(),description:z.string()}),Pw=z.object({name:z.string(),description:z.string().optional()}),Cw=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:ww,status:kw,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:Sw.optional(),implementationNotes:z.string().optional(),stack:bw.optional(),modules:z.array(vw).optional(),roles:z.array(Pw).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Sd=z.object({ideas:z.array(Cw),lastUpdated:z.string()}),aR={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as J}from"zod";function vd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var bd,xw,Tw,Ew,Aw,dR,pR,ja=w(()=>{"use strict";bd=J.enum(["linear","jira","github","monday","asana","none"]),xw=J.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Tw=J.enum(["none","urgent","high","medium","low"]),Ew=J.enum(["feature","bug","improvement","task","chore","epic"]),Aw=J.object({id:J.string(),identifier:J.string(),title:J.string(),description:J.string().optional(),status:xw,priority:Tw,type:Ew.optional(),assignee:J.object({id:J.string(),name:J.string(),email:J.string().optional()}).optional(),labels:J.array(J.string()).default([]),team:J.object({id:J.string(),name:J.string(),key:J.string().optional()}).optional(),project:J.object({id:J.string(),name:J.string()}).optional(),url:J.string(),createdAt:J.string(),updatedAt:J.string(),fetchedAt:J.string()}),dR=J.object({provider:bd,lastSync:J.string(),staleAfter:J.number().default(18e5),issues:J.record(J.string(),Aw)}),pR=J.object({provider:bd,fetched:J.number(),updated:J.number(),errors:J.array(J.object({issueId:J.string(),error:J.string()})),timestamp:J.string()});l(vd,"createEmptyIssues")});var Ed={};hn(Ed,{AgentAssignmentSchema:()=>Pd,OUTPUT_SCHEMAS:()=>xd,SubtaskBreakdownSchema:()=>Cd,TaskClassificationSchema:()=>Sn,renderSchemaForPrompt:()=>$a});import{z as We}from"zod";function $a(r){let e=xd[r];return e?`## OUTPUT FORMAT
309
309
 
310
310
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
311
311
 
@@ -314,15 +314,15 @@ ${e.example}
314
314
  \`\`\`
315
315
 
316
316
  Fields:
317
- ${yw(e.schema)}`:null}function yw(r){if(r instanceof ze.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${bd(n)}`).join(`
318
- `)}return"(see example above)"}function bd(r){return r instanceof ze.ZodString?"string":r instanceof ze.ZodNumber?"number":r instanceof ze.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ze.ZodArray?`array of ${bd(r.element)}`:r instanceof ze.ZodObject?"object":"any"}var wd,kd,Sd,ao=w(()=>{"use strict";mr();mr();wd=ze.object({agentName:ze.string(),reasoning:ze.string(),confidence:ze.number().min(0).max(1)}),kd=ze.object({subtasks:ze.array(ze.object({description:ze.string(),domain:io,agent:ze.string(),dependsOn:ze.array(ze.number())})),effort:ze.enum(["low","medium","high"])}),Sd={classification:{schema:hn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:wd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:kd,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(Ea,"renderSchemaForPrompt");l(yw,"describeSchema");l(bd,"describeField")});import{z as T}from"zod";var Cd,ww,kw,Pd,Sw,bw,vw,Cw,Pw,xw,Tw,xd,Ew,Aw,nI,Td,Ed,Ad,Id,Iw,co,Aa=w(()=>{"use strict";Cd=T.number().min(1).max(5),ww=T.enum(["exceeded","met","partial","failed"]),kw=T.enum(["definitely","probably","maybe","no"]),Pd=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Sw=T.object({estimated:T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),source:T.enum(["prd","manual","historical"]).optional()}),actual:T.object({hours:T.number(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional(),sessions:T.number().optional()}),variance:T.object({hours:T.number(),percentage:T.number(),reason:Pd.optional(),explanation:T.string().optional()})}),bw=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),vw=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Cw=T.object({metrics:T.array(bw),acceptanceCriteria:T.array(vw),overallSuccess:ww,successScore:T.number().min(0).max(100)}),Pw=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),xw=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Pw)}),Tw=T.object({valueDelivered:T.number().min(1).max(10),userImpact:T.enum(["none","low","medium","high","critical"]),businessImpact:T.enum(["none","low","medium","high","critical"]),roiScore:T.number(),worthIt:kw,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),xd=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:Cd,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),Ew=T.object({id:T.string(),featureId:T.string(),featureName:T.string(),prdId:T.string().nullable(),version:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional(),effort:Sw,success:Cw.optional(),learnings:xw,roi:Tw,rating:Cd,taskOutcomes:T.array(xd).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),Aw=T.object({totalFeatures:T.number(),averageEstimationAccuracy:T.number(),averageSuccessRate:T.number(),averageROI:T.number(),bySuccessLevel:T.object({exceeded:T.number(),met:T.number(),partial:T.number(),failed:T.number()}),variancePatterns:T.array(T.object({reason:Pd,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),nI=T.object({outcomes:T.array(Ew),taskOutcomes:T.array(xd).optional(),aggregates:Aw.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),Td={outcomes:[],taskOutcomes:[],lastUpdated:""},Ed=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"),Ad=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Id=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Iw=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),co=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=>Iw(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 Ne}from"zod";function Ow(){let r={};for(let e of Dw)r[e]="allow";for(let e of $w)r[e]="ask";for(let e of Mw)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var lo,iI,Rw,Ia,jw,aI,Dw,$w,Mw,cI,Rd=w(()=>{"use strict";lo=Ne.enum(["allow","deny","ask"]),iI=Ne.enum(["read","write","delete","create"]),Rw=Ne.record(Ne.string(),lo),Ia=Ne.record(Ne.string(),lo),jw=Ne.object({enabled:Ne.boolean().default(!0),allowedDomains:Ne.array(Ne.string()).optional(),blockedDomains:Ne.array(Ne.string()).optional()}),aI=Ne.object({bash:Rw.optional(),files:Ne.object({read:Ia.optional(),write:Ia.optional(),delete:Ia.optional()}).optional(),web:jw.optional(),skills:Ne.record(Ne.string(),lo).optional(),doomLoop:Ne.object({enabled:Ne.boolean().default(!0),maxRetries:Ne.number().default(3)}).optional(),externalDirectories:lo.default("ask")}),Dw=["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*"],$w=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Mw=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Ow,"buildDefaultPermissions");cI=Ow()});import{z as ot}from"zod";var pI,mI,jd=w(()=>{"use strict";pI=ot.object({projectId:ot.string(),name:ot.string(),repoPath:ot.string(),description:ot.string().optional(),version:ot.string().optional(),cliVersion:ot.string().optional(),techStack:ot.array(ot.string()),fileCount:ot.number(),commitCount:ot.number(),createdAt:ot.string(),lastSync:ot.string(),lastSyncCommit:ot.string().optional(),lastSyncBranch:ot.string().optional()}),mI={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Fw,_w,Nw,Lw,Uw,Hw,Gw,zw,Ww,Vw,Bw,Jw,qw,Kw,Xw,Yw,Qw,Zw,yI,wI,Dd=w(()=>{"use strict";Fw=E.enum(["planned","active","completed","shipped"]),_w=E.enum(["low","medium","high"]),Nw=E.enum(["feature","breaking_change","refactor","infrastructure"]),Lw=E.enum(["completed","active","planned"]),Uw=E.enum(["planned","active","completed"]),Hw=E.enum(["git","git-branch","manual","prd"]),Gw=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),zw=E.object({id:E.string(),name:E.string(),status:Lw,completedAt:E.string().optional()}),Ww=E.object({goal:E.string(),phases:E.array(zw),successMetrics:E.array(E.string()).optional()}),Vw=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),Bw=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),Jw=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),qw=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),Kw=E.object({estimated:Jw.nullable(),actual:qw.nullable()}),Xw=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),Yw=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:Xw.optional(),status:Uw,startDate:E.string().optional(),endDate:E.string().optional()}),Qw=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Fw,impact:_w,effort:E.string().optional(),progress:E.number(),type:Nw.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(Gw),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:Vw.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:Hw.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:Kw.optional(),valueScore:E.number().optional(),commits:E.array(Bw).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),Zw=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),yI=E.object({strategy:Ww.nullable().optional(),features:E.array(Qw),backlog:E.array(E.union([E.string(),Zw])),lastUpdated:E.string(),quarters:E.array(Yw).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),wI={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 ek from"node:crypto";import{homedir as tk}from"node:os";import{join as nk}from"node:path";function me(){return ek.randomUUID()}var sk,$d=w(()=>{"use strict";l(me,"generateUUID");sk=nk(tk(),".prjct-cli","projects")});import{z as Qe}from"zod";var EI,Md=w(()=>{"use strict";EI=Qe.object({sessionId:Qe.string(),projectId:Qe.string(),projectPath:Qe.string(),projectName:Qe.string().optional(),taskDescription:Qe.string(),taskStatus:Qe.enum(["active","paused"]),activeSubtaskIndex:Qe.number().optional(),subtaskCount:Qe.number().optional(),branch:Qe.string().optional(),linearId:Qe.string().optional(),filesModified:Qe.array(Qe.string()).optional(),durationWorkedSec:Qe.number().optional(),timestamp:Qe.string(),resumeHint:Qe.string()})});import{z as K}from"zod";var rk,Od,ok,ik,ak,ck,lk,uk,dk,Fd,Ra=w(()=>{"use strict";rk=K.enum(["feature","fix","improvement","refactor"]),Od=K.enum(["pass","warning","fail","skipped"]),ok=K.enum(["added","changed","fixed","removed"]),ik=K.object({hours:K.number(),minutes:K.number(),totalMinutes:K.number()}),ak=K.object({filesChanged:K.number().nullable().optional(),linesAdded:K.number().nullable().optional(),linesRemoved:K.number().nullable().optional(),commits:K.number().nullable().optional()}),ck=K.object({description:K.string(),type:ok.optional()}),lk=K.object({lintStatus:Od.nullable().optional(),lintDetails:K.string().optional(),testStatus:Od.nullable().optional(),testDetails:K.string().optional()}),uk=K.object({hash:K.string().optional(),message:K.string().optional(),branch:K.string().optional()}),dk=K.object({id:K.string(),name:K.string(),version:K.string().nullable().optional(),type:rk,agent:K.string().optional(),description:K.string().optional(),changes:K.array(ck).optional(),codeSnippets:K.array(K.string()).optional(),commit:uk.optional(),codeMetrics:ak.optional(),qualityMetrics:lk.optional(),quantitativeImpact:K.string().optional(),duration:ik.optional(),tasksCompleted:K.number().nullable().optional(),shippedAt:K.string(),featureId:K.string().optional()}),Fd=K.object({shipped:K.array(dk),lastUpdated:K.string()})});import{z as P}from"zod";var pk,Nd,mk,gk,fk,ja,Ld,hk,yk,Ud,_d,wk,kk,Hd,Gd,zd,Sk,bk,MI,uo=w(()=>{"use strict";or();pk=P.enum(["low","medium","high","critical"]),Nd=P.enum(["feature","bug","improvement","chore"]),mk=P.enum(["active","backlog","previously_active"]),gk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),fk=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ja=P.object({title:P.string(),description:P.string(),filesChanged:P.array(P.object({path:P.string(),action:P.enum(["created","modified","deleted"])})),whatWasDone:P.array(P.string()).min(1),outputForNextAgent:P.string().min(1),notes:P.string().optional()}),Ld=P.object({output:P.string().min(1,"Subtask output is required"),summary:ja}),hk=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:gk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:ja.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),yk=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),Ud=P.object({id:P.string(),description:P.string(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(hk).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:yk.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:rr.optional()}),_d=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional()}),wk=P.object({stackConfirmed:P.array(P.string()).optional(),patternsDiscovered:P.array(P.string()).optional(),agentAccuracy:P.array(P.object({agent:P.string(),rating:P.enum(["helpful","neutral","inaccurate"]),note:P.string().optional()})).optional(),issuesEncountered:P.array(P.string()).optional()}),kk=P.object({taskId:P.string(),title:P.string(),classification:Nd,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(ja),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:wk.optional()}),Hd=P.object({currentTask:Ud.nullable(),previousTask:_d.nullable().optional(),pausedTasks:P.array(_d).optional(),taskHistory:P.array(kk).optional(),lastUpdated:P.string()}),Gd=P.object({id:P.string(),description:P.string(),priority:pk,type:Nd,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:mk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),zd=P.object({tasks:P.array(Gd),lastUpdated:P.string()}),Sk=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),bk=P.object({type:fk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),MI=P.object({projectId:P.string(),currentTask:Ud.nullable(),queue:P.array(Gd),stats:Sk,recentActivity:P.array(bk),lastSync:P.string()})});import{z as re}from"zod";var vk,Ck,Wd,NI,LI,UI,yn,Vd,ps=w(()=>{"use strict";vk=re.enum(["improving","stable","declining"]),Ck=re.object({sprintNumber:re.number(),startDate:re.string(),endDate:re.string(),pointsCompleted:re.number(),tasksCompleted:re.number(),avgVariance:re.number(),estimationAccuracy:re.number()}),Wd=re.object({category:re.string(),avgVariance:re.number(),taskCount:re.number()}),NI=re.object({totalPoints:re.number(),sprints:re.number(),estimatedDate:re.string()}),LI=re.object({sprints:re.array(Ck),averageVelocity:re.number(),velocityTrend:vk,estimationAccuracy:re.number(),overEstimated:re.array(Wd),underEstimated:re.array(Wd),lastUpdated:re.string()}),UI=re.object({sprintLengthDays:re.number().min(1).max(90).default(7),startDay:re.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:re.number().min(1).max(52).default(6),accuracyTolerance:re.number().min(0).max(100).default(20)}),yn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Vd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var jt=w(()=>{"use strict";dd();Ca();mr();xa();Ta();ao();or();Aa();Rd();jd();Dd();$d();Md();Ra();uo();ps()});var Fn,Da=w(()=>{"use strict";jt();ls();se();ur();Fn=class extends On{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(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=b(),u={id:me(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let I=this._getCommandTags(t.commandName),j=(p.tags||[]).filter(q=>I.includes(q));g.tagMatch=Math.min(20,j.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),j=0;for(let q of I)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 S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=ka[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=oo[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 Sa(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.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:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.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:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.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?`
319
- 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 $a,Pk,Ze,gr=w(()=>{"use strict";ur();ba();Da();ur();ba();Da();$a=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Fn,this._patternStore=new dr,this._historyStore=new lr,this._sessionStore=new cr}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()}},Pk=new $a,Ze=Pk});import{exec as xk}from"node:child_process";import yt from"node:fs/promises";import Dt from"node:path";import{promisify as Tk}from"node:util";var _n,Ma,Ek,We,Bd=w(()=>{"use strict";F();_n=Tk(xk),Ma=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Dt.join(this.projectPath,"package.json"),t=await yt.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=Dt.join(this.projectPath,"Cargo.toml");return await yt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readRequirements(){try{let e=Dt.join(this.projectPath,"requirements.txt");return await yt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGoMod(){try{let e=Dt.join(this.projectPath,"go.mod");return await yt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGemfile(){try{let e=Dt.join(this.projectPath,"Gemfile");return await yt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readMixExs(){try{let e=Dt.join(this.projectPath,"mix.exs");return await yt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readPomXml(){try{let e=Dt.join(this.projectPath,"pom.xml");return await yt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readComposerJson(){try{let e=Dt.join(this.projectPath,"composer.json"),t=await yt.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=Dt.join(this.projectPath,"pyproject.toml");return await yt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await _n('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(`
320
- `).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 yt.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 yt.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 _n(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await _n("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await _n('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await _n('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 _n('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 yt.access(Dt.join(this.projectPath,e)),!0}catch(t){if(C(t))return!1;throw t}}async readFile(e){try{let t=Dt.join(this.projectPath,e);return await yt.readFile(t,"utf-8")}catch(t){if(C(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await _n(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
321
- `).filter(Boolean)}catch{return[]}}},Ek=new Ma,We=Ek});import{z as Se}from"zod";function Ak(r){return r instanceof ms}function X(r){return Ak(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var gs,MR,OR,FR,_R,NR,LR,ms,po,mo,fr,rn=w(()=>{"use strict";gs={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}},MR=gs.create("FileError",Se.object({path:Se.string(),operation:Se.enum(["read","write","delete","create","copy"]),reason:Se.string().optional()})),OR=gs.create("ValidationError",Se.object({field:Se.string(),expected:Se.string(),received:Se.string().optional(),message:Se.string().optional()})),FR=gs.create("PermissionError",Se.object({action:Se.string(),resource:Se.string(),reason:Se.string().optional()})),_R=gs.create("TaskError",Se.object({taskId:Se.string().optional(),operation:Se.enum(["create","update","complete","pause","resume","delete"]),reason:Se.string()})),NR=gs.create("SessionError",Se.object({sessionId:Se.string().optional(),reason:Se.string()})),LR=gs.create("SyncError",Se.object({projectId:Se.string().optional(),operation:Se.enum(["push","pull","auth","connect"]),reason:Se.string()})),ms=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)}},po=class r extends ms{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")}},mo=class r extends ms{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")}},fr=class r extends ms{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(Ak,"isPrjctError");l(X,"getErrorMessage")});import Oa from"node:fs";import fo from"node:path";function Jd(){if(hr)return hr;let r=__dirname;for(let e=0;e<5;e++){let t=fo.join(r,"package.json");if(Oa.existsSync(t))try{if(JSON.parse(Oa.readFileSync(t,"utf-8")).name==="prjct-cli")return hr=r,r}catch{}r=fo.dirname(r)}return hr=fo.join(__dirname,"..","..",".."),hr}function Fa(){if(go)return go;try{let r=fo.join(Jd(),"package.json"),e=JSON.parse(Oa.readFileSync(r,"utf-8"));return go=e.version,Ik=e,go}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var go,Ik,hr,$e,ae,$t=w(()=>{"use strict";F();go=null,Ik=null,hr=null;l(Jd,"getPackageRoot");l(Fa,"getVersion");$e=Fa(),ae=Jd()});import Na from"node:fs";import Rk from"node:fs/promises";import ho from"node:path";function La(){if(qd)return _a;qd=!0;let r=ho.join(ae,"dist","templates.json");try{let e=Na.readFileSync(r,"utf-8");return _a=JSON.parse(e),_a}catch{return null}}function Dk(r){let e=Nn.indexOf(r);e>-1&&Nn.splice(e,1),Nn.push(r)}function $k(){for(;fs.size>=jk&&Nn.length>0;){let r=Nn.shift();r&&fs.delete(r)}}function yo(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(`
322
- `).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 Kd(r){if(fs.has(r))return Dk(r),fs.get(r);let e,t=La();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ho.join(ae,"templates","commands",`${r}.md`);try{e=await Rk.readFile(s,"utf-8")}catch{throw mo.notFound(r)}}let n=yo(e);return $k(),fs.set(r,n),Nn.push(r),n}async function Mk(r){return(await Kd(r)).frontmatter["allowed-tools"]||[]}function Ok(){fs.clear(),Nn.length=0}function ge(r){let e=La();if(e?.[r])return e[r];let t=ho.join(ae,"templates",r);try{return Na.readFileSync(t,"utf-8")}catch{return null}}function wn(r){let e=La();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ho.join(ae,"templates",r);try{return Na.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var jk,fs,Nn,_a,qd,Fk,Ua,Jt=w(()=>{"use strict";rn();$t();jk=50,fs=new Map,Nn=[],_a=null,qd=!1;l(La,"loadBundle");l(Dk,"updateLruOrder");l($k,"evictLru");l(yo,"parseFrontmatter");l(Kd,"load");l(Mk,"getAllowedTools");l(Ok,"clearCache");l(ge,"getTemplateContent");l(wn,"listTemplates");Fk={load:Kd,parseFrontmatter:yo,getAllowedTools:Mk,clearCache:Ok,getTemplateContent:ge,listTemplates:wn},Ua=Fk});import ue from"node:fs/promises";import Ga from"node:os";import oe from"node:path";async function _k(){try{let r=ge("global/modules/module-config.json");if(r)return JSON.parse(r);let e=oe.join(ae,"templates/global/modules/module-config.json"),t=await ue.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Nk(r){let e=await _k();if(!e){let i=ge("global/CLAUDE.md");if(i)return i;let a=oe.join(ae,"templates/global/CLAUDE.md");return ue.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ge("global/CLAUDE.md");if(a)return a;let c=oe.join(ae,"templates/global/CLAUDE.md");return ue.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=ge(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=oe.join(ae,"templates/global/modules",i),u=await ue.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(`
323
- `)}async function Lk(){try{let r=oe.join(Ga.homedir(),".prjct-cli","docs");await ue.mkdir(r,{recursive:!0});let e=wn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ge(s);if(o){let i=oe.basename(s);await ue.writeFile(oe.join(r,i),o,"utf-8")}}return{success:!0}}let t=oe.join(ae,"templates/global/docs"),n=await ue.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=oe.join(t,s),i=oe.join(r,s),a=await ue.readFile(o,"utf-8");await ue.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Uk(){let r=(Ge(),lt(rt)),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 ue.mkdir(e.configDir,{recursive:!0});let s=oe.join(e.configDir,e.contextFile),o=oe.join(ae,"templates","global",e.contextFile),i="";try{let u=ge(`global/${e.contextFile}`);u?i=u:i=await ue.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Nk()}catch{let d=ge("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(ae,"templates/global/CLAUDE.md");i=await ue.readFile(m,"utf-8")}}else{let d=ge("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(ae,"templates/global/CLAUDE.md");i=await ue.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await ue.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),k=p+f+g;return await ue.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
324
-
325
- ${i}`;return await ue.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await ue.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Xd(){let r=Ga.homedir();return{claude:{commands:oe.join(r,".claude","commands"),config:oe.join(r,".claude"),router:oe.join(r,".claude","commands","p.md")},gemini:{commands:oe.join(r,".gemini","commands"),config:oe.join(r,".gemini"),router:oe.join(r,".gemini","commands","p.toml")}}}var Ha,Hk,Ce,kn=w(()=>{"use strict";Jt();F();$t();l(_k,"loadModuleConfig");l(Nk,"composeGlobalTemplate");l(Lk,"installDocs");l(Uk,"installGlobalConfig");Ha=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Ga.homedir(),this.templatesDir=oe.join(ae,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ge(),lt(rt)).getActiveProvider();this.commandsPath=oe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await ue.access(this.configPath),!0}catch(e){if(C(e))return!1;throw e}}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=wn("commands/");return t.length>0?t.filter(s=>s.endsWith(".md")).map(s=>s.replace("commands/","")).filter(s=>!e.has(s)):(await ue.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}async installCommands(){let e=await this.detectActiveProvider(),n=await(Ge(),lt(rt)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{return await this.installRouter(),{success:!0,installed:["p (router)"],path:this.commandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=[],s=(await(Ge(),lt(rt)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,s);try{await ue.unlink(o),e.push("p (router)")}catch(i){if(i.code!=="ENOENT")return{success:!1,error:y(i)}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectActiveProvider())return{installed:!1,providerDetected:!1};try{let s=(await(Ge(),lt(rt)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,s);return await ue.access(o),{installed:!0,providerDetected:!0,commands:["p (router)"],path:this.commandsPath}}catch(t){if(C(t))return{installed:!1,providerDetected:!0,commands:[]};throw t}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async installRouter(){let t=await(Ge(),lt(rt)).getActiveProvider();if(t.name==="gemini")return this.installStaticRouter("p.toml");try{let n=oe.join(t.configDir,"commands","p.md");await ue.mkdir(oe.dirname(n),{recursive:!0});let s=await this.generateRouterContent();return await ue.writeFile(n,s,"utf-8"),!0}catch(n){if(C(n))return!1;throw n}}async installStaticRouter(e){let n=await(Ge(),lt(rt)).getActiveProvider();try{let s=oe.join(n.configDir,"commands",e);await ue.mkdir(oe.dirname(s),{recursive:!0});let o=ge(`commands/${e}`);if(o)return await ue.writeFile(s,o,"utf-8"),!0;let i=oe.join(this.templatesDir,e),a=await ue.readFile(i,"utf-8");return await ue.writeFile(s,a,"utf-8"),!0}catch(s){if(C(s))return!1;throw s}}async generateRouterContent(){let e=await this.getCommandFiles(),t={task:"Start a task",done:"Complete current subtask",ship:"Ship feature with PR + version bump",sync:"Analyze project, regenerate agents",pause:"Pause current task",resume:"Resume paused task",next:"Show priority queue",idea:"Quick idea capture",bug:"Report bug with auto-priority",dash:"Dashboard view",status:"Project status check",linear:"Linear integration (via SDK)",jira:"JIRA integration (via REST API)",init:"Initialize prjct in a project",analyze:"Deep repository analysis",plan:"Create implementation plan",design:"UI/UX design workflow",test:"Test workflow",cleanup:"Code cleanup",git:"Git operations",review:"Code review",history:"Task history & undo/redo",sessions:"Session management",workflow:"Workflow management",enrich:"Enrich task context",impact:"Impact analysis",learnings:"View learned patterns",merge:"Merge workflow",prd:"Product requirements doc",serve:"Start dev server",setup:"Setup prjct",skill:"Skill management",spec:"Technical specification",update:"Update prjct",verify:"Verify analysis integrity",auth:"Authentication"},n=[];for(let s of e){let o=s.replace(".md",""),i=t[o]||`${o} command`;n.push(`| \`p. ${o}${["task","idea","bug","ship"].includes(o)?" <desc>":""}\` | ${i} |`)}return`---
317
+ ${Rw(e.schema)}`:null}function Rw(r){if(r instanceof We.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Td(n)}`).join(`
318
+ `)}return"(see example above)"}function Td(r){return r instanceof We.ZodString?"string":r instanceof We.ZodNumber?"number":r instanceof We.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof We.ZodArray?`array of ${Td(r.element)}`:r instanceof We.ZodObject?"object":"any"}var Pd,Cd,xd,mo=w(()=>{"use strict";fr();fr();Pd=We.object({agentName:We.string(),reasoning:We.string(),confidence:We.number().min(0).max(1)}),Cd=We.object({subtasks:We.array(We.object({description:We.string(),domain:po,agent:We.string(),dependsOn:We.array(We.number())})),effort:We.enum(["low","medium","high"])}),xd={classification:{schema:Sn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Pd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Cd,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($a,"renderSchemaForPrompt");l(Rw,"describeSchema");l(Td,"describeField")});import{z as T}from"zod";var Ad,Iw,Dw,Rd,jw,$w,Mw,Ow,Fw,_w,Nw,Id,Lw,Uw,SR,Dd,jd,$d,Md,Hw,go,Ma=w(()=>{"use strict";Ad=T.number().min(1).max(5),Iw=T.enum(["exceeded","met","partial","failed"]),Dw=T.enum(["definitely","probably","maybe","no"]),Rd=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),jw=T.object({estimated:T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),source:T.enum(["prd","manual","historical"]).optional()}),actual:T.object({hours:T.number(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional(),sessions:T.number().optional()}),variance:T.object({hours:T.number(),percentage:T.number(),reason:Rd.optional(),explanation:T.string().optional()})}),$w=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),Mw=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Ow=T.object({metrics:T.array($w),acceptanceCriteria:T.array(Mw),overallSuccess:Iw,successScore:T.number().min(0).max(100)}),Fw=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),_w=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Fw)}),Nw=T.object({valueDelivered:T.number().min(1).max(10),userImpact:T.enum(["none","low","medium","high","critical"]),businessImpact:T.enum(["none","low","medium","high","critical"]),roiScore:T.number(),worthIt:Dw,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),Id=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:Ad,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),Lw=T.object({id:T.string(),featureId:T.string(),featureName:T.string(),prdId:T.string().nullable(),version:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional(),effort:jw,success:Ow.optional(),learnings:_w,roi:Nw,rating:Ad,taskOutcomes:T.array(Id).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),Uw=T.object({totalFeatures:T.number(),averageEstimationAccuracy:T.number(),averageSuccessRate:T.number(),averageROI:T.number(),bySuccessLevel:T.object({exceeded:T.number(),met:T.number(),partial:T.number(),failed:T.number()}),variancePatterns:T.array(T.object({reason:Rd,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),SR=T.object({outcomes:T.array(Lw),taskOutcomes:T.array(Id).optional(),aggregates:Uw.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),Dd={outcomes:[],taskOutcomes:[],lastUpdated:""},jd=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"),$d=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Md=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Hw=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),go=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=>Hw(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 Ue}from"zod";function Jw(){let r={};for(let e of Ww)r[e]="allow";for(let e of Vw)r[e]="ask";for(let e of Bw)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var fo,CR,Gw,Oa,zw,xR,Ww,Vw,Bw,TR,Od=w(()=>{"use strict";fo=Ue.enum(["allow","deny","ask"]),CR=Ue.enum(["read","write","delete","create"]),Gw=Ue.record(Ue.string(),fo),Oa=Ue.record(Ue.string(),fo),zw=Ue.object({enabled:Ue.boolean().default(!0),allowedDomains:Ue.array(Ue.string()).optional(),blockedDomains:Ue.array(Ue.string()).optional()}),xR=Ue.object({bash:Gw.optional(),files:Ue.object({read:Oa.optional(),write:Oa.optional(),delete:Oa.optional()}).optional(),web:zw.optional(),skills:Ue.record(Ue.string(),fo).optional(),doomLoop:Ue.object({enabled:Ue.boolean().default(!0),maxRetries:Ue.number().default(3)}).optional(),externalDirectories:fo.default("ask")}),Ww=["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*"],Vw=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Bw=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Jw,"buildDefaultPermissions");TR=Jw()});import{z as lt}from"zod";var IR,DR,Fd=w(()=>{"use strict";IR=lt.object({projectId:lt.string(),name:lt.string(),repoPath:lt.string(),description:lt.string().optional(),version:lt.string().optional(),cliVersion:lt.string().optional(),techStack:lt.array(lt.string()),fileCount:lt.number(),commitCount:lt.number(),createdAt:lt.string(),lastSync:lt.string(),lastSyncCommit:lt.string().optional(),lastSyncBranch:lt.string().optional()}),DR={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var qw,Kw,Xw,Yw,Qw,Zw,ek,tk,nk,sk,rk,ok,ik,ak,ck,lk,uk,dk,OR,FR,_d=w(()=>{"use strict";qw=E.enum(["planned","active","completed","shipped"]),Kw=E.enum(["low","medium","high"]),Xw=E.enum(["feature","breaking_change","refactor","infrastructure"]),Yw=E.enum(["completed","active","planned"]),Qw=E.enum(["planned","active","completed"]),Zw=E.enum(["git","git-branch","manual","prd"]),ek=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),tk=E.object({id:E.string(),name:E.string(),status:Yw,completedAt:E.string().optional()}),nk=E.object({goal:E.string(),phases:E.array(tk),successMetrics:E.array(E.string()).optional()}),sk=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),rk=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),ok=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),ik=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),ak=E.object({estimated:ok.nullable(),actual:ik.nullable()}),ck=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),lk=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:ck.optional(),status:Qw,startDate:E.string().optional(),endDate:E.string().optional()}),uk=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:qw,impact:Kw,effort:E.string().optional(),progress:E.number(),type:Xw.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(ek),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:sk.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:Zw.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:ak.optional(),valueScore:E.number().optional(),commits:E.array(rk).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),dk=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),OR=E.object({strategy:nk.nullable().optional(),features:E.array(uk),backlog:E.array(E.union([E.string(),dk])),lastUpdated:E.string(),quarters:E.array(lk).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),FR={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 pk from"node:crypto";import{homedir as mk}from"node:os";import{join as gk}from"node:path";function ge(){return pk.randomUUID()}var fk,Nd=w(()=>{"use strict";l(ge,"generateUUID");fk=gk(mk(),".prjct-cli","projects")});import{z as nt}from"zod";var VR,Ld=w(()=>{"use strict";VR=nt.object({sessionId:nt.string(),projectId:nt.string(),projectPath:nt.string(),projectName:nt.string().optional(),taskDescription:nt.string(),taskStatus:nt.enum(["active","paused"]),activeSubtaskIndex:nt.number().optional(),subtaskCount:nt.number().optional(),branch:nt.string().optional(),linearId:nt.string().optional(),filesModified:nt.array(nt.string()).optional(),durationWorkedSec:nt.number().optional(),timestamp:nt.string(),resumeHint:nt.string()})});import{z as K}from"zod";var hk,Ud,yk,wk,kk,Sk,bk,vk,Pk,Hd,Fa=w(()=>{"use strict";hk=K.enum(["feature","fix","improvement","refactor"]),Ud=K.enum(["pass","warning","fail","skipped"]),yk=K.enum(["added","changed","fixed","removed"]),wk=K.object({hours:K.number(),minutes:K.number(),totalMinutes:K.number()}),kk=K.object({filesChanged:K.number().nullable().optional(),linesAdded:K.number().nullable().optional(),linesRemoved:K.number().nullable().optional(),commits:K.number().nullable().optional()}),Sk=K.object({description:K.string(),type:yk.optional()}),bk=K.object({lintStatus:Ud.nullable().optional(),lintDetails:K.string().optional(),testStatus:Ud.nullable().optional(),testDetails:K.string().optional()}),vk=K.object({hash:K.string().optional(),message:K.string().optional(),branch:K.string().optional()}),Pk=K.object({id:K.string(),name:K.string(),version:K.string().nullable().optional(),type:hk,agent:K.string().optional(),description:K.string().optional(),changes:K.array(Sk).optional(),codeSnippets:K.array(K.string()).optional(),commit:vk.optional(),codeMetrics:kk.optional(),qualityMetrics:bk.optional(),quantitativeImpact:K.string().optional(),duration:wk.optional(),tasksCompleted:K.number().nullable().optional(),shippedAt:K.string(),featureId:K.string().optional()}),Hd=K.object({shipped:K.array(Pk),lastUpdated:K.string()})});import{z as C}from"zod";var Ck,zd,xk,Tk,Ek,_a,Wd,Ak,Rk,Vd,Gd,Ik,Dk,Bd,Jd,qd,jk,$k,QR,ho=w(()=>{"use strict";ar();Ck=C.enum(["low","medium","high","critical"]),zd=C.enum(["feature","bug","improvement","chore"]),xk=C.enum(["active","backlog","previously_active"]),Tk=C.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ek=C.enum(["task_completed","feature_shipped","idea_captured","session_started"]),_a=C.object({title:C.string(),description:C.string(),filesChanged:C.array(C.object({path:C.string(),action:C.enum(["created","modified","deleted"])})),whatWasDone:C.array(C.string()).min(1),outputForNextAgent:C.string().min(1),notes:C.string().optional()}),Wd=C.object({output:C.string().min(1,"Subtask output is required"),summary:_a}),Ak=C.object({id:C.string(),description:C.string(),domain:C.string(),agent:C.string(),status:Tk,dependsOn:C.array(C.string()),startedAt:C.string().optional(),completedAt:C.string().optional(),output:C.string().optional(),summary:_a.optional(),skipReason:C.string().optional(),blockReason:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional()}),Rk=C.object({completed:C.number(),total:C.number(),percentage:C.number()}),Vd=C.object({id:C.string(),description:C.string(),startedAt:C.string(),sessionId:C.string(),featureId:C.string().optional(),subtasks:C.array(Ak).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:Rk.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:ir.optional()}),Gd=C.object({id:C.string(),description:C.string(),status:C.literal("paused"),startedAt:C.string(),pausedAt:C.string(),pauseReason:C.string().optional()}),Ik=C.object({stackConfirmed:C.array(C.string()).optional(),patternsDiscovered:C.array(C.string()).optional(),agentAccuracy:C.array(C.object({agent:C.string(),rating:C.enum(["helpful","neutral","inaccurate"]),note:C.string().optional()})).optional(),issuesEncountered:C.array(C.string()).optional()}),Dk=C.object({taskId:C.string(),title:C.string(),classification:zd,startedAt:C.string(),completedAt:C.string(),subtaskCount:C.number(),subtaskSummaries:C.array(_a),outcome:C.string(),branchName:C.string(),linearId:C.string().optional(),linearUuid:C.string().optional(),prUrl:C.string().optional(),feedback:Ik.optional()}),Bd=C.object({currentTask:Vd.nullable(),previousTask:Gd.nullable().optional(),pausedTasks:C.array(Gd).optional(),taskHistory:C.array(Dk).optional(),lastUpdated:C.string()}),Jd=C.object({id:C.string(),description:C.string(),priority:Ck,type:zd,featureId:C.string().optional(),originFeature:C.string().optional(),completed:C.boolean(),completedAt:C.string().optional(),createdAt:C.string(),section:xk,agent:C.string().optional(),groupName:C.string().optional(),groupId:C.string().optional()}),qd=C.object({tasks:C.array(Jd),lastUpdated:C.string()}),jk=C.object({tasksToday:C.number(),tasksThisWeek:C.number(),streak:C.number(),velocity:C.string(),avgDuration:C.string()}),$k=C.object({type:Ek,description:C.string(),timestamp:C.string(),duration:C.string().optional()}),QR=C.object({projectId:C.string(),currentTask:Vd.nullable(),queue:C.array(Jd),stats:jk,recentActivity:C.array($k),lastSync:C.string()})});import{z as re}from"zod";var Mk,Ok,Kd,nI,sI,rI,bn,Xd,ms=w(()=>{"use strict";Mk=re.enum(["improving","stable","declining"]),Ok=re.object({sprintNumber:re.number(),startDate:re.string(),endDate:re.string(),pointsCompleted:re.number(),tasksCompleted:re.number(),avgVariance:re.number(),estimationAccuracy:re.number()}),Kd=re.object({category:re.string(),avgVariance:re.number(),taskCount:re.number()}),nI=re.object({totalPoints:re.number(),sprints:re.number(),estimatedDate:re.string()}),sI=re.object({sprints:re.array(Ok),averageVelocity:re.number(),velocityTrend:Mk,estimationAccuracy:re.number(),overEstimated:re.array(Kd),underEstimated:re.array(Kd),lastUpdated:re.string()}),rI=re.object({sprintLengthDays:re.number().min(1).max(90).default(7),startDay:re.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:re.number().min(1).max(52).default(6),accuracyTolerance:re.number().min(0).max(100).default(20)}),bn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Xd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var $t=w(()=>{"use strict";hd();Ra();fr();Da();ja();mo();ar();Ma();Od();Fd();_d();Nd();Ld();Fa();ho();ms()});var _n,Na=w(()=>{"use strict";$t();us();se();pr();_n=class extends Fn{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(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=b(),u={id:ge(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let I=this._getCommandTags(t.commandName),R=(p.tags||[]).filter(G=>I.includes(G));g.tagMatch=Math.min(20,R.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),R=0;for(let G of I)p.content.toLowerCase().includes(G)&&(R+=2),p.title.toLowerCase().includes(G)&&(R+=3);g.keywords=Math.min(15,R)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=xa[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=uo[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 Ta(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.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:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.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:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.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?`
319
+ 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 La,Fk,st,hr=w(()=>{"use strict";pr();Ea();Na();pr();Ea();Na();La=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new _n,this._patternStore=new mr,this._historyStore=new dr,this._sessionStore=new ur}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()}},Fk=new La,st=Fk});import{exec as _k}from"node:child_process";import St from"node:fs/promises";import Mt from"node:path";import{promisify as Nk}from"node:util";var Nn,Ua,Lk,Ve,Yd=w(()=>{"use strict";F();Nn=Nk(_k),Ua=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Mt.join(this.projectPath,"package.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Mt.join(this.projectPath,"Cargo.toml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=Mt.join(this.projectPath,"requirements.txt");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=Mt.join(this.projectPath,"go.mod");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=Mt.join(this.projectPath,"Gemfile");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=Mt.join(this.projectPath,"mix.exs");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=Mt.join(this.projectPath,"pom.xml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=Mt.join(this.projectPath,"composer.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Mt.join(this.projectPath,"pyproject.toml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Nn('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(`
320
+ `).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await St.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(P(e))return[];throw e}}async listDirectories(){try{return(await St.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(P(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Nn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Nn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Nn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Nn('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 Nn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await St.access(Mt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=Mt.join(this.projectPath,e);return await St.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Nn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
321
+ `).filter(Boolean)}catch{return[]}}},Lk=new Ua,Ve=Lk});import{z as Se}from"zod";function Uk(r){return r instanceof gs}function X(r){return Uk(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var fs,QI,ZI,eD,tD,nD,sD,gs,yo,wo,yr,on=w(()=>{"use strict";fs={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}},QI=fs.create("FileError",Se.object({path:Se.string(),operation:Se.enum(["read","write","delete","create","copy"]),reason:Se.string().optional()})),ZI=fs.create("ValidationError",Se.object({field:Se.string(),expected:Se.string(),received:Se.string().optional(),message:Se.string().optional()})),eD=fs.create("PermissionError",Se.object({action:Se.string(),resource:Se.string(),reason:Se.string().optional()})),tD=fs.create("TaskError",Se.object({taskId:Se.string().optional(),operation:Se.enum(["create","update","complete","pause","resume","delete"]),reason:Se.string()})),nD=fs.create("SessionError",Se.object({sessionId:Se.string().optional(),reason:Se.string()})),sD=fs.create("SyncError",Se.object({projectId:Se.string().optional(),operation:Se.enum(["push","pull","auth","connect"]),reason:Se.string()})),gs=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)}},yo=class r extends gs{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")}},wo=class r extends gs{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")}},yr=class r extends gs{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(Uk,"isPrjctError");l(X,"getErrorMessage")});import Ha from"node:fs";import So from"node:path";function Qd(){if(wr)return wr;let r=__dirname;for(let e=0;e<5;e++){let t=So.join(r,"package.json");if(Ha.existsSync(t))try{if(JSON.parse(Ha.readFileSync(t,"utf-8")).name==="prjct-cli")return wr=r,r}catch{}r=So.dirname(r)}return wr=So.join(__dirname,"..","..",".."),wr}function Ga(){if(ko)return ko;try{let r=So.join(Qd(),"package.json"),e=JSON.parse(Ha.readFileSync(r,"utf-8"));return ko=e.version,Hk=e,ko}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var ko,Hk,wr,Oe,ce,Ot=w(()=>{"use strict";F();ko=null,Hk=null,wr=null;l(Qd,"getPackageRoot");l(Ga,"getVersion");Oe=Ga(),ce=Qd()});import Wa from"node:fs";import Gk from"node:fs/promises";import bo from"node:path";function Va(){if(Zd)return za;Zd=!0;let r=bo.join(ce,"dist","templates.json");try{let e=Wa.readFileSync(r,"utf-8");return za=JSON.parse(e),za}catch{return null}}function Wk(r){let e=Ln.indexOf(r);e>-1&&Ln.splice(e,1),Ln.push(r)}function Vk(){for(;hs.size>=zk&&Ln.length>0;){let r=Ln.shift();r&&hs.delete(r)}}function vo(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(`
322
+ `).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 ep(r){if(hs.has(r))return Wk(r),hs.get(r);let e,t=Va();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=bo.join(ce,"templates","commands",`${r}.md`);try{e=await Gk.readFile(s,"utf-8")}catch{throw wo.notFound(r)}}let n=vo(e);return Vk(),hs.set(r,n),Ln.push(r),n}async function Bk(r){return(await ep(r)).frontmatter["allowed-tools"]||[]}function Jk(){hs.clear(),Ln.length=0}function ue(r){let e=Va();if(e?.[r])return e[r];let t=bo.join(ce,"templates",r);try{return Wa.readFileSync(t,"utf-8")}catch{return null}}function vn(r){let e=Va();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=bo.join(ce,"templates",r);try{return Wa.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var zk,hs,Ln,za,Zd,qk,Ba,Kt=w(()=>{"use strict";on();Ot();zk=50,hs=new Map,Ln=[],za=null,Zd=!1;l(Va,"loadBundle");l(Wk,"updateLruOrder");l(Vk,"evictLru");l(vo,"parseFrontmatter");l(ep,"load");l(Bk,"getAllowedTools");l(Jk,"clearCache");l(ue,"getTemplateContent");l(vn,"listTemplates");qk={load:ep,parseFrontmatter:vo,getAllowedTools:Bk,clearCache:Jk,getTemplateContent:ue,listTemplates:vn},Ba=qk});import de from"node:fs/promises";import Ja from"node:os";import oe from"node:path";async function Kk(){try{let r=ue("global/modules/module-config.json");if(r)return JSON.parse(r);let e=oe.join(ce,"templates/global/modules/module-config.json"),t=await de.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Xk(r){let e=await Kk();if(!e){let i=ue("global/CLAUDE.md");if(i)return i;let a=oe.join(ce,"templates/global/CLAUDE.md");return de.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ue("global/CLAUDE.md");if(a)return a;let c=oe.join(ce,"templates/global/CLAUDE.md");return de.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=ue(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=oe.join(ce,"templates/global/modules",i),u=await de.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(`
323
+ `)}async function Yk(){try{let r=oe.join(Ja.homedir(),".prjct-cli","docs");await de.mkdir(r,{recursive:!0});let e=vn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ue(s);if(o){let i=oe.basename(s);await de.writeFile(oe.join(r,i),o,"utf-8")}}return{success:!0}}let t=oe.join(ce,"templates/global/docs"),n=await de.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=oe.join(t,s),i=oe.join(r,s),a=await de.readFile(o,"utf-8");await de.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Qk(){let r=(ze(),pt(ct)),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 de.mkdir(e.configDir,{recursive:!0});let s=oe.join(e.configDir,e.contextFile),o=oe.join(ce,"templates","global",e.contextFile),i="";try{let u=ue(`global/${e.contextFile}`);u?i=u:i=await de.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Xk()}catch{let d=ue("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(ce,"templates/global/CLAUDE.md");i=await de.readFile(m,"utf-8")}}else{let d=ue("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(ce,"templates/global/CLAUDE.md");i=await de.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await de.readFile(s,"utf-8"),c=!0}catch(u){if(P(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await de.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
324
+
325
+ ${i}`;return await de.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await de.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function tp(){let r=Ja.homedir();return{claude:{commands:oe.join(r,".claude","commands"),config:oe.join(r,".claude"),router:oe.join(r,".claude","commands","p.md")},gemini:{commands:oe.join(r,".gemini","commands"),config:oe.join(r,".gemini"),router:oe.join(r,".gemini","commands","p.toml")}}}var ys,Zk,Te,an=w(()=>{"use strict";Kt();F();Ot();l(Kk,"loadModuleConfig");l(Xk,"composeGlobalTemplate");l(Yk,"installDocs");l(Qk,"installGlobalConfig");ys=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Ja.homedir(),this.templatesDir=oe.join(ce,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(ze(),pt(ct)).getActiveProvider();this.commandsPath=oe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await de.access(this.configPath),!0}catch(e){if(P(e))return!1;throw e}}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=vn("commands/");return t.length>0?t.filter(s=>s.endsWith(".md")).map(s=>s.replace("commands/","")).filter(s=>!e.has(s)):(await de.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}async installCommands(){let e=await this.detectActiveProvider(),n=await(ze(),pt(ct)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{return await this.installRouter(),{success:!0,installed:["p (router)"],path:this.commandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=[],s=(await(ze(),pt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,s);try{await de.unlink(o),e.push("p (router)")}catch(i){if(i.code!=="ENOENT")return{success:!1,error:y(i)}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectActiveProvider())return{installed:!1,providerDetected:!1};try{let s=(await(ze(),pt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,s);return await de.access(o),{installed:!0,providerDetected:!0,commands:["p (router)"],path:this.commandsPath}}catch(t){if(P(t))return{installed:!1,providerDetected:!0,commands:[]};throw t}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async installRouter(){let t=await(ze(),pt(ct)).getActiveProvider();if(t.name==="gemini")return this.installStaticRouter("p.toml");try{let n=oe.join(t.configDir,"commands","p.md");await de.mkdir(oe.dirname(n),{recursive:!0});let s=await this.generateRouterContent();return await de.writeFile(n,s,"utf-8"),!0}catch(n){if(P(n))return!1;throw n}}async installStaticRouter(e){let n=await(ze(),pt(ct)).getActiveProvider();try{let s=oe.join(n.configDir,"commands",e);await de.mkdir(oe.dirname(s),{recursive:!0});let o=ue(`commands/${e}`);if(o)return await de.writeFile(s,o,"utf-8"),!0;let i=oe.join(this.templatesDir,e),a=await de.readFile(i,"utf-8");return await de.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async generateRouterContent(){let e=await this.getCommandFiles(),t={task:"Start a task",done:"Complete current subtask",ship:"Ship feature with PR + version bump",sync:"Analyze project, regenerate agents",pause:"Pause current task",resume:"Resume paused task",next:"Show priority queue",idea:"Quick idea capture",bug:"Report bug with auto-priority",dash:"Dashboard view",status:"Project status check",linear:"Linear integration (via SDK)",jira:"JIRA integration (via REST API)",init:"Initialize prjct in a project",analyze:"Deep repository analysis",plan:"Create implementation plan",design:"UI/UX design workflow",test:"Test workflow",cleanup:"Code cleanup",git:"Git operations",review:"Code review",history:"Task history & undo/redo",sessions:"Session management",workflow:"Workflow management",enrich:"Enrich task context",impact:"Impact analysis",learnings:"View learned patterns",merge:"Merge workflow",prd:"Product requirements doc",serve:"Start dev server",setup:"Setup prjct",skill:"Skill management",spec:"Technical specification",update:"Update prjct",verify:"Verify analysis integrity",auth:"Authentication"},n=[];for(let s of e){let o=s.replace(".md",""),i=t[o]||`${o} command`;n.push(`| \`p. ${o}${["task","idea","bug","ship"].includes(o)?" <desc>":""}\` | ${i} |`)}return`---
326
326
  description: 'prjct CLI - Context layer for AI agents'
327
327
  allowed-tools: [Read, Write, Edit, Bash, Glob, Grep, Task, AskUserQuestion, TodoWrite, WebFetch]
328
328
  ---
@@ -375,7 +375,7 @@ Templates should use CLI commands for data operations \u2014 never read/write JS
375
375
  2. Handle aliases (undo \u2192 history undo, redo \u2192 history redo)
376
376
  3. Run \`npm root -g\` to get template path
377
377
  4. Load and execute command template
378
- `}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return await this.installRouter(),{success:!0,added:0,updated:1,removed:0}}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Uk()}async installDocs(){return Lk()}};l(Xd,"getProviderPaths");Hk=new Ha,Ce=Hk});import{z as je}from"zod";function ep(r,e="default"){let t=Yd[e]||Yd.default;return r/1e3*t}function wo(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Gk,zk,Qd,Zd,Yd,ko=w(()=>{"use strict";Gk=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),zk=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),Qd=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(zk),dailyStats:je.array(Gk),firstSync:je.string(),lastUpdated:je.string()}),Zd={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Yd={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};l(ep,"estimateCostSaved");l(wo,"formatCost")});function Wk(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Vk(r){let e=[],t=Wk(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(za,o+i.length);if(c===-1)continue;let u=c+za.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Wa(r,e){let t=Vk(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
378
+ `}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return await this.installRouter(),{success:!0,added:0,updated:1,removed:0}}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Qk()}async installDocs(){return Yk()}};l(tp,"getProviderPaths");Zk=new ys,Te=Zk});import{z as je}from"zod";function op(r,e="default"){let t=np[e]||np.default;return r/1e3*t}function Po(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var eS,tS,sp,rp,np,Co=w(()=>{"use strict";eS=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),tS=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),sp=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(tS),dailyStats:je.array(eS),firstSync:je.string(),lastUpdated:je.string()}),rp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},np={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};l(op,"estimateCostSaved");l(Po,"formatCost")});function nS(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function sS(r){let e=[],t=nS(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(qa,o+i.length);if(c===-1)continue;let u=c+qa.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Ka(r,e){let t=sS(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
379
379
 
380
380
  ---
381
381
 
@@ -386,11 +386,11 @@ Templates should use CLI commands for data operations \u2014 never read/write JS
386
386
  `;for(let s of t)n+=s.content,n+=`
387
387
 
388
388
  `;return`${n.trimEnd()}
389
- `}function Va(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(`
390
- `);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(za)&&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 za,Ba=w(()=>{"use strict";za="<!-- /prjct:preserve -->";l(Wk,"createPreserveStartRegex");l(Vk,"extractPreservedSections");l(Wa,"mergePreservedSections");l(Va,"validatePreserveBlocks")});function yr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Bk.has(e.code))return!0;if(e.code&&np.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 bo(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&np.has(e.code))}function tp(r,e,t){let n=Sn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Sn.delete(r),!1):!0:!1}function Ja(r,e){let t=Sn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Sn.set(r,t)}function Jk(r){Sn.delete(r)}var Bk,np,Sn,So,sp,wr,vo=w(()=>{"use strict";Bk=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),np=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(yr,"isTransientError");l(bo,"isPermanentError");Sn=new Map;l(tp,"isCircuitOpen");l(Ja,"recordFailure");l(Jk,"recordSuccess");So=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(tp(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 Jk(t),o}catch(o){if(n=o,s++,bo(o))throw Ja(t,this.options.circuitBreakerThreshold),o;if(!(yr(o)&&s<this.options.maxAttempts))throw Ja(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 Ja(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return yr(e)}isCircuitOpen(e){return tp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Sn.get(e)}resetCircuit(e){Sn.delete(e)}resetAllCircuits(){Sn.clear()}},sp=new So({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),wr=new So({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var rp=w(()=>{"use strict";Ba();vo()});import{exec as qk}from"node:child_process";import{promisify as Kk}from"node:util";async function Co(r){try{let{stdout:e}=await Xk(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Yk(){let r=await Co("gh api user --jq .login");return r.success&&r.output||(r=await Co("git config --global github.user"),r.success&&r.output)?r.output:null}async function Qk(){let r=await Co("git config user.name");return r.success&&r.output?r.output:null}async function Zk(){let r=await Co("git config user.email");return r.success&&r.output?r.output:null}async function hs(){let[r,e,t]=await Promise.all([Yk(),Qk(),Zk()]);return{github:r,email:t,name:e||r||"Unknown"}}var Xk,Po=w(()=>{"use strict";Xk=Kk(qk);l(Co,"execCommand");l(Yk,"detectGitHubUsername");l(Qk,"detectGitName");l(Zk,"detectGitEmail");l(hs,"detect")});import Ln from"node:fs/promises";import eS from"node:path";import*as xo from"jsonc-parser";function op(r){let e=[],t=xo.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}: ${xo.printParseErrorCode(n.error)}`)}return t}var Ka,tS,$,wt=w(()=>{"use strict";rn();F();se();$t();Po();ke();l(op,"parseJsonc");Ka=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await Ln.readFile(t,"utf-8");return op(n)}catch(t){return C(t)||console.warn(`Warning: Could not read config at ${e}: ${X(t)}`),null}}async writeConfig(e,t){let n=x.getLocalConfigPath(e),s=x.getLegacyPrjctPath(e);await Ln.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Ln.writeFile(n,`${o}
391
- `,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await Ln.readFile(t,"utf-8");return op(n)}catch(t){return C(t)||console.warn(`Warning: Could not read global config for ${e}: ${X(t)}`),null}}async writeGlobalConfig(e,t){let n=x.getGlobalProjectConfigPath(e),s=x.getGlobalProjectPath(e);await Ln.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Ln.writeFile(n,`${o}
392
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:$e,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=x.generateProjectId(e),s=x.getGlobalProjectPath(n),o=x.getDisplayPath(s),i=b(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:$e,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=b(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await x.hasLegacyStructure(e))return!1;if(!await x.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=x.getGlobalProjectPath(s.projectId);try{return(await Ln.readdir(eS.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:x.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=b();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await hs(),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=x.generateProjectId(e);return{projectId:n,dataPath:x.getDisplayPath(x.getGlobalProjectPath(n))}}},tS=new Ka,$=tS});import To from"node:fs/promises";import Xa from"node:path";var Ya,ip,ap=w(()=>{"use strict";wt();ke();F();Ya=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=x.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await To.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await To.readFile(Xa.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=Xa.join(this.agentsPath,`${e}.md`),n=await To.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=Xa.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})}
393
- `;await To.appendFile(s,o)}catch(s){C(s)||console.error(`Agent usage log error: ${y(s)}`)}}},ip=Ya});import cp from"node:path";async function rS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await R(cp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await R(cp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function oS(){return{...nS}}function iS(){return{...sS}}async function lp(){return Eo||(Eo=await rS()?oS():iS(),Eo)}var Eo,nS,sS,up=w(()=>{"use strict";De();Eo=null,nS={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},sS={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(rS,"isClaudeEnvironment");l(oS,"getClaudeAgent");l(iS,"getTerminalAgent");l(lp,"detect")});import kr from"node:fs/promises";var Qa,dp,pp=w(()=>{"use strict";F();Qa=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await kr.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${y(n)}`)}await kr.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await kr.readdir(e)}async fileExists(e){try{return await kr.access(e),!0}catch(t){if(C(t))return!1;throw t}}async createDirectory(e){await kr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
389
+ `}function Xa(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(`
390
+ `);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(qa)&&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 qa,Ya=w(()=>{"use strict";qa="<!-- /prjct:preserve -->";l(nS,"createPreserveStartRegex");l(sS,"extractPreservedSections");l(Ka,"mergePreservedSections");l(Xa,"validatePreserveBlocks")});function kr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&rS.has(e.code))return!0;if(e.code&&ap.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 To(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&ap.has(e.code))}function ip(r,e,t){let n=Pn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Pn.delete(r),!1):!0:!1}function Qa(r,e){let t=Pn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Pn.set(r,t)}function oS(r){Pn.delete(r)}var rS,ap,Pn,xo,cp,Sr,Eo=w(()=>{"use strict";rS=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),ap=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(kr,"isTransientError");l(To,"isPermanentError");Pn=new Map;l(ip,"isCircuitOpen");l(Qa,"recordFailure");l(oS,"recordSuccess");xo=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(ip(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 oS(t),o}catch(o){if(n=o,s++,To(o))throw Qa(t,this.options.circuitBreakerThreshold),o;if(!(kr(o)&&s<this.options.maxAttempts))throw Qa(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Qa(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return kr(e)}isCircuitOpen(e){return ip(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Pn.get(e)}resetCircuit(e){Pn.delete(e)}resetAllCircuits(){Pn.clear()}},cp=new xo({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Sr=new xo({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var lp=w(()=>{"use strict";Ya();Eo()});import{exec as iS}from"node:child_process";import{promisify as aS}from"node:util";async function Ao(r){try{let{stdout:e}=await cS(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function lS(){let r=await Ao("gh api user --jq .login");return r.success&&r.output||(r=await Ao("git config --global github.user"),r.success&&r.output)?r.output:null}async function uS(){let r=await Ao("git config user.name");return r.success&&r.output?r.output:null}async function dS(){let r=await Ao("git config user.email");return r.success&&r.output?r.output:null}async function ws(){let[r,e,t]=await Promise.all([lS(),uS(),dS()]);return{github:r,email:t,name:e||r||"Unknown"}}var cS,Ro=w(()=>{"use strict";cS=aS(iS);l(Ao,"execCommand");l(lS,"detectGitHubUsername");l(uS,"detectGitName");l(dS,"detectGitEmail");l(ws,"detect")});import Un from"node:fs/promises";import pS from"node:path";import*as Io from"jsonc-parser";function up(r){let e=[],t=Io.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}: ${Io.printParseErrorCode(n.error)}`)}return t}var ec,mS,$,Tt=w(()=>{"use strict";on();F();se();Ot();Ro();ke();l(up,"parseJsonc");ec=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await Un.readFile(t,"utf-8");return up(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${X(t)}`),null}}async writeConfig(e,t){let n=x.getLocalConfigPath(e),s=x.getLegacyPrjctPath(e);await Un.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Un.writeFile(n,`${o}
391
+ `,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await Un.readFile(t,"utf-8");return up(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${X(t)}`),null}}async writeGlobalConfig(e,t){let n=x.getGlobalProjectConfigPath(e),s=x.getGlobalProjectPath(e);await Un.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Un.writeFile(n,`${o}
392
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:Oe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=x.generateProjectId(e),s=x.getGlobalProjectPath(n),o=x.getDisplayPath(s),i=b(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Oe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=b(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await x.hasLegacyStructure(e))return!1;if(!await x.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=x.getGlobalProjectPath(s.projectId);try{return(await Un.readdir(pS.join(o,"core"))).length===0}catch(i){return P(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:x.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=b();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await ws(),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=x.generateProjectId(e);return{projectId:n,dataPath:x.getDisplayPath(x.getGlobalProjectPath(n))}}},mS=new ec,$=mS});import Do from"node:fs/promises";import tc from"node:path";var nc,dp,pp=w(()=>{"use strict";Tt();ke();F();nc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=x.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Do.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Do.readFile(tc.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return P(e)||console.error(`Agent loading error: ${y(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=tc.join(this.agentsPath,`${e}.md`),n=await Do.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(t)||console.error(`Agent load error: ${y(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=tc.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})}
393
+ `;await Do.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},dp=nc});import mp from"node:path";async function hS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await D(mp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await D(mp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function yS(){return{...gS}}function wS(){return{...fS}}async function gp(){return jo||(jo=await hS()?yS():wS(),jo)}var jo,gS,fS,fp=w(()=>{"use strict";Me();jo=null,gS={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}},fS={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(hS,"isClaudeEnvironment");l(yS,"getClaudeAgent");l(wS,"getTerminalAgent");l(gp,"detect")});import br from"node:fs/promises";var sc,hp,yp=w(()=>{"use strict";F();sc=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await br.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${y(n)}`)}await br.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await br.readdir(e)}async fileExists(e){try{return await br.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await br.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
394
394
  ${e.map((t,n)=>`${n+1}. ${t}`).join(`
395
395
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
396
396
 
@@ -435,7 +435,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
435
435
 
436
436
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
437
437
 
438
- Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},dp=Qa});var cS,Ao,ys,mp=w(()=>{"use strict";ap();rn();up();pp();vo();cS=["claude"],Ao=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new ip}async initialize(){return this.agent?this.agent:await sp.execute(async()=>{if(this.agentInfo=await lp(),!this.agentInfo?.isSupported)throw fr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!cS.includes(e))throw fr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new dp,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:`
438
+ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},hp=sc});var SS,$o,ks,wp=w(()=>{"use strict";pp();on();fp();yp();Eo();SS=["claude"],$o=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new dp}async initialize(){return this.agent?this.agent:await cp.execute(async()=>{if(this.agentInfo=await gp(),!this.agentInfo?.isSupported)throw yr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!SS.includes(e))throw yr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new hp,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:`
439
439
  AGENTIC EXECUTION:
440
440
  - Read: templates/agentic/orchestrator.md
441
441
  - Analyze task: "${e}"
@@ -443,14 +443,14 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
443
443
  - Claude decides which agent(s) to use
444
444
  - Always prefer specialists over generalist
445
445
  - Fragment complex tasks into subtasks
446
- `}}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}},ys=new Ao});var Io,Ro,gp=w(()=>{"use strict";Io=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"}},Ro=new Io});import fp from"node:path";var lS,uS,Sr,hp=w(()=>{"use strict";se();De();lS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],uS=`# Changelog
446
+ `}}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}},ks=new $o});var Mo,Oo,kp=w(()=>{"use strict";Mo=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"}},Oo=new Mo});import Sp from"node:path";var bS,vS,vr,bp=w(()=>{"use strict";se();Me();bS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],vS=`# Changelog
447
447
 
448
448
  All notable changes to this project will be documented in this file.
449
449
 
450
450
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
451
451
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
452
- `,Sr=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of lS){let s=fp.join(this.projectPath,n);if(await R(s)){let o=await Ye(s),i=this.detectFormat(o);return{filePath:s,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=fp.join(this.projectPath,e);return await Wt(t,`${uS}
453
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Ye(t.filePath),s=e.date||us(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,s):o=this.insertMarkdownEntry(n,e,s),await Wt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,n){let s=this.formatKeepAChangelogEntry(t,n),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+s}
452
+ `,vr=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of bS){let s=Sp.join(this.projectPath,n);if(await D(s)){let o=await tt(s),i=this.detectFormat(o);return{filePath:s,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=Sp.join(this.projectPath,e);return await Bt(t,`${vS}
453
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await tt(t.filePath),s=e.date||ds(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,s):o=this.insertMarkdownEntry(n,e,s),await Bt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,n){let s=this.formatKeepAChangelogEntry(t,n),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+s}
454
454
  ${a}`}return`${e.trimEnd()}
455
455
 
456
456
  ${s}`}insertMarkdownEntry(e,t,n){let s=this.formatMarkdownEntry(t,n),o=e.indexOf(`
@@ -460,18 +460,18 @@ ${a}`}return`${s}
460
460
 
461
461
  ${e}`}formatKeepAChangelogEntry(e,t){let n=[`## [${e.version}] - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push("### Added"),n.push(`- ${e.description}`),n.push(""));return n.join(`
462
462
  `)}formatMarkdownEntry(e,t){let n=[`## ${e.version} - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push(`- ${e.description}`),n.push(""));return n.join(`
463
- `)}}});import dS from"node:crypto";import jo from"node:fs/promises";import yp from"node:path";function wp(){return{version:Mt,lastUpdated:"",checksums:{}}}var Mt,Za,Be,br=w(()=>{"use strict";ke();F();se();ee();Mt="1.0.0";l(wp,"getDefaultChecksums");Za=class{static{l(this,"IndexStorage")}getIndexPath(e){return yp.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await jo.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Mt?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 wp()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await jo.readFile(e);return dS.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:Mt,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{A.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await jo.readdir(t);await Promise.all(n.map(s=>jo.unlink(yp.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!==Mt?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!==Mt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=A.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=A.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Be=new Za});var kp,pS,Do,mS,Sp=w(()=>{"use strict";br();kp=8e4,pS={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"]},Do=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||kp,[c,u,d]=await Promise.all([Be.readIndex(t),Be.readDomains(t),Be.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 Fe of q)p.add(Fe)}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,k=[];for(let j of g){let q=Math.ceil(j.size/this.CHARS_PER_TOKEN);if(f+q>a||k.length>=s)break;k.push(j),f+=q}let S=Math.ceil(c.relevantFiles.reduce((j,q)=>j+q.size,0)/this.CHARS_PER_TOKEN),I=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:I,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(pS))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 Be.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 Be.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Be.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||kp,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)}},mS=new Do});import{execFile as gS}from"node:child_process";import ec from"node:fs/promises";import bp from"node:os";import tc from"node:path";import{promisify as fS}from"node:util";function wS(){let r=ge("mcp-config.json");if(!r)return{mcpServers:{context7:nc}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:nc}}}}function Pp(){return wS().mcpServers?.context7||nc}function vp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?tc.join(bp.tmpdir(),"prjct-context7-test","mcp.json"):tc.join(bp.homedir(),".claude","mcp.json")}async function Cp(r){try{let e=await ec.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(C(e))return{};throw e}}async function kS(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Pp(),e=[...r.args||[],"--help"];await hS(r.command||"npx",e,{timeout:15e3})}var hS,nc,yS,ws,sc,xp,on,ks=w(()=>{"use strict";Jt();F();hS=fS(gS),nc={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},yS=300*1e3,ws=null;l(wS,"parseTemplateConfig");l(Pp,"getContext7Config");l(vp,"getConfigPath");l(Cp,"readConfig");l(kS,"runSmokeCheck");sc=class{static{l(this,"Context7Service")}async install(){let e=vp(),t=tc.dirname(e);await ec.mkdir(t,{recursive:!0});let n=await Cp(e),s=n.mcpServers||{};return s.context7=Pp(),n.mcpServers=s,await ec.writeFile(e,JSON.stringify(n,null,2),"utf-8"),ws=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(ws&&Date.now()-ws.at<yS)return ws.status;let e=vp(),s=((await Cp(e)).mcpServers||{}).context7;if(!s?.command||!Array.isArray(s.args)||s.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await kS();let o={installed:!0,verified:!0,configPath:e};return ws={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return ws={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},xp=new sc,on=xp});import Tp from"node:path";var rc,$o,SS,Ep=w(()=>{"use strict";br();se();rc=[{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"}],$o=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 rc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Tp.dirname(i.path);n.get(u).add(`**/${Tp.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=rc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=b();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of rc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=b(),o={version:Mt,projectId:e,domains:t,discoveredAt:s};await Be.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:Mt,lastUpdate:s,fileCategories:n,domainIndex:i};await Be.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Be.readDomains(e),Be.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 Be.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 Be.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:Mt,lastUpdate:b(),fileCategories:u,domainIndex:d};await Be.writeCategories(e,m)}return o}},SS=new $o});import oc from"node:path";var ic,bS,vS,Mo,Ap,ac=w(()=>{"use strict";ic=30,bS=[/^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$/],vS=[/^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],Mo=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=ic){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=oc.basename(e.path);for(let n of bS)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=oc.basename(e.path);for(let s of vS)if(s.test(t))return 15;let n=oc.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}},Ap=new Mo});function Ss(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 CS[r]}var Q,cc,lc,Oo,CS,Ot,Ip,bn=w(()=>{"use strict";Q={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},cc=["feature","spec","design","refactor","migrate"],lc=["ship","cleanup","git","migrate"],Oo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],CS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ss,"getTimeout");Ot={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},Ip={HISTORY_MAX:100}});function uc(r,e){return{...sr[r],...e}}function Fo(r,e,t){return{message:r,hint:e,...t}}var _o=w(()=>{"use strict";Yr();Yr();l(uc,"getError");l(Fo,"createError")});import{execSync as dc}from"node:child_process";var No,pc,Lo,bs,Uo=w(()=>{"use strict";_o();No={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"}},pc=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=No[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=No[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Lo(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=No[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
464
- `);throw new Lo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
465
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(No),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=dc(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:Fo(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return dc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return dc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Fo(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Lo=class extends Error{static{l(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},bs=new pc});import{exec as PS}from"node:child_process";import{promisify as xS}from"node:util";var BD,Rp=w(()=>{"use strict";bn();Uo();BD=xS(PS)});var qt,mc,kt,vn=w(()=>{"use strict";jt();se();ee();qt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},mc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=me(),s=b();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=b();return A.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(me(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new mc});var Ho,ut,gc=w(()=>{"use strict";wt();vn();ee();Ho=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;L.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?L.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?L.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;L.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 L.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=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=qt.MEMORY_MAX_ENTRIES)return 0;let s=n-qt.MEMORY_MAX_ENTRIES,o=L.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);kt.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&&L.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}}},ut=new Ho});var jp=w(()=>{"use strict";ke();De()});import{execSync as TS}from"node:child_process";import ES from"node:fs/promises";import Go from"node:path";function AS(r){return r.trim().toLowerCase()}async function IS(r){try{return await ES.access(r),!0}catch{return!1}}function RS(){let r=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(r)return r;try{let e=jn.resolve("prjct-cli/package.json");return Go.dirname(e)}catch{return null}}function jS(){let r=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(r)return r;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return TS("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim().replace(/\r?\n/g,"")}catch{return null}}function DS(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||ae}function $S(){let r=[],e=RS();e&&r.push({source:"package-resolve",root:e});let t=jS();return t&&r.push({source:"npm-root-g",root:Go.join(t,"prjct-cli")}),r.push({source:"local-dev",root:DS()}),r}function MS(){let e=wn("commands/").filter(t=>t.endsWith(".md")).map(t=>Go.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function hc(r){return r instanceof Error&&typeof r.code=="string"&&typeof r.message=="string"}var vr,fc,yc,wc=w(()=>{"use strict";Jt();$t();vr=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,n){super(t),this.name="PCommandResolverError",this.code=e,this.fix=n}};l(AS,"normalizeCommand");l(IS,"fileExists");l(RS,"getPackageResolveRoot");l(jS,"getNpmGlobalRoot");l(DS,"getLocalDevRoot");l($S,"getCandidateRoots");l(MS,"getCatalogFromTemplates");fc=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return MS()}validatePCommand(e){let t=AS(e);return/^[a-z][a-z0-9-]*$/.test(t)?this.getPCommandCatalog().includes(t)?{valid:!0,command:t}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Unknown command: p. ${t}`}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Invalid p. command "${e}"`}}async resolvePCommandTemplate(e){if(this.getPCommandCatalog().length===0)throw new vr("ROUTER_NOT_READY","p. router command catalog is empty",["Run `prjct setup` to reinstall command templates"]);let t=this.validatePCommand(e);if(!t.valid)throw new vr(t.code||"UNKNOWN_COMMAND",t.message||`Unknown command: p. ${t.command}`,[`Use one of: ${this.getPCommandCatalog().join(", ")}`,"Run `prjct setup` to refresh command templates"]);for(let n of $S()){let s=Go.join(n.root,"templates","commands",`${t.command}.md`);if(await IS(s))return{command:t.command,templatePath:s,source:n.source}}throw new vr("TEMPLATE_NOT_FOUND",`Template not found for p. ${t.command}`,["Run `prjct start` to repair Codex skill and command templates","Run `prjct setup` to refresh installation"])}};l(hc,"isPCommandResolveError");yc=new fc});import{createHash as OS}from"node:crypto";import $p from"node:fs/promises";import Sc from"node:path";function Un(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function _S(r){let e=Sc.resolve(r);return OS("sha256").update(e).digest("hex").slice(0,16)}function zo(r){let e=ge(r);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function NS(r){let e=[],t=[r];for(;t.length>0&&e.length<Dp;){let n=t.pop();if(!n)break;let s=await $p.readdir(n,{withFileTypes:!0});for(let o of s){if(e.length>=Dp)break;let i=Sc.join(n,o.name);if(o.isDirectory()){FS.has(o.name)||t.push(i);continue}o.isFile()&&/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java)$/.test(o.name)&&e.push(i)}}return e}async function LS(r,e){let t=[],n=[],s=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=Sc.relative(r,d),p=await $p.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(s=!0),(/from\s+['"]@?heroui\//.test(p)||/from\s+['"]@nextui-org\//.test(p))&&(o=!0),/<UiButton\b|from\s+['"][^'"]*UiButton[^'"]*['"]/.test(p)&&(i=!0);let g=p.match(/:\s*any\b|<\s*any\s*>/g);g&&(a+=g.length,n.push({issue:"Unbounded any usage",file:m,suggestion:"Replace with specific types or justified unknown + narrowing.",severity:"high",language:"TypeScript",source:"repo",confidence:.92}));let f=p.match(/@ts-ignore/g);f&&(c+=f.length,n.push({issue:"Unchecked @ts-ignore usage",file:m,suggestion:"Use @ts-expect-error with reason or refactor typings.",severity:"medium",language:"TypeScript",source:"repo",confidence:.88})),/\.(tsx|jsx)$/.test(d)&&/<img\s+/.test(p)&&!/next\/image/.test(p)&&(u+=1,n.push({issue:"Raw <img> in React/Next component",file:m,suggestion:"Prefer framework image component or documented exception.",severity:"medium",framework:"Next.js",source:"repo",confidence:.8}))}return s&&t.push({name:"Image rendering via next/image",description:"Project uses next/image for optimized image delivery.",location:"app/** or src/**",framework:"Next.js",source:"repo",confidence:.9}),o&&t.push({name:"HeroUI as component system",description:"UI components are sourced from HeroUI/NextUI packages.",location:"components/**",source:"repo",confidence:.87}),i&&t.push({name:"Use UiButton abstraction",description:"Buttons are wrapped in UiButton instead of native button in app UI.",location:"components/**",source:"repo",confidence:.84}),(a>0||c>0||u>0)&&t.push({name:"Strict type/lint hygiene",description:`Detected ${a} any, ${c} ts-ignore, ${u} raw img potential violations.`,source:"repo",confidence:.76}),{patterns:t,antiPatterns:n}}function US(r){let e=new Set,t=[];for(let n of r){let s=`${Un(n.name)}::${Un(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}function HS(r){let e=new Set,t=[];for(let n of r){let s=`${Un(n.issue)}::${Un(n.file)}::${Un(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}var FS,Dp,kc,Mp,Op,bc=w(()=>{"use strict";Jt();ee();FS=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),Dp=400;l(Un,"normalizeKey");l(_S,"repoHash");l(zo,"parseBaselineFile");l(NS,"listSourceFiles");l(LS,"detectRepoRules");l(US,"dedupePatterns");l(HS,"dedupeAntiPatterns");kc=class{static{l(this,"PatternExtractor")}async extract(e){let t=_S(e.projectPath),n=await NS(e.projectPath),s=[],o=[];for(let p of e.languages){let g=Un(p),f=zo(`baseline/patterns/${g}.json`),k=zo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,language:p,source:"baseline",confidence:S.confidence??.8}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",language:p,source:"baseline",confidence:S.confidence??.8})))}for(let p of e.frameworks){let g=Un(p),f=zo(`baseline/patterns/${g}.json`),k=zo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,framework:p,source:"baseline",confidence:S.confidence??.82}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",framework:p,source:"baseline",confidence:S.confidence??.82}))),e.context7Verified&&s.push({name:`${p} API validation via Context7`,description:`Validate ${p} APIs against current documentation through Context7 before implementation.`,framework:p,source:"context7",confidence:.7})}let i=await LS(e.projectPath,n),a=(e.feedback?.patternsDiscovered||[]).map(p=>({name:p,description:`Confirmed during completed tasks: ${p}`,source:"feedback",confidence:.75})),c=(e.feedback?.knownGotchas||[]).map(p=>({issue:p,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${p}`,source:"feedback",severity:"medium",confidence:.7})),u=US([...s,...i.patterns,...a]),d=HS([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return A.setDoc(e.projectId,m,{projectId:e.projectId,repoPathHash:t,patterns:u,antiPatterns:d,updatedAt:new Date().toISOString(),version:1}),{patterns:u,antiPatterns:d,repoPathHash:t}}},Mp=new kc,Op=Mp});import{exec as zS}from"node:child_process";import{promisify as WS}from"node:util";var E0,Fp=w(()=>{"use strict";br();se();ac();E0=WS(zS)});import Hn from"chalk";var _p,VS,BS,Ft,Np=w(()=>{"use strict";Ge();_p=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],VS=80,BS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:_p,speed:VS},cli:{header:l(()=>`${Hn.cyan.bold("\u26A1")} ${Hn.cyan("prjct")}`,"header"),footer:l(()=>Hn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Hn.cyan("\u26A1")} ${Hn.cyan("prjct")} ${Hn.cyan(_p[r%10])} ${Hn.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")=>no(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>no(r).signature,"getSignature")},Ft=BS});import te from"chalk";function KS(){return JS[qS]}var N0,vc,JS,qS,Gn,vs,Cc,St,Cn,XS,YS,h,zn=w(()=>{"use strict";Np();bn();_o();_o();N0=Ft.spinner.frames,vc=Ft.spinner.speed,JS={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}},qS="compact";l(KS,"getTierConfig");Gn={success:te.green("\u2713"),fail:te.red("\u2717"),warn:te.yellow("\u26A0"),info:te.blue("\u2139"),debug:te.dim("\u{1F527}"),bullet:te.dim("\u2022"),arrow:te.dim("\u2192"),check:te.green("\u2713"),cross:te.red("\u2717"),spinner:te.cyan("\u25D0")},vs=null,Cc=0,St=!1,Cn=l((r,e)=>{let t=e??(KS().maxCharsPerLine||Ot.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),XS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ot.CLEAR_WIDTH)}\r`):!0,"clear"),YS={start(){return St||console.log(Ft.cli.header()),this},end(){return St||console.log(Ft.cli.footer()),this},spin(r){return St?this:(this.stop(),process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(Cc++,Cn(r,Ot.SPINNER_MSG))}`)},vc),this):(process.stdout.write(`${Ft.cli.spin(0,Cn(r,Ot.SPINNER_MSG))}
466
- `),this))},done(r,e){if(this.stop(),!St){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=te.dim(` [${n.join(" | ")}]`))}console.log(`${Gn.success} ${Cn(r,Ot.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Gn.fail} ${Cn(r,Ot.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?uc(r):r;return console.error(),console.error(`${Gn.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),St||console.log(`${Gn.warn} ${Cn(r,Ot.WARN_MSG)}`),this},info(r){return this.stop(),St||console.log(`${Gn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!St&&e&&console.log(`${Gn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),St)return this;let t=e.bullet||Gn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),St||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(te.dim(s)),console.log(te.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(),St)return this;let t=e.split(`
467
- `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),St?this:(console.log(`
468
- ${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return vs&&(clearInterval(vs),vs=null,XS()),this},step(r,e,t){if(St)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(Cc++,`${n} ${Cn(t,Ot.STEP_MSG)}`)}`)},vc),this):(process.stdout.write(`${Ft.cli.spin(0,`${n} ${Cn(t,Ot.STEP_MSG)}`)}
469
- `),this)},progress(r,e,t){if(St)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Cn(t,Ot.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(Cc++,`[${i}] ${n}%${a}`)}`)},vc),this):(process.stdout.write(`${Ft.cli.spin(0,`[${i}] ${n}%${a}`)}
470
- `),this)}},h=YS});function Lp(r,e){let t=[];Cr("Languages",r.languages,e.languages,t),Cr("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),Cr("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let n=r.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Cr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Cr("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Pc(r){if(!r.hasChanges)return`## Analysis Diff
463
+ `)}}});import PS from"node:crypto";import Fo from"node:fs/promises";import vp from"node:path";function Pp(){return{version:Ft,lastUpdated:"",checksums:{}}}var Ft,rc,Ke,Pr=w(()=>{"use strict";ke();F();se();ee();Ft="1.0.0";l(Pp,"getDefaultChecksums");rc=class{static{l(this,"IndexStorage")}getIndexPath(e){return vp.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Fo.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Ft?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 Pp()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Fo.readFile(e);return PS.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:Ft,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{A.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await Fo.readdir(t);await Promise.all(n.map(s=>Fo.unlink(vp.join(t,s))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Ft?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!==Ft?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=A.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=A.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Ke=new rc});var Cp,CS,_o,xS,xp=w(()=>{"use strict";Pr();Cp=8e4,CS={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"]},_o=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||Cp,[c,u,d]=await Promise.all([Ke.readIndex(t),Ke.readDomains(t),Ke.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let R of m){let G=d.domainIndex[R]||[];for(let $e of G)p.add($e)}if(i&&d.domainIndex.general){let R=d.domainIndex.general.slice(0,10);for(let G of R)p.add(G)}let g=c.relevantFiles.filter(R=>p.has(R.path)&&R.score>=o);g.sort((R,G)=>G.score-R.score);let f=0,k=[];for(let R of g){let G=Math.ceil(R.size/this.CHARS_PER_TOKEN);if(f+G>a||k.length>=s)break;k.push(R),f+=G}let S=Math.ceil(c.relevantFiles.reduce((R,G)=>R+G.size,0)/this.CHARS_PER_TOKEN),I=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:I,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(CS))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 Ke.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 Ke.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ke.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||Cp,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)}},xS=new _o});import{execFile as TS}from"node:child_process";import oc from"node:fs/promises";import Tp from"node:os";import ic from"node:path";import{promisify as ES}from"node:util";function IS(){let r=ue("mcp-config.json");if(!r)return{mcpServers:{context7:ac}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:ac}}}}function Rp(){return IS().mcpServers?.context7||ac}function Ep(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?ic.join(Tp.tmpdir(),"prjct-context7-test","mcp.json"):ic.join(Tp.homedir(),".claude","mcp.json")}async function Ap(r){try{let e=await oc.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e))return{};throw e}}async function DS(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Rp(),e=[...r.args||[],"--help"];await AS(r.command||"npx",e,{timeout:15e3})}var AS,ac,RS,Ss,cc,Ip,cn,bs=w(()=>{"use strict";Kt();F();AS=ES(TS),ac={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},RS=300*1e3,Ss=null;l(IS,"parseTemplateConfig");l(Rp,"getContext7Config");l(Ep,"getConfigPath");l(Ap,"readConfig");l(DS,"runSmokeCheck");cc=class{static{l(this,"Context7Service")}async install(){let e=Ep(),t=ic.dirname(e);await oc.mkdir(t,{recursive:!0});let n=await Ap(e),s=n.mcpServers||{};return s.context7=Rp(),n.mcpServers=s,await oc.writeFile(e,JSON.stringify(n,null,2),"utf-8"),Ss=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(Ss&&Date.now()-Ss.at<RS)return Ss.status;let e=Ep(),s=((await Ap(e)).mcpServers||{}).context7;if(!s?.command||!Array.isArray(s.args)||s.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await DS();let o={installed:!0,verified:!0,configPath:e};return Ss={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return Ss={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},Ip=new cc,cn=Ip});import Dp from"node:path";var lc,No,jS,jp=w(()=>{"use strict";Pr();se();lc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],No=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of lc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Dp.dirname(i.path);n.get(u).add(`**/${Dp.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=lc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=b();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of lc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=b(),o={version:Ft,projectId:e,domains:t,discoveredAt:s};await Ke.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:Ft,lastUpdate:s,fileCategories:n,domainIndex:i};await Ke.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ke.readDomains(e),Ke.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 Ke.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 Ke.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:Ft,lastUpdate:b(),fileCategories:u,domainIndex:d};await Ke.writeCategories(e,m)}return o}},jS=new No});import uc from"node:path";var dc,$S,MS,Lo,$p,pc=w(()=>{"use strict";dc=30,$S=[/^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$/],MS=[/^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],Lo=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=dc){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=uc.basename(e.path);for(let n of $S)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=uc.basename(e.path);for(let s of MS)if(s.test(t))return 15;let n=uc.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}},$p=new Lo});function vs(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 OS[r]}var Z,mc,gc,Uo,OS,_t,Mp,Cn=w(()=>{"use strict";Z={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},mc=["feature","spec","design","refactor","migrate"],gc=["ship","cleanup","git","migrate"],Uo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],OS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(vs,"getTimeout");_t={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},Mp={HISTORY_MAX:100}});function fc(r,e){return{...or[r],...e}}function Ho(r,e,t){return{message:r,hint:e,...t}}var Go=w(()=>{"use strict";no();no();l(fc,"getError");l(Ho,"createError")});import{execSync as hc}from"node:child_process";var zo,yc,Wo,Ps,Vo=w(()=>{"use strict";Go();zo={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"}},yc=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=zo[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=zo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Wo(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=zo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
464
+ `);throw new Wo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
465
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(zo),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=hc(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:Ho(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return hc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return hc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Ho(`${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())}},Wo=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}},Ps=new yc});import{exec as FS}from"node:child_process";import{promisify as _S}from"node:util";var u0,Op=w(()=>{"use strict";Cn();Vo();u0=_S(FS)});var Xt,wc,bt,xn=w(()=>{"use strict";$t();se();ee();Xt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},wc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ge(),s=b();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=b();return A.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ge(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},bt=new wc});var Bo,mt,kc=w(()=>{"use strict";Tt();xn();ee();Bo=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;U.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?U.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?U.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;U.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 U.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=U.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Xt.MEMORY_MAX_ENTRIES)return 0;let s=n-Xt.MEMORY_MAX_ENTRIES,o=U.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);bt.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&&U.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}}},mt=new Bo});var Fp=w(()=>{"use strict";ke();Me()});import{execSync as NS}from"node:child_process";import LS from"node:fs/promises";import Jo from"node:path";function US(r){return r.trim().toLowerCase()}async function HS(r){try{return await LS.access(r),!0}catch{return!1}}function GS(){let r=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(r)return r;try{let e=fn.resolve("prjct-cli/package.json");return Jo.dirname(e)}catch{return null}}function zS(){let r=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(r)return r;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return NS("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).trim().replace(/\r?\n/g,"")}catch{return null}}function WS(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||ce}function VS(){let r=[],e=GS();e&&r.push({source:"package-resolve",root:e});let t=zS();return t&&r.push({source:"npm-root-g",root:Jo.join(t,"prjct-cli")}),r.push({source:"local-dev",root:WS()}),r}function BS(){let e=vn("commands/").filter(t=>t.endsWith(".md")).map(t=>Jo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function bc(r){return r instanceof Error&&typeof r.code=="string"&&typeof r.message=="string"}var Cr,Sc,vc,Pc=w(()=>{"use strict";Kt();Ot();Cr=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,n){super(t),this.name="PCommandResolverError",this.code=e,this.fix=n}};l(US,"normalizeCommand");l(HS,"fileExists");l(GS,"getPackageResolveRoot");l(zS,"getNpmGlobalRoot");l(WS,"getLocalDevRoot");l(VS,"getCandidateRoots");l(BS,"getCatalogFromTemplates");Sc=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return BS()}validatePCommand(e){let t=US(e);return/^[a-z][a-z0-9-]*$/.test(t)?this.getPCommandCatalog().includes(t)?{valid:!0,command:t}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Unknown command: p. ${t}`}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Invalid p. command "${e}"`}}async resolvePCommandTemplate(e){if(this.getPCommandCatalog().length===0)throw new Cr("ROUTER_NOT_READY","p. router command catalog is empty",["Run `prjct setup` to reinstall command templates"]);let t=this.validatePCommand(e);if(!t.valid)throw new Cr(t.code||"UNKNOWN_COMMAND",t.message||`Unknown command: p. ${t.command}`,[`Use one of: ${this.getPCommandCatalog().join(", ")}`,"Run `prjct setup` to refresh command templates"]);if(!process.env.PRJCT_P_RESOLVER_DISABLE_BUNDLE){let n=`commands/${t.command}.md`;if(ue(n))return{command:t.command,templatePath:n,source:"bundle"}}for(let n of VS()){let s=Jo.join(n.root,"templates","commands",`${t.command}.md`);if(await HS(s))return{command:t.command,templatePath:s,source:n.source}}throw new Cr("TEMPLATE_NOT_FOUND",`Template not found for p. ${t.command}`,["Run `prjct start` to repair Codex skill and command templates","Run `prjct setup` to refresh installation"])}};l(bc,"isPCommandResolveError");vc=new Sc});import{createHash as JS}from"node:crypto";import Np from"node:fs/promises";import xc from"node:path";function Hn(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function KS(r){let e=xc.resolve(r);return JS("sha256").update(e).digest("hex").slice(0,16)}function qo(r){let e=ue(r);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function XS(r){let e=[],t=[r];for(;t.length>0&&e.length<_p;){let n=t.pop();if(!n)break;let s=await Np.readdir(n,{withFileTypes:!0});for(let o of s){if(e.length>=_p)break;let i=xc.join(n,o.name);if(o.isDirectory()){qS.has(o.name)||t.push(i);continue}o.isFile()&&/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java)$/.test(o.name)&&e.push(i)}}return e}async function YS(r,e){let t=[],n=[],s=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=xc.relative(r,d),p=await Np.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(s=!0),(/from\s+['"]@?heroui\//.test(p)||/from\s+['"]@nextui-org\//.test(p))&&(o=!0),/<UiButton\b|from\s+['"][^'"]*UiButton[^'"]*['"]/.test(p)&&(i=!0);let g=p.match(/:\s*any\b|<\s*any\s*>/g);g&&(a+=g.length,n.push({issue:"Unbounded any usage",file:m,suggestion:"Replace with specific types or justified unknown + narrowing.",severity:"high",language:"TypeScript",source:"repo",confidence:.92}));let f=p.match(/@ts-ignore/g);f&&(c+=f.length,n.push({issue:"Unchecked @ts-ignore usage",file:m,suggestion:"Use @ts-expect-error with reason or refactor typings.",severity:"medium",language:"TypeScript",source:"repo",confidence:.88})),/\.(tsx|jsx)$/.test(d)&&/<img\s+/.test(p)&&!/next\/image/.test(p)&&(u+=1,n.push({issue:"Raw <img> in React/Next component",file:m,suggestion:"Prefer framework image component or documented exception.",severity:"medium",framework:"Next.js",source:"repo",confidence:.8}))}return s&&t.push({name:"Image rendering via next/image",description:"Project uses next/image for optimized image delivery.",location:"app/** or src/**",framework:"Next.js",source:"repo",confidence:.9}),o&&t.push({name:"HeroUI as component system",description:"UI components are sourced from HeroUI/NextUI packages.",location:"components/**",source:"repo",confidence:.87}),i&&t.push({name:"Use UiButton abstraction",description:"Buttons are wrapped in UiButton instead of native button in app UI.",location:"components/**",source:"repo",confidence:.84}),(a>0||c>0||u>0)&&t.push({name:"Strict type/lint hygiene",description:`Detected ${a} any, ${c} ts-ignore, ${u} raw img potential violations.`,source:"repo",confidence:.76}),{patterns:t,antiPatterns:n}}function QS(r){let e=new Set,t=[];for(let n of r){let s=`${Hn(n.name)}::${Hn(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}function ZS(r){let e=new Set,t=[];for(let n of r){let s=`${Hn(n.issue)}::${Hn(n.file)}::${Hn(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}var qS,_p,Cc,Lp,Up,Tc=w(()=>{"use strict";Kt();ee();qS=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),_p=400;l(Hn,"normalizeKey");l(KS,"repoHash");l(qo,"parseBaselineFile");l(XS,"listSourceFiles");l(YS,"detectRepoRules");l(QS,"dedupePatterns");l(ZS,"dedupeAntiPatterns");Cc=class{static{l(this,"PatternExtractor")}async extract(e){let t=KS(e.projectPath),n=await XS(e.projectPath),s=[],o=[];for(let p of e.languages){let g=Hn(p),f=qo(`baseline/patterns/${g}.json`),k=qo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,language:p,source:"baseline",confidence:S.confidence??.8}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",language:p,source:"baseline",confidence:S.confidence??.8})))}for(let p of e.frameworks){let g=Hn(p),f=qo(`baseline/patterns/${g}.json`),k=qo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,framework:p,source:"baseline",confidence:S.confidence??.82}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",framework:p,source:"baseline",confidence:S.confidence??.82}))),e.context7Verified&&s.push({name:`${p} API validation via Context7`,description:`Validate ${p} APIs against current documentation through Context7 before implementation.`,framework:p,source:"context7",confidence:.7})}let i=await YS(e.projectPath,n),a=(e.feedback?.patternsDiscovered||[]).map(p=>({name:p,description:`Confirmed during completed tasks: ${p}`,source:"feedback",confidence:.75})),c=(e.feedback?.knownGotchas||[]).map(p=>({issue:p,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${p}`,source:"feedback",severity:"medium",confidence:.7})),u=QS([...s,...i.patterns,...a]),d=ZS([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return A.setDoc(e.projectId,m,{projectId:e.projectId,repoPathHash:t,patterns:u,antiPatterns:d,updatedAt:new Date().toISOString(),version:1}),{patterns:u,antiPatterns:d,repoPathHash:t}}},Lp=new Cc,Up=Lp});import{exec as tb}from"node:child_process";import{promisify as nb}from"node:util";var V0,Hp=w(()=>{"use strict";Pr();se();pc();V0=nb(tb)});import Gn from"chalk";var Gp,sb,rb,Nt,zp=w(()=>{"use strict";ze();Gp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],sb=80,rb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Gp,speed:sb},cli:{header:l(()=>`${Gn.cyan.bold("\u26A1")} ${Gn.cyan("prjct")}`,"header"),footer:l(()=>Gn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Gn.cyan("\u26A1")} ${Gn.cyan("prjct")} ${Gn.cyan(Gp[r%10])} ${Gn.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")=>ao(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>ao(r).signature,"getSignature")},Nt=rb});import te from"chalk";function ab(){return ob[ib]}var n$,Ec,ob,ib,zn,Cs,Ac,vt,Tn,cb,lb,h,Wn=w(()=>{"use strict";zp();Cn();Go();Go();n$=Nt.spinner.frames,Ec=Nt.spinner.speed,ob={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}},ib="compact";l(ab,"getTierConfig");zn={success:te.green("\u2713"),fail:te.red("\u2717"),warn:te.yellow("\u26A0"),info:te.blue("\u2139"),debug:te.dim("\u{1F527}"),bullet:te.dim("\u2022"),arrow:te.dim("\u2192"),check:te.green("\u2713"),cross:te.red("\u2717"),spinner:te.cyan("\u25D0")},Cs=null,Ac=0,vt=!1,Tn=l((r,e)=>{let t=e??(ab().maxCharsPerLine||_t.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),cb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(_t.CLEAR_WIDTH)}\r`):!0,"clear"),lb={start(){return vt||console.log(Nt.cli.header()),this},end(){return vt||console.log(Nt.cli.footer()),this},spin(r){return vt?this:(this.stop(),process.stdout.isTTY?(Cs=setInterval(()=>{process.stdout.write(`\r${Nt.cli.spin(Ac++,Tn(r,_t.SPINNER_MSG))}`)},Ec),this):(process.stdout.write(`${Nt.cli.spin(0,Tn(r,_t.SPINNER_MSG))}
466
+ `),this))},done(r,e){if(this.stop(),!vt){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=te.dim(` [${n.join(" | ")}]`))}console.log(`${zn.success} ${Tn(r,_t.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${zn.fail} ${Tn(r,_t.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?fc(r):r;return console.error(),console.error(`${zn.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),vt||console.log(`${zn.warn} ${Tn(r,_t.WARN_MSG)}`),this},info(r){return this.stop(),vt||console.log(`${zn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!vt&&e&&console.log(`${zn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),vt)return this;let t=e.bullet||zn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),vt||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(te.dim(s)),console.log(te.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(),vt)return this;let t=e.split(`
467
+ `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),vt?this:(console.log(`
468
+ ${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return Cs&&(clearInterval(Cs),Cs=null,cb()),this},step(r,e,t){if(vt)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Cs=setInterval(()=>{process.stdout.write(`\r${Nt.cli.spin(Ac++,`${n} ${Tn(t,_t.STEP_MSG)}`)}`)},Ec),this):(process.stdout.write(`${Nt.cli.spin(0,`${n} ${Tn(t,_t.STEP_MSG)}`)}
469
+ `),this)},progress(r,e,t){if(vt)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Tn(t,_t.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Cs=setInterval(()=>{process.stdout.write(`\r${Nt.cli.spin(Ac++,`[${i}] ${n}%${a}`)}`)},Ec),this):(process.stdout.write(`${Nt.cli.spin(0,`[${i}] ${n}%${a}`)}
470
+ `),this)}},h=lb});function Wp(r,e){let t=[];xr("Languages",r.languages,e.languages,t),xr("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),xr("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let n=r.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);xr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);xr("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Rc(r){if(!r.hasChanges)return`## Analysis Diff
471
471
 
472
472
  No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let n of r.items){let s=n.type==="added"?"+":n.type==="removed"?"-":"~",o=n.type==="changed"?`${n.before} \u2192 ${n.after}`:n.after??n.before??"";e.push(`| ${s} | ${n.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
473
- `)}function Up(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
474
- `)}function Cr(r,e,t,n){let s=new Set(e),o=new Set(t);for(let i of t)s.has(i)||n.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:r,type:"removed",before:i})}var xc=w(()=>{"use strict";l(Lp,"generateAnalysisDiff");l(Pc,"formatAnalysisDiffMd");l(Up,"formatAnalysisDiffText");l(Cr,"diffStringArray")});function ZS(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(QS.has(r)||r.includes("prjct"))return{level:Cs.debug,name:"debug"};let e=Cs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Wo(r,e,t){return Hp>=r?(...n)=>console[t](e,...n):tb}var Cs,QS,Hp,eb,tb,nb,U,Pn=w(()=>{"use strict";Cs={error:0,warn:1,info:2,debug:3},QS=new Set(["1","true","*"]);l(ZS,"getLogLevel");({level:Hp,name:eb}=ZS()),tb=l(()=>{},"noop");l(Wo,"createLogMethod");nb={error:Wo(Cs.error,"[prjct:error]","error"),warn:Wo(Cs.warn,"[prjct:warn]","warn"),info:Wo(Cs.info,"[prjct:info]","log"),debug:Wo(Cs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Hp>=0,"isEnabled"),level:l(()=>eb,"level")},U=nb});var Vo,sb,Gp=w(()=>{"use strict";rn();ee();aa();bn();Pn();Vo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Ip.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"&&U.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Xr.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Xr.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw U.error("Event callback error:",n),n}}async logEvent(e){try{A.appendEvent(this.projectId,e.type,e)}catch(t){U.debug("Failed to log event:",X(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())}},sb=new Vo});var Bo,Jo,zp=w(()=>{"use strict";ke();se();De();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=x.getSyncPendingPath(e.projectId),n=await zt(t,[])??[];n.push(e),await $n(t,n)}async getPending(e){let t=x.getSyncPendingPath(e);return await zt(t,[])??[]}async clearPending(e){let t=x.getSyncPendingPath(e);await $n(t,[])}async updateLastSync(e){let t=x.getLastSyncPath(e),n={timestamp:b(),success:!0};await $n(t,n)}async getLastSync(e){let t=x.getLastSyncPath(e);return await zt(t,null)}},Jo=new Bo});var Tc=w(()=>{"use strict";Gp();zp()});var _t,qo=w(()=>{"use strict";_t=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 Le,Kt=w(()=>{"use strict";Tc();qo();se();ee();Le=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new _t({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await Jo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as ob}from"node:crypto";var Ec,Ue,Pr=w(()=>{"use strict";Ca();xc();se();Kt();Ec=class extends Le{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};va.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=b(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return va.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,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,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Lp(t.sealed,t.draft)}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 pd(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 ob("sha256").update(JSON.stringify(t)).digest("hex")}},Ue=new Ec});var Ac,Je,xr=w(()=>{"use strict";jt();xa();se();vn();Kt();Ac=class extends Le{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",fd)}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:me(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=mn(qt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Je=new Ac});var Ic,Wn,Ko=w(()=>{"use strict";ko();se();Kt();Ic=class extends Le{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Qd)}getDefault(){return{...Zd}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(I=>I.date>=f),S=[...i.agentUsage];if(t.agents)for(let I of t.agents){let j=S.findIndex(q=>q.agentName===I);j>=0?S[j]={...S[j],usageCount:S[j].usageCount+1,tokensSaved:S[j].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:S,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:ep(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 Ic});import it from"node:fs/promises";import de from"node:path";async function Tr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(r)&&A.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=x.getGlobalProjectPath(r),s=de.join(n,"storage"),o=de.join(n,"index"),i=de.join(n,"memory");t.backupDir=await ib(s,o,i),A.getDb(r);for(let{filename:a,key:c}of Dc){let u=de.join(s,a),d=await Vn(u);if(d===null){t.skippedFiles.push(a);continue}try{A.setDoc(r,c,d),Wp(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of jc){let u=de.join(o,a),d=await Vn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Vp(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await gb(r,o,t),await fb(r,o,t),await hb(r,i,t),await yb(r,i,t),t.errors.length===0&&await wb(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 ib(r,e,t){let n=de.join(r,"backup");return await it.mkdir(n,{recursive:!0}),await it.mkdir(de.join(n,"index"),{recursive:!0}),await it.mkdir(de.join(n,"memory"),{recursive:!0}),await Rc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Rc(e,de.join(n,"index")),await Rc(t,de.join(n,"memory")),n}async function Rc(r,e,t){try{let n=await it.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=de.join(r,s.name),i=de.join(e,s.name);await it.copyFile(o,i)}}catch(n){if(!C(n))throw n}}function Wp(r,e,t){switch(e){case"state":ab(r,t);break;case"queue":cb(r,t);break;case"ideas":lb(r,t);break;case"shipped":ub(r,t);break;case"metrics":db(r,t);break;case"analysis":pb(r,t);break}}function ab(r,e){let t=A.getDb(r),n=t.prepare(`
473
+ `)}function Vp(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
474
+ `)}function xr(r,e,t,n){let s=new Set(e),o=new Set(t);for(let i of t)s.has(i)||n.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:r,type:"removed",before:i})}var Ic=w(()=>{"use strict";l(Wp,"generateAnalysisDiff");l(Rc,"formatAnalysisDiffMd");l(Vp,"formatAnalysisDiffText");l(xr,"diffStringArray")});function db(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(ub.has(r)||r.includes("prjct"))return{level:xs.debug,name:"debug"};let e=xs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Ko(r,e,t){return Bp>=r?(...n)=>console[t](e,...n):mb}var xs,ub,Bp,pb,mb,gb,L,En=w(()=>{"use strict";xs={error:0,warn:1,info:2,debug:3},ub=new Set(["1","true","*"]);l(db,"getLogLevel");({level:Bp,name:pb}=db()),mb=l(()=>{},"noop");l(Ko,"createLogMethod");gb={error:Ko(xs.error,"[prjct:error]","error"),warn:Ko(xs.warn,"[prjct:warn]","warn"),info:Ko(xs.info,"[prjct:info]","log"),debug:Ko(xs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Bp>=0,"isEnabled"),level:l(()=>pb,"level")},L=gb});var Xo,fb,Jp=w(()=>{"use strict";on();ee();ma();Cn();En();Xo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Mp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&L.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(to.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(to.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw L.error("Event callback error:",n),n}}async logEvent(e){try{A.appendEvent(this.projectId,e.type,e)}catch(t){L.debug("Failed to log event:",X(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())}},fb=new Xo});var Yo,Qo,qp=w(()=>{"use strict";ke();se();Me();Yo=class{static{l(this,"SyncEventBus")}async publish(e){let t=x.getSyncPendingPath(e.projectId),n=await Vt(t,[])??[];n.push(e),await Mn(t,n)}async getPending(e){let t=x.getSyncPendingPath(e);return await Vt(t,[])??[]}async clearPending(e){let t=x.getSyncPendingPath(e);await Mn(t,[])}async updateLastSync(e){let t=x.getLastSyncPath(e),n={timestamp:b(),success:!0};await Mn(t,n)}async getLastSync(e){let t=x.getLastSyncPath(e);return await Vt(t,null)}},Qo=new Yo});var Dc=w(()=>{"use strict";Jp();qp()});var Lt,Zo=w(()=>{"use strict";Lt=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 He,Yt=w(()=>{"use strict";Dc();Zo();se();ee();He=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Lt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await Qo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as yb}from"node:crypto";var jc,Ge,Tr=w(()=>{"use strict";Ra();Ic();se();Yt();jc=class extends He{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Aa.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=b(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Aa.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,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,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Wp(t.sealed,t.draft)}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 yd(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 yb("sha256").update(JSON.stringify(t)).digest("hex")}},Ge=new jc});var $c,Xe,Er=w(()=>{"use strict";$t();Da();se();xn();Yt();$c=class extends He{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Sd)}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:ge(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=yn(Xt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Xe=new $c});var Mc,Vn,ei=w(()=>{"use strict";Co();se();Yt();Mc=class extends He{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",sp)}getDefault(){return{...rp}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(I=>I.date>=f),S=[...i.agentUsage];if(t.agents)for(let I of t.agents){let R=S.findIndex(G=>G.agentName===I);R>=0?S[R]={...S[R],usageCount:S[R].usageCount+1,tokensSaved:S[R].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:S,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:op(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)}},Vn=new Mc});import ut from"node:fs/promises";import pe from"node:path";async function Ar(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(r)&&A.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=x.getGlobalProjectPath(r),s=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await wb(s,o,i),A.getDb(r);for(let{filename:a,key:c}of _c){let u=pe.join(s,a),d=await Bn(u);if(d===null){t.skippedFiles.push(a);continue}try{A.setDoc(r,c,d),Kp(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Fc){let u=pe.join(o,a),d=await Bn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Xp(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Tb(r,o,t),await Eb(r,o,t),await Ab(r,i,t),await Rb(r,i,t),t.errors.length===0&&await Ib(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 wb(r,e,t){let n=pe.join(r,"backup");return await ut.mkdir(n,{recursive:!0}),await ut.mkdir(pe.join(n,"index"),{recursive:!0}),await ut.mkdir(pe.join(n,"memory"),{recursive:!0}),await Oc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Oc(e,pe.join(n,"index")),await Oc(t,pe.join(n,"memory")),n}async function Oc(r,e,t){try{let n=await ut.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=pe.join(r,s.name),i=pe.join(e,s.name);await ut.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Kp(r,e,t){switch(e){case"state":kb(r,t);break;case"queue":Sb(r,t);break;case"ideas":bb(r,t);break;case"shipped":vb(r,t);break;case"metrics":Pb(r,t);break;case"analysis":Cb(r,t);break}}function kb(r,e){let t=A.getDb(r),n=t.prepare(`
475
475
  INSERT OR REPLACE INTO tasks
476
476
  (id, description, type, status, parent_description, branch, linear_id,
477
477
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -482,83 +482,83 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r
482
482
  (id, task_id, description, status, domain, agent, sort_order,
483
483
  depends_on, started_at, completed_at, output, summary)
484
484
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
485
- `),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 cb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
485
+ `),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 Sb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
486
486
  INSERT OR REPLACE INTO queue_tasks
487
487
  (id, description, type, priority, section, created_at, completed, completed_at,
488
488
  feature_id, feature_name)
489
489
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
490
- `);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 lb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
490
+ `);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 bb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
491
491
  INSERT OR REPLACE INTO ideas
492
492
  (id, text, status, priority, tags, added_at, converted_to, details, data)
493
493
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
494
- `);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 ub(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
494
+ `);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 vb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
495
495
  INSERT OR REPLACE INTO shipped_features
496
496
  (id, name, shipped_at, version, description, type, duration, data)
497
497
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
498
- `);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 db(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
498
+ `);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 Pb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
499
499
  INSERT OR REPLACE INTO metrics_daily
500
500
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
501
501
  VALUES (?, ?, ?, ?, ?)
502
- `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function pb(r,e){let n=A.getDb(r).prepare(`
502
+ `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Cb(r,e){let n=A.getDb(r).prepare(`
503
503
  INSERT OR REPLACE INTO analysis
504
504
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
505
505
  VALUES (?, ?, ?, ?, ?, ?, ?)
506
- `),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 Vp(r,e,t){e==="categories-cache"&&mb(r,t)}function mb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
506
+ `),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 Xp(r,e,t){e==="categories-cache"&&xb(r,t)}function xb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
507
507
  INSERT OR REPLACE INTO index_files
508
508
  (path, categories, domain, score, size, mtime, language)
509
509
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
510
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function gb(r,e,t){let n=de.join(e,"checksums.json"),s=await Vn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=A.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function fb(r,e,t){let n=de.join(e,"file-scores.json"),s=await Vn(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=A.getDb(r),a=i.prepare(`
510
+ `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Tb(r,e,t){let n=pe.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=A.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Eb(r,e,t){let n=pe.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=A.getDb(r),a=i.prepare(`
511
511
  INSERT OR REPLACE INTO index_files
512
512
  (path, score, size, mtime, language, categories, domain)
513
513
  VALUES (?, ?, ?, ?, NULL,
514
514
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
515
515
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
516
- `);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 hb(r,e,t){let n=de.join(e,"events.jsonl");try{let o=(await it.readFile(n,"utf-8")).split(`
517
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function yb(r,e,t){let n=de.join(e,"learnings.jsonl");try{let o=(await it.readFile(n,"utf-8")).split(`
518
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function wb(r,e,t,n){let s=l(async(i,a)=>{try{await it.unlink(i)}catch(c){C(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Dc)await s(de.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(de.join(e,i),`cleanup:index/${i}`);await s(de.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(de.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Vn(r){try{let e=await it.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function Xo(r){let e=x.getGlobalProjectPath(r),t=de.join(e,"storage"),n=0;A.getDb(r);for(let{filename:u,key:d}of Dc){let m=de.join(t,u),p=await Vn(m);if(p!==null){A.setDoc(r,d,p),Wp(r,d,p);try{await it.unlink(m)}catch{}n++}}let s=de.join(e,"project.json"),o=await Vn(s);if(o!==null){A.setDoc(r,"project",o);try{await it.unlink(s)}catch{}n++}let i=de.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=de.join(i,u);try{let p=(await it.readFile(d,"utf-8")).split(`
519
- `).filter(f=>f.trim());if(p.length===0){await it.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,k,S.timestamp??S.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k),I=`learning:${S.taskId??S.timestamp??Date.now()}`,j=S.tags;f.run(I,j?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await it.unlink(d),n++}catch{}}let a=de.join(e,"index"),c=[...jc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=de.join(a,u),m=await Vn(d);if(m===null)continue;let p=jc.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Vp(r,p.key,m));try{await it.unlink(d)}catch{}n++}return n}var Dc,jc,Yo=w(()=>{"use strict";ke();F();ee();Dc=[{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"}],jc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Tr,"migrateJsonToSqlite");l(ib,"createBackup");l(Rc,"copyFiles");l(Wp,"populateNormalized");l(ab,"populateTasksFromState");l(cb,"populateQueueTasks");l(lb,"populateIdeas");l(ub,"populateShippedFeatures");l(db,"populateMetricsDaily");l(pb,"populateAnalysis");l(Vp,"populateIndexTables");l(mb,"populateCategoriesIndex");l(gb,"migrateChecksums");l(fb,"migrateFileScores");l(hb,"migrateEventsJsonl");l(yb,"migrateLearningsJsonl");l(wb,"cleanupJsonFiles");l(Vn,"readJsonSafe");l(Xo,"sweepLegacyJson")});var $c,fe,Ps=w(()=>{"use strict";jt();uo();se();vn();Kt();$c=class extends Le{static{l(this,"QueueStorage")}constructor(){super("queue.json",zd)}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:me(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:me(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=mn(qt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},fe=new $c});var Mc,dt,Er=w(()=>{"use strict";jt();Ra();se();vn();Kt();Mc=class extends Le{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Fd)}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:me(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=mn(qt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},dt=new Mc});var Ar,Oc,Bn,Fc=w(()=>{"use strict";Ar={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"}},Oc=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=Ar[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 Ar[e]}getPrompt(e){return Ar[e].prompt}getValidCommands(e){return Ar[e].transitions}formatNextSteps(e){return Ar[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}`}})}},Bn=new Oc});var _c,_,xs=w(()=>{"use strict";jt();uo();se();Fc();vn();Kt();_c=class extends Le{static{l(this,"StateStorage")}constructor(){super("state.json",Hd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Bn.getCurrentState(e),s=Bn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:me()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){return e.pausedTasks||[]}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[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Ld.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
516
+ `);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 Ab(r,e,t){let n=pe.join(e,"events.jsonl");try{let o=(await ut.readFile(n,"utf-8")).split(`
517
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Rb(r,e,t){let n=pe.join(e,"learnings.jsonl");try{let o=(await ut.readFile(n,"utf-8")).split(`
518
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Ib(r,e,t,n){let s=l(async(i,a)=>{try{await ut.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of _c)await s(pe.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(pe.join(e,i),`cleanup:index/${i}`);await s(pe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(pe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Bn(r){try{let e=await ut.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function ti(r){let e=x.getGlobalProjectPath(r),t=pe.join(e,"storage"),n=0;A.getDb(r);for(let{filename:u,key:d}of _c){let m=pe.join(t,u),p=await Bn(m);if(p!==null){A.setDoc(r,d,p),Kp(r,d,p);try{await ut.unlink(m)}catch{}n++}}let s=pe.join(e,"project.json"),o=await Bn(s);if(o!==null){A.setDoc(r,"project",o);try{await ut.unlink(s)}catch{}n++}let i=pe.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=pe.join(i,u);try{let p=(await ut.readFile(d,"utf-8")).split(`
519
+ `).filter(f=>f.trim());if(p.length===0){await ut.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,k,S.timestamp??S.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k),I=`learning:${S.taskId??S.timestamp??Date.now()}`,R=S.tags;f.run(I,R?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await ut.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...Fc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.join(a,u),m=await Bn(d);if(m===null)continue;let p=Fc.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Xp(r,p.key,m));try{await ut.unlink(d)}catch{}n++}return n}var _c,Fc,ni=w(()=>{"use strict";ke();F();ee();_c=[{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"}],Fc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Ar,"migrateJsonToSqlite");l(wb,"createBackup");l(Oc,"copyFiles");l(Kp,"populateNormalized");l(kb,"populateTasksFromState");l(Sb,"populateQueueTasks");l(bb,"populateIdeas");l(vb,"populateShippedFeatures");l(Pb,"populateMetricsDaily");l(Cb,"populateAnalysis");l(Xp,"populateIndexTables");l(xb,"populateCategoriesIndex");l(Tb,"migrateChecksums");l(Eb,"migrateFileScores");l(Ab,"migrateEventsJsonl");l(Rb,"migrateLearningsJsonl");l(Ib,"cleanupJsonFiles");l(Bn,"readJsonSafe");l(ti,"sweepLegacyJson")});var Nc,he,Ts=w(()=>{"use strict";$t();ho();se();xn();Yt();Nc=class extends He{static{l(this,"QueueStorage")}constructor(){super("queue.json",qd)}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:ge(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:ge(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=yn(Xt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},he=new Nc});var Lc,gt,Rr=w(()=>{"use strict";$t();Fa();se();xn();Yt();Lc=class extends He{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Hd)}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:ge(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=yn(Xt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},gt=new Lc});var Ir,Uc,Jn,Hc=w(()=>{"use strict";Ir={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"}},Uc=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=Ir[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 Ir[e]}getPrompt(e){return Ir[e].prompt}getValidCommands(e){return Ir[e].transitions}formatNextSteps(e){return Ir[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}`}})}},Jn=new Uc});var Gc,_,Es=w(()=>{"use strict";$t();ho();se();Hc();xn();Yt();Gc=class extends He{static{l(this,"StateStorage")}constructor(){super("state.json",Bd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Jn.getCurrentState(e),s=Jn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:ge()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){return e.pausedTasks||[]}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[];bt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Wd.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
520
520
  ${f.join(`
521
- `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new _c});var Bp=w(()=>{"use strict";Tc();F()});var Nc,Lc,Uc=w(()=>{"use strict";ps();Kt();Nc=class extends Le{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Vd,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}},Lc=new Nc});var Hc,at,Gc=w(()=>{"use strict";ee();Hc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();L.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
522
- VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let s=L.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!s)throw new Error(`Failed to create workflow: ${t.name}`);return s.id}getWorkflow(e,t){let n=L.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return L.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),L.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return L.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},at=new Hc});function zc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Wc,Pe,Ir=w(()=>{"use strict";Gc();ee();l(zc,"rowToRule");Wc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=A.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(n?.m??-1)+1;return A.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
523
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),A.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,n){if(!A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(n)){let d=o[c];d&&(i.push(`${d.column} = ?`),a.push(d.transform?d.transform(u):u))}return i.length===0||(a.push(t),A.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=A.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?zc(n):null}getRulesForCommand(e,t){let n=at.getWorkflow(e,t);return!n||!n.enabled?[]:A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(zc)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(zc)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Pe=new Wc});var Xt=w(()=>{"use strict";Pr();vn();ee();xr();br();Ko();Yo();Ps();Er();xs();Bp();Kt();Uc();Ir()});function kb(){return`\u26A1 prjct
521
+ `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new Gc});var Yp=w(()=>{"use strict";Dc();F()});var zc,Wc,Vc=w(()=>{"use strict";ms();Yt();zc=class extends He{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Xd,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}},Wc=new zc});var Bc,Ye,Jc=w(()=>{"use strict";ee();Bc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();U.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
522
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let s=U.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!s)throw new Error(`Failed to create workflow: ${t.name}`);return s.id}getWorkflow(e,t){let n=U.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return U.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),U.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return U.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Ye=new Bc});function qc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Kc,Pe,Dr=w(()=>{"use strict";Jc();ee();l(qc,"rowToRule");Kc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=A.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(n?.m??-1)+1;return A.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
523
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),A.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,n){if(!A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(n)){let d=o[c];d&&(i.push(`${d.column} = ?`),a.push(d.transform?d.transform(u):u))}return i.length===0||(a.push(t),A.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=A.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?qc(n):null}getRulesForCommand(e,t){let n=Ye.getWorkflow(e,t);return!n||!n.enabled?[]:A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(qc)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(qc)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Pe=new Kc});var Qt=w(()=>{"use strict";Tr();xn();ee();Er();Pr();ei();ni();Ts();Rr();Es();Yp();Yt();Vc();Dr()});function Db(){return`\u26A1 prjct
524
524
 
525
- ---`}function Sb(){return`---
526
- \u26A1 prjct \xB7 v${Fa()}`}function N(...r){return bb(kb(),...r.filter(Boolean),Sb())}function Vc(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
527
- `)}function Jp(r,e=""){return`\`\`\`${e}
525
+ ---`}function jb(){return`---
526
+ \u26A1 prjct \xB7 v${Ga()}`}function N(...r){return $b(Db(),...r.filter(Boolean),jb())}function Xc(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
527
+ `)}function Qp(r,e=""){return`\`\`\`${e}
528
528
  ${r}
529
- \`\`\``}function Z(r,e,t=3){return`### ${r}
530
- ${e}`}function xe(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
531
- `)}function Bc(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
532
- > ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function qp(r,e){let t=["#","Status","Description"],n=r.map((s,o)=>{let i=String(o+1),a;s.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${s.description}${c}`]});return`### Subtasks
533
- ${Vc(t,n)}`}function Kp(r){return r.length===0?"":`### Relevant Files
529
+ \`\`\``}function Y(r,e,t=3){return`### ${r}
530
+ ${e}`}function Ce(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
531
+ `)}function Yc(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
532
+ > ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Zp(r,e){let t=["#","Status","Description"],n=r.map((s,o)=>{let i=String(o+1),a;s.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${s.description}${c}`]});return`### Subtasks
533
+ ${Xc(t,n)}`}function em(r){return r.length===0?"":`### Relevant Files
534
534
  ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
535
- `)}`}function Xp(r){return`### Rules
536
- ${xe(r)}`}function ce(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
537
- ${Vc(e,t)}`}function pt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Vc(t,n)}function he(r,e){return e?`## \u2705 ${r}
538
- > ${e}`:`## \u2705 ${r}`}function Yp(r){return`> \u26A0\uFE0F **${r}**`}function bb(...r){return r.filter(Boolean).join(`
539
-
540
- `)}function Ct(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Ts=w(()=>{"use strict";$t();l(kb,"mdHeader");l(Sb,"mdFooter");l(N,"mdOutput");l(Vc,"mdTable");l(Jp,"mdCodeBlock");l(Z,"mdSection");l(xe,"mdList");l(Bc,"mdTaskHeader");l(qp,"mdSubtasks");l(Kp,"mdRelevantFiles");l(Xp,"mdRules");l(ce,"mdNextSteps");l(pt,"mdStats");l(he,"mdDone");l(Yp,"mdWarn");l(bb,"mdJoin");l(Ct,"mdActionRequired")});import Rr from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Zp[r]||"idle",n=Bn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Qp[o]||o}));console.log(Rr.dim(`
541
- Next:`));for(let o of s){let i=Rr.cyan(o.cmd.padEnd(12));console.log(Rr.dim(` ${i} \u2192 ${o.desc}`))}}function Qo(r){let e=Zp[r]||"idle";return Bn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Qp[n]||n}))}function jr(r){let e=Bn.getStateInfo(r);console.log(Rr.dim(`\u{1F4CD} State: ${Rr.white(r.toUpperCase())} - ${e.description}`))}var Qp,Zp,Es=w(()=>{"use strict";Fc();Qp={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"},Zp={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(bt,"showNextSteps");l(Qo,"getNextSteps");l(jr,"showStateInfo")});import et from"node:path";async function vb(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 R(et.join(r,"pnpm-lock.yaml"))?"pnpm":await R(et.join(r,"yarn.lock"))?"yarn":await R(et.join(r,"bun.lockb"))||await R(et.join(r,"bun.lock"))?"bun":(await R(et.join(r,"package-lock.json")),"npm")}function em(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function Cb(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function As(r,e){for(let s of Pb)if(await R(et.join(r,s)))return s;let n=(e??await sn(r)).find(s=>s.endsWith(xb));if(n)return n}async function an(r){for(let e of Tb)if(await R(et.join(r,e)))return e}async function Zo(r){let e=et.join(r,"package.json"),t=await zt(e,null);if(t){let a=await vb(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:em(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:em(a,"typecheck")}),c.test&&(u.test={tool:a,command:Cb(a)}),u.versionFile=await As(r),u.changelogFile=await an(r),u}if(await R(et.join(r,"pytest.ini"))){let a=await As(r),c=await an(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await Ye(et.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await As(r),c=await an(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await R(et.join(r,"Cargo.toml"))){let a=await an(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await R(et.join(r,"go.mod"))){let a=await As(r),c=await an(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let s=await sn(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await As(r,s),c=await an(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await R(et.join(r,"pom.xml"))){let a=await an(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await R(et.join(r,"gradlew"))&&(await R(et.join(r,"build.gradle"))||await R(et.join(r,"build.gradle.kts")))){let a=await an(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await As(r),i=await an(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var Pb,xb,Tb,Jc=w(()=>{"use strict";De();l(vb,"detectPackageManager");l(em,"pmRun");l(Cb,"pmTest");Pb=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],xb=".csproj",Tb=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(As,"detectVersionFile");l(an,"detectChangelogFile");l(Zo,"detectProjectCommands")});import*as ne from"@clack/prompts";import Jn from"chalk";var ei,tm,Is,nm=w(()=>{"use strict";zn();ei=[{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."}],tm=[{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"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],Is=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){ne.intro(Jn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ne.outro(Jn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["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=ei.findIndex(n=>n.value===this.detectedType),t=await ne.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ei.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?ei[e].value:void 0});return ne.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ne.multiselect({message:"Which AI agents do you use?",options:tm.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ne.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);ne.note(e,"Detected stack");let t=await ne.confirm({message:"Is this stack correct?",initialValue:!0});if(ne.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ne.group({language:l(()=>ne.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ne.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await ne.group({verbosity:l(()=>ne.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>ne.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Jn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Jn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Jn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Jn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Jn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
542
- `);ne.note(e,"Configuration Summary");let t=await ne.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ne.isCancel(t)||!t?(ne.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),s.push("codex")}catch{try{await e.access(t.join(n.homedir(),".codex")),s.push("codex")}catch{}}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,ne.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ei.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return tm.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 qc from"node:path";var Eb,Ab,ti,Ib,mt,qn=w(()=>{"use strict";ke();jt();De();Eb="outcomes",Ab="outcomes.jsonl",ti=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return qc.join(t,Eb)}getOutcomesPath(e){return qc.join(this.getOutcomesDir(e),Ab)}async record(e,t){let n={...t,id:me()},s=this.getOutcomesPath(e);return await Rt(qc.dirname(s)),await la(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await R(t))return[];let n=await Ye(t);return n.trim()?n.trim().split(`
543
- `).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}},Ib=new ti,mt=Ib});var ni,Rb,Kc,sm=w(()=>{"use strict";qn();ni=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await mt.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 mt.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 mt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,S)=>k+S.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let S=this.parseVariance(k.variance),I=this.parseDuration(k.estimatedDuration);return I===0?!1:Math.abs(S)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(S=>S.completedAsPlanned))for(let S of k.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((k,S)=>S[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await mt.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 mt.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}},Rb=new ni,Kc=Rb});var Dr,si,Xc,Yc=w(()=>{"use strict";ls();se();Dr=3,si=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>=Dr){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}/${Dr} 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>=Dr){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}/${Dr} 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>=Dr&&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:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
544
- `)}},Xc=new si});var ri,rm,Qc=w(()=>{"use strict";Aa();Kt();se();ri=class extends Le{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Td,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:co([t,...n.outcomes]),lastUpdated:b()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?co(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:co(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=Ed(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Ad(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:Id(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}},rm=new ri});var Zc=w(()=>{"use strict";nm();sm();Yc();qn();Qc()});import Yt from"chalk";function jb(r){return om[r.toLowerCase()]||om.default}var om,el,oi,im=w(()=>{"use strict";om={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(jb,"getIcon");el=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Yt.cyan(`
535
+ `)}`}function tm(r){return`### Rules
536
+ ${Ce(r)}`}function ie(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
537
+ ${Xc(e,t)}`}function ft(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Xc(t,n)}function fe(r,e){return e?`## \u2705 ${r}
538
+ > ${e}`:`## \u2705 ${r}`}function nm(r){return`> \u26A0\uFE0F **${r}**`}function $b(...r){return r.filter(Boolean).join(`
539
+
540
+ `)}function Et(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var As=w(()=>{"use strict";Ot();l(Db,"mdHeader");l(jb,"mdFooter");l(N,"mdOutput");l(Xc,"mdTable");l(Qp,"mdCodeBlock");l(Y,"mdSection");l(Ce,"mdList");l(Yc,"mdTaskHeader");l(Zp,"mdSubtasks");l(em,"mdRelevantFiles");l(tm,"mdRules");l(ie,"mdNextSteps");l(ft,"mdStats");l(fe,"mdDone");l(nm,"mdWarn");l($b,"mdJoin");l(Et,"mdActionRequired")});import jr from"chalk";function Pt(r,e={}){if(e.quiet)return;let t=rm[r]||"idle",n=Jn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:sm[o]||o}));console.log(jr.dim(`
541
+ Next:`));for(let o of s){let i=jr.cyan(o.cmd.padEnd(12));console.log(jr.dim(` ${i} \u2192 ${o.desc}`))}}function si(r){let e=rm[r]||"idle";return Jn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:sm[n]||n}))}function $r(r){let e=Jn.getStateInfo(r);console.log(jr.dim(`\u{1F4CD} State: ${jr.white(r.toUpperCase())} - ${e.description}`))}var sm,rm,Rs=w(()=>{"use strict";Hc();sm={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"},rm={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(Pt,"showNextSteps");l(si,"getNextSteps");l($r,"showStateInfo")});import rt from"node:path";async function Mb(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await D(rt.join(r,"pnpm-lock.yaml"))?"pnpm":await D(rt.join(r,"yarn.lock"))?"yarn":await D(rt.join(r,"bun.lockb"))||await D(rt.join(r,"bun.lock"))?"bun":(await D(rt.join(r,"package-lock.json")),"npm")}function om(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function Ob(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Is(r,e){for(let s of Fb)if(await D(rt.join(r,s)))return s;let n=(e??await rn(r)).find(s=>s.endsWith(_b));if(n)return n}async function ln(r){for(let e of Nb)if(await D(rt.join(r,e)))return e}async function ri(r){let e=rt.join(r,"package.json"),t=await Vt(e,null);if(t){let a=await Mb(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:om(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:om(a,"typecheck")}),c.test&&(u.test={tool:a,command:Ob(a)}),u.versionFile=await Is(r),u.changelogFile=await ln(r),u}if(await D(rt.join(r,"pytest.ini"))){let a=await Is(r),c=await ln(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await tt(rt.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await Is(r),c=await ln(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await D(rt.join(r,"Cargo.toml"))){let a=await ln(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await D(rt.join(r,"go.mod"))){let a=await Is(r),c=await ln(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let s=await rn(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Is(r,s),c=await ln(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await D(rt.join(r,"pom.xml"))){let a=await ln(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await D(rt.join(r,"gradlew"))&&(await D(rt.join(r,"build.gradle"))||await D(rt.join(r,"build.gradle.kts")))){let a=await ln(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Is(r),i=await ln(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var Fb,_b,Nb,Qc=w(()=>{"use strict";Me();l(Mb,"detectPackageManager");l(om,"pmRun");l(Ob,"pmTest");Fb=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],_b=".csproj",Nb=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Is,"detectVersionFile");l(ln,"detectChangelogFile");l(ri,"detectProjectCommands")});import*as ne from"@clack/prompts";import qn from"chalk";var oi,im,Ds,am=w(()=>{"use strict";Wn();oi=[{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."}],im=[{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"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],Ds=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){ne.intro(qn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ne.outro(qn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["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=oi.findIndex(n=>n.value===this.detectedType),t=await ne.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:oi.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?oi[e].value:void 0});return ne.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ne.multiselect({message:"Which AI agents do you use?",options:im.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ne.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);ne.note(e,"Detected stack");let t=await ne.confirm({message:"Is this stack correct?",initialValue:!0});if(ne.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ne.group({language:l(()=>ne.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ne.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await ne.group({verbosity:l(()=>ne.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>ne.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${qn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${qn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${qn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${qn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${qn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
542
+ `);ne.note(e,"Configuration Summary");let t=await ne.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ne.isCancel(t)||!t?(ne.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),s.push("codex")}catch{try{await e.access(t.join(n.homedir(),".codex")),s.push("codex")}catch{}}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,ne.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return oi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return im.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 Zc from"node:path";var Lb,Ub,ii,Hb,ht,Kn=w(()=>{"use strict";ke();$t();Me();Lb="outcomes",Ub="outcomes.jsonl",ii=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return Zc.join(t,Lb)}getOutcomesPath(e){return Zc.join(this.getOutcomesDir(e),Ub)}async record(e,t){let n={...t,id:ge()},s=this.getOutcomesPath(e);return await jt(Zc.dirname(s)),await fa(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await D(t))return[];let n=await tt(t);return n.trim()?n.trim().split(`
543
+ `).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}},Hb=new ii,ht=Hb});var ai,Gb,el,cm=w(()=>{"use strict";Kn();ai=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await ht.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 ht.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 ht.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,S)=>k+S.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let S=this.parseVariance(k.variance),I=this.parseDuration(k.estimatedDuration);return I===0?!1:Math.abs(S)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(S=>S.completedAsPlanned))for(let S of k.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((k,S)=>S[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await ht.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 ht.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}},Gb=new ai,el=Gb});var Mr,ci,tl,nl=w(()=>{"use strict";us();se();Mr=3,ci=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>=Mr){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}/${Mr} 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>=Mr){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}/${Mr} 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>=Mr&&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:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
544
+ `)}},tl=new ci});var li,lm,sl=w(()=>{"use strict";Ma();Yt();se();li=class extends He{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Dd,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:go([t,...n.outcomes]),lastUpdated:b()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?go(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:go(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=jd(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=$d(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:Md(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}},lm=new li});var rl=w(()=>{"use strict";am();cm();nl();Kn();sl()});import Zt from"chalk";function zb(r){return um[r.toLowerCase()]||um.default}var um,ol,ui,dm=w(()=>{"use strict";um={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(zb,"getIcon");ol=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Zt.cyan(`
545
545
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
546
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=jb(t);console.log(Yt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Yt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Yt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Yt.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?Yt.green("\u2713"):Yt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Yt.dim(`(${n})`)}
547
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Yt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Yt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},oi=new el});import qe from"chalk";function Db(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%am.length;return am[t]}function $b(r,e,t="\u25B6"){let n=qe.dim(String(r+1).padStart(2)),o=Db(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=qe.green("\u2713 Complete");break;case"in_progress":a=qe.yellow(`${t} Working...`);break;case"pending":a=qe.gray("\u25CB Pending");break;case"failed":a=qe.red("\u2717 Failed");break;case"blocked":a=qe.gray("\u2298 Blocked");break;default:a=qe.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function Mb(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${qe.bold.white("SUBTASK PROGRESS")}`),e.push(` ${qe.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push($b(t,r[t]));return e.push(""),e.join(`
548
- `)}function cm(r){console.log(Mb(r))}var am,lm=w(()=>{"use strict";am=[qe.cyan,qe.magenta,qe.yellow,qe.blue,qe.green,qe.redBright,qe.magentaBright,qe.cyanBright];l(Db,"getDomainColor");l($b,"formatSubtaskLine");l(Mb,"renderSubtaskProgress");l(cm,"printSubtaskProgress")});function Ob(r){return um.includes(r)}async function Fb(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 _b(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(`
549
- `)}var um,Nb,ii,dm=w(()=>{"use strict";um=["ship","feature","spec","cleanup","migrate"];l(Ob,"requiresReasoning");l(Fb,"reason");l(_b,"formatPlan");Nb={requiresReasoning:Ob,reason:Fb,formatPlan:_b,REASONING_REQUIRED_COMMANDS:um},ii=Nb});import $r from"node:fs/promises";var tl,Lb,gt,nl=w(()=>{"use strict";wt();ke();F();qo();tl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new _t({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=x.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:x.getFilePath(n,"core","now.md"),next:x.getFilePath(n,"core","next.md"),context:x.getFilePath(n,"core","context.md"),shipped:x.getFilePath(n,"progress","shipped.md"),metrics:x.getFilePath(n,"progress","metrics.md"),ideas:x.getFilePath(n,"planning","ideas.md"),roadmap:x.getFilePath(n,"planning","roadmap.md"),specs:x.getFilePath(n,"planning","specs"),memory:x.getFilePath(n,"memory","context.jsonl"),patterns:x.getFilePath(n,"memory","patterns.json"),analysis:x.getFilePath(n,"analysis","repo-summary.md"),codePatterns:x.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 $r.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([$r.readFile(d,"utf-8"),$r.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 $r.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 $r.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Lb=new tl,gt=Lb});import{exec as Ub}from"node:child_process";import Te from"node:fs/promises";import pm from"node:os";import xn from"node:path";import{promisify as Hb}from"node:util";function mm(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 sl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function zb(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
546
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=zb(t);console.log(Zt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Zt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Zt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Zt.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?Zt.green("\u2713"):Zt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Zt.dim(`(${n})`)}
547
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Zt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Zt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ui=new ol});import Qe from"chalk";function Wb(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%pm.length;return pm[t]}function Vb(r,e,t="\u25B6"){let n=Qe.dim(String(r+1).padStart(2)),o=Wb(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=Qe.green("\u2713 Complete");break;case"in_progress":a=Qe.yellow(`${t} Working...`);break;case"pending":a=Qe.gray("\u25CB Pending");break;case"failed":a=Qe.red("\u2717 Failed");break;case"blocked":a=Qe.gray("\u2298 Blocked");break;default:a=Qe.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function Bb(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Qe.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Qe.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Vb(t,r[t]));return e.push(""),e.join(`
548
+ `)}function mm(r){console.log(Bb(r))}var pm,gm=w(()=>{"use strict";pm=[Qe.cyan,Qe.magenta,Qe.yellow,Qe.blue,Qe.green,Qe.redBright,Qe.magentaBright,Qe.cyanBright];l(Wb,"getDomainColor");l(Vb,"formatSubtaskLine");l(Bb,"renderSubtaskProgress");l(mm,"printSubtaskProgress")});function Jb(r){return fm.includes(r)}async function qb(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 Kb(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(`
549
+ `)}var fm,Xb,di,hm=w(()=>{"use strict";fm=["ship","feature","spec","cleanup","migrate"];l(Jb,"requiresReasoning");l(qb,"reason");l(Kb,"formatPlan");Xb={requiresReasoning:Jb,reason:qb,formatPlan:Kb,REASONING_REQUIRED_COMMANDS:fm},di=Xb});import Or from"node:fs/promises";var il,Yb,yt,al=w(()=>{"use strict";Tt();ke();F();Zo();il=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Lt({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=x.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:x.getFilePath(n,"core","now.md"),next:x.getFilePath(n,"core","next.md"),context:x.getFilePath(n,"core","context.md"),shipped:x.getFilePath(n,"progress","shipped.md"),metrics:x.getFilePath(n,"progress","metrics.md"),ideas:x.getFilePath(n,"planning","ideas.md"),roadmap:x.getFilePath(n,"planning","roadmap.md"),specs:x.getFilePath(n,"planning","specs"),memory:x.getFilePath(n,"memory","context.jsonl"),patterns:x.getFilePath(n,"memory","patterns.json"),analysis:x.getFilePath(n,"analysis","repo-summary.md"),codePatterns:x.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 Or.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Or.readFile(d,"utf-8"),Or.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await Or.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await Or.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Yb=new il,yt=Yb});import{exec as Qb}from"node:child_process";import Ee from"node:fs/promises";import ym from"node:os";import An from"node:path";import{promisify as Zb}from"node:util";function wm(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 cl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tv(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
550
550
  `;return r.warnings.forEach(t=>{e+=` - ${t}
551
551
  `}),r.recommendations.length>0&&(e+=`
552
552
  Recommendations:
553
553
  `,r.recommendations.forEach(t=>{e+=` -> ${t}
554
- `})),e}async function gm(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Te.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=mm(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 Te.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 Te.access(xn.dirname(i),Te.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 fm(r){let e=[],t=[],n={};try{let{stdout:i}=await Gb("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
555
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=xn.join(r.projectPath,"package.json");try{let i=await Te.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 Te.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}.*${sl(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 Te.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 hm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Te.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 Te.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(sl(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 Te.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 ym(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Te.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 Te.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 wm(r){let e=[],t=[],n={},s=xn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Te.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=xn.join(pm.homedir(),".prjct-cli");try{await Te.access(o,Te.constants.W_OK),n.globalPathWritable=!0}catch(i){if(C(i))try{await Te.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 km(r){let e=[],t=[],n={},s=xn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Te.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=xn.join(pm.homedir(),".prjct-cli/projects",o||"");try{await Te.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 Sm(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 Te.access(xn.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 Te.stat(xn.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 bm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Te.access(s),n.specsExists=!0;let i=await Te.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 Cm(r,e,t){let n=vm[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 Wb(r,e,t){let n=await Cm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Vb(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var Gb,vm,Bb,ai,Pm=w(()=>{"use strict";F();Gb=Hb(Ub);l(mm,"formatDuration");l(sl,"escapeRegex");l(zb,"formatWarnings");l(gm,"verifyDone");l(fm,"verifyShip");l(hm,"verifyFeature");l(ym,"verifyNow");l(wm,"verifyInit");l(km,"verifySync");l(Sm,"verifyAnalyze");l(bm,"verifySpec");vm={done:gm,ship:fm,feature:hm,now:ym,init:wm,sync:km,analyze:Sm,spec:bm};l(Cm,"verify");l(Wb,"prepareCommand");l(Vb,"requiresVerification");Bb={verify:Cm,prepareCommand:Wb,requiresVerification:Vb,verifiers:vm,formatWarnings:zb,formatDuration:mm,escapeRegex:sl,verifyDone:gm,verifyShip:fm,verifyFeature:hm,verifyNow:ym,verifyInit:wm,verifySync:km,verifyAnalyze:Sm,verifySpec:bm},ai=Bb});function qb(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 Kb(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of Jb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:qb(t)};return{detected:!1}}function Xb(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 Yb(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 Qb(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 Zb(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 Jb,rl,ev,Rs,xm=w(()=>{"use strict";Jb=[{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(qb,"getHallucinationSuggestion");l(Kb,"detectHallucination");l(Xb,"isSimilarError");l(Yb,"analyzeErrorPattern");l(Qb,"generateEscalationMessage");l(Zb,"generateSuggestion");rl=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=>Xb(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=Yb(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:Qb(e,o,this.maxAttempts),suggestion:Zb(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 Kb(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}}},ev=new rl,Rs=ev});function ol(r,e){let t=Mr(e),n=tv[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 nv(r,e){let t=Mr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function sv(r,e,t){let n=Mr(t),s=ol(r,t),o=ol(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function ci(r,e=yn){let t=Mr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=rv(r,e),s=ov(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=cv(o),a=iv(o),c=av(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=lv(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Em(r,e,t=yn){let n=Mr(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 rv(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=sv(i,s,e);if(!t.has(a)){let c=ol(i,e),u=nv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function ov(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+uv(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>al(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 iv(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 av(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=al(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function cv(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 lv(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=al(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 al(r){if(!r.variance)return 0;let e=il(r.estimatedDuration),t=il(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function il(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 Am(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(`
556
- `)}function uv(r){if(!r.estimatedDuration)return 0;let e=il(r.estimatedDuration);if(e<=0)return 0;let t=Tm[0],n=Number.POSITIVE_INFINITY;for(let s of Tm){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Mr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var tv,Tm,cl=w(()=>{"use strict";ps();tv={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(ol,"getSprintStart");l(nv,"getSprintEnd");l(sv,"getSprintNumber");l(ci,"calculateVelocity");l(Em,"projectCompletion");l(rv,"bucketBySprint");l(ov,"buildSprintVelocities");l(iv,"detectTrend");l(av,"calculateOverallAccuracy");l(cv,"calculateAverageVelocity");l(lv,"detectEstimationPatterns");l(al,"parseVariancePercent");l(il,"parseDurationMinutes");l(Am,"formatVelocityContext");Tm=[{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(uv,"derivePoints");l(Mr,"resolveConfig")});import{exec as dv}from"node:child_process";import pv from"node:fs/promises";import li from"node:path";import{promisify as mv}from"node:util";async function ui(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=wv(r),c=await kv(e),u=await Sv(e),d=[];for(let p of c){if(!i&&vv(p))continue;let g=bv(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 wv(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 kv(r){let e=[];async function t(n,s=""){try{let o=await pv.readdir(n,{withFileTypes:!0});for(let i of o){let a=li.join(n,i.name),c=li.join(s,i.name);if(i.isDirectory()){if(yv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=li.extname(i.name).toLowerCase();hv.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(r),e}async function Sv(r){let e=new Map;try{let{stdout:t}=await gv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
554
+ `})),e}async function km(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Ee.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=wm(n.durationMs))}}catch(a){if(P(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await Ee.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(P(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await Ee.access(An.dirname(i),Ee.constants.W_OK),n.metricsWritable=!0}catch(a){if(P(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Sm(r){let e=[],t=[],n={};try{let{stdout:i}=await ev("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
555
+ `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=An.join(r.projectPath,"package.json");try{let i=await Ee.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ee.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}.*${cl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ee.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function bm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ee.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ee.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(cl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ee.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function vm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ee.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ee.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Pm(r){let e=[],t=[],n={},s=An.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ee.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=An.join(ym.homedir(),".prjct-cli");try{await Ee.access(o,Ee.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Ee.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 Cm(r){let e=[],t=[],n={},s=An.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ee.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=An.join(ym.homedir(),".prjct-cli/projects",o||"");try{await Ee.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function xm(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 Ee.access(An.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ee.stat(An.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Tm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ee.access(s),n.specsExists=!0;let i=await Ee.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Am(r,e,t){let n=Em[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 nv(r,e,t){let n=await Am(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function sv(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var ev,Em,rv,pi,Rm=w(()=>{"use strict";F();ev=Zb(Qb);l(wm,"formatDuration");l(cl,"escapeRegex");l(tv,"formatWarnings");l(km,"verifyDone");l(Sm,"verifyShip");l(bm,"verifyFeature");l(vm,"verifyNow");l(Pm,"verifyInit");l(Cm,"verifySync");l(xm,"verifyAnalyze");l(Tm,"verifySpec");Em={done:km,ship:Sm,feature:bm,now:vm,init:Pm,sync:Cm,analyze:xm,spec:Tm};l(Am,"verify");l(nv,"prepareCommand");l(sv,"requiresVerification");rv={verify:Am,prepareCommand:nv,requiresVerification:sv,verifiers:Em,formatWarnings:tv,formatDuration:wm,escapeRegex:cl,verifyDone:km,verifyShip:Sm,verifyFeature:bm,verifyNow:vm,verifyInit:Pm,verifySync:Cm,verifyAnalyze:xm,verifySpec:Tm},pi=rv});function iv(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 av(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of ov)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:iv(t)};return{detected:!1}}function cv(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 lv(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 uv(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 dv(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 ov,ll,pv,js,Im=w(()=>{"use strict";ov=[{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(iv,"getHallucinationSuggestion");l(av,"detectHallucination");l(cv,"isSimilarError");l(lv,"analyzeErrorPattern");l(uv,"generateEscalationMessage");l(dv,"generateSuggestion");ll=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=>cv(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=lv(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:uv(e,o,this.maxAttempts),suggestion:dv(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 av(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}}},pv=new ll,js=pv});function ul(r,e){let t=Fr(e),n=mv[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 gv(r,e){let t=Fr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function fv(r,e,t){let n=Fr(t),s=ul(r,t),o=ul(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function mi(r,e=bn){let t=Fr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=hv(r,e),s=yv(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=Sv(o),a=wv(o),c=kv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=bv(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function jm(r,e,t=bn){let n=Fr(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 hv(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=fv(i,s,e);if(!t.has(a)){let c=ul(i,e),u=gv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function yv(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+vv(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>pl(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 wv(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 kv(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=pl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function Sv(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 bv(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=pl(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 pl(r){if(!r.variance)return 0;let e=dl(r.estimatedDuration),t=dl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function dl(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 $m(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(`
556
+ `)}function vv(r){if(!r.estimatedDuration)return 0;let e=dl(r.estimatedDuration);if(e<=0)return 0;let t=Dm[0],n=Number.POSITIVE_INFINITY;for(let s of Dm){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Fr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var mv,Dm,ml=w(()=>{"use strict";ms();mv={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(ul,"getSprintStart");l(gv,"getSprintEnd");l(fv,"getSprintNumber");l(mi,"calculateVelocity");l(jm,"projectCompletion");l(hv,"bucketBySprint");l(yv,"buildSprintVelocities");l(wv,"detectTrend");l(kv,"calculateOverallAccuracy");l(Sv,"calculateAverageVelocity");l(bv,"detectEstimationPatterns");l(pl,"parseVariancePercent");l(dl,"parseDurationMinutes");l($m,"formatVelocityContext");Dm=[{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(vv,"derivePoints");l(Fr,"resolveConfig")});import{exec as Pv}from"node:child_process";import Cv from"node:fs/promises";import gi from"node:path";import{promisify as xv}from"node:util";async function fi(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Iv(r),c=await Dv(e),u=await jv(e),d=[];for(let p of c){if(!i&&Mv(p))continue;let g=$v(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 Iv(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 Dv(r){let e=[];async function t(n,s=""){try{let o=await Cv.readdir(n,{withFileTypes:!0});for(let i of o){let a=gi.join(n,i.name),c=gi.join(s,i.name);if(i.isDirectory()){if(Rv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=gi.extname(i.name).toLowerCase();Av.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(r),e}async function jv(r){let e=new Map;try{let{stdout:t}=await Tv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
557
557
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
558
558
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
559
559
  END { for (f in files) print files[f], lastmod[f], f }
560
560
  '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
561
- `).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 bv(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(fv))for(let k of f)if(c.includes(k)&&e.some(I=>f.includes(I)||I.includes(g)||g.includes(I))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=li.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 vv(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 gv,fv,hv,yv,ll=w(()=>{"use strict";F();gv=mv(dv),fv={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"]},hv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),yv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(ui,"findRelevantFiles");l(wv,"extractKeywords");l(kv,"getAllCodeFiles");l(Sv,"getGitRecency");l(bv,"scoreFile");l(vv,"isTestFile")});import{exec as Cv}from"node:child_process";import{promisify as Pv}from"node:util";async function Im(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 Ev(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Tv(r,t);return o=o.filter(c=>!Av(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 Tv(r,e){let{stdout:t}=await Or(`git log -${e} --pretty=format:"%ct" --name-only | awk '
561
+ `).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 $v(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(Ev))for(let k of f)if(c.includes(k)&&e.some(I=>f.includes(I)||I.includes(g)||g.includes(I))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=gi.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 Mv(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 Tv,Ev,Av,Rv,gl=w(()=>{"use strict";F();Tv=xv(Pv),Ev={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"]},Av=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Rv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(fi,"findRelevantFiles");l(Iv,"extractKeywords");l(Dv,"getAllCodeFiles");l(jv,"getGitRecency");l($v,"scoreFile");l(Mv,"isTestFile")});import{exec as Ov}from"node:child_process";import{promisify as Fv}from"node:util";async function Mm(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 Lv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Nv(r,t);return o=o.filter(c=>!Uv(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 Nv(r,e){let{stdout:t}=await _r(`git log -${e} --pretty=format:"%ct" --name-only | awk '
562
562
  /^[0-9]+$/ { timestamp=$1; next }
563
563
  NF {
564
564
  count[$0]++
@@ -568,8 +568,8 @@ Recommendations:
568
568
  for (f in count) print count[f], lastmod[f], f
569
569
  }
570
570
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
571
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),S=u/i,I=k*.6+S*.4,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 Ev(r){let{stdout:e}=await Or("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Or("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Or(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
572
- `).filter(Boolean),{stdout:i}=await Or(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
571
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),S=u/i,I=k*.6+S*.4,R;f<1?R="just now":f<24?R=`${f}h ago`:g<7?R=`${g}d ago`:g<30?R=`${Math.floor(g/7)}w ago`:R=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(I*100)/100,lastChanged:R,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function Lv(r){let{stdout:e}=await _r("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await _r("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await _r(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
572
+ `).filter(Boolean),{stdout:i}=await _r(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
573
573
  /^[0-9]+$/ { timestamp=$1; next }
574
574
  NF {
575
575
  count[$0]++
@@ -579,10 +579,10 @@ Recommendations:
579
579
  for (f in count) print count[f], lastmod[f], f
580
580
  }
581
581
  '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
582
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],S=u-f,I=Math.floor(S/86400),j=Math.floor(S/3600),q=Math.max(0,1-I/14),Fe=g/d,ct=q*.5+Fe*.5,Ve;j<1?Ve="just now":j<24?Ve=`${j}h ago`:Ve=`${I}d ago`,a.push({path:k,changes:g,heatScore:Math.round(ct*100)/100,lastChanged:Ve,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function Av(r){let e=r.split("/").pop()||"";for(let t of xv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Or,xv,Rm=w(()=>{"use strict";Or=Pv(Cv),xv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Im,"getRecentFiles");l(Tv,"getHotFilesFromCommits");l(Ev,"getBranchOnlyFiles");l(Av,"shouldIgnore")});function ul(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function jm(r,e){let t=Iv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function jv(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function $m(r,e){let t=ul(r),n=ul(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=jm(s,Rv),a=Dm.map(c=>({model:c,...jm(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:jv(i.total),byModel:a}}}function dl(r){let e=ul(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Dm.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Iv,Rv,Dm,Mm=w(()=>{"use strict";Iv={"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}},Rv="claude-sonnet-4.5";l(ul,"countTokens");Dm=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(jm,"calculateModelCost");l(jv,"formatCostSaved");l($m,"measureCompression");l(dl,"noCompression")});import Dv from"node:fs/promises";import pl from"node:path";async function _m(r,e=process.cwd()){let t=pl.isAbsolute(r)?r:pl.join(e,r),n;try{n=await Dv.readFile(t,"utf-8")}catch(u){if(C(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:dl("")};throw u}let s=pl.extname(r).toLowerCase(),o=$v[s]||"unknown",i=_v[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:dl(n)};let a=Nv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
583
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:$m(n,c)}}function Nv(r,e){let t=[],n=r.split(`
582
+ `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],S=u-f,I=Math.floor(S/86400),R=Math.floor(S/3600),G=Math.max(0,1-I/14),$e=g/d,dt=G*.5+$e*.5,qe;R<1?qe="just now":R<24?qe=`${R}h ago`:qe=`${I}d ago`,a.push({path:k,changes:g,heatScore:Math.round(dt*100)/100,lastChanged:qe,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function Uv(r){let e=r.split("/").pop()||"";for(let t of _v)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var _r,_v,Om=w(()=>{"use strict";_r=Fv(Ov),_v=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Mm,"getRecentFiles");l(Nv,"getHotFilesFromCommits");l(Lv,"getBranchOnlyFiles");l(Uv,"shouldIgnore")});function fl(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Fm(r,e){let t=Hv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function zv(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Nm(r,e){let t=fl(r),n=fl(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=Fm(s,Gv),a=_m.map(c=>({model:c,...Fm(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:zv(i.total),byModel:a}}}function hl(r){let e=fl(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:_m.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Hv,Gv,_m,Lm=w(()=>{"use strict";Hv={"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}},Gv="claude-sonnet-4.5";l(fl,"countTokens");_m=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Fm,"calculateModelCost");l(zv,"formatCostSaved");l(Nm,"measureCompression");l(hl,"noCompression")});import Wv from"node:fs/promises";import yl from"node:path";async function Gm(r,e=process.cwd()){let t=yl.isAbsolute(r)?r:yl.join(e,r),n;try{n=await Wv.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:hl("")};throw u}let s=yl.extname(r).toLowerCase(),o=Vv[s]||"unknown",i=Kv[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:hl(n)};let a=Xv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
583
+ `);return{file:r,language:o,signatures:a,fallback:!1,metrics:Nm(n,c)}}function Xv(r,e){let t=[],n=r.split(`
584
584
  `),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(`
585
- `).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:Lv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Lv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var $v,Om,Mv,Ov,Fv,Fm,_v,Nm=w(()=>{"use strict";F();Mm();$v={".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"},Om=[{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}],Mv=[{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}],Ov=[{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}],Fv=[{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}],Fm=[{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}],_v={typescript:Om,javascript:Om,python:Mv,go:Ov,rust:Fv,java:Fm,csharp:Fm,php:[],ruby:[],unknown:[]};l(_m,"extractSignatures");l(Nv,"extractFromContent");l(Lv,"cleanSignature")});import{createHash as Uv}from"node:crypto";import Hm from"node:fs/promises";import Gm from"node:path";function Lm(r){return Uv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Um(r){try{let e=Gm.join(r,"storage","classification-cache.json"),t=await Hm.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e)?Pa:(console.warn("[classifier] Failed to load cache:",y(e)),Pa)}}async function ml(r,e){try{let t=Gm.join(r,"storage","classification-cache.json");await Hm.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function Gv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>Hv?null:n.classification}function zv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function Wv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=zm(e),s=Ea("classification")||"",o=`Classify this software engineering task into a domain.
585
+ `).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:Yv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Yv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Vv,Um,Bv,Jv,qv,Hm,Kv,zm=w(()=>{"use strict";F();Lm();Vv={".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"},Um=[{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}],Bv=[{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}],Jv=[{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}],qv=[{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}],Hm=[{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}],Kv={typescript:Um,javascript:Um,python:Bv,go:Jv,rust:qv,java:Hm,csharp:Hm,php:[],ruby:[],unknown:[]};l(Gm,"extractSignatures");l(Xv,"extractFromContent");l(Yv,"cleanSignature")});import{createHash as Qv}from"node:crypto";import Bm from"node:fs/promises";import Jm from"node:path";function Wm(r){return Qv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Vm(r){try{let e=Jm.join(r,"storage","classification-cache.json"),t=await Bm.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?Ia:(console.warn("[classifier] Failed to load cache:",y(e)),Ia)}}async function wl(r,e){try{let t=Jm.join(r,"storage","classification-cache.json");await Bm.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function eP(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>Zv?null:n.classification}function tP(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function nP(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=qm(e),s=$a("classification")||"",o=`Classify this software engineering task into a domain.
586
586
 
587
587
  Task: "${r}"
588
588
 
@@ -590,19 +590,19 @@ Available domains in this project: ${n.join(", ")}
590
590
  Available agents: ${e.agents.join(", ")||"none"}
591
591
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
592
592
 
593
- ${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=hn.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 Bv(r,e){let t=zm(e),n=new Map;for(let[p,g]of Object.entries(Vv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return md;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=Jv(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 zm(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 Jv(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 Hv,Vv,gl,qv,Wm,Vm=w(()=>{"use strict";mr();ao();F();Hv=3600*1e3;l(Lm,"hashDescription");l(Um,"loadCache");l(ml,"saveCache");l(Gv,"lookupCache");l(zv,"lookupPatterns");l(Wv,"classifyWithLLM");Vv={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(Bv,"classifyWithHeuristic");l(zm,"buildAvailableDomains");l(Jv,"getFilePatterns");gl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Lm(e),i=await Um(n),a=Gv(i,o,t);if(a)return{classification:a,source:"cache"};let c=zv(i,o);if(c)return{classification:c,source:"history"};let u=await Wv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await ml(n,i),{classification:u,source:"llm"};let d=Bv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await ml(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=Lm(e),o=await Um(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await ml(n,o))}},qv=new gl,Wm=qv});import{exec as Kv}from"node:child_process";import Fr from"node:fs/promises";import Xv from"node:os";import Kn from"node:path";import{promisify as Yv}from"node:util";var Bm,Jm,fl,Qv,di,hl=w(()=>{"use strict";cl();wt();ke();ps();Xt();ll();Rm();Nm();F();qn();Vm();Jt();Bm=Yv(Kv),Jm=["database","backend","frontend","testing","devops"],fl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=x.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((ct,Ve)=>{if(ct.status==="fulfilled")return ct.value;g.push(p[Ve]),console.warn(`Context tool "${p[Ve]}" failed: ${y(ct.reason)}`)}),[k,S,I]=f,j={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},q=this.shouldFragment(a,t),Fe=null;return q&&e==="task"&&(Fe=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:q,subtasks:Fe,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:S??null,velocityContext:I??null,contextDegradation:j}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),ui(e,t,{maxFiles:10,minScore:.15}),Im(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await _m(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(`
594
- `);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([Bm("git branch --show-current",{cwd:e}),Bm("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
595
- `).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 Ue.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await mt.getAll(e);if(t.length===0)return null;let n=ci(t,yn);return n.sprints.length===0?null:Am(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Kn.join(e,"analysis","repo-analysis.json"),n=await Fr.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=x.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Wm.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=Kn.join(e,"agents");return(await Fr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=x.getGlobalProjectPath(t),s=Kn.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=Kn.join(s,u);try{let m=await Fr.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=yo(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=Kn.join(Xv.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=Kn.join(t,`${i}.md`),c=Kn.join(t,i,"SKILL.md");try{let u=await Fr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await Fr.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=Jm.indexOf(a),d=Jm.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Qv=new fl,di=Qv});function Zv(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 yl,eC,Me,qm=w(()=>{"use strict";jt();se();bn();bn();l(Zv,"generateApprovalPrompt");yl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return cc.includes(e)}isDestructive(e){return lc.includes(e)}isToolAllowedInPlanning(e){return Oo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Oo.includes(n)):t}startPlanning(e,t,n){let s={id:me(),projectId:e,command:t,params:n,status:Q.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[Q.GATHERING,Q.ANALYZING,Q.PROPOSING,Q.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===Q.APPROVED?n.approvedAt=b():t===Q.EXECUTING?n.executionStartedAt=b():(t===Q.COMPLETED||t===Q.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=Q.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=Q.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==Q.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=Q.APPROVED,n.approvedAt=b(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=Q.REJECTED,n.userFeedback=t,n.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==Q.APPROVED?null:(t.status=Q.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==Q.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==Q.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=b(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=Q.COMPLETED,t.completedAt=b();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=Q.ABORTED,n.completedAt=b(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Zv(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[Q.GATHERING]:"\u{1F50D}",[Q.ANALYZING]:"\u{1F9E0}",[Q.PROPOSING]:"\u{1F4DD}",[Q.PENDING_APPROVAL]:"\u23F3",[Q.APPROVED]:"\u2705",[Q.EXECUTING]:"\u26A1",[Q.COMPLETED]:"\u{1F389}",[Q.REJECTED]:"\u274C",[Q.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===Q.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
596
- `)}_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`}},eC=new yl,Me=eC});function tC(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return pi[t]?pi[t]:pi[e]?pi[e]:e}function mi(r){let e=new Set,t=[];for(let n of r){let s=tC(n);e.has(s)||(e.add(s),t.push(n))}return t}var pi,wl=w(()=>{"use strict";pi={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(tC,"normalizeFrameworkName");l(mi,"deduplicateTechStack")});import{z as Oe}from"zod";function Km(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
597
- `);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=mi(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])=>nC[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(`
593
+ ${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=Sn.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 rP(r,e){let t=qm(e),n=new Map;for(let[p,g]of Object.entries(sP)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return wd;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=oP(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 qm(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 oP(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 Zv,sP,kl,iP,Km,Xm=w(()=>{"use strict";fr();mo();F();Zv=3600*1e3;l(Wm,"hashDescription");l(Vm,"loadCache");l(wl,"saveCache");l(eP,"lookupCache");l(tP,"lookupPatterns");l(nP,"classifyWithLLM");sP={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(rP,"classifyWithHeuristic");l(qm,"buildAvailableDomains");l(oP,"getFilePatterns");kl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Wm(e),i=await Vm(n),a=eP(i,o,t);if(a)return{classification:a,source:"cache"};let c=tP(i,o);if(c)return{classification:c,source:"history"};let u=await nP(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await wl(n,i),{classification:u,source:"llm"};let d=rP(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await wl(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=Wm(e),o=await Vm(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await wl(n,o))}},iP=new kl,Km=iP});import{exec as aP}from"node:child_process";import Nr from"node:fs/promises";import cP from"node:os";import Xn from"node:path";import{promisify as lP}from"node:util";var Ym,Qm,Sl,uP,hi,bl=w(()=>{"use strict";ml();Tt();ke();ms();Qt();gl();Om();zm();F();Kn();Xm();Kt();Ym=lP(aP),Qm=["database","backend","frontend","testing","devops"],Sl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=x.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((dt,qe)=>{if(dt.status==="fulfilled")return dt.value;g.push(p[qe]),console.warn(`Context tool "${p[qe]}" failed: ${y(dt.reason)}`)}),[k,S,I]=f,R={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},G=this.shouldFragment(a,t),$e=null;return G&&e==="task"&&($e=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:G,subtasks:$e,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:S??null,velocityContext:I??null,contextDegradation:R}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),fi(e,t,{maxFiles:10,minScore:.15}),Mm(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Gm(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(`
594
+ `);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([Ym("git branch --show-current",{cwd:e}),Ym("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
595
+ `).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 Ge.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await ht.getAll(e);if(t.length===0)return null;let n=mi(t,bn);return n.sprints.length===0?null:$m(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Xn.join(e,"analysis","repo-analysis.json"),n=await Nr.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=x.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Km.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=Xn.join(e,"agents");return(await Nr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=x.getGlobalProjectPath(t),s=Xn.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=Xn.join(s,u);try{let m=await Nr.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=vo(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=Xn.join(cP.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=Xn.join(t,`${i}.md`),c=Xn.join(t,i,"SKILL.md");try{let u=await Nr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await Nr.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=Qm.indexOf(a),d=Qm.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},uP=new Sl,hi=uP});function dP(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 vl,pP,Fe,Zm=w(()=>{"use strict";$t();se();Cn();Cn();l(dP,"generateApprovalPrompt");vl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return mc.includes(e)}isDestructive(e){return gc.includes(e)}isToolAllowedInPlanning(e){return Uo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Uo.includes(n)):t}startPlanning(e,t,n){let s={id:ge(),projectId:e,command:t,params:n,status:Z.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[Z.GATHERING,Z.ANALYZING,Z.PROPOSING,Z.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===Z.APPROVED?n.approvedAt=b():t===Z.EXECUTING?n.executionStartedAt=b():(t===Z.COMPLETED||t===Z.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=Z.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=Z.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!==Z.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=Z.APPROVED,n.approvedAt=b(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=Z.REJECTED,n.userFeedback=t,n.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==Z.APPROVED?null:(t.status=Z.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==Z.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!==Z.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=b(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=Z.COMPLETED,t.completedAt=b();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=Z.ABORTED,n.completedAt=b(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return dP(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[Z.GATHERING]:"\u{1F50D}",[Z.ANALYZING]:"\u{1F9E0}",[Z.PROPOSING]:"\u{1F4DD}",[Z.PENDING_APPROVAL]:"\u23F3",[Z.APPROVED]:"\u2705",[Z.EXECUTING]:"\u26A1",[Z.COMPLETED]:"\u{1F389}",[Z.REJECTED]:"\u274C",[Z.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===Z.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
596
+ `)}_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`}},pP=new vl,Fe=pP});function mP(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return yi[t]?yi[t]:yi[e]?yi[e]:e}function wi(r){let e=new Set,t=[];for(let n of r){let s=mP(n);e.has(s)||(e.add(s),t.push(n))}return t}var yi,Pl=w(()=>{"use strict";yi={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(mP,"normalizeFrameworkName");l(wi,"deduplicateTechStack")});import{z as _e}from"zod";function eg(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
597
+ `);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=wi(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])=>gP[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(`
598
598
  Context: ${r.fileCount} files in project.`),e.join(`
599
- `)}var s_,nC,Xm=w(()=>{"use strict";wl();s_=Oe.object({projectPath:Oe.string(),language:Oe.string().optional(),framework:Oe.string().optional(),techStack:Oe.array(Oe.string()).default([]),domains:Oe.object({hasFrontend:Oe.boolean().default(!1),hasBackend:Oe.boolean().default(!1),hasDatabase:Oe.boolean().default(!1),hasTesting:Oe.boolean().default(!1),hasDocker:Oe.boolean().default(!1)}).optional(),fileCount:Oe.number().optional(),availableAgents:Oe.array(Oe.string()).default([]),analysisLanguages:Oe.array(Oe.string()).default([]),analysisFrameworks:Oe.array(Oe.string()).default([]),analysisPackageManager:Oe.string().optional()}),nC={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Km,"buildAntiHallucinationBlock")});import{z as Nt}from"zod";var sC,Ym,Qm=w(()=>{"use strict";sC=Nt.object({agents:Nt.boolean(),patterns:Nt.boolean(),checklist:Nt.boolean(),modules:Nt.array(Nt.string())}),Ym=Nt.object({version:Nt.string(),description:Nt.string().optional(),commands:Nt.record(Nt.string(),sC).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function kl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Zm(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=kl(o,rC),a=kl(o,oC),c=kl(o,iC);return s.some(d=>aC.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 rC,oC,iC,aC,eg=w(()=>{"use strict";rC=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],oC=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],iC=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],aC=["Write","Edit","Bash"];l(kl,"countMatches");l(Zm,"classifyCommand")});import Sl from"node:fs/promises";import cC from"node:path";async function ng(){if(_r)return _r;let r=await Sl.readFile(bl,"utf-8"),e=JSON.parse(r);return _r=Ym.parse(e),_r}function lC(r){return sg.get(r)}function uC(r,e){sg.set(r,e)}function pC(r,e){let t=r,n=tg.get(t);return n&&gC(n.entry,e)?(n.count++,n.count>=dC):(tg.set(t,{entry:e,count:1}),!1)}async function mC(r,e){let t=await Sl.readFile(bl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Sl.writeFile(bl,`${JSON.stringify(n,null,2)}
600
- `,"utf-8"),_r=null}function gC(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 rg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=lC(e);if(n)return{entry:n,source:"cache"};if(t){let s=Zm(e,t);return uC(e,s),pC(e,s)&&mC(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var bl,_r,sg,tg,dC,og=w(()=>{"use strict";Qm();$t();eg();bl=cC.join(ae,"core/config/command-context.config.json"),_r=null;l(ng,"loadCommandContextConfig");sg=new Map;l(lC,"getCachedClassification");l(uC,"cacheClassification");tg=new Map,dC=3;l(pC,"trackClassification");l(mC,"persistClassification");l(gC,"isSameEntry");l(rg,"resolveCommandContextFull")});import fC from"node:os";import{z as Qt}from"zod";function hC(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function yC(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function ig(r){let e=r.platform??fC.platform(),t=r.runtime??hC(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
601
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",yC(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
599
+ `)}var b_,gP,tg=w(()=>{"use strict";Pl();b_=_e.object({projectPath:_e.string(),language:_e.string().optional(),framework:_e.string().optional(),techStack:_e.array(_e.string()).default([]),domains:_e.object({hasFrontend:_e.boolean().default(!1),hasBackend:_e.boolean().default(!1),hasDatabase:_e.boolean().default(!1),hasTesting:_e.boolean().default(!1),hasDocker:_e.boolean().default(!1)}).optional(),fileCount:_e.number().optional(),availableAgents:_e.array(_e.string()).default([]),analysisLanguages:_e.array(_e.string()).default([]),analysisFrameworks:_e.array(_e.string()).default([]),analysisPackageManager:_e.string().optional()}),gP={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(eg,"buildAntiHallucinationBlock")});import{z as Ut}from"zod";var fP,ng,sg=w(()=>{"use strict";fP=Ut.object({agents:Ut.boolean(),patterns:Ut.boolean(),checklist:Ut.boolean(),modules:Ut.array(Ut.string())}),ng=Ut.object({version:Ut.string(),description:Ut.string().optional(),commands:Ut.record(Ut.string(),fP).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Cl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function rg(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Cl(o,hP),a=Cl(o,yP),c=Cl(o,wP);return s.some(d=>kP.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 hP,yP,wP,kP,og=w(()=>{"use strict";hP=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],yP=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],wP=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],kP=["Write","Edit","Bash"];l(Cl,"countMatches");l(rg,"classifyCommand")});import xl from"node:fs/promises";import SP from"node:path";async function ag(){if(Lr)return Lr;let r=await xl.readFile(Tl,"utf-8"),e=JSON.parse(r);return Lr=ng.parse(e),Lr}function bP(r){return cg.get(r)}function vP(r,e){cg.set(r,e)}function CP(r,e){let t=r,n=ig.get(t);return n&&TP(n.entry,e)?(n.count++,n.count>=PP):(ig.set(t,{entry:e,count:1}),!1)}async function xP(r,e){let t=await xl.readFile(Tl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await xl.writeFile(Tl,`${JSON.stringify(n,null,2)}
600
+ `,"utf-8"),Lr=null}function TP(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 lg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=bP(e);if(n)return{entry:n,source:"cache"};if(t){let s=rg(e,t);return vP(e,s),CP(e,s)&&xP(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Tl,Lr,cg,ig,PP,ug=w(()=>{"use strict";sg();Ot();og();Tl=SP.join(ce,"core/config/command-context.config.json"),Lr=null;l(ag,"loadCommandContextConfig");cg=new Map;l(bP,"getCachedClassification");l(vP,"cacheClassification");ig=new Map,PP=3;l(CP,"trackClassification");l(xP,"persistClassification");l(TP,"isSameEntry");l(lg,"resolveCommandContextFull")});import EP from"node:os";import{z as en}from"zod";function AP(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function RP(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function dg(r){let e=r.platform??EP.platform(),t=r.runtime??AP(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
601
+ ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",RP(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
602
602
  `)}
603
- </env>`}var k_,ag=w(()=>{"use strict";k_=Qt.object({projectName:Qt.string(),projectPath:Qt.string(),isGitRepo:Qt.boolean().default(!0),gitBranch:Qt.string().optional(),platform:Qt.string().optional(),runtime:Qt.string().optional(),date:Qt.string().optional(),model:Qt.string().optional(),provider:Qt.string().optional()});l(hC,"detectRuntime");l(yC,"normalizePlatform");l(ig,"buildEnvironmentBlock")});function lg(r){let e=r.getAllocationFor("injection");return{...fi,totalPrompt:e}}function Xn(r,e){let t=e*ug;return r.length<=t?r:`${r.substring(0,t)}
604
- ... (truncated to ~${e} tokens)`}function cg(r){return Math.ceil(r.length/ug)}function dg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=wC[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 fi,ug,wC,gi,pg=w(()=>{"use strict";fi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(lg,"budgetsFromCoordinator");ug=4;l(Xn,"truncateToTokenBudget");l(cg,"estimateTokens");wC={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(dg,"filterSkillsByDomains");gi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...fi,...e}}addSection(e,t){let n=Xn(e,t),s=cg(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+=cg(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 mg from"node:fs/promises";import Yn from"node:path";var vl,kC,gg,fg=w(()=>{"use strict";Xt();F();De();$t();Zc();Xm();og();ag();pg();wl();Jt();vl=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 R(e)){let s=await mg.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?lg(this._coordinator):fi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ge(`global/modules/${e}`);if(t)return t;let n=Yn.join(ae,"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=wn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ge(s);if(o){let i=Yn.basename(s,".md");t[i]=o}}}else{let s=Yn.join(ae,"templates","checklists");if(await R(s)){let o=(await mg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Yn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){C(n)||console.error(`Checklist loading warning: ${y(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([_.read(e),fe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(C(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await Kc.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(`
605
- `);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=Yn.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 v=await ng();p=rg(v,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
603
+ </env>`}var __,pg=w(()=>{"use strict";__=en.object({projectName:en.string(),projectPath:en.string(),isGitRepo:en.boolean().default(!0),gitBranch:en.string().optional(),platform:en.string().optional(),runtime:en.string().optional(),date:en.string().optional(),model:en.string().optional(),provider:en.string().optional()});l(AP,"detectRuntime");l(RP,"normalizePlatform");l(dg,"buildEnvironmentBlock")});function gg(r){let e=r.getAllocationFor("injection");return{...Si,totalPrompt:e}}function Yn(r,e){let t=e*fg;return r.length<=t?r:`${r.substring(0,t)}
604
+ ... (truncated to ~${e} tokens)`}function mg(r){return Math.ceil(r.length/fg)}function hg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=IP[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 Si,fg,IP,ki,yg=w(()=>{"use strict";Si={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(gg,"budgetsFromCoordinator");fg=4;l(Yn,"truncateToTokenBudget");l(mg,"estimateTokens");IP={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(hg,"filterSkillsByDomains");ki=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Si,...e}}addSection(e,t){let n=Yn(e,t),s=mg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Yn(n,o);return this.used+=mg(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 wg from"node:fs/promises";import Qn from"node:path";var El,DP,kg,Sg=w(()=>{"use strict";Qt();F();Me();Ot();rl();tg();ug();pg();yg();Pl();Kt();El=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await D(e)){let s=await wg.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){P(s)||console.error(`Template loading warning: ${y(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?gg(this._coordinator):Si}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ue(`global/modules/${e}`);if(t)return t;let n=Qn.join(ce,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=vn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ue(s);if(o){let i=Qn.basename(s,".md");t[i]=o}}}else{let s=Qn.join(ce,"templates","checklists");if(await D(s)){let o=(await wg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Qn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(n)||console.error(`Checklist loading warning: ${y(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([_.read(e),he.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(P(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await el.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!P(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
605
+ `);return Yn(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=Qn.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 v=await ag();p=lg(v,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
606
606
  `),s.role&&d.push(`Role: ${s.role}
607
607
  `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
608
608
  `),d.push(`
@@ -611,8 +611,8 @@ Apply specialized expertise. Read agent file for details if needed.
611
611
  `)),d.push(`TASK: ${e.frontmatter.description}
612
612
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
613
613
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
614
- `);let k=t.projectPath;if(k){let v=u?.project?.id?Yn.basename(k):Yn.basename(k),D=ig({projectName:v,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
615
- ${D}
614
+ `);let k=t.projectPath;if(k){let v=u?.project?.id?Qn.basename(k):Qn.basename(k),j=dg({projectName:v,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
615
+ ${j}
616
616
  `)}if(u){let v=u.sealedAnalysis;if(d.push(`
617
617
  ## PROJECT ANALYSIS (Sealed)
618
618
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
@@ -627,46 +627,46 @@ ${D}
627
627
  `),d.push(`**Analysis Status**: ${v.status}${v.commitHash?` (commit: ${v.commitHash.slice(0,8)})`:""}
628
628
  `),v.patterns?.length>0){d.push(`
629
629
  ### Code Patterns (Follow These)
630
- `);for(let D of v.patterns)d.push(`- **${D.name}**: ${D.description}${D.location?` (${D.location})`:""}
630
+ `);for(let j of v.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
631
631
  `)}if(v.antiPatterns?.length>0){d.push(`
632
632
  ### Anti-Patterns (Avoid These)
633
- `);for(let D of v.antiPatterns)d.push(`- **${D.issue}** in \`${D.file}\` \u2014 ${D.suggestion}
633
+ `);for(let j of v.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
634
634
  `)}}d.push(`
635
635
  `)}let S=p.patterns,I=n?.codePatterns||"";if(S&&I&&I.trim()){let v=this.extractPatternSummary(I);v&&(d.push(`## CODE PATTERNS
636
636
  `),d.push(v),d.push(`
637
637
  Full patterns: Read analysis/patterns.md
638
- `))}let j=n?.analysis||"";if(S&&j&&j.trim()){let v=j.match(/Stack[:\s]+([^\n]+)/i)||j.match(/Technology[:\s]+([^\n]+)/i),D=v?v[1].trim():"detected";d.push(`
638
+ `))}let R=n?.analysis||"";if(S&&R&&R.trim()){let v=R.match(/Stack[:\s]+([^\n]+)/i)||R.match(/Technology[:\s]+([^\n]+)/i),j=v?v[1].trim():"detected";d.push(`
639
639
  ## STACK
640
- Stack: ${D}
640
+ Stack: ${j}
641
641
  `),I||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
642
642
  `)}if(u){if(u.agents.length>0){d.push(`
643
643
  ### LOADED AGENTS (Project-Specific Specialists)
644
644
 
645
- `);for(let D of u.agents){d.push(`#### Agent: ${D.name} (${D.domain})
646
- `),D.effort&&d.push(`Effort: ${D.effort}
647
- `),D.model&&d.push(`Model: ${D.model}
648
- `),D.skills.length>0&&d.push(`Skills: ${D.skills.join(", ")}
649
- `);let Ie=Xn(D.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
645
+ `);for(let j of u.agents){d.push(`#### Agent: ${j.name} (${j.domain})
646
+ `),j.effort&&d.push(`Effort: ${j.effort}
647
+ `),j.model&&d.push(`Model: ${j.model}
648
+ `),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
649
+ `);let Ie=Yn(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
650
650
  ${Ie}
651
651
  \`\`\`
652
652
 
653
- `)}}let v=dg(u.skills,u.detectedDomains);if(v.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
653
+ `)}}let v=hg(u.skills,u.detectedDomains);if(v.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
654
654
 
655
- `);for(let D of v){d.push(`#### Skill: ${D.name}
656
- `);let Ie=Xn(D.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
655
+ `);for(let j of v){d.push(`#### Skill: ${j.name}
656
+ `);let Ie=Yn(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
657
657
  ${Ie}
658
658
  \`\`\`
659
659
 
660
- `)}}}let q=this.getModulesForCommand(m,p);if(q.length>0)for(let v of q){let D=await this.loadModule(v);D&&(d.push(`
661
- `),d.push(D))}if(c?.isPlanning&&(d.push(`
660
+ `)}}}let G=this.getModulesForCommand(m,p);if(G.length>0)for(let v of G){let j=await this.loadModule(v);j&&(d.push(`
661
+ `),d.push(j))}if(c?.isPlanning&&(d.push(`
662
662
  ## PLAN MODE
663
663
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
664
664
  `),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
665
665
  `)),c?.requiresApproval&&d.push(`
666
666
  ## APPROVAL REQUIRED
667
667
  Show changes, list affected files, ask for confirmation.
668
- `),k){let v=u?.sealedAnalysis,D=[...v?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Ie={projectPath:k,language:u?.project?.ecosystem,framework:v?.frameworks?.[0],techStack:mi(D),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(tr=>tr.name)||[],analysisLanguages:v?.languages||[],analysisFrameworks:v?.frameworks||[],analysisPackageManager:v?.packageManager};d.push(`
669
- ${Km(Ie)}
668
+ `),k){let v=u?.sealedAnalysis,j=[...v?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Ie={projectPath:k,language:u?.project?.ecosystem,framework:v?.frameworks?.[0],techStack:wi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(sr=>sr.name)||[],analysisLanguages:v?.languages||[],analysisFrameworks:v?.frameworks||[],analysisPackageManager:v?.packageManager};d.push(`
669
+ ${eg(Ie)}
670
670
  `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let v=u.contextDegradation;d.push(`
671
671
  ### CONTEXT DEGRADATION NOTICE
672
672
 
@@ -682,27 +682,27 @@ ${Km(Ie)}
682
682
  `),v.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
683
683
  `),d.push(`| Score | File | Why |
684
684
  `),d.push(`|-------|------|-----|
685
- `);for(let D of v.relevantFiles.slice(0,8))d.push(`| ${D.score} | ${D.path} | ${D.reason} |
685
+ `);for(let j of v.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
686
686
  `);d.push(`
687
687
  `)}if(v.signatures.length>0){d.push(`**Code Signatures** (top files):
688
- `);for(let D of v.signatures)d.push(`\`\`\`typescript
689
- // ${D.path}
690
- ${D.content}
688
+ `);for(let j of v.signatures)d.push(`\`\`\`typescript
689
+ // ${j.path}
690
+ ${j.content}
691
691
  \`\`\`
692
692
  `);d.push(`
693
- `)}if(v.recentFiles.length>0){d.push("**Recently Changed**: ");let D=v.recentFiles.slice(0,5).map(Ie=>`${Ie.path} (${Ie.lastChanged})`).join(", ");d.push(`${D}
693
+ `)}if(v.recentFiles.length>0){d.push("**Recently Changed**: ");let j=v.recentFiles.slice(0,5).map(Ie=>`${Ie.path} (${Ie.lastChanged})`).join(", ");d.push(`${j}
694
694
 
695
- `)}}let Fe=t.files||[];if(Fe.length>0){let v=Fe.slice(0,5).join(", ");d.push(`
696
- ## FILES: ${Fe.length} available. Top: ${v}
695
+ `)}}let $e=t.files||[];if($e.length>0){let v=$e.slice(0,5).join(", ");d.push(`
696
+ ## FILES: ${$e.length} available. Top: ${v}
697
697
  `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
698
698
 
699
699
  `)}else k&&d.push(`
700
700
  ## PROJECT: ${k}
701
701
  Read files before modifying.
702
702
 
703
- `);let ct=this.filterRelevantState(n);if(ct&&(d.push(`
703
+ `);let dt=this.filterRelevantState(n);if(dt&&(d.push(`
704
704
  ## PRJCT STATE (Project Management Data)
705
- `),d.push(ct),d.push(`
705
+ `),d.push(dt),d.push(`
706
706
  `)),u?.velocityContext&&(d.push(`
707
707
  ### VELOCITY (Historical Estimation Data)
708
708
 
@@ -710,7 +710,7 @@ Read files before modifying.
710
710
 
711
711
  `)),o&&Object.keys(o).some(v=>o[v])){d.push(`
712
712
  ## PROJECT DEFAULTS (apply automatically)
713
- `);for(let[v,D]of Object.entries(o))D&&d.push(`- ${v}: ${D}
713
+ `);for(let[v,j]of Object.entries(o))j&&d.push(`- ${v}: ${j}
714
714
  `)}if(i?.plan&&i.plan.length>0){if(d.push(`
715
715
  ## THINK FIRST (reasoning from analysis)
716
716
  `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
@@ -729,34 +729,34 @@ Read files before modifying.
729
729
 
730
730
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
731
731
  `),d.push(`|---|--------|-------------|--------|
732
- `);for(let D of u.subtasks){let Ie=D.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":D.status==="completed"?"\u2705 Done":D.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${D.order} | ${D.domain} | ${D.description} | ${Ie} |
733
- `)}let v=u.subtasks.find(D=>D.status==="in_progress");if(v&&(d.push(`
732
+ `);for(let j of u.subtasks){let Ie=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${Ie} |
733
+ `)}let v=u.subtasks.find(j=>j.status==="in_progress");if(v&&(d.push(`
734
734
  **FOCUS ON SUBTASK #${v.order}**: ${v.description}
735
735
  `),d.push(`Agent: ${v.agent} | Domain: ${v.domain}
736
736
  `),v.dependsOn.length>0&&d.push(`Dependencies: ${v.dependsOn.join(", ")}
737
- `),v.handoff)){let D=v.handoff;d.push(`
737
+ `),v.handoff)){let j=v.handoff;d.push(`
738
738
  ### Previous Subtask Handoff
739
739
 
740
- `),d.push(`**From:** ${D.fromSubtask}
740
+ `),d.push(`**From:** ${j.fromSubtask}
741
741
 
742
742
  `),d.push(`**What was done:**
743
- `);for(let Ie of D.whatWasDone)d.push(`- ${Ie}
744
- `);if(D.filesChanged.length>0){d.push(`
743
+ `);for(let Ie of j.whatWasDone)d.push(`- ${Ie}
744
+ `);if(j.filesChanged.length>0){d.push(`
745
745
  **Files changed:**
746
- `);for(let Ie of D.filesChanged)d.push(`- \`${Ie.path}\` (${Ie.action})
746
+ `);for(let Ie of j.filesChanged)d.push(`- \`${Ie.path}\` (${Ie.action})
747
747
  `)}d.push(`
748
748
  **Context for this subtask:**
749
- ${D.outputForNextAgent}
749
+ ${j.outputForNextAgent}
750
750
  `)}d.push(`
751
- `)}let Ve=this.getSchemaTypeForCommand(m);if(Ve){let{renderSchemaForPrompt:v}=await Promise.resolve().then(()=>(ao(),vd)),D=v(Ve);D&&d.push(`
752
- ${D}
753
- `)}if(p.checklist){let v=await this.loadChecklistRouting(),D=await this.loadChecklists();v&&Object.keys(D).length>0&&(d.push(`
751
+ `)}let qe=this.getSchemaTypeForCommand(m);if(qe){let{renderSchemaForPrompt:v}=await Promise.resolve().then(()=>(mo(),Ed)),j=v(qe);j&&d.push(`
752
+ ${j}
753
+ `)}if(p.checklist){let v=await this.loadChecklistRouting(),j=await this.loadChecklists();v&&Object.keys(j).length>0&&(d.push(`
754
754
  ## QUALITY CHECKLISTS
755
755
  `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
756
- `),d.push(`Available: ${Object.keys(D).join(", ")}
756
+ `),d.push(`Available: ${Object.keys(j).join(", ")}
757
757
  `),d.push(`Path: templates/checklists/{name}.md
758
758
  `),d.push(`Use Read tool to load checklists you determine are relevant.
759
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new gi({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}
759
+ `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new ki({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}
760
760
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
761
761
 
762
762
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -773,7 +773,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
773
773
  `);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
774
774
  Avoid:
775
775
  ${a}`)}let o=t.join(`
776
- `);return Xn(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
776
+ `);return Yn(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
777
777
  ## RULES (CRITICAL)
778
778
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
779
779
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -790,7 +790,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
790
790
  - Prefer structured output (JSON) over free text when applicable.
791
791
 
792
792
  EXECUTE: Follow flow. Use tools. Decide.
793
- `}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}}}},kC=new vl,gg=kC});import hg from"node:fs/promises";import Pt from"node:path";var SC,bC,Cl,Pl,hi,xl=w(()=>{"use strict";wt();ke();F();SC=["task","done","ship","resume","bug","enrich"],bC=["init","sync","pause","next","dash","history","undo","redo"],Cl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Pt.dirname(jn.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=x.getGlobalProjectPath(s),a=await(Ge(),lt(rt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Pt.join(u,"templates")}catch{c=Pt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:Pt.join(c,"agentic","orchestrator.md"),agentRouting:Pt.join(c,"agentic","agent-routing.md"),taskFragmentation:Pt.join(c,"agentic","task-fragmentation.md"),commandTemplate:Pt.join(c,"commands",`${e}.md`),repoAnalysis:Pt.join(o,"analysis","repo-analysis.json"),agentsDir:Pt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:Pt.join(o,"storage","state.json")}}}requiresOrchestration(e){return SC.includes(e)?!0:!bC.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Pt.join(x.getGlobalProjectPath(t),"agents");return(await hg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return C(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=Pt.join(x.getGlobalProjectPath(t),"agents");return(await hg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
793
+ `}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}}}},DP=new El,kg=DP});import bg from"node:fs/promises";import At from"node:path";var jP,$P,Al,Rl,bi,Il=w(()=>{"use strict";Tt();ke();F();jP=["task","done","ship","resume","bug","enrich"],$P=["init","sync","pause","next","dash","history","undo","redo"],Al=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return At.dirname(fn.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=x.getGlobalProjectPath(s),a=await(ze(),pt(ct)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=At.join(u,"templates")}catch{c=At.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:At.join(c,"agentic","orchestrator.md"),agentRouting:At.join(c,"agentic","agent-routing.md"),taskFragmentation:At.join(c,"agentic","task-fragmentation.md"),commandTemplate:At.join(c,"commands",`${e}.md`),repoAnalysis:At.join(o,"analysis","repo-analysis.json"),agentsDir:At.join(o,"agents"),skillsDir:a.skillsDir,stateJson:At.join(o,"storage","state.json")}}}requiresOrchestration(e){return jP.includes(e)?!0:!$P.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=At.join(x.getGlobalProjectPath(t),"agents");return(await bg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=At.join(x.getGlobalProjectPath(t),"agents");return(await bg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
794
794
  ## Agentic Execution Mode
795
795
 
796
796
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -873,13 +873,13 @@ When fragmenting tasks:
873
873
  2. Track progress: currentSubtaskIndex, subtaskProgress
874
874
  3. Each completed subtask generates a summary
875
875
  4. Pass summary to next agent for context handoff
876
- `,context:e,requiresOrchestration:t}}},Pl=new Cl,hi=Pl});import{exec as vC}from"node:child_process";import yg from"node:fs/promises";import{promisify as CC}from"node:util";var PC,Qn,Ke,Tl=w(()=>{"use strict";vo();PC=CC(vC),Qn={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())}};Qn.register("Read",async r=>{try{return await wr.execute(async()=>await yg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return bo(e)||yr(e),null}});Qn.register("Write",async(r,e)=>{try{return await wr.execute(async()=>await yg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return bo(t)||yr(t),!1}});Qn.register("Bash",async r=>{try{return await wr.execute(async()=>await PC(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Qn.register("GetTimestamp",async()=>new Date().toISOString());Qn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Qn.register("GetDateTime",async()=>new Date().toISOString());Ke=Qn});import El from"node:fs/promises";import xC from"node:os";import wg from"node:path";async function TC(r){try{let e=wg.dirname(yi);await R(e)||await El.mkdir(e,{recursive:!0}),await El.writeFile(yi,`/p:${r}`)}catch{}}async function EC(){try{await R(yi)&&await El.unlink(yi)}catch{}}var yi,Al,AC,wi,Il=w(()=>{"use strict";F();im();De();lm();dm();nl();Pm();xm();gr();hl();qm();fg();xl();Jt();Tl();yi=wg.join(xC.homedir(),".prjct-cli",".running");l(TC,"signalStart");l(EC,"signalEnd");Al=class{static{l(this,"CommandExecutor")}async signalStart(e){await TC(e)}async signalEnd(){await EC()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Rs.shouldEscalate(e,s)){let o=Rs.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ua.load(e),i=await gt.build(n,t),a=Me.requiresPlanning(e),c=Me.isDestructive(e),u=Me.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Me.startPlanning(i.projectId,e,t):u&&(d=Me.getActivePlan(i.projectId));let m=null;if(ai.requiresVerification(e)){let v=await gt.loadStateForCommand(i,e);m=await ai.verify(e,i,v),!m.verified&&m.warnings.length>0&&console.log(ai.formatWarnings(m))}let p=null;if(ii.requiresReasoning(e)){let v=await gt.loadStateForCommand(i,e);p=await ii.reason(e,i,v),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(ii.formatPlan(p)))}let g=t.task||t.description||"",f=await hi.buildContext(e,g,n),k=hi.buildAgenticPrompt(f),S=null;if(hi.requiresOrchestration(e)&&g)try{S=await di.execute(e,g,n),S.detectedDomains.length>0&&oi.orchestrate(S.detectedDomains);for(let v of S.agents){let D=v.domain||v.name.replace(".md","");oi.startAgent(v.name,D,`Loading ${D} specialist...`),oi.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let v=S.subtasks.map(D=>({id:D.id,domain:D.domain,description:D.description,status:D.status}));cm(v)}}catch(v){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(v)}`)}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 gt.loadState(i),q=null,Fe=null;i.projectId&&(q={commit_footer:await Ze.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ze.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ze.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ze.getSmartDecision(i.projectId,`preferred_agent_${e}`)},Fe=await Ze.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let ct={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Me.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Ve=await gg.build(o,I,j,null,q,null,Fe,ct,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Rs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:j,prompt:Ve,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:I.agentsPath,agentRoutingPath:I.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:q,relevantMemories:Fe,orchestratorContext:S,memory:{create:l(v=>Ze.createMemory(i.projectId,v),"create"),autoRemember:l((v,D,Ie)=>Ze.autoRemember(i.projectId,v,D,Ie),"autoRemember"),search:l(v=>Ze.searchMemories(i.projectId,v),"search"),findByTags:l(v=>Ze.findByTags(i.projectId,v),"findByTags"),getStats:l(()=>Ze.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(v=>Me.recordGatheredInfo(i.projectId,v),"recordInfo"),setAnalysis:l(v=>Me.setAnalysis(i.projectId,v),"setAnalysis"),propose:l(v=>Me.proposePlan(i.projectId,v),"propose"),approve:l(v=>Me.approvePlan(i.projectId,v),"approve"),reject:l(v=>Me.rejectPlan(i.projectId,v),"reject"),getApprovalPrompt:l(()=>Me.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Me.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Me.getNextStep(i.projectId),"getNextStep"),completeStep:l(v=>Me.completeStep(i.projectId,v),"completeStep"),failStep:l(v=>Me.failStep(i.projectId,v),"failStep"),abort:l(v=>Me.abortPlan(i.projectId,v),"abort"),getStatus:l(()=>Me.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Me.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rs.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Rs.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Ke.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ke.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Ua.load(e)).frontmatter["allowed-tools"]||[],i=await gt.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)}}}},AC=new Al,wi=AC});import ki from"node:fs/promises";import IC from"node:https";import RC from"node:os";import Rl from"node:path";import Lt from"chalk";var jl,kg,Sg=w(()=>{"use strict";F();De();jl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(RC.homedir(),".prjct-cli","config"),this.cacheFile=Rl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rl.join(__dirname,"..","..","package.json");return JSON.parse(await ki.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=IC.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 R(this.cacheFile))return JSON.parse(await ki.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await R(this.cacheDir)||await ki.mkdir(this.cacheDir,{recursive:!0}),await ki.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:`
877
- `+Lt.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")+`
878
- `+Lt.yellow("\u2502")+" "+Lt.bold("Update available!")+" "+Lt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Lt.yellow("\u2502")+`
879
- `+Lt.yellow("\u2502")+" "+Lt.yellow("\u2502")+`
880
- `+Lt.yellow("\u2502")+" Run: "+Lt.cyan("npm update -g prjct-cli")+" "+Lt.yellow("\u2502")+`
881
- `+Lt.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")+`
882
- `}},kg=jl});var be,tt=w(()=>{"use strict";Il();nl();Tl();wt();ke();Sg();cn();se();De();zn();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new kg,this.updateNotificationShown=!1,this.commandExecutor=wi}get agent(){return ys.getAgent()}get agentInfo(){return ys.getInfo()}get currentAuthor(){return Tn.getCurrentAuthor()}async initializeAgent(){return ys.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 ut.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Tn.isEmptyDirectory(e)}async _detectExistingCode(e){return Tn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ro.breakdownFeature(e)}_detectBugSeverity(e){return Ro.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ys.assignForTask(e,t,n)}}});var bg={};Dn(bg,{PlanningCommands:()=>es});import Zn from"node:path";async function jC(){if(!Dl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(bi(),vg));Dl=new r}return Dl}var Dl,es,Si=w(()=>{"use strict";Po();kn();jt();Xt();Ir();F();Ts();Es();Jc();Zc();tt();Dl=null;l(jC,"getAnalysisCommands");es=class extends be{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await $.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Is(t).runNonInteractive());else if(a=await new Is(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await hs(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await x.ensureProjectStructure(m);let p=x.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
876
+ `,context:e,requiresOrchestration:t}}},Rl=new Al,bi=Rl});import{exec as MP}from"node:child_process";import vg from"node:fs/promises";import{promisify as OP}from"node:util";var FP,Zn,Ze,Dl=w(()=>{"use strict";Eo();FP=OP(MP),Zn={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())}};Zn.register("Read",async r=>{try{return await Sr.execute(async()=>await vg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return To(e)||kr(e),null}});Zn.register("Write",async(r,e)=>{try{return await Sr.execute(async()=>await vg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return To(t)||kr(t),!1}});Zn.register("Bash",async r=>{try{return await Sr.execute(async()=>await FP(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Zn.register("GetTimestamp",async()=>new Date().toISOString());Zn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Zn.register("GetDateTime",async()=>new Date().toISOString());Ze=Zn});import jl from"node:fs/promises";import _P from"node:os";import Pg from"node:path";async function NP(r){try{let e=Pg.dirname(vi);await D(e)||await jl.mkdir(e,{recursive:!0}),await jl.writeFile(vi,`/p:${r}`)}catch{}}async function LP(){try{await D(vi)&&await jl.unlink(vi)}catch{}}var vi,$l,UP,Pi,Ml=w(()=>{"use strict";F();dm();Me();gm();hm();al();Rm();Im();hr();bl();Zm();Sg();Il();Kt();Dl();vi=Pg.join(_P.homedir(),".prjct-cli",".running");l(NP,"signalStart");l(LP,"signalEnd");$l=class{static{l(this,"CommandExecutor")}async signalStart(e){await NP(e)}async signalEnd(){await LP()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(js.shouldEscalate(e,s)){let o=js.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ba.load(e),i=await yt.build(n,t),a=Fe.requiresPlanning(e),c=Fe.isDestructive(e),u=Fe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Fe.startPlanning(i.projectId,e,t):u&&(d=Fe.getActivePlan(i.projectId));let m=null;if(pi.requiresVerification(e)){let v=await yt.loadStateForCommand(i,e);m=await pi.verify(e,i,v),!m.verified&&m.warnings.length>0&&console.log(pi.formatWarnings(m))}let p=null;if(di.requiresReasoning(e)){let v=await yt.loadStateForCommand(i,e);p=await di.reason(e,i,v),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(di.formatPlan(p)))}let g=t.task||t.description||"",f=await bi.buildContext(e,g,n),k=bi.buildAgenticPrompt(f),S=null;if(bi.requiresOrchestration(e)&&g)try{S=await hi.execute(e,g,n),S.detectedDomains.length>0&&ui.orchestrate(S.detectedDomains);for(let v of S.agents){let j=v.domain||v.name.replace(".md","");ui.startAgent(v.name,j,`Loading ${j} specialist...`),ui.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let v=S.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));mm(v)}}catch(v){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(v)}`)}let I={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},R=await yt.loadState(i),G=null,$e=null;i.projectId&&(G={commit_footer:await st.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await st.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await st.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await st.getSmartDecision(i.projectId,`preferred_agent_${e}`)},$e=await st.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let dt={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},qe=await kg.build(o,I,R,null,G,null,$e,dt,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),js.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:R,prompt:qe,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:I.agentsPath,agentRoutingPath:I.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:G,relevantMemories:$e,orchestratorContext:S,memory:{create:l(v=>st.createMemory(i.projectId,v),"create"),autoRemember:l((v,j,Ie)=>st.autoRemember(i.projectId,v,j,Ie),"autoRemember"),search:l(v=>st.searchMemories(i.projectId,v),"search"),findByTags:l(v=>st.findByTags(i.projectId,v),"findByTags"),getStats:l(()=>st.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(v=>Fe.recordGatheredInfo(i.projectId,v),"recordInfo"),setAnalysis:l(v=>Fe.setAnalysis(i.projectId,v),"setAnalysis"),propose:l(v=>Fe.proposePlan(i.projectId,v),"propose"),approve:l(v=>Fe.approvePlan(i.projectId,v),"approve"),reject:l(v=>Fe.rejectPlan(i.projectId,v),"reject"),getApprovalPrompt:l(()=>Fe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Fe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Fe.getNextStep(i.projectId),"getNextStep"),completeStep:l(v=>Fe.completeStep(i.projectId,v),"completeStep"),failStep:l(v=>Fe.failStep(i.projectId,v),"failStep"),abort:l(v=>Fe.abortPlan(i.projectId,v),"abort"),getStatus:l(()=>Fe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=js.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=js.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(!Ze.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ze.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Ba.load(e)).frontmatter["allowed-tools"]||[],i=await yt.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)}}}},UP=new $l,Pi=UP});import Ci from"node:fs/promises";import HP from"node:https";import GP from"node:os";import Ol from"node:path";import Ht from"chalk";var Fl,Cg,xg=w(()=>{"use strict";F();Me();Fl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Ol.join(GP.homedir(),".prjct-cli","config"),this.cacheFile=Ol.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Ol.join(__dirname,"..","..","package.json");return JSON.parse(await Ci.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=HP.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await D(this.cacheFile))return JSON.parse(await Ci.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await D(this.cacheDir)||await Ci.mkdir(this.cacheDir,{recursive:!0}),await Ci.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:`
877
+ `+Ht.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")+`
878
+ `+Ht.yellow("\u2502")+" "+Ht.bold("Update available!")+" "+Ht.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Ht.yellow("\u2502")+`
879
+ `+Ht.yellow("\u2502")+" "+Ht.yellow("\u2502")+`
880
+ `+Ht.yellow("\u2502")+" Run: "+Ht.cyan("npm update -g prjct-cli")+" "+Ht.yellow("\u2502")+`
881
+ `+Ht.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")+`
882
+ `}},Cg=Fl});var be,ot=w(()=>{"use strict";Ml();al();Dl();Tt();ke();xg();un();se();Me();Wn();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Cg,this.updateNotificationShown=!1,this.commandExecutor=Pi}get agent(){return ks.getAgent()}get agentInfo(){return ks.getInfo()}get currentAuthor(){return Rn.getCurrentAuthor()}async initializeAgent(){return ks.initialize()}async ensureProjectInit(e){return Rn.ensureInit(e)}async ensureAuthor(){return Rn.ensureAuthor()}async getGlobalProjectPath(e){return Rn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return mt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Rn.isEmptyDirectory(e)}async _detectExistingCode(e){return Rn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Oo.breakdownFeature(e)}_detectBugSeverity(e){return Oo.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ks.assignForTask(e,t,n)}}});var Tg={};hn(Tg,{PlanningCommands:()=>ts});import es from"node:path";async function zP(){if(!_l){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ti(),Eg));_l=new r}return _l}var _l,ts,xi=w(()=>{"use strict";Ro();an();$t();Qt();Dr();F();As();Rs();Qc();rl();ot();_l=null;l(zP,"getAnalysisCommands");ts=class extends be{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await $.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Ds(t).runNonInteractive());else if(a=await new Ds(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await ws(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await x.ensureProjectStructure(m);let p=x.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
883
883
 
884
884
  No current task. Use \`/p:now\` to set focus.
885
885
  `,"core/next.md":`# NEXT
@@ -899,7 +899,7 @@ No current task. Use \`/p:now\` to set focus.
899
899
  `,"planning/roadmap.md":`# ROADMAP
900
900
 
901
901
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
902
- `,"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 Ke.get("Write")(Zn.join(p,I),j);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let I=await jC();if((await I.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await I.sync(t,{aiTools:a.agents}):await I.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let S=n.idea;if(f&&!k){if(!S)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let I=Zn.join(p,"planning","architect-session.md"),j=`# Architect Session
902
+ `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[I,R]of Object.entries(g))await Ze.get("Write")(es.join(p,I),R);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let I=await zP();if((await I.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await I.sync(t,{aiTools:a.agents}):await I.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let S=n.idea;if(f&&!k){if(!S)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let I=es.join(p,"planning","architect-session.md"),R=`# Architect Session
903
903
 
904
904
  ## Idea
905
905
  ${S}
@@ -908,8 +908,8 @@ ${S}
908
908
  Initialized - awaiting stack recommendation
909
909
 
910
910
  Generated: ${new Date().toLocaleString()}
911
- `;return await Ke.get("Write")(I,j),await Ce.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await Ce.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";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await gt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=me(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await fe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:z.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await gt.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await fe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:z.getTimestamp()}),n.md?console.log(N(Z("Bug Reported",e),pt({Severity:a,Priority:m,Agent:u}),ce([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("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
912
- `);let s=await this.getGlobalProjectPath(t),o=Zn.join(s,"planning","architect-session.md"),i;try{i=await we.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
911
+ `;return await Ze.get("Write")(I,R),await Te.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await Te.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";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await yt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ge(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await he.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:W.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await yt.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 he.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:W.getTimestamp()}),n.md?console.log(N(Y("Bug Reported",e),ft({Severity:a,Priority:m,Agent:u}),ie([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),Pt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
912
+ `);let s=await this.getGlobalProjectPath(t),o=es.join(s,"planning","architect-session.md"),i;try{i=await we.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
913
913
 
914
914
  Create a plan first:
915
915
  1. Run /p:init in an empty directory
@@ -930,7 +930,7 @@ The architect plan is ready. Claude will now:
930
930
  4. Create starter files with boilerplate
931
931
  `),console.log(`
932
932
  \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.
933
- `),await this.logToMemory(t,"architect_executed",{timestamp:z.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=x.getGlobalProjectPath(o),u=Zn.join(c,"planning","architect-session.md"),d=`# Architect Session
933
+ `),await this.logToMemory(t,"architect_executed",{timestamp:W.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=x.getGlobalProjectPath(o),u=es.join(c,"planning","architect-session.md"),d=`# Architect Session
934
934
 
935
935
  ## Idea
936
936
  ${e}
@@ -945,14 +945,14 @@ Initialized - awaiting architecture design
945
945
  4. Generate roadmap
946
946
 
947
947
  Generated: ${new Date().toLocaleString()}
948
- `;return await Ke.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(N(Z("Idea Captured",e),pt({Mode:"architecture"}),ce([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
948
+ `;return await Ze.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(N(Y("Idea Captured",e),ft({Mode:"architecture"}),ie([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
949
949
  \u{1F4A1} Use /p:architect execute to continue planning
950
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Je.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(N(Z("Idea Captured",e),pt({Mode:"capture"}),ce([{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)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=x.getGlobalProjectPath(s),m=Zn.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
950
+ `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Xe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(N(Y("Idea Captured",e),ft({Mode:"capture"}),ie([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),Pt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=x.getGlobalProjectPath(s),m=es.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
951
951
  \u{1F4A1} Create one with /p:spec "feature name"
952
952
  `),{success:!0,specs:[]}):(console.log(`
953
953
  \u{1F4CB} SPECIFICATIONS
954
954
  `),console.log("\u2550".repeat(50)),f.forEach((k,S)=>{let I=k.replace(".md","").replace(/-/g," ");console.log(` ${S+1}. ${I}`)}),console.log(`${"\u2550".repeat(50)}
955
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=x.getGlobalProjectPath(s),i=Zn.join(o,"planning","specs");await we.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Zn.join(i,`${a}.md`),u=`# Specification: ${e}
955
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=x.getGlobalProjectPath(s),i=es.join(o,"planning","specs");await we.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=es.join(i,`${a}.md`),u=`# Specification: ${e}
956
956
 
957
957
  ## Overview
958
958
  [Brief description of the feature]
@@ -982,21 +982,21 @@ Generated: ${new Date().toLocaleString()}
982
982
  ---
983
983
  Created: ${new Date().toLocaleString()}
984
984
  Status: Draft
985
- `;return await Ke.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:z.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
985
+ `;return await Ze.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:W.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
986
986
  \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
987
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async _seedShipWorkflow(e,t){let n=await Zo(t),s=0;Pe.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),n.lint&&Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),n.test&&Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var vi,Tn,Cg=w(()=>{"use strict";rn();Po();wt();ke();F();De();zn();vi=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Si(),bg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw po.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await x.ensureProjectStructure(t),x.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await hs();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 sn(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 sn(e)).some(s=>t.includes(s))}catch(t){return C(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Tn=new vi});var DC,Pg,xg,$l,Tg,Eg=w(()=>{"use strict";ee();se();DC=1800*1e3,Pg=50,xg=200,$l=class{static{l(this,"SessionTracker")}async read(e){try{return A.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){A.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:DC}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Pg&&(s.current.commands=s.current.commands.slice(-Pg)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>xg&&(s.current.files=s.current.files.slice(-xg)),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:nn(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:nn(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}},Tg=new $l});import{exec as $C}from"node:child_process";import{promisify as MC}from"node:util";var Ml,OC,Ci,Nr,Ag=w(()=>{"use strict";ee();F();Eg();Ml=MC($C),OC={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Ci=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...OC,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=A.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Ml("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([Ml(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ml(`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(`
987
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async _seedShipWorkflow(e,t){let n=await ri(t),s=0;Pe.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),n.lint&&Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),n.test&&Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var Ei,Rn,Ag=w(()=>{"use strict";on();Ro();Tt();ke();F();Me();Wn();Ei=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(xi(),Tg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw yo.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await x.ensureProjectStructure(t),x.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ws();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 rn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return P(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await rn(e)).some(s=>t.includes(s))}catch(t){return P(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Rn=new Ei});var WP,Rg,Ig,Nl,Dg,jg=w(()=>{"use strict";ee();se();WP=1800*1e3,Rg=50,Ig=200,Nl=class{static{l(this,"SessionTracker")}async read(e){try{return A.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){A.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:WP}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Rg&&(s.current.commands=s.current.commands.slice(-Rg)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>Ig&&(s.current.files=s.current.files.slice(-Ig)),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:sn(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:sn(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}},Dg=new Nl});import{exec as VP}from"node:child_process";import{promisify as BP}from"node:util";var Ll,JP,Ai,Ur,$g=w(()=>{"use strict";ee();F();jg();Ll=BP(VP),JP={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Ai=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...JP,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=A.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Ll("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([Ll(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ll(`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(`
988
988
  `).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(`
989
- `)}async getSessionInfo(e){return Tg.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
989
+ `)}async getSessionInfo(e){return Dg.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
990
990
  `);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(`
991
- `)}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}},Nr=l((r,e)=>new Ci(r,e),"createStalenessChecker")});import jg from"node:fs/promises";import Pi from"node:path";function js(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 NC(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...js(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(...js(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(...js(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(...js(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...js(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&&!Dg.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function LC(r){return r.split(/\s+/).flatMap(e=>js(e)).filter(e=>e.length>1&&!Dg.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function $g(r,e){let t=[],n=await jg.readdir(r,{withFileTypes:!0});for(let s of n){if(_C.has(s.name))continue;let o=Pi.join(r,s.name);if(s.isDirectory())t.push(...await $g(o,e));else if(s.isFile()){let i=Pi.extname(s.name).toLowerCase();FC.has(i)&&t.push(Pi.relative(e,o))}}return t}async function UC(r){let e=await $g(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 jg.readFile(Pi.join(r,d),"utf-8"),p=NC(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 HC(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function GC(r,e){let t=LC(r);if(t.length===0)return[];let n=new Map;for(let s of t){let o=e.invertedIndex[s];if(!o)continue;let i=HC(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(Ig+1),m=c+Ig*(1-Rg+Rg*(u.length/e.avgDocLength)),p=i*(d/m);n.set(a,(n.get(a)||0)+p)}}return Array.from(n.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function zC(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]))};L.setDoc(r,Mg,t)}function WC(r){let e=L.getDoc(r,Mg);if(!e)return null;let t={};for(let[n,s]of Object.entries(e.docLengths))t[n]={tokens:[],length:s};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Og(r,e){let t=await UC(r);return zC(e,t),t}function Fg(r,e,t=15){let n=WC(r);return n?GC(e,n).slice(0,t):[]}var Ig,Rg,FC,Dg,_C,Mg,Ol=w(()=>{"use strict";ee();Ig=1.2,Rg=.75,FC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Dg=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"]),_C=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(js,"splitIdentifier");l(NC,"tokenizeFile");l(LC,"tokenizeQuery");l($g,"listFiles");l(UC,"buildIndex");l(HC,"idf");l(GC,"score");Mg="bm25-index";l(zC,"saveIndex");l(WC,"loadIndex");l(Og,"indexProject");l(Fg,"queryFiles")});import Fl from"node:fs/promises";import ln from"node:path";function KC(r){let e=[],t,n=new RegExp(qC.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function XC(r,e,t){let n;if(r.startsWith("@/"))n=ln.join(t,"src",r.slice(2));else{let s=ln.dirname(ln.join(t,e));n=ln.resolve(s,r)}for(let s of JC){let o=n+s;try{if((await Fl.stat(o)).isFile())return ln.relative(t,o)}catch{}}return null}async function _g(r,e){let t=[],n=await Fl.readdir(r,{withFileTypes:!0});for(let s of n){if(BC.has(s.name))continue;let o=ln.join(r,s.name);if(s.isDirectory())t.push(...await _g(o,e));else if(s.isFile()){let i=ln.extname(s.name).toLowerCase();VC.has(i)&&t.push(ln.relative(e,o))}}return t}async function YC(r){let e=await _g(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 Fl.readFile(ln.join(r,u),"utf-8"),m=KC(d),p=[];for(let g of m){let f=await XC(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 QC(r,e){L.setDoc(r,Ng,e)}function Lg(r){return L.getDoc(r,Ng)}async function Ug(r,e){let t=await YC(r);return QC(e,t),t}var VC,BC,JC,qC,Ng,_l=w(()=>{"use strict";ee();VC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),BC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),JC=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],qC=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(KC,"extractImportSources");l(XC,"resolveImport");l(_g,"listFiles");l(YC,"buildGraph");Ng="import-graph";l(QC,"saveGraph");l(Lg,"loadGraph");l(Ug,"indexImports")});function Hg(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Lg(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 Gg(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 zg=w(()=>{"use strict";_l();l(Hg,"propagateChanges");l(Gg,"affectedDomains")});import Nl from"node:fs/promises";import xi from"node:path";async function Wg(r,e){let t=[],n=await Nl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(eP.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=xi.join(r,o);if(s.isDirectory())t.push(...await Wg(i,e));else if(s.isFile()){let a=xi.extname(o).toLowerCase();ZC.has(a)&&t.push(xi.relative(e,i))}}return t}function tP(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 nP(r){let e=await Wg(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=xi.join(r,a),[u,d]=await Promise.all([Nl.readFile(c,"utf-8"),Nl.stat(c)]);return{path:a,hash:tP(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 sP(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 Ll(r,e){let t=L.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)})(),L.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function rP(r){let e=new Map;try{let t=L.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 Ul(r,e){let[t,n]=await Promise.all([nP(r),Promise.resolve(rP(e))]);return{diff:sP(t,n),currentHashes:t}}function Vg(r){return L.hasDoc(r,"file-hashes-meta")}var ZC,eP,Bg=w(()=>{"use strict";ee();ZC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),eP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Wg,"listProjectFiles");l(tP,"hashContent");l(nP,"computeHashes");l(sP,"diffHashes");l(Ll,"saveHashes");l(rP,"loadHashes");l(Ul,"detectChanges");l(Vg,"hasHashRegistry")});import{exec as oP}from"node:child_process";import{promisify as iP}from"node:util";async function lP(r,e=100){try{let{stdout:t}=await aP(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
992
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=qg&&n.push(s),s=new Set):i&&s&&uP(i)&&s.add(i)}return s&&s.size>0&&s.size<=qg&&n.push(s),n}catch{return[]}}function uP(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 dP(r,e=100){let t=await lP(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=pP(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<Jg||m<Jg)continue;let p=d+m-a,g=p>0?a/p:0;g<cP||(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 pP(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function gP(r,e){L.setDoc(r,mP,e)}async function Kg(r,e,t=100){let n=await dP(r,t);return gP(e,n),n}var aP,cP,Jg,qg,mP,Xg=w(()=>{"use strict";ee();aP=iP(oP),cP=.1,Jg=2,qg=30;l(lP,"parseGitLog");l(uP,"isSourceFile");l(dP,"buildMatrix");l(pP,"pairKey");mP="cochange-index";l(gP,"saveMatrix");l(Kg,"indexCoChanges")});import Ds from"node:fs/promises";import fP from"node:os";import Yg from"node:path";var Hl,hP,Qg,Zg=w(()=>{"use strict";F();Hl=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=fP.homedir(),this.configDir=Yg.join(this.homeDir,".prjct-cli","config"),this.configFile=Yg.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ds.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Ds.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,provider:n,lastInstall:new Date().toISOString(),path:t};return await Ds.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",y(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await Ds.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){try{return await Ds.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await Ds.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},hP=new Hl,Qg=hP});var zl={};Dn(zl,{installAntigravitySkill:()=>rf,installCodexSkill:()=>Gl,needsAntigravityInstallation:()=>vP,run:()=>sf,verifyCodexPRouterReady:()=>Ei});import{execSync as yP}from"node:child_process";import{createHash as wP}from"node:crypto";import V from"node:fs/promises";import ts from"node:os";import Y from"node:path";import le from"chalk";async function kP(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!bs.isAvailable("npm"))return console.log(`${le.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${le.dim(`Install ${r.displayName} using one of:`)}`),console.log(le.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(le.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(le.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(le.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),yP(`npm install -g ${e}`,{stdio:"inherit",timeout:Ss("NPM_INSTALL")}),console.log(""),console.log(`${le.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(le.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(le.dim("The npm install took too long. Try:")),console.log(le.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(le.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(le.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(le.dim("Alternative installation methods:")),console.log(le.dim(` \u2022 npm: npm install -g ${e}`)),console.log(le.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(le.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(le.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function sf(){let r=await ir(),e=await ga(),t=st[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let a of s){let c=st[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await kP(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ce.detectActiveProvider()){let p=await Ce.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ce.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ce.installDocs(),await TP(),await on.ensureReady()}}else if(a==="gemini"){await SP()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await bP();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await so()).installed&&(await rf()).success&&console.log(` ${le.green("\u2713")} Antigravity skill installed`),(await Mn()).installed){if(!(await Gl()).success)throw new Error("Codex skill installation failed");let c=await Ei({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${le.green("\u2713")} Codex skill installed`),console.log(` ${le.green("\u2713")} Codex p. router ready`)}await Qg.saveConfig($e,await Ce.getInstallPath(),e.provider),await xP();for(let a of n.providers)EP(a,st[a.provider]);return n}async function SP(){try{let r=Y.join(ts.homedir(),".gemini","commands"),e=Y.join(r,"p.toml");await V.mkdir(r,{recursive:!0});let t=ge("commands/p.toml");if(t)return await V.writeFile(e,t,"utf-8"),!0;let n=Y.join(ae,"templates","commands","p.toml");return await R(n)?(await V.copyFile(n,e),!0):!1}catch(r){return U.warn(`Gemini router warning: ${y(r)}`),!1}}async function bP(){try{let r=Y.join(ts.homedir(),".gemini"),e=Y.join(r,"GEMINI.md");await V.mkdir(r,{recursive:!0});let t=ge("global/GEMINI.md");if(!t){let p=Y.join(ae,"templates","global","GEMINI.md");t=await V.readFile(p,"utf-8")}let n="",s=!1;try{n=await V.readFile(e,"utf-8"),s=!0}catch(p){if(C(p))s=!1;else throw p}if(!s)return await V.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
991
+ `)}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}},Ur=l((r,e)=>new Ai(r,e),"createStalenessChecker")});import Fg from"node:fs/promises";import Ri from"node:path";function $s(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 XP(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...$s(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(...$s(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(...$s(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(...$s(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...$s(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&&!_g.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function YP(r){return r.split(/\s+/).flatMap(e=>$s(e)).filter(e=>e.length>1&&!_g.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Ng(r,e){let t=[],n=await Fg.readdir(r,{withFileTypes:!0});for(let s of n){if(KP.has(s.name))continue;let o=Ri.join(r,s.name);if(s.isDirectory())t.push(...await Ng(o,e));else if(s.isFile()){let i=Ri.extname(s.name).toLowerCase();qP.has(i)&&t.push(Ri.relative(e,o))}}return t}async function QP(r){let e=await Ng(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 Fg.readFile(Ri.join(r,d),"utf-8"),p=XP(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 ZP(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function eC(r,e){let t=YP(r);if(t.length===0)return[];let n=new Map;for(let s of t){let o=e.invertedIndex[s];if(!o)continue;let i=ZP(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(Mg+1),m=c+Mg*(1-Og+Og*(u.length/e.avgDocLength)),p=i*(d/m);n.set(a,(n.get(a)||0)+p)}}return Array.from(n.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function tC(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]))};U.setDoc(r,Lg,t)}function nC(r){let e=U.getDoc(r,Lg);if(!e)return null;let t={};for(let[n,s]of Object.entries(e.docLengths))t[n]={tokens:[],length:s};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Ug(r,e){let t=await QP(r);return tC(e,t),t}function Hg(r,e,t=15){let n=nC(r);return n?eC(e,n).slice(0,t):[]}var Mg,Og,qP,_g,KP,Lg,Ul=w(()=>{"use strict";ee();Mg=1.2,Og=.75,qP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),_g=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"]),KP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l($s,"splitIdentifier");l(XP,"tokenizeFile");l(YP,"tokenizeQuery");l(Ng,"listFiles");l(QP,"buildIndex");l(ZP,"idf");l(eC,"score");Lg="bm25-index";l(tC,"saveIndex");l(nC,"loadIndex");l(Ug,"indexProject");l(Hg,"queryFiles")});import Hl from"node:fs/promises";import dn from"node:path";function aC(r){let e=[],t,n=new RegExp(iC.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function cC(r,e,t){let n;if(r.startsWith("@/"))n=dn.join(t,"src",r.slice(2));else{let s=dn.dirname(dn.join(t,e));n=dn.resolve(s,r)}for(let s of oC){let o=n+s;try{if((await Hl.stat(o)).isFile())return dn.relative(t,o)}catch{}}return null}async function Gg(r,e){let t=[],n=await Hl.readdir(r,{withFileTypes:!0});for(let s of n){if(rC.has(s.name))continue;let o=dn.join(r,s.name);if(s.isDirectory())t.push(...await Gg(o,e));else if(s.isFile()){let i=dn.extname(s.name).toLowerCase();sC.has(i)&&t.push(dn.relative(e,o))}}return t}async function lC(r){let e=await Gg(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 Hl.readFile(dn.join(r,u),"utf-8"),m=aC(d),p=[];for(let g of m){let f=await cC(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 uC(r,e){U.setDoc(r,zg,e)}function Wg(r){return U.getDoc(r,zg)}async function Vg(r,e){let t=await lC(r);return uC(e,t),t}var sC,rC,oC,iC,zg,Gl=w(()=>{"use strict";ee();sC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),rC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),oC=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],iC=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(aC,"extractImportSources");l(cC,"resolveImport");l(Gg,"listFiles");l(lC,"buildGraph");zg="import-graph";l(uC,"saveGraph");l(Wg,"loadGraph");l(Vg,"indexImports")});function Bg(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Wg(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 Jg(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 qg=w(()=>{"use strict";Gl();l(Bg,"propagateChanges");l(Jg,"affectedDomains")});import zl from"node:fs/promises";import Ii from"node:path";async function Kg(r,e){let t=[],n=await zl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(pC.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Ii.join(r,o);if(s.isDirectory())t.push(...await Kg(i,e));else if(s.isFile()){let a=Ii.extname(o).toLowerCase();dC.has(a)&&t.push(Ii.relative(e,i))}}return t}function mC(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 gC(r){let e=await Kg(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=Ii.join(r,a),[u,d]=await Promise.all([zl.readFile(c,"utf-8"),zl.stat(c)]);return{path:a,hash:mC(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 fC(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 Wl(r,e){let t=U.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)})(),U.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function hC(r){let e=new Map;try{let t=U.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 Vl(r,e){let[t,n]=await Promise.all([gC(r),Promise.resolve(hC(e))]);return{diff:fC(t,n),currentHashes:t}}function Xg(r){return U.hasDoc(r,"file-hashes-meta")}var dC,pC,Yg=w(()=>{"use strict";ee();dC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),pC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Kg,"listProjectFiles");l(mC,"hashContent");l(gC,"computeHashes");l(fC,"diffHashes");l(Wl,"saveHashes");l(hC,"loadHashes");l(Vl,"detectChanges");l(Xg,"hasHashRegistry")});import{exec as yC}from"node:child_process";import{promisify as wC}from"node:util";async function bC(r,e=100){try{let{stdout:t}=await kC(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
992
+ `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Zg&&n.push(s),s=new Set):i&&s&&vC(i)&&s.add(i)}return s&&s.size>0&&s.size<=Zg&&n.push(s),n}catch{return[]}}function vC(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 PC(r,e=100){let t=await bC(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=CC(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<Qg||m<Qg)continue;let p=d+m-a,g=p>0?a/p:0;g<SC||(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 CC(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function TC(r,e){U.setDoc(r,xC,e)}async function ef(r,e,t=100){let n=await PC(r,t);return TC(e,n),n}var kC,SC,Qg,Zg,xC,tf=w(()=>{"use strict";ee();kC=wC(yC),SC=.1,Qg=2,Zg=30;l(bC,"parseGitLog");l(vC,"isSourceFile");l(PC,"buildMatrix");l(CC,"pairKey");xC="cochange-index";l(TC,"saveMatrix");l(ef,"indexCoChanges")});import Ms from"node:fs/promises";import EC from"node:os";import nf from"node:path";var Bl,AC,sf,rf=w(()=>{"use strict";F();Bl=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=EC.homedir(),this.configDir=nf.join(this.homeDir,".prjct-cli","config"),this.configFile=nf.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ms.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Ms.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,provider:n,lastInstall:new Date().toISOString(),path:t};return await Ms.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",y(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await Ms.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){try{return await Ms.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await Ms.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},AC=new Bl,sf=AC});var ql={};hn(ql,{installAntigravitySkill:()=>uf,installCodexSkill:()=>Jl,needsAntigravityInstallation:()=>MC,run:()=>lf,verifyCodexPRouterReady:()=>ji});import{execSync as RC}from"node:child_process";import{createHash as IC}from"node:crypto";import B from"node:fs/promises";import ns from"node:os";import Q from"node:path";import le from"chalk";async function DC(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Ps.isAvailable("npm"))return console.log(`${le.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${le.dim(`Install ${r.displayName} using one of:`)}`),console.log(le.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(le.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(le.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(le.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),RC(`npm install -g ${e}`,{stdio:"inherit",timeout:vs("NPM_INSTALL")}),console.log(""),console.log(`${le.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(le.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(le.dim("The npm install took too long. Try:")),console.log(le.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(le.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(le.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(le.dim("Alternative installation methods:")),console.log(le.dim(` \u2022 npm: npm install -g ${e}`)),console.log(le.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(le.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(le.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function lf(){let r=await cr(),e=await Sa(),t=at[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let a of s){let c=at[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await DC(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Te.detectActiveProvider()){let p=await Te.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Te.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Te.installDocs(),await NC(),await cn.ensureReady()}}else if(a==="gemini"){await jC()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await $C();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await co()).installed&&(await uf()).success&&console.log(` ${le.green("\u2713")} Antigravity skill installed`),(await On()).installed){if(!(await Jl()).success)throw new Error("Codex skill installation failed");let c=await ji({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${le.green("\u2713")} Codex skill installed`),console.log(` ${le.green("\u2713")} Codex p. router ready`)}await sf.saveConfig(Oe,await Te.getInstallPath(),e.provider),await _C();for(let a of n.providers)LC(a,at[a.provider]);return n}async function jC(){try{let r=Q.join(ns.homedir(),".gemini","commands"),e=Q.join(r,"p.toml");await B.mkdir(r,{recursive:!0});let t=ue("commands/p.toml");if(t)return await B.writeFile(e,t,"utf-8"),!0;let n=Q.join(ce,"templates","commands","p.toml");return await D(n)?(await B.copyFile(n,e),!0):!1}catch(r){return L.warn(`Gemini router warning: ${y(r)}`),!1}}async function $C(){try{let r=Q.join(ns.homedir(),".gemini"),e=Q.join(r,"GEMINI.md");await B.mkdir(r,{recursive:!0});let t=ue("global/GEMINI.md");if(!t){let p=Q.join(ce,"templates","global","GEMINI.md");t=await B.readFile(p,"utf-8")}let n="",s=!1;try{n=await B.readFile(e,"utf-8"),s=!0}catch(p){if(P(p))s=!1;else throw p}if(!s)return await B.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
993
993
 
994
- ${t}`;return await V.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await V.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return U.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function rf(){try{let r=Y.join(ts.homedir(),".gemini","antigravity","skills"),e=Y.join(r,"prjct"),t=Y.join(e,"SKILL.md");await V.mkdir(e,{recursive:!0});let n=await R(t),s=ge("antigravity/SKILL.md");if(!s){let o=Y.join(ae,"templates","antigravity","SKILL.md");if(!await R(o))return U.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await V.readFile(o,"utf-8")}return await V.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return U.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function vP(){let r=await so();return r.installed&&!r.skillInstalled}function af(){return Y.join(ts.homedir(),".codex","skills","prjct","SKILL.md")}function CP(r){return`<!-- ${of}: ${JSON.stringify({version:$e,templateHash:r})} -->`}function ef(r){let e=r.match(new RegExp(`<!--\\s*${of}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function PP(r){return wP("sha256").update(r).digest("hex")}async function cf(){let r=ge("codex/SKILL.md");if(r)return r;let e=Y.join(ae,"templates","codex","SKILL.md");return await R(e)?V.readFile(e,"utf-8"):null}function lf(r){let e=r.trimEnd(),t=PP(e),n=CP(t);return{content:`${e}
994
+ ${t}`;return await B.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await B.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return L.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function uf(){try{let r=Q.join(ns.homedir(),".gemini","antigravity","skills"),e=Q.join(r,"prjct"),t=Q.join(e,"SKILL.md");await B.mkdir(e,{recursive:!0});let n=await D(t),s=ue("antigravity/SKILL.md");if(!s){let o=Q.join(ce,"templates","antigravity","SKILL.md");if(!await D(o))return L.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await B.readFile(o,"utf-8")}return await B.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return L.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function MC(){let r=await co();return r.installed&&!r.skillInstalled}function pf(){return Q.join(ns.homedir(),".codex","skills","prjct","SKILL.md")}function OC(r){return`<!-- ${df}: ${JSON.stringify({version:Oe,templateHash:r})} -->`}function of(r){let e=r.match(new RegExp(`<!--\\s*${df}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function FC(r){return IC("sha256").update(r).digest("hex")}async function mf(){let r=ue("codex/SKILL.md");if(r)return r;let e=Q.join(ce,"templates","codex","SKILL.md");return await D(e)?B.readFile(e,"utf-8"):null}function gf(r){let e=r.trimEnd(),t=FC(e),n=OC(t);return{content:`${e}
995
995
 
996
996
  ${n}
997
- `,templateHash:t}}async function Gl(){try{let r=af(),e=Y.dirname(r);await V.mkdir(e,{recursive:!0});let t=await R(r),n=await cf();if(!n)return U.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=lf(n);return t&&await V.readFile(r,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await V.writeFile(r,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return U.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ei(r={}){let e=af();if(!(await Mn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await cf();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=lf(n),o=l(async()=>r.autoRepair?(await Gl()).success:!1,"maybeRepair"),i="";if(!await R(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await V.readFile(e,"utf-8").catch(()=>"");let a=ef(i);if(!(a?.version===$e&&a?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await V.readFile(e,"utf-8").catch(()=>""),a=ef(i),!(a?.version===$e&&a?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await yc.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=hc(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function xP(){try{let r=Y.join(ts.homedir(),".prjct-cli","projects");if(!await R(r))return;let e=(await V.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=A.getDoc(n,"project");if(!s)continue;s.cliVersion!==$e&&(s.cliVersion=$e,A.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${le.green("\u2713")} Updated ${t} project(s) to v${$e}`)}catch(r){C(r)||U.warn(`Migration warning: ${y(r)}`)}}async function tf(r,e){let t={};if(await R(r))try{t=JSON.parse(await V.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await V.writeFile(r,JSON.stringify(t,null,2))}async function TP(){try{let r=Y.join(ts.homedir(),".claude"),e=Y.join(r,"settings.json"),t=Y.join(r,"prjct-statusline.sh"),n=Y.join(ts.homedir(),".prjct-cli","statusline"),s=Y.join(n,"statusline.sh"),o=Y.join(n,"themes"),i=Y.join(n,"lib"),a=Y.join(n,"components"),c=Y.join(n,"config.json"),u=Y.join(ae,"assets","statusline"),d=Y.join(u,"statusline.sh"),m=Y.join(u,"themes"),p=Y.join(u,"lib"),g=Y.join(u,"components"),f=Y.join(u,"default-config.json");if(await R(r)||await V.mkdir(r,{recursive:!0}),await R(n)||await V.mkdir(n,{recursive:!0}),await R(o)||await V.mkdir(o,{recursive:!0}),await R(i)||await V.mkdir(i,{recursive:!0}),await R(a)||await V.mkdir(a,{recursive:!0}),await R(s)){let k=await V.readFile(s,"utf8");if(k.includes("CLI_VERSION=")){let S=k.match(/CLI_VERSION="([^"]*)"/);if(S&&S[1]!==$e){let I=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${$e}"`);await V.writeFile(s,I,{mode:493})}await Ti(p,i),await Ti(g,a),await nf(t,s),await tf(e,t);return}}if(await R(d)){let k=await V.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${$e}"`),await V.writeFile(s,k,{mode:493}),await Ti(p,i),await Ti(g,a),await R(m)){let S=await V.readdir(m);for(let I of S){let j=Y.join(m,I),q=Y.join(o,I);await V.copyFile(j,q)}}!await R(c)&&await R(f)&&await V.copyFile(f,c)}else{let k=`#!/bin/bash
997
+ `,templateHash:t}}async function Jl(){try{let r=pf(),e=Q.dirname(r);await B.mkdir(e,{recursive:!0});let t=await D(r),n=await mf();if(!n)return L.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=gf(n);return t&&await B.readFile(r,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await B.writeFile(r,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return L.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function ji(r={}){let e=pf();if(!(await On()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await mf();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=gf(n),o=l(async()=>r.autoRepair?(await Jl()).success:!1,"maybeRepair"),i="";if(!await D(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await B.readFile(e,"utf-8").catch(()=>"");let a=of(i);if(!(a?.version===Oe&&a?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await B.readFile(e,"utf-8").catch(()=>""),a=of(i),!(a?.version===Oe&&a?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await vc.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=bc(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function _C(){try{let r=Q.join(ns.homedir(),".prjct-cli","projects");if(!await D(r))return;let e=(await B.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=A.getDoc(n,"project");if(!s)continue;s.cliVersion!==Oe&&(s.cliVersion=Oe,A.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${le.green("\u2713")} Updated ${t} project(s) to v${Oe}`)}catch(r){P(r)||L.warn(`Migration warning: ${y(r)}`)}}async function af(r,e){let t={};if(await D(r))try{t=JSON.parse(await B.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await B.writeFile(r,JSON.stringify(t,null,2))}async function NC(){try{let r=Q.join(ns.homedir(),".claude"),e=Q.join(r,"settings.json"),t=Q.join(r,"prjct-statusline.sh"),n=Q.join(ns.homedir(),".prjct-cli","statusline"),s=Q.join(n,"statusline.sh"),o=Q.join(n,"themes"),i=Q.join(n,"lib"),a=Q.join(n,"components"),c=Q.join(n,"config.json"),u=Q.join(ce,"assets","statusline"),d=Q.join(u,"statusline.sh"),m=Q.join(u,"themes"),p=Q.join(u,"lib"),g=Q.join(u,"components"),f=Q.join(u,"default-config.json");if(await D(r)||await B.mkdir(r,{recursive:!0}),await D(n)||await B.mkdir(n,{recursive:!0}),await D(o)||await B.mkdir(o,{recursive:!0}),await D(i)||await B.mkdir(i,{recursive:!0}),await D(a)||await B.mkdir(a,{recursive:!0}),await D(s)){let k=await B.readFile(s,"utf8");if(k.includes("CLI_VERSION=")){let S=k.match(/CLI_VERSION="([^"]*)"/);if(S&&S[1]!==Oe){let I=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`);await B.writeFile(s,I,{mode:493})}await Di(p,i),await Di(g,a),await cf(t,s),await af(e,t);return}}if(await D(d)){let k=await B.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`),await B.writeFile(s,k,{mode:493}),await Di(p,i),await Di(g,a),await D(m)){let S=await B.readdir(m);for(let I of S){let R=Q.join(m,I),G=Q.join(o,I);await B.copyFile(R,G)}}!await D(c)&&await D(f)&&await B.copyFile(f,c)}else{let k=`#!/bin/bash
998
998
  # prjct Status Line for Claude Code
999
- CLI_VERSION="${$e}"
999
+ CLI_VERSION="${Oe}"
1000
1000
  input=$(cat)
1001
1001
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
1002
1002
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -1025,25 +1025,25 @@ if [ -f "$CONFIG" ]; then
1025
1025
  fi
1026
1026
  fi
1027
1027
  echo "prjct"
1028
- `;await V.writeFile(s,k,{mode:493})}await nf(t,s),await tf(e,t)}catch(r){C(r)||U.warn(`Status line warning: ${y(r)}`)}}async function Ti(r,e){if(!await R(r))return;let t=await V.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=Y.join(r,n),o=Y.join(e,n);await V.copyFile(s,o),await V.chmod(o,493)}}async function nf(r,e){try{if(await R(r)){if((await V.lstat(r)).isSymbolicLink()&&await V.readlink(r)===e)return;await V.unlink(r)}await V.symlink(e,r)}catch{try{await R(e)&&(await V.copyFile(e,r),await V.chmod(r,493))}catch(n){C(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function EP(r,e){if(console.log(""),r.cliInstalled?console.log(` ${le.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${le.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${le.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${le.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${le.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${le.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${le.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var of,AP,Ai=w(()=>{"use strict";Jt();ks();Uo();wc();ee();F();bn();De();Pn();$t();Ge();kn();Zg();l(kP,"installAICLI");l(sf,"run");l(SP,"installGeminiRouter");l(bP,"installGeminiGlobalConfig");l(rf,"installAntigravitySkill");l(vP,"needsAntigravityInstallation");of="prjct-codex-router";l(af,"getCodexSkillPath");l(CP,"getCodexSkillMetadata");l(ef,"parseCodexSkillMetadata");l(PP,"hashContent");l(cf,"loadCodexSkillTemplate");l(lf,"buildCodexSkillContent");l(Gl,"installCodexSkill");l(Ei,"verifyCodexPRouterReady");l(xP,"migrateProjectsCliVersion");l(tf,"ensureStatusLineSettings");l(TP,"installStatusLine");l(Ti,"installStatusLineModules");l(nf,"ensureStatusLineSymlink");l(EP,"showResults");AP=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");AP&&sf().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});function xt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function ns(){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 Wl=w(()=>{"use strict";l(xt,"cite");l(ns,"defaultSources")});function Ii(r,e){let t=[];return e==="full"?(t.push("## prjct Rules"),t.push(""),t.push("### Path Resolution"),t.push(`**ALL prjct writes go to**: \`~/.prjct-cli/projects/${r.projectId}/\``),t.push("- NEVER write to `.prjct/`"),t.push("- NEVER write to `./` for prjct data"),t.push(""),t.push("### Workflow"),t.push("```"),t.push('p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship'),t.push("```"),t.push(""),t.push("| Command | Action |"),t.push("|---------|--------|"),t.push("| `p. sync` | Re-analyze project |"),t.push("| `p. task X` | Start task |"),t.push("| `p. done` | Complete subtask |"),t.push("| `p. ship X` | Ship feature |"),t.push("")):(t.push("## prjct Rules"),t.push(""),t.push(`Path: \`~/.prjct-cli/projects/${r.projectId}/\``),t.push('Workflow: `p. sync` \u2192 `p. task "desc"` \u2192 work \u2192 `p. done` \u2192 `p. ship`'),t.push("")),t.push("## Project State"),t.push(""),t.push("| Field | Value |"),t.push("|-------|-------|"),t.push(`| Name | ${r.name} |`),t.push(`| Version | ${r.version} |`),t.push(`| Ecosystem | ${r.ecosystem} |`),t.push(`| Branch | ${r.branch} |`),t.push(`| Files | ~${r.fileCount} |`),t.push(`| Commits | ${r.commits} |`),t.push(""),(r.agents.workflow.length>0||r.agents.domain.length>0)&&(t.push("## Agents"),t.push(""),t.push(`Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:`),t.push(""),t.push(`**Workflow**: ${r.agents.workflow.join(", ")}`),t.push(`**Domain**: ${r.agents.domain.join(", ")||"none"}`),t.push("")),r.learnings&&(r.learnings.completedTasks.length>0||r.learnings.resolvedBugs.length>0||r.learnings.shippedFeatures.length>0)&&(t.push("## Recent Learnings"),t.push(""),r.learnings.completedTasks.length>0&&(t.push("### Completed Tasks"),t.push(r.learnings.completedTasks.map(n=>`- ${n.description}${n.branch?` (${n.branch})`:""}`).join(`
1028
+ `;await B.writeFile(s,k,{mode:493})}await cf(t,s),await af(e,t)}catch(r){P(r)||L.warn(`Status line warning: ${y(r)}`)}}async function Di(r,e){if(!await D(r))return;let t=await B.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=Q.join(r,n),o=Q.join(e,n);await B.copyFile(s,o),await B.chmod(o,493)}}async function cf(r,e){try{if(await D(r)){if((await B.lstat(r)).isSymbolicLink()&&await B.readlink(r)===e)return;await B.unlink(r)}await B.symlink(e,r)}catch{try{await D(e)&&(await B.copyFile(e,r),await B.chmod(r,493))}catch(n){P(n)||L.warn(`Symlink fallback warning: ${n.message}`)}}}function LC(r,e){if(console.log(""),r.cliInstalled?console.log(` ${le.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${le.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${le.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${le.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${le.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${le.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${le.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var df,UC,$i=w(()=>{"use strict";Kt();bs();Vo();Pc();ee();F();Cn();Me();En();Ot();ze();an();rf();l(DC,"installAICLI");l(lf,"run");l(jC,"installGeminiRouter");l($C,"installGeminiGlobalConfig");l(uf,"installAntigravitySkill");l(MC,"needsAntigravityInstallation");df="prjct-codex-router";l(pf,"getCodexSkillPath");l(OC,"getCodexSkillMetadata");l(of,"parseCodexSkillMetadata");l(FC,"hashContent");l(mf,"loadCodexSkillTemplate");l(gf,"buildCodexSkillContent");l(Jl,"installCodexSkill");l(ji,"verifyCodexPRouterReady");l(_C,"migrateProjectsCliVersion");l(af,"ensureStatusLineSettings");l(NC,"installStatusLine");l(Di,"installStatusLineModules");l(cf,"ensureStatusLineSymlink");l(LC,"showResults");UC=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");UC&&lf().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});function Rt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function ss(){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 Kl=w(()=>{"use strict";l(Rt,"cite");l(ss,"defaultSources")});function Mi(r,e){let t=[];return e==="full"?(t.push("## prjct Rules"),t.push(""),t.push("### Path Resolution"),t.push(`**ALL prjct writes go to**: \`~/.prjct-cli/projects/${r.projectId}/\``),t.push("- NEVER write to `.prjct/`"),t.push("- NEVER write to `./` for prjct data"),t.push(""),t.push("### Workflow"),t.push("```"),t.push('p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship'),t.push("```"),t.push(""),t.push("| Command | Action |"),t.push("|---------|--------|"),t.push("| `p. sync` | Re-analyze project |"),t.push("| `p. task X` | Start task |"),t.push("| `p. done` | Complete subtask |"),t.push("| `p. ship X` | Ship feature |"),t.push("")):(t.push("## prjct Rules"),t.push(""),t.push(`Path: \`~/.prjct-cli/projects/${r.projectId}/\``),t.push('Workflow: `p. sync` \u2192 `p. task "desc"` \u2192 work \u2192 `p. done` \u2192 `p. ship`'),t.push("")),t.push("## Project State"),t.push(""),t.push("| Field | Value |"),t.push("|-------|-------|"),t.push(`| Name | ${r.name} |`),t.push(`| Version | ${r.version} |`),t.push(`| Ecosystem | ${r.ecosystem} |`),t.push(`| Branch | ${r.branch} |`),t.push(`| Files | ~${r.fileCount} |`),t.push(`| Commits | ${r.commits} |`),t.push(""),(r.agents.workflow.length>0||r.agents.domain.length>0)&&(t.push("## Agents"),t.push(""),t.push(`Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:`),t.push(""),t.push(`**Workflow**: ${r.agents.workflow.join(", ")}`),t.push(`**Domain**: ${r.agents.domain.join(", ")||"none"}`),t.push("")),r.learnings&&(r.learnings.completedTasks.length>0||r.learnings.resolvedBugs.length>0||r.learnings.shippedFeatures.length>0)&&(t.push("## Recent Learnings"),t.push(""),r.learnings.completedTasks.length>0&&(t.push("### Completed Tasks"),t.push(r.learnings.completedTasks.map(n=>`- ${n.description}${n.branch?` (${n.branch})`:""}`).join(`
1029
1029
  `)),t.push("")),r.learnings.resolvedBugs.length>0&&(t.push("### Resolved Bugs"),t.push(r.learnings.resolvedBugs.map(n=>`- ${n.description}`).join(`
1030
1030
  `)),t.push("")),r.learnings.shippedFeatures.length>0&&(t.push("### Shipped Features"),t.push(r.learnings.shippedFeatures.map(n=>`- **${n.name}** (v${n.version})${n.description?`: ${n.description}`:""}`).join(`
1031
1031
  `)),t.push(""))),t.join(`
1032
- `)}function Lr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
1033
- `)}function Ur(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
1034
- `)}function Vl(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?`
1032
+ `)}function Hr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
1033
+ `)}function Gr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
1034
+ `)}function Xl(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?`
1035
1035
  ### Project Structure
1036
1036
 
1037
1037
  ${e.join(`
1038
1038
  `)}
1039
- `:""}function IP(r){let e=[];return r.patterns?.length>0&&e.push(`
1039
+ `:""}function HC(r){let e=[];return r.patterns?.length>0&&e.push(`
1040
1040
  ### Code Patterns (Follow These)
1041
1041
 
1042
- ${Lr(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
1042
+ ${Hr(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
1043
1043
  ### Anti-Patterns (Avoid These)
1044
1044
 
1045
- ${Ur(r.antiPatterns)}`),e.push(Vl(r)),e.join(`
1046
- `)}function RP(r,e){let t=r.sources||ns();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
1045
+ ${Gr(r.antiPatterns)}`),e.push(Xl(r)),e.join(`
1046
+ `)}function GC(r,e){let t=r.sources||ss();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
1047
1047
  # ${r.name} - Project Rules
1048
1048
  <!-- projectId: ${r.projectId} -->
1049
1049
  <!-- Generated: ${new Date().toISOString()} -->
@@ -1051,13 +1051,13 @@ ${Ur(r.antiPatterns)}`),e.push(Vl(r)),e.join(`
1051
1051
 
1052
1052
  ## THIS PROJECT (${r.ecosystem})
1053
1053
 
1054
- ${xt(t.ecosystem)}
1054
+ ${Rt(t.ecosystem)}
1055
1055
  **Type:** ${r.projectType}
1056
1056
  **Path:** ${r.repoPath}
1057
1057
 
1058
1058
  ### Commands (USE THESE, NOT OTHERS)
1059
1059
 
1060
- ${xt(t.commands)}
1060
+ ${Rt(t.commands)}
1061
1061
  | Action | Command |
1062
1062
  |--------|---------|
1063
1063
  | Install dependencies | \`${r.commands.install}\` |
@@ -1069,11 +1069,11 @@ ${xt(t.commands)}
1069
1069
 
1070
1070
  ### Code Conventions
1071
1071
 
1072
- ${xt(t.languages)}
1072
+ ${Rt(t.languages)}
1073
1073
  - **Languages**: ${r.languages.join(", ")||"Not detected"}
1074
- ${xt(t.frameworks)}
1074
+ ${Rt(t.frameworks)}
1075
1075
  - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
1076
- ${r.analysis?IP(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
1076
+ ${r.analysis?HC(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
1077
1077
  ---
1078
1078
 
1079
1079
  ## PRJCT RULES
@@ -1099,7 +1099,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
1099
1099
 
1100
1100
  ## PROJECT STATE
1101
1101
 
1102
- ${xt(t.name)}
1102
+ ${Rt(t.name)}
1103
1103
  | Field | Value |
1104
1104
  |-------|-------|
1105
1105
  | Name | ${r.name} |
@@ -1136,16 +1136,16 @@ ${r.learnings.shippedFeatures.length>0?r.learnings.shippedFeatures.map(n=>`- **$
1136
1136
  `):"_(No shipped features yet)_"}
1137
1137
  `:"> Run `p. sync` to populate learnings from task history"}
1138
1138
  <!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->
1139
- `}function jP(r,e){let t=r.sources||ns(),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(xt(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(xt(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(Lr(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Ur(r.analysis.antiPatterns)),n.push(""));let s=Vl(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.push(""),n.push(Ii(r,"concise")),n.join(`
1140
- `)}function DP(r,e){let t=r.sources||ns(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(xt(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(Lr(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(Ur(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(xt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push(Ii(r,"concise")),n.join(`
1141
- `)}function $P(r,e){let t=r.sources||ns(),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(xt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(xt(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(Lr(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Ur(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.push(""),n.push(Ii(r,"concise")),n.join(`
1142
- `)}function MP(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."),t.push(""),t.push("prjct Rules:"),t.push(`- All prjct data: ~/.prjct-cli/projects/${r.projectId}/`),t.push('- Workflow: p. sync \u2192 p. task "desc" \u2192 work \u2192 p. done \u2192 p. ship'),t.push(""),t.push(`Project: ${r.name} v${r.version} | ${r.ecosystem} | Branch: ${r.branch} | Files: ~${r.fileCount}`),r.agents.workflow.length>0&&t.push(`Agents: ${[...r.agents.workflow,...r.agents.domain].join(", ")}`);let s={systemMessage:t.join(`
1143
- `),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 OP(r,e){let t=[];return t.push("<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->"),t.push(`# ${r.name} - Project Rules`),t.push(`<!-- projectId: ${r.projectId} -->`),t.push(`<!-- Generated: ${new Date().toISOString()} -->`),t.push(`<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->`),t.push(""),t.push(`## THIS PROJECT (${r.ecosystem})`),t.push(""),t.push(`**Type:** ${r.projectType}`),t.push(`**Path:** ${r.repoPath}`),t.push(""),t.push("### Commands (USE THESE, NOT OTHERS)"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install dependencies | \`${r.commands.install}\` |`),t.push(`| Run dev server | \`${r.commands.dev}\` |`),t.push(`| Run tests | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(`| Lint | \`${r.commands.lint}\` |`),t.push(`| Format | \`${r.commands.format}\` |`),t.push(""),t.push("### Code Conventions"),t.push(""),t.push(`- **Languages**: ${r.languages.join(", ")||"Not detected"}`),t.push(`- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}`),r.analysis?(r.analysis.patterns?.length>0&&(t.push(""),t.push("### Code Patterns (Follow These)"),t.push(""),t.push(Lr(r.analysis.patterns))),r.analysis.antiPatterns?.length>0&&(t.push(""),t.push("### Anti-Patterns (Avoid These)"),t.push(""),t.push(Ur(r.analysis.antiPatterns))),t.push(Vl(r.analysis))):(t.push(""),t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("---"),t.push(""),t.push(Ii(r,"full")),t.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
1144
- `)}function uf(r){return{claude:RP,cursor:jP,copilot:DP,windsurf:$P,continue:MP,codex:OP}[r]||null}var Bl=w(()=>{"use strict";Wl();l(Ii,"formatOperationalContext");l(Lr,"formatPatterns");l(Ur,"formatAntiPatterns");l(Vl,"formatStructure");l(IP,"formatAnalysisForClaude");l(RP,"formatForClaude");l(jP,"formatForCursor");l(DP,"formatForCopilot");l($P,"formatForWindsurf");l(MP,"formatForContinue");l(OP,"formatForCodex");l(uf,"getFormatter")});import{exec as FP}from"node:child_process";import df from"node:os";import Zt from"node:path";import{promisify as _P}from"node:util";function pf(r){return ji[r]||null}function mf(r){let e=df.homedir();switch(r){case"claude":return Zt.join(e,".claude","CLAUDE.md");case"gemini":return Zt.join(e,".gemini","GEMINI.md");case"codex":return Zt.join(e,".codex","CODEX.md");case"aider":return Zt.join(e,".aider","AIDER.md");default:return""}}async function Ri(r){try{return await NP(`which ${r}`),!0}catch{return!1}}async function Di(r=process.cwd()){let e=[];return await Ri("claude")&&e.push("claude"),(await Ri("cursor")||await R(Zt.join(r,".cursor")))&&e.push("cursor"),await R(Zt.join(r,".github"))&&e.push("copilot"),(await Ri("windsurf")||await R(Zt.join(r,".windsurf")))&&e.push("windsurf"),(await R(Zt.join(r,".continue"))||await R(Zt.join(df.homedir(),".continue")))&&e.push("continue"),(await Ri("codex")||await R(Zt.join(r,".agents")))&&e.push("codex"),e}async function gf(r,e=process.cwd()){if(r==="auto"){let t=await Di(e);return t.length>0?t:["claude"]}return r==="all"?LP:r.filter(t=>ji[t])}var NP,ji,$s,LP,Jl=w(()=>{"use strict";De();NP=_P(FP),ji={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"}},$s=["claude"],LP=Object.keys(ji);l(pf,"getAIToolConfig");l(mf,"getGlobalConfigPath");l(Ri,"commandExists");l(Di,"detectInstalledTools");l(gf,"resolveToolIds")});import Hr from"node:fs/promises";import UP from"node:path";function hf(r){let e=r.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function HP(r){let e=[],t="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",n="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->",s=0;for(;;){let o=r.indexOf(t,s);if(o===-1)break;let i=r.indexOf(n,o);if(i===-1){console.warn("\u26A0\uFE0F Found project section without end marker, skipping...");break}let a=r.substring(o,i+n.length),c=hf(a);c&&e.push({projectId:c,startIndex:o,endIndex:i+n.length,content:a}),s=i+n.length}return e}function GP(r){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n=r.indexOf(e),s=r.indexOf(t);return n!==-1&&s!==-1&&s>n?r.substring(n,s+t.length):null}async function yf(r,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let n=hf(t);if(n!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${n||"none"}`);await Hr.mkdir(UP.dirname(r),{recursive:!0});let s="";try{s=await Hr.readFile(r,"utf-8")}catch(d){if(d.code!=="ENOENT")throw d}if(!s.trim()){await ff(r,t);return}let o=GP(s),i=HP(s),a=i.findIndex(d=>d.projectId===e),c;a!==-1?(c=[...i],c[a]={projectId:e,startIndex:0,endIndex:0,content:t}):c=[...i,{projectId:e,startIndex:0,endIndex:0,content:t}];let u="";o&&(u+=`${o}
1139
+ `}function zC(r,e){let t=r.sources||ss(),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(Rt(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(Rt(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(Hr(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Gr(r.analysis.antiPatterns)),n.push(""));let s=Xl(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.push(""),n.push(Mi(r,"concise")),n.join(`
1140
+ `)}function WC(r,e){let t=r.sources||ss(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(Rt(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(Hr(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(Gr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(Rt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push(Mi(r,"concise")),n.join(`
1141
+ `)}function VC(r,e){let t=r.sources||ss(),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(Rt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(Rt(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(Hr(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Gr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.push(""),n.push(Mi(r,"concise")),n.join(`
1142
+ `)}function BC(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."),t.push(""),t.push("prjct Rules:"),t.push(`- All prjct data: ~/.prjct-cli/projects/${r.projectId}/`),t.push('- Workflow: p. sync \u2192 p. task "desc" \u2192 work \u2192 p. done \u2192 p. ship'),t.push(""),t.push(`Project: ${r.name} v${r.version} | ${r.ecosystem} | Branch: ${r.branch} | Files: ~${r.fileCount}`),r.agents.workflow.length>0&&t.push(`Agents: ${[...r.agents.workflow,...r.agents.domain].join(", ")}`);let s={systemMessage:t.join(`
1143
+ `),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 JC(r,e){let t=[];return t.push("<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->"),t.push(`# ${r.name} - Project Rules`),t.push(`<!-- projectId: ${r.projectId} -->`),t.push(`<!-- Generated: ${new Date().toISOString()} -->`),t.push(`<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->`),t.push(""),t.push(`## THIS PROJECT (${r.ecosystem})`),t.push(""),t.push(`**Type:** ${r.projectType}`),t.push(`**Path:** ${r.repoPath}`),t.push(""),t.push("### Commands (USE THESE, NOT OTHERS)"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install dependencies | \`${r.commands.install}\` |`),t.push(`| Run dev server | \`${r.commands.dev}\` |`),t.push(`| Run tests | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(`| Lint | \`${r.commands.lint}\` |`),t.push(`| Format | \`${r.commands.format}\` |`),t.push(""),t.push("### Code Conventions"),t.push(""),t.push(`- **Languages**: ${r.languages.join(", ")||"Not detected"}`),t.push(`- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}`),r.analysis?(r.analysis.patterns?.length>0&&(t.push(""),t.push("### Code Patterns (Follow These)"),t.push(""),t.push(Hr(r.analysis.patterns))),r.analysis.antiPatterns?.length>0&&(t.push(""),t.push("### Anti-Patterns (Avoid These)"),t.push(""),t.push(Gr(r.analysis.antiPatterns))),t.push(Xl(r.analysis))):(t.push(""),t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("---"),t.push(""),t.push(Mi(r,"full")),t.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
1144
+ `)}function ff(r){return{claude:GC,cursor:zC,copilot:WC,windsurf:VC,continue:BC,codex:JC}[r]||null}var Yl=w(()=>{"use strict";Kl();l(Mi,"formatOperationalContext");l(Hr,"formatPatterns");l(Gr,"formatAntiPatterns");l(Xl,"formatStructure");l(HC,"formatAnalysisForClaude");l(GC,"formatForClaude");l(zC,"formatForCursor");l(WC,"formatForCopilot");l(VC,"formatForWindsurf");l(BC,"formatForContinue");l(JC,"formatForCodex");l(ff,"getFormatter")});import{exec as qC}from"node:child_process";import hf from"node:os";import tn from"node:path";import{promisify as KC}from"node:util";function yf(r){return Fi[r]||null}function wf(r){let e=hf.homedir();switch(r){case"claude":return tn.join(e,".claude","CLAUDE.md");case"gemini":return tn.join(e,".gemini","GEMINI.md");case"codex":return tn.join(e,".codex","CODEX.md");case"aider":return tn.join(e,".aider","AIDER.md");default:return""}}async function Oi(r){try{return await XC(`which ${r}`),!0}catch{return!1}}async function _i(r=process.cwd()){let e=[];return await Oi("claude")&&e.push("claude"),(await Oi("cursor")||await D(tn.join(r,".cursor")))&&e.push("cursor"),await D(tn.join(r,".github"))&&e.push("copilot"),(await Oi("windsurf")||await D(tn.join(r,".windsurf")))&&e.push("windsurf"),(await D(tn.join(r,".continue"))||await D(tn.join(hf.homedir(),".continue")))&&e.push("continue"),(await Oi("codex")||await D(tn.join(r,".agents")))&&e.push("codex"),e}async function kf(r,e=process.cwd()){if(r==="auto"){let t=await _i(e);return t.length>0?t:["claude"]}return r==="all"?YC:r.filter(t=>Fi[t])}var XC,Fi,Os,YC,Ql=w(()=>{"use strict";Me();XC=KC(qC),Fi={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"}},Os=["claude"],YC=Object.keys(Fi);l(yf,"getAIToolConfig");l(wf,"getGlobalConfigPath");l(Oi,"commandExists");l(_i,"detectInstalledTools");l(kf,"resolveToolIds")});import zr from"node:fs/promises";import QC from"node:path";function bf(r){let e=r.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function ZC(r){let e=[],t="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",n="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->",s=0;for(;;){let o=r.indexOf(t,s);if(o===-1)break;let i=r.indexOf(n,o);if(i===-1){console.warn("\u26A0\uFE0F Found project section without end marker, skipping...");break}let a=r.substring(o,i+n.length),c=bf(a);c&&e.push({projectId:c,startIndex:o,endIndex:i+n.length,content:a}),s=i+n.length}return e}function ex(r){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n=r.indexOf(e),s=r.indexOf(t);return n!==-1&&s!==-1&&s>n?r.substring(n,s+t.length):null}async function vf(r,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let n=bf(t);if(n!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${n||"none"}`);await zr.mkdir(QC.dirname(r),{recursive:!0});let s="";try{s=await zr.readFile(r,"utf-8")}catch(d){if(d.code!=="ENOENT")throw d}if(!s.trim()){await Sf(r,t);return}let o=ex(s),i=ZC(s),a=i.findIndex(d=>d.projectId===e),c;a!==-1?(c=[...i],c[a]={projectId:e,startIndex:0,endIndex:0,content:t}):c=[...i,{projectId:e,startIndex:0,endIndex:0,content:t}];let u="";o&&(u+=`${o}
1145
1145
 
1146
1146
  `);for(let d of c)u+=d.content,d!==c[c.length-1]&&(u+=`
1147
1147
 
1148
- `);await ff(r,u)}async function ff(r,e){let t=`${r}.tmp.${Date.now()}`;try{await Hr.writeFile(t,e,"utf-8"),await Hr.rename(t,r)}catch(n){try{await Hr.unlink(t)}catch{}throw n}}var wf=w(()=>{"use strict";l(hf,"extractProjectId");l(HP,"findProjectSections");l(GP,"extractGlobalSection");l(yf,"updateProjectSection");l(ff,"writeFileAtomic")});import ql from"node:fs/promises";import Kl from"node:path";async function kf(r,e,t,n=$s){let s=[];for(let o of n){let i=pf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await zP(r,i,e,t);s.push(a)}return s}async function zP(r,e,t,n){let s=uf(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;if(e.outputPath==="repo")i=Kl.join(n,e.outputFile);else{let a=mf(e.id);a?i=a:i=Kl.join(t,"context",e.outputFile)}if(await ql.mkdir(Kl.dirname(i),{recursive:!0}),e.outputPath==="global")await yf(i,r.projectId,o);else{try{let a=await ql.readFile(i,"utf-8"),c=Va(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Wa(o,a)}catch{}await ql.writeFile(i,o,"utf-8")}return{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 Sf=w(()=>{"use strict";F();Ba();Bl();Jl();wf();l(kf,"generateAIToolContexts");l(zP,"generateForTool")});var bf=w(()=>{"use strict";Bl();Sf();Jl()});async function vf(r){try{let e=A.getDb(r),t=e.prepare(`
1148
+ `);await Sf(r,u)}async function Sf(r,e){let t=`${r}.tmp.${Date.now()}`;try{await zr.writeFile(t,e,"utf-8"),await zr.rename(t,r)}catch(n){try{await zr.unlink(t)}catch{}throw n}}var Pf=w(()=>{"use strict";l(bf,"extractProjectId");l(ZC,"findProjectSections");l(ex,"extractGlobalSection");l(vf,"updateProjectSection");l(Sf,"writeFileAtomic")});import Zl from"node:fs/promises";import eu from"node:path";async function Cf(r,e,t,n=Os){let s=[];for(let o of n){let i=yf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await tx(r,i,e,t);s.push(a)}return s}async function tx(r,e,t,n){let s=ff(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;if(e.outputPath==="repo")i=eu.join(n,e.outputFile);else{let a=wf(e.id);a?i=a:i=eu.join(t,"context",e.outputFile)}if(await Zl.mkdir(eu.dirname(i),{recursive:!0}),e.outputPath==="global")await vf(i,r.projectId,o);else{try{let a=await Zl.readFile(i,"utf-8"),c=Xa(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Ka(o,a)}catch{}await Zl.writeFile(i,o,"utf-8")}return{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 xf=w(()=>{"use strict";F();Ya();Yl();Ql();Pf();l(Cf,"generateAIToolContexts");l(tx,"generateForTool")});var Tf=w(()=>{"use strict";Yl();xf();Ql()});async function Ef(r){try{let e=A.getDb(r),t=e.prepare(`
1149
1149
  SELECT description, completed_at, branch
1150
1150
  FROM tasks
1151
1151
  WHERE status = 'done' OR status = 'shipped'
@@ -1163,8 +1163,8 @@ ${r.learnings.shippedFeatures.length>0?r.learnings.shippedFeatures.map(n=>`- **$
1163
1163
  FROM shipped_features
1164
1164
  ORDER BY shipped_at DESC
1165
1165
  LIMIT 5
1166
- `).all();return{completedTasks:t.map(o=>({description:o.description,completedAt:o.completed_at||"unknown",branch:o.branch})),resolvedBugs:n.map(o=>({description:o.description,resolution:o.resolution||"completed"})),shippedFeatures:s.map(o=>({name:o.name,description:o.description||"",version:o.version})),patterns:[]}}catch{return{completedTasks:[],resolvedBugs:[],shippedFeatures:[],patterns:[]}}}var Cf=w(()=>{"use strict";ee();l(vf,"extractLearningsFromDB")});import $i from"node:fs/promises";import Mi from"node:path";var Xl,Yl,Pf,xf=w(()=>{"use strict";F();Xl=".prjct/.prjct-state.md",Yl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=Mi.join(e,Xl);await $i.mkdir(Mi.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await $i.writeFile(n,s,"utf-8")}async remove(e){try{await $i.unlink(Mi.join(e,Xl))}catch(t){if(!C(t))throw t}}async exists(e){let t=Mi.join(e,Xl);try{return await $i.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(`
1167
- `)}},Pf=new Yl});import Ql from"node:fs/promises";import WP from"node:os";import Tf from"node:path";function Zl(){return Tf.join(WP.homedir(),".prjct-cli","skills",VP)}function BP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Gr(){try{let r=await Ql.readFile(Zl(),"utf-8");return JSON.parse(r)}catch{return BP()}}async function eu(r){let e=Zl();await Ql.mkdir(Tf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Ql.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function JP(r){let e=await Gr();e.skills[r.name]=r,await eu(e)}async function qP(r){let e=await Gr();return r in e.skills?(delete e.skills[r],await eu(e),!0):!1}async function KP(r){return(await Gr()).skills[r]||null}async function XP(){return(await Gr()).skills}function YP(){return Zl()}var VP,zr,Ef=w(()=>{"use strict";VP=".skill-lock.json";l(Zl,"getLockFilePath");l(BP,"createEmptyLockFile");l(Gr,"read");l(eu,"write");l(JP,"addEntry");l(qP,"removeEntry");l(KP,"getEntry");l(XP,"getAll");l(YP,"getPath");zr={read:Gr,write:eu,addEntry:JP,removeEntry:qP,getEntry:KP,getAll:XP,getPath:YP}});import{exec as QP}from"node:child_process";import un from"node:fs/promises";import nu from"node:os";import nt from"node:path";import{promisify as ZP}from"node:util";import{glob as Af}from"glob";function Rf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?nt.join(nu.homedir(),r.slice(1)):nt.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 jf(r){let e=[];try{let s=nt.join(r,"SKILL.md");await un.access(s);let o=nt.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Af("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=nt.basename(nt.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Af("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=nt.basename(nt.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function ex(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()}
1166
+ `).all();return{completedTasks:t.map(o=>({description:o.description,completedAt:o.completed_at||"unknown",branch:o.branch})),resolvedBugs:n.map(o=>({description:o.description,resolution:o.resolution||"completed"})),shippedFeatures:s.map(o=>({name:o.name,description:o.description||"",version:o.version})),patterns:[]}}catch{return{completedTasks:[],resolvedBugs:[],shippedFeatures:[],patterns:[]}}}var Af=w(()=>{"use strict";ee();l(Ef,"extractLearningsFromDB")});import Ni from"node:fs/promises";import Li from"node:path";var tu,nu,Rf,If=w(()=>{"use strict";F();tu=".prjct/.prjct-state.md",nu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=Li.join(e,tu);await Ni.mkdir(Li.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await Ni.writeFile(n,s,"utf-8")}async remove(e){try{await Ni.unlink(Li.join(e,tu))}catch(t){if(!P(t))throw t}}async exists(e){let t=Li.join(e,tu);try{return await Ni.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(`
1167
+ `)}},Rf=new nu});import su from"node:fs/promises";import nx from"node:os";import Df from"node:path";function ru(){return Df.join(nx.homedir(),".prjct-cli","skills",sx)}function rx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Wr(){try{let r=await su.readFile(ru(),"utf-8");return JSON.parse(r)}catch{return rx()}}async function ou(r){let e=ru();await su.mkdir(Df.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await su.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function ox(r){let e=await Wr();e.skills[r.name]=r,await ou(e)}async function ix(r){let e=await Wr();return r in e.skills?(delete e.skills[r],await ou(e),!0):!1}async function ax(r){return(await Wr()).skills[r]||null}async function cx(){return(await Wr()).skills}function lx(){return ru()}var sx,Vr,jf=w(()=>{"use strict";sx=".skill-lock.json";l(ru,"getLockFilePath");l(rx,"createEmptyLockFile");l(Wr,"read");l(ou,"write");l(ox,"addEntry");l(ix,"removeEntry");l(ax,"getEntry");l(cx,"getAll");l(lx,"getPath");Vr={read:Wr,write:ou,addEntry:ox,removeEntry:ix,getEntry:ax,getAll:cx,getPath:lx}});import{exec as ux}from"node:child_process";import pn from"node:fs/promises";import au from"node:os";import it from"node:path";import{promisify as dx}from"node:util";import{glob as $f}from"glob";function Of(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?it.join(au.homedir(),r.slice(1)):it.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 Ff(r){let e=[];try{let s=it.join(r,"SKILL.md");await pn.access(s);let o=it.basename(r);e.push({name:o,filePath:s})}catch{}let t=await $f("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=it.basename(it.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await $f("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=it.basename(it.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function px(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()}
1168
1168
  ${s.join(`
1169
1169
  `)}`;return r.replace(o,`---
1170
1170
  ${c}
@@ -1173,10 +1173,10 @@ ${s.join(`
1173
1173
  `)}
1174
1174
  ---
1175
1175
 
1176
- ${r}`}function su(){return nt.join(nu.homedir(),".claude","skills")}async function tu(r,e,t,n){let s=su(),o=nt.join(s,e),i=nt.join(o,"SKILL.md"),a=await un.readFile(r,"utf-8"),c=ex(a,t,n);return await un.mkdir(o,{recursive:!0}),await un.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function tx(r){let e={installed:[],skipped:[],errors:[]};if(!bs.isAvailable("git")){let n=bs.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=nt.join(nu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await If(`git clone --depth 1 ${n} ${t}`,{timeout:Ss("GIT_CLONE")});let s;try{let{stdout:a}=await If("git rev-parse HEAD",{cwd:t,timeout:Ss("TOOL_CHECK")});s=a.trim()}catch{}let o=await jf(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 tu(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 zr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await un.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function nx(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await un.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await un.stat(t)).isFile()){let s=nt.basename(nt.dirname(t));try{let o=await tu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await zr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await jf(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 tu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await zr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function sx(r){let e=su(),t=nt.join(e,r);try{await un.rm(t,{recursive:!0,force:!0})}catch{}let n=nt.join(e,`${r}.md`);try{await un.rm(n,{force:!0})}catch{}return zr.removeEntry(r)}async function rx(r){let e=Rf(r);switch(e.type){case"github":return tx(e);case"local":return nx(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var If,Df,$f=w(()=>{"use strict";F();bn();Uo();Ef();If=ZP(QP);l(Rf,"parseSource");l(jf,"discoverSkills");l(ex,"injectSourceMetadata");l(su,"getInstallDir");l(tu,"installSkillFile");l(tx,"installFromGitHub");l(nx,"installFromLocal");l(sx,"remove");l(rx,"install");Df={install:rx,remove:sx,parseSource:Rf,getInstallDir:su}});import Tt from"node:fs/promises";import ox from"node:os";import vt from"node:path";async function Mf(r,e,t,n){let s=[],o=vt.join(r,"agents");try{let c=await Tt.readdir(o);for(let u of c)u.endsWith(".md")&&await Tt.unlink(vt.join(o,u))}catch(c){U.debug("Failed to purge old agents",{path:o,error:X(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>ix(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=>ax(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 Of(r){let e=vt.join(r,"agents"),t=[];try{let n=await Tt.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 Ff(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=ge(`subagents/${o}.md`);if(!i){let a=vt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Tt.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 ix(r,e){let t="";try{let n=vt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Tt.readFile(n,"utf-8"),t=await Ff(t)}catch(n){U.debug("Workflow agent template not found, generating minimal",{name:r,error:X(n)}),t=lx(r)}await Tt.writeFile(vt.join(e,`${r}.md`),t,"utf-8")}async function ax(r,e,t,n,s){let o="";try{let i=vt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Tt.readFile(i,"utf-8"),o=await Ff(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){U.debug("Domain agent template not found, generating minimal",{name:r,error:X(i)}),o=ux(r,t,n)}o=cx(o,r,s),await Tt.writeFile(vt.join(e,`${r}.md`),o,"utf-8")}function cx(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=[`
1176
+ ${r}`}function cu(){return it.join(au.homedir(),".claude","skills")}async function iu(r,e,t,n){let s=cu(),o=it.join(s,e),i=it.join(o,"SKILL.md"),a=await pn.readFile(r,"utf-8"),c=px(a,t,n);return await pn.mkdir(o,{recursive:!0}),await pn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function mx(r){let e={installed:[],skipped:[],errors:[]};if(!Ps.isAvailable("git")){let n=Ps.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=it.join(au.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Mf(`git clone --depth 1 ${n} ${t}`,{timeout:vs("GIT_CLONE")});let s;try{let{stdout:a}=await Mf("git rev-parse HEAD",{cwd:t,timeout:vs("TOOL_CHECK")});s=a.trim()}catch{}let o=await Ff(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 iu(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 Vr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await pn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function gx(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await pn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await pn.stat(t)).isFile()){let s=it.basename(it.dirname(t));try{let o=await iu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await Vr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await Ff(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 iu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await Vr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function fx(r){let e=cu(),t=it.join(e,r);try{await pn.rm(t,{recursive:!0,force:!0})}catch{}let n=it.join(e,`${r}.md`);try{await pn.rm(n,{force:!0})}catch{}return Vr.removeEntry(r)}async function hx(r){let e=Of(r);switch(e.type){case"github":return mx(e);case"local":return gx(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Mf,_f,Nf=w(()=>{"use strict";F();Cn();Vo();jf();Mf=dx(ux);l(Of,"parseSource");l(Ff,"discoverSkills");l(px,"injectSourceMetadata");l(cu,"getInstallDir");l(iu,"installSkillFile");l(mx,"installFromGitHub");l(gx,"installFromLocal");l(fx,"remove");l(hx,"install");_f={install:hx,remove:fx,parseSource:Of,getInstallDir:cu}});import It from"node:fs/promises";import yx from"node:os";import Ct from"node:path";async function Lf(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await It.readdir(o);for(let u of c)u.endsWith(".md")&&await It.unlink(Ct.join(o,u))}catch(c){L.debug("Failed to purge old agents",{path:o,error:X(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>wx(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=>kx(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 Uf(r){let e=Ct.join(r,"agents"),t=[];try{let n=await It.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 Hf(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=ue(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await It.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 wx(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await It.readFile(n,"utf-8"),t=await Hf(t)}catch(n){L.debug("Workflow agent template not found, generating minimal",{name:r,error:X(n)}),t=bx(r)}await It.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function kx(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await It.readFile(i,"utf-8"),o=await Hf(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){L.debug("Domain agent template not found, generating minimal",{name:r,error:X(i)}),o=vx(r,t,n)}o=Sx(o,r,s),await It.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function Sx(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=[`
1177
1177
  ## Recent Learnings (from completed tasks)
1178
1178
  `];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(`
1179
- `)}function lx(r){return`---
1179
+ `)}function bx(r){return`---
1180
1180
  name: ${r}
1181
1181
  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"}
1182
1182
  tools: Read, Write, Glob
@@ -1192,7 +1192,7 @@ When invoked:
1192
1192
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
1193
1193
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
1194
1194
  3. Execute requested operation
1195
- `}function ux(r,e,t){return`---
1195
+ `}function vx(r,e,t){return`---
1196
1196
  name: ${r}
1197
1197
  description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
1198
1198
  tools: Read, Write, Glob, Grep
@@ -1212,21 +1212,21 @@ Domain specialist for ${r} tasks.
1212
1212
  ## Your Role
1213
1213
 
1214
1214
  You are the ${r} expert for this project. Apply best practices for the detected stack.
1215
- `}function _f(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:b(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Tt.writeFile(vt.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{U.debug("Failed to write skills.json",{error:X(o)})}),n}async function Nf(r){let e=[];try{let t=vt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Tt.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=vt.join(ox.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=vt.join(a,d,"SKILL.md"),p=vt.join(a,`${d}.md`),g=!1;try{await Tt.access(m),g=!0}catch{try{await Tt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let S=await Df.install(k);S.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),U.info(`Installed skill: ${d} for agent: ${u}`)):S.errors.length>0?(e.push({name:d,agent:u,status:"error"}),U.debug(`Failed to install skill ${d}`,{errors:S.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),U.debug(`Skill install error for ${d}`,{error:X(f)})}}}catch(t){U.debug("Skill auto-installation failed (non-critical)",{error:X(t)})}return e}var Lf=w(()=>{"use strict";Jt();rn();se();Pn();$f();l(Mf,"generateAgents");l(Of,"loadExistingAgents");l(Ff,"resolveTemplateIncludes");l(ix,"generateWorkflowAgent");l(ax,"generateDomainAgent");l(cx,"injectFeedbackSection");l(lx,"generateMinimalWorkflowAgent");l(ux,"generateMinimalDomainAgent");l(_f,"configureSkills");l(Nf,"autoInstallSkills")});import Uf from"node:fs/promises";import Hf from"node:path";var Oi,Gf=w(()=>{"use strict";Oi=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=Hf.join(this.projectPath,"package.json"),t=await Uf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Uf.access(Hf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as dx}from"node:child_process";import zf from"node:fs/promises";import ru from"node:path";import{promisify as px}from"node:util";async function Wf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ss("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await ss("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await ss("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await ss("git status --porcelain",{cwd:r}),i=o.trim().split(`
1216
- `).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 ss('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
1217
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ss('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:X(t)})}return e}async function en(r,e){try{return await zf.access(ru.join(r,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:X(t)}),!1}}async function Vf(r){let e={fileCount:0,version:"0.0.0",name:ru.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ss('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){U.debug("File count failed",{path:r,error:X(t)}),e.fileCount=0}try{let t=ru.join(r,"package.json"),n=JSON.parse(await zf.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 en(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:r,error:X(t)})}return await en(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await en(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await en(r,"requirements.txt")||await en(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 Bf(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 en(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 en(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 en(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 en(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 en(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 Jf(r,e){let t=ns(),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 qf(r){return new Oi(r).detect()}var ss,Kf=w(()=>{"use strict";rn();Wl();Pn();Gf();ss=px(dx);l(Wf,"analyzeGit");l(en,"fileExists");l(Vf,"gatherStats");l(Bf,"detectCommands");l(Jf,"buildSources");l(qf,"detectStack")});import{exec as mx}from"node:child_process";import ou from"node:fs/promises";import Fi from"node:path";import{promisify as gx}from"node:util";var fx,iu,au,Xf,Yf=w(()=>{"use strict";Xt();F();fx=gx(mx),iu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Fi.join(r,s);try{await ou.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=Fi.basename(r);try{await _.read(n)}catch(s){C(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Fi.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 ou.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await ou.readFile(Fi.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}}},au=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[iu.contextFilesExist(t),iu.jsonFilesValid(t),iu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await fx(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}}}},Xf=new au});import _i from"node:fs/promises";import Ni from"node:path";var Li,En,cu=w(()=>{"use strict";gr();Ol();zg();Bg();Xg();_l();rn();Ge();kn();wt();ke();Ai();Pr();vn();ee();xr();Ko();Yo();Ps();Er();xs();bf();Cf();se();Pn();Yc();Qc();ks();xf();gc();bc();Lf();Kf();Yf();Li=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 i=await Di(e),a=i.filter(u=>$s.includes(u)||u==="codex"),c=i.filter(u=>!$s.includes(u)&&u!=="codex");s=[...a.length>0?a:$s,...c],s=Array.from(new Set(s))}else t.aiTools[0]==="auto"?(s=await Di(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await gf("all",e):s=t.aiTools;let o={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if((await Mn()).installed){let O=await Ei({autoRepair:!0});if(!O.verified)return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:`Codex p. router is required but not ready: ${O.message||"verification failed"}. Run 'prjct start' or 'prjct setup' to repair.`}}try{o=await on.ensureReady()}catch(O){return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:!1,message:X(O)},error:`Context7 MCP is required but not ready: ${X(O)}. Run 'prjct start' to repair.`}}this.globalPath=x.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Tr(this.projectId);try{let O=await Xo(this.projectId);O>0&&U.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){U.debug("Legacy JSON sweep failed (non-critical)",{error:X(O)})}let[c,u,d,m]=await Promise.all([Wf(this.projectPath),Vf(this.projectPath),Bf(this.projectPath),qf(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,S=new Set;if(!p&&Vg(this.projectId))try{let{diff:O,currentHashes:Bh}=await Ul(this.projectPath,this.projectId),Fu=O.added.length+O.modified.length+O.deleted.length;if(Fu===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let oa=Hg(O,this.projectId);S=Gg(oa.allAffected);let Jh=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=oa.allAffected.some(Rn=>{let qh=Rn.substring(Rn.lastIndexOf("."));return Jh.has(qh)}),k=oa.directlyChanged.some(Rn=>Rn==="package.json"||Rn==="tsconfig.json"||Rn.includes("Dockerfile")||Rn.includes("docker-compose")),g={isIncremental:!0,filesChanged:Fu,filesUnchanged:O.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(S)}}Ll(this.projectId,Bh)}catch(O){U.debug("Incremental detection failed, falling back to full sync",{error:X(O)})}else try{let{currentHashes:O}=await Ul(this.projectPath,this.projectId);Ll(this.projectId,O)}catch(O){U.debug("Hash computation failed (non-critical)",{error:X(O)})}if(f)try{await Promise.all([Og(this.projectPath,this.projectId),Ug(this.projectPath,this.projectId),Kg(this.projectPath,this.projectId)])}catch(O){U.debug("File ranking index build failed (non-critical)",{error:X(O)})}let I;if(k)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(I=O)}catch{}let j=k?await Mf(this.globalPath,m,u,I):await Of(this.globalPath),q=_f(j,this.projectId,this.globalPath),Fe=k?await Nf(j):[],ct=Jf(u,d),Ve=[],v;try{let O=await Ue.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(v={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let D;try{D=await vf(this.projectId)}catch{}let Ie={projectId:this.projectId,name:u.name,version:u.version,ecosystem:u.ecosystem,projectType:u.projectType,languages:u.languages,frameworks:u.frameworks,repoPath:this.projectPath,branch:c.branch,fileCount:u.fileCount,commits:c.commits,hasChanges:c.hasChanges,commands:d,agents:{workflow:j.filter(O=>O.type==="workflow").map(O=>O.name),domain:j.filter(O=>O.type==="domain").map(O=>O.name)},sources:ct,analysis:v,learnings:D},tr=await kf(Ie,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let nr=await Ue.getActive(this.projectId),Gt={patterns:nr?.patterns?.length||0,antiPatterns:nr?.antiPatterns?.length||0,criticalAntiPatterns:nr?.antiPatterns?.filter(O=>O.severity==="high").length||0},Wh=Date.now()-n,Vh=await this.recordSyncMetrics(u,Ve,j,Wh);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ce.installGlobalConfig(),await Ce.syncCommands();let Ou;try{let O=await $.readConfig(this.projectPath);Ou=await Xf.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){U.debug("Verification failed (non-critical)",{error:X(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:j,skills:q,skillsInstalled:Fe,contextFiles:Ve,aiTools:tr.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Gt,syncMetrics:Vh,verification:Ou,incremental:g}}catch(i){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:[],context7:{installed:o.installed,verified:o.verified,message:o.message},error:X(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>_i.mkdir(Ni.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=A.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await Pf.generate(this.projectPath,s)}catch(o){U.debug("Local state generation failed (optional)",{error:X(o)})}}async logToMemory(e,t){A.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=Ni.join(this.globalPath,m),g=await _i.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:X(p)})}for(let m of n)try{let p=Ni.join(this.globalPath,"agents",`${m.name}.md`),g=await _i.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:X(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){U.debug("Failed to record sync metrics",{error:X(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n,s){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Op.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...n.frameworks])),feedback:c,context7Verified:s});i=u.patterns,a=u.antiPatterns,await Ue.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){U.debug("Failed to save draft analysis (non-critical)",{error:X(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([dt.archiveOldShipped(this.projectId).catch(()=>0),Je.markDormantIdeas(this.projectId).catch(()=>0),fe.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),ut.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:X(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Fn,n=await Xc.learnFromTaskHistory(this.projectId,e,t);try{let s=await rm.getFeatureOutcomes(this.projectId);s.length>0&&await Xc.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:X(e)})}}async getCliVersion(){try{let e=Ni.join(__dirname,"..","..","package.json");return JSON.parse(await _i.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:X(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:[]}}},En=new Li});import{exec as hx}from"node:child_process";import Ms from"node:path";import{promisify as yx}from"node:util";function Zf(r){return/^\d+\.\d+\.\d+/.test(r)}function Os(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,n,s]=e;return`${t}.${n}.${Number(s)+1}`}function wx(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function kx(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function Sx(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Qf,Wr,eh=w(()=>{"use strict";De();Qf=yx(hx),Wr=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Ms.join(this.projectPath,"package.json"),t=await zt(e,null);return t?.version?{current:t.version,next:Os(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Ms.join(this.projectPath,"Cargo.toml"),t=await Ye(e,"");if(!t)return null;let n=wx(t);return n?{current:n,next:Os(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Ms.join(this.projectPath,"pyproject.toml"),t=await Ye(e,"");if(!t)return null;let n=kx(t);return n?{current:n,next:Os(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await sn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Ms.join(this.projectPath,e[0]),n=await Ye(t,"");if(!n)return null;let s=Sx(n);return s?{current:s,next:Os(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Ms.join(this.projectPath,e),n=await Ye(t,"");if(!n)return null;let s=n.trim();return Zf(s)?{current:s,next:Os(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Qf("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1218
- `);for(let n of t){let s=n.trim().replace(/^v/,"");if(Zf(s))return{current:s,next:Os(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Ms.join(this.projectPath,"VERSION");return await Wt(e,`0.1.0
1219
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Qf(`git tag v${e.next}`,{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Wt(e.file,`${e.next}
1220
- `);break}}async writeJsonVersion(e,t){let n=await zt(e,{});n&&(n.version=t,await $n(e,n))}async writeTomlVersion(e,t){let n=await Ye(e,"");if(!n)return;let s=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Wt(e,s)}async writeXmlVersion(e,t){let n=await Ye(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Wt(e,s)}};l(Zf,"isSemver");l(Os,"bumpPatch");l(wx,"parseTomlVersion");l(kx,"parsePyprojectVersion");l(Sx,"parseCsprojVersion")});var cn=w(()=>{"use strict";rp();mp();gp();hp();Sp();ks();Ep();ac();Rp();gc();jp();wc();bc();Fp();Cg();Ag();cu();eh()});var lu,bx,Fs,uu=w(()=>{"use strict";se();ee();lu=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let n=A.getDb(e),s=b();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),n.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=A.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(s=>{let o=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:o.patterns.length}})}},bx=new lu,Fs=bx});import th from"node:fs/promises";import nh from"node:path";async function sh(r,e,t,n){let[s,o,i,a]=await Promise.all([Px(r,e,n),xx(r),Tx(r),Ex(r)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,vx).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:s,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Px(r,e,t){let n=[],s=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Fg(r,s,du*2);for(let a of o){if(n.length>=du)break;try{let c=nh.join(e,a.path),u=await th.readFile(c,"utf-8");u.length>Ui*3?n.push({path:a.path,content:`${u.slice(0,Ui)}
1221
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,Ui),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=du)break;if(!n.some(c=>c.path===a))try{let c=nh.join(e,a),u=await th.readFile(c,"utf-8");n.push({path:a,content:u.slice(0,Ui),reason:"entry point"})}catch{}}return n}async function xx(r){try{let e=await Ue.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function Tx(r){try{return(await _.getTaskHistory(r)).slice(0,Cx).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Ex(r){try{let e=Fs.getActiveSummary(r);return Promise.resolve(e)}catch(e){return U.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Ui,du,vx,Cx,rh=w(()=>{"use strict";Ol();Pr();uu();xs();Pn();Ui=3e3,du=15,vx=15,Cx=10;l(sh,"buildAnalysisPayload");l(Px,"selectCodeSamples");l(xx,"getExistingPatterns");l(Tx,"getTaskHistory");l(Ex,"getPreviousAnalysisSummary")});import dn from"chalk";function oh(r){return Math.ceil(r.length/Ax)}function ih(r){let e=r.split(`
1215
+ `}function Gf(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:b(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return It.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{L.debug("Failed to write skills.json",{error:X(o)})}),n}async function zf(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await It.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(yx.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 It.access(m),g=!0}catch{try{await It.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let S=await _f.install(k);S.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),L.info(`Installed skill: ${d} for agent: ${u}`)):S.errors.length>0?(e.push({name:d,agent:u,status:"error"}),L.debug(`Failed to install skill ${d}`,{errors:S.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),L.debug(`Skill install error for ${d}`,{error:X(f)})}}}catch(t){L.debug("Skill auto-installation failed (non-critical)",{error:X(t)})}return e}var Wf=w(()=>{"use strict";Kt();on();se();En();Nf();l(Lf,"generateAgents");l(Uf,"loadExistingAgents");l(Hf,"resolveTemplateIncludes");l(wx,"generateWorkflowAgent");l(kx,"generateDomainAgent");l(Sx,"injectFeedbackSection");l(bx,"generateMinimalWorkflowAgent");l(vx,"generateMinimalDomainAgent");l(Gf,"configureSkills");l(zf,"autoInstallSkills")});import Vf from"node:fs/promises";import Bf from"node:path";var Ui,Jf=w(()=>{"use strict";Ui=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=Bf.join(this.projectPath,"package.json"),t=await Vf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Vf.access(Bf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as Px}from"node:child_process";import qf from"node:fs/promises";import lu from"node:path";import{promisify as Cx}from"node:util";async function Kf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await rs("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await rs("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await rs("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await rs("git status --porcelain",{cwd:r}),i=o.trim().split(`
1216
+ `).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 rs('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
1217
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await rs('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){L.debug("Git analysis failed (not a git repo?)",{error:X(t)})}return e}async function nn(r,e){try{return await qf.access(lu.join(r,e)),!0}catch(t){return L.debug("File not found",{filename:e,error:X(t)}),!1}}async function Xf(r){let e={fileCount:0,version:"0.0.0",name:lu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await rs('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){L.debug("File count failed",{path:r,error:X(t)}),e.fileCount=0}try{let t=lu.join(r,"package.json"),n=JSON.parse(await qf.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 nn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){L.debug("No package.json found",{path:r,error:X(t)})}return await nn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await nn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await nn(r,"requirements.txt")||await nn(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 Yf(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 nn(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 nn(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 nn(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 nn(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 nn(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 Qf(r,e){let t=ss(),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 Zf(r){return new Ui(r).detect()}var rs,eh=w(()=>{"use strict";on();Kl();En();Jf();rs=Cx(Px);l(Kf,"analyzeGit");l(nn,"fileExists");l(Xf,"gatherStats");l(Yf,"detectCommands");l(Qf,"buildSources");l(Zf,"detectStack")});import{exec as xx}from"node:child_process";import uu from"node:fs/promises";import Hi from"node:path";import{promisify as Tx}from"node:util";var Ex,du,pu,th,nh=w(()=>{"use strict";Qt();F();Ex=Tx(xx),du={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Hi.join(r,s);try{await uu.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=Hi.basename(r);try{await _.read(n)}catch(s){P(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Hi.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 uu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await uu.readFile(Hi.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},pu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[du.contextFilesExist(t),du.jsonFilesValid(t),du.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Ex(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}}}},th=new pu});import Gi from"node:fs/promises";import zi from"node:path";var Wi,In,mu=w(()=>{"use strict";hr();Ul();qg();Yg();tf();Gl();on();ze();an();Tt();ke();$i();Tr();xn();ee();Er();ei();ni();Ts();Rr();Es();Tf();Af();se();En();nl();sl();bs();If();kc();Tc();Wf();eh();nh();Wi=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 i=await _i(e),a=i.filter(u=>Os.includes(u)||u==="codex"),c=i.filter(u=>!Os.includes(u)&&u!=="codex");s=[...a.length>0?a:Os,...c],s=Array.from(new Set(s))}else t.aiTools[0]==="auto"?(s=await _i(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await kf("all",e):s=t.aiTools;let o={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=x.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),(await On()).installed){let O=await ji({autoRepair:!0});O.verified||L.warn(`Codex p. router not ready: ${O.message||"verification failed"}`)}try{o=await cn.ensureReady()}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:[],context7:{installed:o.installed,verified:!1,message:X(O)},error:`Context7 MCP is required but not ready: ${X(O)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Ar(this.projectId);try{let O=await ti(this.projectId);O>0&&L.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){L.debug("Legacy JSON sweep failed (non-critical)",{error:X(O)})}let[c,u,d,m]=await Promise.all([Kf(this.projectPath),Xf(this.projectPath),Yf(this.projectPath),Zf(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,S=new Set;if(!p&&Xg(this.projectId))try{let{diff:O,currentHashes:ry}=await Vl(this.projectPath,this.projectId),Hu=O.added.length+O.modified.length+O.deleted.length;if(Hu===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let da=Bg(O,this.projectId);S=Jg(da.allAffected);let oy=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=da.allAffected.some($n=>{let iy=$n.substring($n.lastIndexOf("."));return oy.has(iy)}),k=da.directlyChanged.some($n=>$n==="package.json"||$n==="tsconfig.json"||$n.includes("Dockerfile")||$n.includes("docker-compose")),g={isIncremental:!0,filesChanged:Hu,filesUnchanged:O.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(S)}}Wl(this.projectId,ry)}catch(O){L.debug("Incremental detection failed, falling back to full sync",{error:X(O)})}else try{let{currentHashes:O}=await Vl(this.projectPath,this.projectId);Wl(this.projectId,O)}catch(O){L.debug("Hash computation failed (non-critical)",{error:X(O)})}if(f)try{await Promise.all([Ug(this.projectPath,this.projectId),Vg(this.projectPath,this.projectId),ef(this.projectPath,this.projectId)])}catch(O){L.debug("File ranking index build failed (non-critical)",{error:X(O)})}let I;if(k)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(I=O)}catch{}let R=k?await Lf(this.globalPath,m,u,I):await Uf(this.globalPath),G=Gf(R,this.projectId,this.globalPath),$e=k?await zf(R):[],dt=Qf(u,d),qe=[],v;try{let O=await Ge.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(v={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let j;try{j=await Ef(this.projectId)}catch{}let Ie={projectId:this.projectId,name:u.name,version:u.version,ecosystem:u.ecosystem,projectType:u.projectType,languages:u.languages,frameworks:u.frameworks,repoPath:this.projectPath,branch:c.branch,fileCount:u.fileCount,commits:c.commits,hasChanges:c.hasChanges,commands:d,agents:{workflow:R.filter(O=>O.type==="workflow").map(O=>O.name),domain:R.filter(O=>O.type==="domain").map(O=>O.name)},sources:dt,analysis:v,learnings:j},sr=await Cf(Ie,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let rr=await Ge.getActive(this.projectId),Wt={patterns:rr?.patterns?.length||0,antiPatterns:rr?.antiPatterns?.length||0,criticalAntiPatterns:rr?.antiPatterns?.filter(O=>O.severity==="high").length||0},ny=Date.now()-n,sy=await this.recordSyncMetrics(u,qe,R,ny);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Te.installGlobalConfig(),await Te.syncCommands();let Uu;try{let O=await $.readConfig(this.projectPath);Uu=await th.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){L.debug("Verification failed (non-critical)",{error:X(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:R,skills:G,skillsInstalled:$e,contextFiles:qe,aiTools:sr.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Wt,syncMetrics:sy,verification:Uu,incremental:g}}catch(i){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:[],context7:{installed:o.installed,verified:o.verified,message:o.message},error:X(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Gi.mkdir(zi.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=A.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await Rf.generate(this.projectPath,s)}catch(o){L.debug("Local state generation failed (optional)",{error:X(o)})}}async logToMemory(e,t){A.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=zi.join(this.globalPath,m),g=await Gi.readFile(p,"utf-8");i+=g.length}catch(p){L.debug("Context file not found for metrics",{file:m,error:X(p)})}for(let m of n)try{let p=zi.join(this.globalPath,"agents",`${m.name}.md`),g=await Gi.readFile(p,"utf-8");i+=g.length}catch(p){L.debug("Agent file not found for metrics",{agent:m.name,error:X(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Vn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){L.debug("Failed to record sync metrics",{error:X(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n,s){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Up.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...n.frameworks])),feedback:c,context7Verified:s});i=u.patterns,a=u.antiPatterns,await Ge.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){L.debug("Failed to save draft analysis (non-critical)",{error:X(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([gt.archiveOldShipped(this.projectId).catch(()=>0),Xe.markDormantIdeas(this.projectId).catch(()=>0),he.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){L.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=bt.getStats(this.projectId);L.debug("Archive stats",a)}}catch(e){L.debug("Archival failed (non-critical)",{error:X(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new _n,n=await tl.learnFromTaskHistory(this.projectId,e,t);try{let s=await lm.getFeatureOutcomes(this.projectId);s.length>0&&await tl.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&L.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){L.debug("Auto-learning failed (non-critical)",{error:X(e)})}}async getCliVersion(){try{let e=zi.join(__dirname,"..","..","package.json");return JSON.parse(await Gi.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return L.debug("Failed to read CLI version",{error:X(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:[]}}},In=new Wi});import{exec as Ax}from"node:child_process";import Fs from"node:path";import{promisify as Rx}from"node:util";function rh(r){return/^\d+\.\d+\.\d+/.test(r)}function _s(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,n,s]=e;return`${t}.${n}.${Number(s)+1}`}function Ix(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Dx(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function jx(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var sh,Br,oh=w(()=>{"use strict";Me();sh=Rx(Ax),Br=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Fs.join(this.projectPath,"package.json"),t=await Vt(e,null);return t?.version?{current:t.version,next:_s(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Fs.join(this.projectPath,"Cargo.toml"),t=await tt(e,"");if(!t)return null;let n=Ix(t);return n?{current:n,next:_s(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Fs.join(this.projectPath,"pyproject.toml"),t=await tt(e,"");if(!t)return null;let n=Dx(t);return n?{current:n,next:_s(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await rn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Fs.join(this.projectPath,e[0]),n=await tt(t,"");if(!n)return null;let s=jx(n);return s?{current:s,next:_s(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Fs.join(this.projectPath,e),n=await tt(t,"");if(!n)return null;let s=n.trim();return rh(s)?{current:s,next:_s(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await sh("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1218
+ `);for(let n of t){let s=n.trim().replace(/^v/,"");if(rh(s))return{current:s,next:_s(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Fs.join(this.projectPath,"VERSION");return await Bt(e,`0.1.0
1219
+ `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await sh(`git tag v${e.next}`,{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Bt(e.file,`${e.next}
1220
+ `);break}}async writeJsonVersion(e,t){let n=await Vt(e,{});n&&(n.version=t,await Mn(e,n))}async writeTomlVersion(e,t){let n=await tt(e,"");if(!n)return;let s=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Bt(e,s)}async writeXmlVersion(e,t){let n=await tt(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Bt(e,s)}};l(rh,"isSemver");l(_s,"bumpPatch");l(Ix,"parseTomlVersion");l(Dx,"parsePyprojectVersion");l(jx,"parseCsprojVersion")});var un=w(()=>{"use strict";lp();wp();kp();bp();xp();bs();jp();pc();Op();kc();Fp();Pc();Tc();Hp();Ag();$g();mu();oh()});var gu,$x,Ns,fu=w(()=>{"use strict";se();ee();gu=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let n=A.getDb(e),s=b();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),n.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=A.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(s=>{let o=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:o.patterns.length}})}},$x=new gu,Ns=$x});import ih from"node:fs/promises";import ah from"node:path";async function ch(r,e,t,n){let[s,o,i,a]=await Promise.all([Fx(r,e,n),_x(r),Nx(r),Lx(r)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,Mx).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:s,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Fx(r,e,t){let n=[],s=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Hg(r,s,hu*2);for(let a of o){if(n.length>=hu)break;try{let c=ah.join(e,a.path),u=await ih.readFile(c,"utf-8");u.length>Vi*3?n.push({path:a.path,content:`${u.slice(0,Vi)}
1221
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,Vi),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=hu)break;if(!n.some(c=>c.path===a))try{let c=ah.join(e,a),u=await ih.readFile(c,"utf-8");n.push({path:a,content:u.slice(0,Vi),reason:"entry point"})}catch{}}return n}async function _x(r){try{let e=await Ge.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function Nx(r){try{return(await _.getTaskHistory(r)).slice(0,Ox).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Lx(r){try{let e=Ns.getActiveSummary(r);return Promise.resolve(e)}catch(e){return L.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Vi,hu,Mx,Ox,lh=w(()=>{"use strict";Ul();Tr();fu();Es();En();Vi=3e3,hu=15,Mx=15,Ox=10;l(ch,"buildAnalysisPayload");l(Fx,"selectCodeSamples");l(_x,"getExistingPatterns");l(Nx,"getTaskHistory");l(Lx,"getPreviousAnalysisSummary")});import mn from"chalk";function uh(r){return Math.ceil(r.length/Ux)}function dh(r){let e=r.split(`
1222
1222
  `),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+=`
1223
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function pu(r){return r.includes("<!-- prjct:preserve")}function ah(r,e){let t=ih(r),n=ih(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:oh(r),tokensAfter:oh(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)pu(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1224
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(pu(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
1223
+ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function yu(r){return r.includes("<!-- prjct:preserve")}function ph(r,e){let t=dh(r),n=dh(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:uh(r),tokensAfter:uh(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)yu(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1224
+ `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(yu(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
1225
1225
  `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
1226
- `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!pu(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1227
- `).length}),s.hasChanges=!0)}return s}function ch(r,e={}){let{colorize:t=!0}=e,n=[],s=t?dn.green:p=>p,o=t?dn.red:p=>p,i=t?dn.yellow:p=>p,a=t?dn.dim:p=>p,c=t?dn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1226
+ `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!yu(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1227
+ `).length}),s.hasChanges=!0)}return s}function mh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:p=>p,o=t?mn.red:p=>p,i=t?mn.yellow:p=>p,a=t?mn.dim:p=>p,c=t?mn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1228
1228
  `);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(`
1229
- `)}function lh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?dn.green:c=>c,o=t?dn.red:c=>c,i=t?dn.cyan:c=>c,a=t?dn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1229
+ `)}function gh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:c=>c,o=t?mn.red:c=>c,i=t?mn.cyan:c=>c,a=t?mn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1230
1230
  `))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(`
1231
1231
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1232
1232
  `).length>5&&n.push(a(` ... ${c.before.split(`
@@ -1237,11 +1237,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function pu(r){return r.incl
1237
1237
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1238
1238
  `).length>5&&n.push(a(` ... ${c.before.split(`
1239
1239
  `).length-5} more lines`))}n.push("")}return n.join(`
1240
- `)}var Ax,uh=w(()=>{"use strict";Ax=4;l(oh,"estimateTokens");l(ih,"parseMarkdownSections");l(pu,"isPreservedSection");l(ah,"generateSyncDiff");l(ch,"formatDiffPreview");l(lh,"formatFullDiff")});import Ix from"node:path";async function mu(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 Ce.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(`
1241
- `));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(r.context7&&u.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&u.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),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 bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function dh(r){try{let e=await ut.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=z.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 Vr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function gu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function ph(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 mh(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 | ${Vr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${wo(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 | ${gu(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: ${Vr(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(`
1242
- `)}function gh(r,e){let t=[];t.push(`# Repository Analysis
1240
+ `)}var Ux,fh=w(()=>{"use strict";Ux=4;l(uh,"estimateTokens");l(dh,"parseMarkdownSections");l(yu,"isPreservedSection");l(ph,"generateSyncDiff");l(mh,"formatDiffPreview");l(gh,"formatFullDiff")});import Hx from"node:path";async function wu(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 Te.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(`
1241
+ `));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(r.context7&&u.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&u.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Pt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function hh(r){try{let e=await mt.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=W.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 Jr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function ku(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function yh(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 wh(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 | ${Jr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${Po(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 | ${ku(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: ${Jr(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(`
1242
+ `)}function kh(r,e){let t=[];t.push(`# Repository Analysis
1243
1243
  `),t.push(`Generated: ${new Date().toLocaleString()}
1244
- `);let n=Ix.basename(e);if(t.push(`## Project: ${n}
1244
+ `);let n=Hx.basename(e);if(t.push(`## Project: ${n}
1245
1245
  `),t.push(`## Stack Detected
1246
1246
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
1247
1247
  `),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
@@ -1257,34 +1257,70 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function pu(r){return r.incl
1257
1257
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1258
1258
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1259
1259
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1260
- `)}var fh=w(()=>{"use strict";kn();ko();cn();Es();zn();tt();l(mu,"showSyncResult");l(dh,"getSessionActivity");l(Vr,"formatTokens");l(gu,"formatDuration");l(ph,"generateSparkline");l(mh,"generateStatsMarkdown");l(gh,"generateAnalysisSummary")});var vg={};Dn(vg,{AnalysisCommands:()=>os});import fu from"node:fs/promises";import hh from"node:path";import*as rs from"@clack/prompts";var os,bi=w(()=>{"use strict";gr();Bd();kn();ko();cn();xc();rh();uh();Pr();ee();uu();Ko();F();Ts();Es();zn();fh();tt();os=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1261
- `),We.init(t);let n=await gt.build(t,e),s={packageJson:await We.readPackageJson(),cargoToml:await We.readCargoToml(),goMod:await We.readGoMod(),requirements:await We.readRequirements(),directories:await We.listDirectories(),fileCount:await We.countFiles(),gitStats:await We.getGitStats(),gitLog:await We.getGitLog(20),hasDockerfile:await We.fileExists("Dockerfile"),hasDockerCompose:await We.fileExists("docker-compose.yml"),hasReadme:await We.fileExists("README.md"),hasTsconfig:await We.fileExists("tsconfig.json"),hasViteConfig:await We.fileExists("vite.config.ts")||await We.fileExists("vite.config.js"),hasNextConfig:await We.fileExists("next.config.js")||await We.fileExists("next.config.mjs")},o=gh(s,t),i=await $.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await Ke.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:z.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ge(),lt(rt)).getActiveProvider(),d=await Ce.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1260
+ `)}var Sh=w(()=>{"use strict";an();Co();un();Rs();Wn();ot();l(wu,"showSyncResult");l(hh,"getSessionActivity");l(Jr,"formatTokens");l(ku,"formatDuration");l(yh,"generateSparkline");l(wh,"generateStatsMarkdown");l(kh,"generateAnalysisSummary")});var Eg={};hn(Eg,{AnalysisCommands:()=>is});import Su from"node:fs/promises";import bh from"node:path";import*as os from"@clack/prompts";var is,Ti=w(()=>{"use strict";hr();Yd();an();Co();un();Ic();lh();fh();Tr();ee();fu();ei();F();As();Rs();Wn();Sh();ot();is=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1261
+ `),Ve.init(t);let n=await yt.build(t,e),s={packageJson:await Ve.readPackageJson(),cargoToml:await Ve.readCargoToml(),goMod:await Ve.readGoMod(),requirements:await Ve.readRequirements(),directories:await Ve.listDirectories(),fileCount:await Ve.countFiles(),gitStats:await Ve.getGitStats(),gitLog:await Ve.getGitLog(20),hasDockerfile:await Ve.fileExists("Dockerfile"),hasDockerCompose:await Ve.fileExists("docker-compose.yml"),hasReadme:await Ve.fileExists("README.md"),hasTsconfig:await Ve.fileExists("tsconfig.json"),hasViteConfig:await Ve.fileExists("vite.config.ts")||await Ve.fileExists("vite.config.js"),hasNextConfig:await Ve.fileExists("next.config.js")||await Ve.fileExists("next.config.mjs")},o=kh(s,t),i=await $.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await Ze.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:W.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(ze(),pt(ct)).getActiveProvider(),d=await Te.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1262
1262
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1263
- `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=x.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await x.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await En.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(N(he(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=hh.join(o,"context","CLAUDE.md"),c=null;try{c=await fu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||h.spin("Analyzing changes...");let m=await En.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(N("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await fu.readFile(a,"utf-8")}catch{p=""}let g=ah(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(N(he("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 fu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let j of g.added)S.push(`Added: ${j.name} (${j.lineCount} lines)`);for(let j of g.modified)S.push(`Modified: ${j.name} (${j.lineCount} lines)`);for(let j of g.removed)S.push(`Removed: ${j.name} (${j.lineCount} lines)`);let I=N("## \u26A1 Sync Preview",S.length>0?Z("Changes",xe(S)):"No section changes.",pt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(I),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let S={added:g.added.map(I=>({name:I.name,lineCount:I.lineCount})),modified:g.modified.map(I=>({name:I.name,lineCount:I.lineCount})),removed:g.removed.map(I=>({name:I.name,lineCount:I.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:S,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(ch(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await rs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(rs.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
1264
- ${lh(g)}`);let S=await rs.confirm({message:"Apply these changes?",initialValue:!0});if(rs.isCancel(S)||!S)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),mu(m,i)}t.md||h.spin("Syncing project...");let d=await En.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(N("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(I=>I.success).length||0),g=d.agents.length,f=null;try{let I=await Ue.diff(s);I?.hasChanges&&(f=Pc(I))}catch{}let k=Qo("sync"),S=N(he("Sync Complete"),pt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Yp("Uncommitted changes detected"):null,ce(k.map(I=>({label:I.desc,command:I.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return mu(d,i)}catch(n){return t.md?console.log(N("## \u274C Sync Failed",`> ${y(n)}`)):h.fail(y(n)),{success:!1,error:y(n)}}}async analysisPayload(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await En.sync(e,{aiTools:[]});if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Fs.isCurrent(s,i))return t.md?console.log(N(he("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await sh(s,e,o.git,o.stats);return t.md?console.log(N("## \u{1F50D} Analysis Payload","> Analyze this project data and produce structured findings.","","```json",JSON.stringify(a,null,2),"```","","> After analyzing, call: `prjct analysis save-llm --json '{...}'`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(n){return{success:!1,error:y(n)}}}async saveLlmAnalysis(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Fs.save(o,i),n.md?console.log(N(he("LLM Analysis Saved"),pt({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(s){return{success:!1,error:y(s)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=Fs.getActive(s);if(!o)return t.md?console.log(N("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[he(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Z("Architecture Insights",xe(o.architecture.insights))),o.patterns.length>0&&i.push(Z("Patterns",xe(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Z("Anti-Patterns",xe(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Z("Tech Debt",xe(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Z("Conventions",xe(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(N(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(n){return{success:!1,error:y(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Wn.getSummary(s),i=await Wn.getDailyStats(s,30),a=await dh(s),c=await Ze.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await 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: ${Vr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${wo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${gu(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=ph(i);if(console.log(` ${p} ${Vr(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=mh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Nr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Ue.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=hh.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)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=N(`## \u26A1 Status: ${u}`,pt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Z("Analysis",xe(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),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 diff(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ue.diff(s);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(N("## Analysis Diff",`> ${i}`)):h.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(N(Pc(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(Up(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),h.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Diff Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ue.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 rollback(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ue.rollback(s);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(N(he("Analysis Rolled Back"),pt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(N("## \u274C Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(h.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(h.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Rollback Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Ue.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(s,"project")?.repoPath||e}catch{}let i=await Ue.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 Gx}from"node:child_process";import{promisify as zx}from"node:util";async function Ki(r){if(process.platform!=="darwin")return vh(r);try{let{stdout:e}=await Wx(`security find-generic-password -s "${Vx}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return vh(r)}}function vh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var Wx,Vx,Iu=w(()=>{"use strict";F();Wx=zx(Gx),Vx="prjct-cli";l(Ki,"getCredential");l(vh,"getEnvFallback")});import It from"node:fs";import{createServer as WT}from"node:net";aa();bi();cn();Xt();F();Ts();tt();import Rx from"node:path";wt();ke();F();se();var Hi=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:x.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},W=new Hi;var _s=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=Rx.basename(t),a=await _.getCurrentTask(o),c=await fe.getActiveTasks(o),u=await dt.getRecent(o,5),d=await Je.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=z.getDaysAgo(m),g=[];try{let S=p.toISOString();g=A.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(j=>({...JSON.parse(j.data),timestamp:j.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
1263
+ `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=x.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await x.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await In.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(N(fe(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=bh.join(o,"context","CLAUDE.md"),c=null;try{c=await Su.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||h.spin("Analyzing changes...");let m=await In.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(N("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await Su.readFile(a,"utf-8")}catch{p=""}let g=ph(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(N(fe("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 Su.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let R of g.added)S.push(`Added: ${R.name} (${R.lineCount} lines)`);for(let R of g.modified)S.push(`Modified: ${R.name} (${R.lineCount} lines)`);for(let R of g.removed)S.push(`Removed: ${R.name} (${R.lineCount} lines)`);let I=N("## \u26A1 Sync Preview",S.length>0?Y("Changes",Ce(S)):"No section changes.",ft({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(I),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let S={added:g.added.map(I=>({name:I.name,lineCount:I.lineCount})),modified:g.modified.map(I=>({name:I.name,lineCount:I.lineCount})),removed:g.removed.map(I=>({name:I.name,lineCount:I.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:S,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(mh(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await os.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(os.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
1264
+ ${gh(g)}`);let S=await os.confirm({message:"Apply these changes?",initialValue:!0});if(os.isCancel(S)||!S)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),wu(m,i)}t.md||h.spin("Syncing project...");let d=await In.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(N("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(R=>R.success).length||0),g=d.agents.length,f=null;try{let R=await Ge.diff(s);R?.hasChanges&&(f=Rc(R))}catch{}let k=`## LLM Analysis (hybrid pipeline)
1265
+
1266
+ After sync, run the analysis payload builder:
1267
+ \`\`\`bash
1268
+ prjct analysis-payload --md
1269
+ \`\`\`
1270
+
1271
+ If the output says "Analysis is current", skip analysis.
1272
+
1273
+ Otherwise, analyze the JSON payload and produce a structured \`LLMAnalysis\` JSON:
1274
+
1275
+ \`\`\`json
1276
+ {
1277
+ "version": 1,
1278
+ "commitHash": "from payload git data",
1279
+ "analyzedAt": "ISO timestamp",
1280
+ "architecture": {
1281
+ "style": "monolith|monorepo|microservices|modular-monolith",
1282
+ "insights": ["key architectural observations"],
1283
+ "domains": ["identified modules/domains"]
1284
+ },
1285
+ "patterns": [{"name": "", "description": "", "locations": [], "confidence": 0.0, "category": ""}],
1286
+ "antiPatterns": [{"issue": "", "reasoning": "", "files": [], "suggestion": "", "severity": "low|medium|high", "confidence": 0.0}],
1287
+ "techDebt": [{"description": "", "area": "", "effort": "small|medium|large", "impact": "", "priority": "low|medium|high"}],
1288
+ "riskAreas": [{"path": "", "reason": "", "risk": "", "severity": "low|medium|high"}],
1289
+ "refactorSuggestions": [{"description": "", "files": [], "benefit": "", "effort": "small|medium|large"}],
1290
+ "projectInsights": ["key insights about the project"],
1291
+ "conventions": [{"category": "naming|file-structure|imports|error-handling", "rule": "", "example": ""}]
1292
+ }
1293
+ \`\`\`
1294
+
1295
+ Save the analysis:
1296
+ \`\`\`bash
1297
+ prjct analysis-save-llm '<your JSON here>' --md
1298
+ \`\`\``,S=si("sync"),I=N(fe("Sync Complete"),ft({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?nm("Uncommitted changes detected"):null,k,ie(S.map(R=>({label:R.desc,command:R.cmd}))));return console.log(I),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return wu(d,i)}catch(n){return t.md?console.log(N("## \u274C Sync Failed",`> ${y(n)}`)):h.fail(y(n)),{success:!1,error:y(n)}}}async analysisPayload(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await In.sync(e,{aiTools:[]});if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Ns.isCurrent(s,i))return t.md?console.log(N(fe("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await ch(s,e,o.git,o.stats);return t.md?console.log(N("## \u{1F50D} Analysis Payload","> Analyze this project data and produce structured findings.","","```json",JSON.stringify(a,null,2),"```","","> After analyzing, call: `prjct analysis save-llm --json '{...}'`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(n){return{success:!1,error:y(n)}}}async saveLlmAnalysis(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Ns.save(o,i),n.md?console.log(N(fe("LLM Analysis Saved"),ft({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(s){return{success:!1,error:y(s)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=Ns.getActive(s);if(!o)return t.md?console.log(N("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[fe(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Y("Architecture Insights",Ce(o.architecture.insights))),o.patterns.length>0&&i.push(Y("Patterns",Ce(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Y("Anti-Patterns",Ce(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Y("Tech Debt",Ce(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Y("Conventions",Ce(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(N(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(n){return{success:!1,error:y(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Vn.getSummary(s),i=await Vn.getDailyStats(s,30),a=await hh(s),c=await st.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Vn.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: ${Jr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Po(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${ku(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=yh(i);if(console.log(` ${p} ${Jr(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=wh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Ur(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Ge.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=bh.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)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=N(`## \u26A1 Status: ${u}`,ft({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Y("Analysis",Ce(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),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 diff(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ge.diff(s);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(N("## Analysis Diff",`> ${i}`)):h.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(N(Rc(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(Vp(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),h.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Diff Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ge.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 rollback(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ge.rollback(s);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(N(fe("Analysis Rolled Back"),ft({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(N("## \u274C Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(h.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(h.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Rollback Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Ge.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(s,"project")?.repoPath||e}catch{}let i=await Ge.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}}}}});function qr(r){return Buffer.from(`${JSON.stringify(r)}
1299
+ `)}var Ne,Ch,Iu=w(()=>{"use strict";Ne={runDir:l(()=>`${process.env.HOME||fn("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ne.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ne.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ne.runDir()}/daemon.log`,"log")},Ch=1800*1e3;l(qr,"encodeMessage")});var Eh={};hn(Eh,{executeViaDaemon:()=>Yx,forceKillDaemon:()=>Zx,getDaemonStatus:()=>Xx,isDaemonRunning:()=>xh,sendRequest:()=>Kr,spawnDaemon:()=>Th,stopDaemon:()=>Qx});import Xi from"node:crypto";import Be from"node:fs";import{connect as Kx}from"node:net";async function xh(){let r=Ne.socket();if(!Be.existsSync(r))return!1;try{return(await Kr({id:Xi.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Be.unlinkSync(r)}catch{}return!1}}async function Xx(){let r=Ne.socket(),e=Ne.pid();if(!Be.existsSync(r))return{running:!1};try{let t=await Kr({id:Xi.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Be.existsSync(e)?{running:!1,pid:parseInt(Be.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Kr(r){return new Promise((e,t)=>{let n=Ne.socket(),s=Kx(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(qr(r))}),s.on("data",c=>{o+=c.toString();let u=o.indexOf(`
1300
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Yx(r,e,t,n,s,o=!0){let i=Ne.socket();if(!Be.existsSync(i))return o&&Th().catch(()=>{}),null;try{return await Kr({id:Xi.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function Qx(){try{return(await Kr({id:Xi.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function Zx(){let r=Ne.pid(),e=Ne.socket(),t=!1;if(Be.existsSync(r)){let n=parseInt(Be.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(n))try{process.kill(n,"SIGKILL"),t=!0}catch{}}try{Be.existsSync(r)&&Be.unlinkSync(r)}catch{}try{Be.existsSync(e)&&Be.unlinkSync(e)}catch{}return t}async function Th(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),s=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Be.existsSync(t))o=t,i="bun";else if(Be.existsSync(n))o=n,i="node";else if(Be.existsSync(s))o=s,i="node";else return!1;let a=Ne.runDir();Be.mkdirSync(a,{recursive:!0});let c=Ne.log(),u=Be.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Be.closeSync(u),await new Promise(m=>setTimeout(m,500)),xh()}var Ah=w(()=>{"use strict";Iu();l(xh,"isDaemonRunning");l(Xx,"getDaemonStatus");l(Kr,"sendRequest");l(Yx,"executeViaDaemon");l(Qx,"stopDaemon");l(Zx,"forceKillDaemon");l(Th,"spawnDaemon")});import{exec as oT}from"node:child_process";import{promisify as iT}from"node:util";async function ta(r){if(process.platform!=="darwin")return Mh(r);try{let{stdout:e}=await aT(`security find-generic-password -s "${cT}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Mh(r)}}function Mh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var aT,cT,Ou=w(()=>{"use strict";F();aT=iT(oT),cT="prjct-cli";l(ta,"getCredential");l(Mh,"getEnvFallback")});import Je from"node:fs";import{createServer as aE}from"node:net";ma();Ti();un();Qt();F();As();ot();import Gx from"node:path";Tt();ke();F();se();var Bi=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:x.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},V=new Bi;var Ls=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=Gx.basename(t),a=await _.getCurrentTask(o),c=await he.getActiveTasks(o),u=await gt.getRecent(o,5),d=await Xe.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=W.getDaysAgo(m),g=[];try{let S=p.toISOString();g=A.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(R=>({...JSON.parse(R.data),timestamp:R.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
1265
1301
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1266
1302
  `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
1267
1303
  Activity: ${k}
1268
- `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await gt.build(t),p=await Ke.get("Read")(m.paths.roadmap);if(console.log(`
1304
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await yt.build(t),p=await Ze.get("Read")(m.paths.roadmap);if(console.log(`
1269
1305
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1270
1306
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1271
1307
  `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let S=f.split(`
1272
1308
  `)[0].trim();console.log(` ${k+1}. ${S}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1273
- `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${z.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let S=k.priority?` [${k.priority}]`:"";return`${k.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let S=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=N(`## \u26A1 Dashboard: ${i}`,Z("Current Focus",m),Z(`Queue (${c.length})`,xe(p,!0)),Z("Recent Ships",xe(g)),Z("Ideas",`${d.length} pending`),ce([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1309
+ `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${W.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let S=k.priority?` [${k.priority}]`:"";return`${k.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let S=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=N(`## \u26A1 Dashboard: ${i}`,Y("Current Focus",m),Y(`Queue (${c.length})`,Ce(p,!0)),Y("Recent Ships",Ce(g)),Y("Ideas",`${d.length} pending`),ie([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1274
1310
  \u{1F4CA} DASHBOARD - ${i}
1275
- `),console.log("\u2550".repeat(50));let m=Nr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1311
+ `),console.log("\u2550".repeat(50));let m=Ur(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1276
1312
  ${g}`),console.log(`
1277
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=z.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1313
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=W.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1278
1314
  \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let S=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${S}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1279
1315
  \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
1280
1316
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1281
1317
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1282
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:z.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(`
1318
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:W.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(`
1283
1319
  PRJCT COMMANDS
1284
- `),console.log("=".repeat(50));let i=W.getAllCategories(),a=W.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(`
1320
+ `),console.log("=".repeat(50));let i=V.getAllCategories(),a=V.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(`
1285
1321
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1286
1322
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1287
- `),{success:!0,topic:"overview"}}let n=W.getByName(e);if(n){if(console.log(`
1323
+ `),{success:!0,topic:"overview"}}let n=V.getByName(e);if(n){if(console.log(`
1288
1324
  \u{1F4DA} HELP: /p:${n.name}
1289
1325
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1290
1326
  Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
@@ -1294,7 +1330,7 @@ ${"\u2550".repeat(50)}
1294
1330
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1295
1331
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1296
1332
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1297
- `),{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("")}};hl();wt();ke();Xt();F();import jx from"node:fs/promises";import Dx from"node:path";var is=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=x.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await di.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=Dx.join(e,"analysis","repo-analysis.json"),n=await jx.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}}},mz=new is;tt();cn();Xt();ee();F();tt();async function Gi(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;L.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(Gi,"cleanupMemory");async function zi(r){let e=await $.getProjectId(r);if(!e)return;let n=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;L.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(zi,"cleanupMemoryInternal");async function hu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await Gi(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=L.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;L.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 Je.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${y(a)}`)}try{let c=(await fe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await zi(e),await ut.log(e,"cleanup_performed",{items:s.length,timestamp:z.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(hu,"cleanup");cn();F();tt();import yh from"node:path";async function yu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=yh.join(x.getGlobalProjectPath(i),"planning","designs");await we.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1333
+ `),{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("")}};bl();Tt();ke();Qt();F();import zx from"node:fs/promises";import Wx from"node:path";var as=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=x.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await hi.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=Wx.join(e,"analysis","repo-analysis.json"),n=await zx.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return P(t),null}}},Dz=new as;ot();un();Qt();ee();F();ot();async function Ji(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=U.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;U.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(Ji,"cleanupMemory");async function qi(r){let e=await $.getProjectId(r);if(!e)return;let n=U.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;U.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(qi,"cleanupMemoryInternal");async function bu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await Ji(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=U.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;U.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 Xe.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 he.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 qi(e),await mt.log(e,"cleanup_performed",{items:s.length,timestamp:W.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(bu,"cleanup");un();F();ot();import vh from"node:path";async function vu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=vh.join(x.getGlobalProjectPath(i),"planning","designs");await we.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1298
1334
 
1299
1335
  *Use templates/design/architecture.md for full design*
1300
1336
  `;break;case"api":c=`# API Design: ${o}
@@ -1309,12 +1345,12 @@ ${"\u2550".repeat(50)}
1309
1345
  `;break;case"flow":c=`# Flow Design: ${o}
1310
1346
 
1311
1347
  *Use templates/design/flow.md for full design*
1312
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=yh.join(a,u);return await we.writeFile(d,c),await ut.log(t,"design_created",{type:n,target:o,timestamp:z.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(yu,"design");cn();F();tt();import Ns from"node:path";async function wu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=x.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await we.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(`
1348
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=vh.join(a,u);return await we.writeFile(d,c),await mt.log(t,"design_created",{type:n,target:o,timestamp:W.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(vu,"design");un();F();ot();import Us from"node:path";async function Pu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=x.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await we.readFile(t);n=JSON.parse(s)}catch(s){if(P(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1313
1349
  Found abandoned session:
1314
- `),console.log(` Task: ${n.task}`),n.startedAt){let s=z.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1350
+ `),console.log(` Task: ${n.task}`),n.startedAt){let s=W.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1315
1351
  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
1316
- `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(wu,"recover");async function ku(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ns.join(x.getGlobalProjectPath(e),"snapshots");await we.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=Ns.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await we.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 we.writeFile(a,JSON.stringify(c,null,2)),await ut.log(r,"undo_performed",{snapshotId:i,timestamp:z.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(ku,"undo");async function Su(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ns.join(x.getGlobalProjectPath(e),"snapshots"),n=Ns.join(t,"history.json"),s;try{let i=await we.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(`
1317
- `).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 we.writeFile(n,JSON.stringify(s,null,2)),await ut.log(r,"redo_performed",{timestamp:z.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(Su,"redo");async function bu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ns.join(x.getGlobalProjectPath(e),"snapshots"),n=Ns.join(t,"history.json"),s;try{let o=await we.readFile(n);s=JSON.parse(o)}catch(o){if(C(o)||o instanceof SyntaxError)return console.log(`
1352
+ `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Pu,"recover");async function Cu(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Us.join(x.getGlobalProjectPath(e),"snapshots");await we.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=Us.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await we.readFile(a);c=JSON.parse(u)}catch(u){if(!P(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await we.writeFile(a,JSON.stringify(c,null,2)),await mt.log(r,"undo_performed",{snapshotId:i,timestamp:W.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(Cu,"undo");async function xu(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Us.join(x.getGlobalProjectPath(e),"snapshots"),n=Us.join(t,"history.json"),s;try{let i=await we.readFile(n);s=JSON.parse(i)}catch(i){if(P(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1353
+ `).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 we.writeFile(n,JSON.stringify(s,null,2)),await mt.log(r,"redo_performed",{timestamp:W.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(xu,"redo");async function Tu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Us.join(x.getGlobalProjectPath(e),"snapshots"),n=Us.join(t,"history.json"),s;try{let o=await we.readFile(n);s=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1318
1354
  SNAPSHOT HISTORY
1319
1355
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1320
1356
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1322,26 +1358,26 @@ ${"\u2550".repeat(50)}
1322
1358
  `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1323
1359
  `)):(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
1324
1360
  `)),console.log(`${"=".repeat(50)}
1325
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(bu,"history");var Ls=class extends be{static{l(this,"MaintenanceCommands")}_cleanupMemory=Gi;_cleanupMemoryInternal=zi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?hu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?yu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?wu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ku(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Su(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?bu(e):t}};import Ee from"chalk";ee();var vu=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){L.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)L.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){L.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){L.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 L.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,S)=>k+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,S)=>k+S,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,S)=>k+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},$x=new vu,wh=$x;F();tt();var An={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Wi(r,e,t){return t==="below"?r<=e?Ee.green("\u2713"):Ee.yellow("\u26A0"):r>=e?Ee.green("\u2713"):Ee.yellow("\u26A0")}l(Wi,"statusIcon");var Us=class extends be{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await wh.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1326
- ${Ee.dim("No performance data yet.")}`),console.log(`${Ee.dim("Metrics are collected automatically as you use the CLI.")}
1361
+ `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Tu,"history");var Hs=class extends be{static{l(this,"MaintenanceCommands")}_cleanupMemory=Ji;_cleanupMemoryInternal=qi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?bu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?vu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Pu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Cu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?xu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Tu(e):t}};import Ae from"chalk";ee();var Eu=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){U.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)U.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){U.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){U.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 U.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,S)=>k+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,S)=>k+S,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,S)=>k+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Vx=new Eu,Ph=Vx;F();ot();var Dn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Ki(r,e,t){return t==="below"?r<=e?Ae.green("\u2713"):Ae.yellow("\u26A0"):r>=e?Ae.green("\u2713"):Ae.yellow("\u26A0")}l(Ki,"statusIcon");var Gs=class extends be{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Ph.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1362
+ ${Ae.dim("No performance data yet.")}`),console.log(`${Ae.dim("Metrics are collected automatically as you use the CLI.")}
1327
1363
  `),{success:!0,message:"No data"};if(console.log(`
1328
- ${Ee.cyan("Performance Report")} ${Ee.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Wi(i.startup.avg,An.startup.max,"below");console.log(` Startup: avg ${Ee.bold(`${i.startup.avg}ms`)} ${Ee.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ee.dim(`target: <${An.startup.max}ms`)}`)}if(i.memory){let c=Wi(i.memory.peakHeapMB,An.heapMB.max,"below");console.log(` Memory: avg ${Ee.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ee.dim(`target: <${An.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Wi(i.contextCorrectness.rate,An.contextRate.min,"above");console.log(` Context: ${Ee.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ee.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ee.dim(`target: ${An.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Wi(i.subtaskHandoff.rate,An.handoffRate.min,"above");console.log(` Handoff: ${Ee.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ee.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ee.dim(`target: ${An.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1329
- ${Ee.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ee.bold(`${u.avg}ms`)} ${Ee.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)}}}};Si();kn();ke();ks();F();De();$t();tt();import Cu from"node:fs/promises";import Mx from"node:path";import ie from"chalk";var Hs=class extends be{static{l(this,"SetupCommands")}async start(){let e=await Ce.checkInstallation(),t=(Ge(),lt(rt)),n=await t.detectCodex(),s=e.providerDetected,o=s?await t.getActiveProvider():null,i=s?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1364
+ ${Ae.cyan("Performance Report")} ${Ae.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Ki(i.startup.avg,Dn.startup.max,"below");console.log(` Startup: avg ${Ae.bold(`${i.startup.avg}ms`)} ${Ae.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ae.dim(`target: <${Dn.startup.max}ms`)}`)}if(i.memory){let c=Ki(i.memory.peakHeapMB,Dn.heapMB.max,"below");console.log(` Memory: avg ${Ae.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ae.dim(`target: <${Dn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Ki(i.contextCorrectness.rate,Dn.contextRate.min,"above");console.log(` Context: ${Ae.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ae.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ae.dim(`target: ${Dn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Ki(i.subtaskHandoff.rate,Dn.handoffRate.min,"above");console.log(` Handoff: ${Ae.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ae.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ae.dim(`target: ${Dn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1365
+ ${Ae.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ae.bold(`${u.avg}ms`)} ${Ae.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)}}}};xi();an();ke();bs();F();Me();Ot();ot();import Au from"node:fs/promises";import Bx from"node:path";import ae from"chalk";var zs=class extends be{static{l(this,"SetupCommands")}async start(){let e=await Te.checkInstallation(),t=(ze(),pt(ct)),n=await t.detectCodex(),s=e.providerDetected,o=s?await t.getActiveProvider():null,i=s?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1330
1366
  `),!s&&!n.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1331
1367
 
1332
1368
  Please install one first:
1333
1369
  - Claude Code: https://docs.anthropic.com/claude-code
1334
1370
  - Gemini CLI: https://geminicli.com/docs
1335
- - OpenAI Codex: https://github.com/openai/codex`};if(s){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Ce.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1371
+ - OpenAI Codex: https://github.com/openai/codex`};if(s){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Te.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1336
1372
  \u2705 Installed ${a.installed?.length??0} commands to:
1337
1373
  ${x.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1338
- \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(n.installed){let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(Ai(),zl));await a();let u=await c({autoRepair:!0});if(!u.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
1374
+ \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(n.installed){let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>($i(),ql));await a();let u=await c({autoRepair:!0});if(!u.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
1339
1375
 
1340
1376
  ${u.message||"router verification failed"}
1341
1377
 
1342
1378
  Fix:
1343
1379
  1. Run: prjct setup
1344
- 2. Re-run: prjct start`};console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")}try{await on.ensureReady(),console.log("\u2705 Context7 MCP ready")}catch(a){return{success:!1,message:`\u274C Context7 MCP is required but not ready.
1380
+ 2. Re-run: prjct start`};console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")}try{await cn.ensureReady(),console.log("\u2705 Context7 MCP ready")}catch(a){return{success:!1,message:`\u274C Context7 MCP is required but not ready.
1345
1381
 
1346
1382
  ${y(a)}
1347
1383
 
@@ -1350,17 +1386,17 @@ Fix:
1350
1386
  2. Re-run: prjct start`}}return console.log(`
1351
1387
  \u{1F389} Setup complete!`),console.log(`
1352
1388
  Next steps:`),console.log(` 1. Open ${i}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1353
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ce.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ce.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1389
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Te.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Te.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1354
1390
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1355
1391
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1356
- \u{1F4DD} Installing global configuration...`);let n=await Ce.installGlobalConfig(),s=n.path?x.getDisplayPath(n.path):"global config";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}`);let o=(Ge(),lt(rt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1357
- \u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed){let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(Ai(),zl));await c();let d=await u({autoRepair:!0});if(!d.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
1392
+ \u{1F4DD} Installing global configuration...`);let n=await Te.installGlobalConfig(),s=n.path?x.getDisplayPath(n.path):"global config";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}`);let o=(ze(),pt(ct)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1393
+ \u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed){let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>($i(),ql));await c();let d=await u({autoRepair:!0});if(!d.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
1358
1394
 
1359
1395
  ${d.message||"router verification failed"}
1360
1396
 
1361
1397
  Fix:
1362
1398
  1. Run: prjct start
1363
- 2. Re-run: prjct setup`};console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")}try{await on.ensureReady(),console.log("\u2705 Context7 MCP ready")}catch(c){return{success:!1,message:`\u274C Context7 MCP is required but not ready.
1399
+ 2. Re-run: prjct setup`};console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")}try{await cn.ensureReady(),console.log("\u2705 Context7 MCP ready")}catch(c){return{success:!1,message:`\u274C Context7 MCP is required but not ready.
1364
1400
 
1365
1401
  ${y(c)}
1366
1402
 
@@ -1368,12 +1404,12 @@ Fix:
1368
1404
  1. Ensure Node+npx is installed
1369
1405
  2. Re-run: prjct setup`}}return console.log(`
1370
1406
  \u{1F389} Setup complete!
1371
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=Mx.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1407
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=Bx.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1372
1408
  # prjct Status Line for Claude Code
1373
1409
  # Shows version update notifications and current task
1374
1410
 
1375
1411
  # Current CLI version (embedded at install time)
1376
- CLI_VERSION="${$e}"
1412
+ CLI_VERSION="${Oe}"
1377
1413
 
1378
1414
  # Read JSON context from stdin (provided by Claude Code)
1379
1415
  read -r json
@@ -1424,24 +1460,25 @@ fi
1424
1460
 
1425
1461
  # Default: show prjct branding
1426
1462
  echo "\u26A1 prjct"
1427
- `;await Cu.writeFile(n,s,{mode:493});let o={};if(await R(t))try{o=JSON.parse(await Cu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Cu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(ie.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(ie.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(ie.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(ie.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(ie.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(ie.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(ie.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(` ${ie.bold.cyan("prjct")}${ie.magenta("/")}${ie.green("cli")} ${ie.dim.white(`v${$e} installed`)}`),console.log(""),console.log(` ${ie.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ie.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ie.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ie.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(ie.bold.cyan("\u{1F680} Quick Start")),console.log(ie.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(` ${ie.bold("1.")} Initialize your project:`),console.log(` ${ie.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ie.bold("2.")} Start your first task:`),console.log(` ${ie.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ie.bold("3.")} Ship & celebrate:`),console.log(` ${ie.green('prjct ship "user login"')}`),console.log(""),console.log(ie.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(` ${ie.dim("Documentation:")} ${ie.cyan("https://prjct.app")}`),console.log(` ${ie.dim("Report issues:")} ${ie.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ie.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};gr();cn();cu();Xt();F();Ts();Es();Ir();F();import{exec as Ox}from"node:child_process";import{promisify as Fx}from"node:util";import Et from"chalk";var Pu=Fx(Ox);async function Ut(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=Pe.getRulesForCommand(r,e).filter(d=>d.position===t),a=i.filter(d=>d.type==="gate");for(let d of a){let m=d.description||d.action;console.log(`
1428
- ${Et.dim(`[gate] ${t}-${e}: ${d.action}`)}`);try{let p=Date.now();await Pu(d.action,{timeout:d.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Et.green("\u2713")} ${Et.dim(`gate passed (${f})`)}`)}catch(p){return console.log(`${Et.red("\u2717")} gate failed: ${m}`),s.gatesFailed.push(m),s.success=!1,s.output+=`Gate failed: ${m}
1463
+ `;await Au.writeFile(n,s,{mode:493});let o={};if(await D(t))try{o=JSON.parse(await Au.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Au.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(ae.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(ae.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(ae.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(ae.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(ae.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(ae.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(ae.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(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${Oe} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.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(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.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(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.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(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};hr();un();mu();Qt();F();As();Rs();Dr();F();import{exec as Jx}from"node:child_process";import{promisify as qx}from"node:util";import xt from"chalk";var Ru=qx(Jx);async function Gt(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(n.skipRules)return s;let i=Pe.getRulesForCommand(r,e).filter(m=>m.position===t),a=i.filter(m=>m.type==="gate");for(let m of a){let p=m.description||m.action;console.log(`
1464
+ ${xt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await Ru(m.action,{timeout:m.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${xt.green("\u2713")} ${xt.dim(`gate passed (${k})`)}`)}catch(g){return console.log(`${xt.red("\u2717")} gate failed: ${p}`),s.gatesFailed.push(p),s.success=!1,s.output+=`Gate failed: ${p}
1465
+ ${y(g)}
1466
+ `,s}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
1467
+ ${xt.dim(`[instruction] ${t}-${e}: ${p}`)}`),s.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
1468
+ ${xt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await Ru(m.action,{timeout:m.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${xt.green("\u2713")} ${xt.dim(`(${f})`)}`)}catch(p){console.log(`${xt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),s.hooksFailed.push(m.description||m.action),s.output+=`Hook failed: ${m.action}
1469
+ ${y(p)}
1470
+ `}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
1471
+ ${xt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await Ru(m.action,{timeout:m.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${xt.green("\u2713")} ${xt.dim(`step passed (${f})`)}`),s.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${xt.red("\u2717")} step failed: ${m.action}`),s.gatesFailed.push(m.description||m.action),s.success=!1,s.output+=`Step failed: ${m.action}
1429
1472
  ${y(p)}
1430
- `,s}}let c=i.filter(d=>d.type==="hook");for(let d of c){console.log(`
1431
- ${Et.dim(`[hook] ${t}-${e}: ${d.action}`)}`);try{let m=Date.now();await Pu(d.action,{timeout:d.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let p=Date.now()-m,g=p>1e3?`${(p/1e3).toFixed(1)}s`:`${p}ms`;console.log(`${Et.green("\u2713")} ${Et.dim(`(${g})`)}`)}catch(m){console.log(`${Et.yellow("\u26A0")} hook failed (non-blocking): ${d.action}`),s.hooksFailed.push(d.description||d.action),s.output+=`Hook failed: ${d.action}
1432
- ${y(m)}
1433
- `}}let u=i.filter(d=>d.type==="step");for(let d of u){console.log(`
1434
- ${Et.dim(`[step] ${e}: ${d.action}`)}`);try{let m=Date.now();await Pu(d.action,{timeout:d.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let p=Date.now()-m,g=p>1e3?`${(p/1e3).toFixed(1)}s`:`${p}ms`;console.log(`${Et.green("\u2713")} ${Et.dim(`step passed (${g})`)}`),s.stepsRun.push(d.description||d.action)}catch(m){return console.log(`${Et.red("\u2717")} step failed: ${d.action}`),s.gatesFailed.push(d.description||d.action),s.success=!1,s.output+=`Step failed: ${d.action}
1435
- ${y(m)}
1436
- `,s}}return s}l(Ut,"executeWorkflowRules");tt();var Gs=class extends be{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Ut(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};n.md||h.step(1,4,"Bumping version...");let d=await new Wr(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new Sr(t).addFeature(d,i),n.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let f=await this._gitPush(t);g=f.success?"pushed":f.message}await dt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:z.getTimestamp()}),await Ze.learnDecision(o,"commit_footer","prjct","ship"),await Ze.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d}),await Ut(o,"ship","after",{projectPath:t,skipRules:n.skipHooks});try{n.md||h.step(4,4,"Updating AI context..."),await En.sync(t),n.md||h.done("\u2713 AI context updated")}catch(f){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(f))}if(n.md){let f=Qo("ship"),k=N(he(`Shipped: ${i}`,`Version: ${d}`),Z("Results",xe([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),ce(f.map(S=>({label:S.desc,command:S.cmd}))));console.log(k)}else h.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _createShipCommit(e,t){try{await Ke.get("Bash")("git add .");let n=`feat: ${e}
1437
-
1438
- Generated with [p/](https://www.prjct.app/)`;return await Ke.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 Ke.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)"}}}};wt();ke();Yo();F();zn();tt();import _x from"node:fs/promises";import Nx from"node:path";import zs from"chalk";var Ws=class extends be{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(zs.dim(`[dry-run] Would update ${o.length} project(s)
1439
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${zs.dim("would update")} ${m}`);continue}try{let p=await Tr(d),g=await Xo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${zs.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${zs.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${zs.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${zs.red("\u2717")} ${m}: ${y(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(y(o)),{success:!1,error:y(o)}}}async getCurrentProjectId(e){let t=await $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=Nx.join(x.getGlobalBasePath(),"projects");try{return(await _x.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};cl();ps();Uc();F();qn();tt();import Ae from"chalk";var Vs=class extends be{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await mt.getAll(s);if(i.length===0)return console.log(`
1440
- ${Ae.dim("No velocity data yet.")}`),console.log(`${Ae.dim("Complete tasks with estimates to build velocity history.")}
1441
- `),{success:!0,message:"No data"};let a=ci(i,o);await Lc.saveMetrics(s,a),console.log(`
1442
- ${Ae.cyan("Sprint Velocity")} ${Ae.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?Ae.green:m.estimationAccuracy>=60?Ae.yellow:Ae.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ae.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ae.green("\u2191"):a.velocityTrend==="declining"?Ae.red("\u2193"):Ae.dim("\u2192");if(console.log(` Average: ${Ae.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ae.bold(`${a.estimationAccuracy}%`)} ${Ae.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1443
- ${Ae.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ae.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ae.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ae.green("\u2713")} ${m.category} tasks estimated within ${Ae.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Em(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1444
- ${Ae.dim("Projection:")}`),console.log(` Backlog: ${Ae.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ae.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...yn,...n.velocity}}catch{}return yn}};Il();xl();import sT from"node:fs/promises";import rT from"node:path";qn();var Lx=[1,2,3,5,8,13,21],Ux={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}},Sh=l(r=>Lx.includes(r),"isValidPoint"),Vi=l(r=>Ux[r],"pointsToMinutes"),kh=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"),bh=l(r=>{let e=Vi(r);return`${kh(e.min)}\u2013${kh(e.max)}`},"pointsToTimeRange");ke();F();import Bi from"node:fs/promises";import Hx from"node:os";import Ji from"node:path";var xu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ji.join(Hx.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Bi.mkdir(this.commandsPath,{recursive:!0});let n=Ji.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await Bi.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=Ji.join(this.commandsPath,`${e}.md`);return await Bi.unlink(t),{success:!0}}catch(t){return C(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Ji.join(this.commandsPath,`${e}.md`);return await Bi.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
1473
+ `,s}}return s}l(Gt,"executeWorkflowRules");ot();var Ws=class extends be{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Gt(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};n.md||h.step(1,4,"Bumping version...");let d=await new Br(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new vr(t).addFeature(d,i),n.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let S=await this._gitPush(t);g=S.success?"pushed":S.message}await gt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:W.getTimestamp()}),await st.learnDecision(o,"commit_footer","prjct","ship"),await st.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let f=await Gt(o,"ship","after",{projectPath:t,skipRules:n.skipHooks}),k=[...c.instructions,...f.instructions];try{n.md||h.step(4,4,"Updating AI context..."),await In.sync(t),n.md||h.done("\u2713 AI context updated")}catch(S){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(S))}if(n.md){let S=si("ship"),I=N(fe(`Shipped: ${i}`,`Version: ${d}`),Y("Results",Ce([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),k.length>0?Y("Agent Instructions",Ce(k)):null,ie(S.map(R=>({label:R.desc,command:R.cmd}))));console.log(I)}else h.done(`v${d} shipped`),Pt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _createShipCommit(e,t){try{await Ze.get("Bash")("git add .");let n=`feat: ${e}
1474
+
1475
+ Generated with [p/](https://www.prjct.app/)`;return await Ze.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Ze.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};an();ke();ni();F();Wn();ot();import{execSync as Yr}from"node:child_process";import eT from"node:fs/promises";import tT from"node:path";import Xr from"chalk";function Rh(){try{return!!Yr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(Rh,"isHomebrewInstall");function Ih(){try{let e=Yr("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}l(Ih,"getCurrentVersion");var Vs=class extends be{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{return s||h.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(n),s||h.stop(),s||h.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(n),s||h.stop(),s||h.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(n),s||h.stop(),s?this.formatMdOutput(o,n):this.formatTerminalOutput(o,n)}catch(i){return s||h.stop(),h.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=Ih();if(e)return Rh()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(Rh()){try{Yr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Yr("npm install -g prjct-cli",{stdio:"pipe"}),t.details.push("Installed via npm")}else Yr("npm update -g prjct-cli",{stdio:"pipe"}),t.details.push("npm update complete");let o=Ih();n&&o&&n!==o?t.details.push(`${n} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(s){t.success=!1,t.errors.push(y(s))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},n=await this.getAllProjectIds();if(n.length===0)t.details.push("No projects found");else{let s=0,o=0;for(let i of n)if(!e)try{let a=await Ar(i),c=await ti(i);if(s+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${n.length} project(s)`);else{let i=[`${n.length} project(s) checked`];s>0&&i.push(`${s} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config");else{try{let o=await new ys().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(s){t.errors.push(`Commands: ${y(s)}`)}try{await new ys().installGlobalConfig(),t.details.push("Global config reinstalled")}catch(s){t.errors.push(`Global config: ${y(s)}`)}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:s,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Ah(),Eh));await n()?(await s()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):(t.success=!1,t.errors.push("Failed to restart daemon"))}catch(n){t.success=!1,t.errors.push(y(n))}return t}formatTerminalOutput(e,t){let n=e.phase1.success&&e.phase2.success&&e.phase3.success,s=[...e.phase1.errors,...e.phase2.errors,...e.phase3.errors];console.log("");let o=[{label:"Package",result:e.phase1},{label:"Cleanup",result:e.phase2},{label:"Daemon",result:e.phase3}];for(let{label:i,result:a}of o){let c=a.success?Xr.green("\u2713"):Xr.red("\u2717");console.log(` ${c} ${Xr.bold(i)}`);for(let u of a.details)console.log(` ${Xr.dim(u)}`);for(let u of a.errors)console.log(` ${Xr.yellow("\u26A0")} ${u}`)}return console.log(""),t?h.done("Dry run complete \u2014 no changes made"):n?h.done("System updated"):h.warn(`Updated with ${s.length} error(s)`),{success:n,message:t?"Dry run complete":n?"System updated":"Updated with errors"}}formatMdOutput(e,t){let n=e.phase1.success&&e.phase2.success&&e.phase3.success,s=[];s.push(t?"# Update (Dry Run)":"# System Update"),s.push("");let o=[{label:"Package Update",result:e.phase1},{label:"Global Cleanup",result:e.phase2},{label:"Daemon Restart",result:e.phase3}];for(let{label:i,result:a}of o){let c=a.success?"\u2705":"\u274C";s.push(`## ${c} ${i}`);for(let u of a.details)s.push(`- ${u}`);for(let u of a.errors)s.push(`- \u26A0\uFE0F ${u}`);s.push("")}return t||s.push(n?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(s.join(`
1476
+ `)),{success:n,message:t?"Dry run complete":n?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=tT.join(x.getGlobalBasePath(),"projects");try{return(await eT.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};ml();ms();Vc();F();Kn();ot();import Re from"chalk";var Bs=class extends be{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await ht.getAll(s);if(i.length===0)return console.log(`
1477
+ ${Re.dim("No velocity data yet.")}`),console.log(`${Re.dim("Complete tasks with estimates to build velocity history.")}
1478
+ `),{success:!0,message:"No data"};let a=mi(i,o);await Wc.saveMetrics(s,a),console.log(`
1479
+ ${Re.cyan("Sprint Velocity")} ${Re.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?Re.green:m.estimationAccuracy>=60?Re.yellow:Re.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Re.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Re.green("\u2191"):a.velocityTrend==="declining"?Re.red("\u2193"):Re.dim("\u2192");if(console.log(` Average: ${Re.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Re.bold(`${a.estimationAccuracy}%`)} ${Re.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1480
+ ${Re.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Re.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Re.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Re.green("\u2713")} ${m.category} tasks estimated within ${Re.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=jm(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1481
+ ${Re.dim("Projection:")}`),console.log(` Backlog: ${Re.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Re.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...bn,...n.velocity}}catch{}return bn}};Ml();Il();import ST from"node:fs/promises";import bT from"node:path";Kn();var nT=[1,2,3,5,8,13,21],sT={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}},jh=l(r=>nT.includes(r),"isValidPoint"),Yi=l(r=>sT[r],"pointsToMinutes"),Dh=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"),$h=l(r=>{let e=Yi(r);return`${Dh(e.min)}\u2013${Dh(e.max)}`},"pointsToTimeRange");ke();F();import Qi from"node:fs/promises";import rT from"node:os";import Zi from"node:path";var Du=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Zi.join(rT.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Qi.mkdir(this.commandsPath,{recursive:!0});let n=Zi.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await Qi.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=Zi.join(this.commandsPath,`${e}.md`);return await Qi.unlink(t),{success:!0}}catch(t){return P(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Zi.join(this.commandsPath,`${e}.md`);return await Qi.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
1445
1482
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1446
1483
  ---
1447
1484
 
@@ -1477,35 +1514,34 @@ Suggest relevant actions based on the workflow results:
1477
1514
  - View rules: \`prjct workflow ${e} --md\`
1478
1515
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1479
1516
  - Run again: \`p. ${e}\`
1480
- `}},Tu=new xu;qo();var qi=300*1e3,Xe=new _t({ttl:qi,maxSize:100}),Ht=new _t({ttl:qi,maxSize:10}),Bs=new _t({ttl:qi,maxSize:5}),Js=new _t({ttl:qi,maxSize:5});function Eu(){Xe.clear(),Ht.clear(),Bs.clear(),Js.clear()}l(Eu,"clearLinearCache");function Au(){return{issues:Xe.stats(),assignedIssues:Ht.stats(),teams:Bs.stats(),projects:Js.stats()}}l(Au,"getLinearCacheStats");F();Iu();var Bx={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},Jx={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Ch={none:0,urgent:1,high:2,medium:3,low:4},Xi=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await Ki("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${y(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(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?Ch[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=Ch[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:Bx[t?.type||"backlog"]||"backlog",priority:Jx[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):[]}},ft=new Xi;var Yi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&ft.isConfigured()}async initialize(e){this.initialized||(await ft.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=Ht.get(t);if(n)return n;let s=await ft.fetchAssignedIssues(e);Ht.set(t,s);for(let o of s)Xe.set(`issue:${o.id}`,o),Xe.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Ht.get(n);if(s)return s;let o=await ft.fetchTeamIssues(e,t);Ht.set(n,o);for(let i of o)Xe.set(`issue:${i.id}`,i),Xe.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Xe.get(t);if(n)return n;let s=await ft.fetchIssue(e);return s&&(Xe.set(`issue:${s.id}`,s),Xe.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await ft.createIssue(e);return Xe.set(`issue:${t.id}`,t),Xe.set(`issue:${t.externalId}`,t),Ht.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await ft.updateIssue(e,t);return Xe.set(`issue:${n.id}`,n),Xe.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await ft.markInProgress(e),Xe.delete(`issue:${e}`),Ht.clear()}async markDone(e){this.ensureInitialized(),await ft.markDone(e),Xe.delete(`issue:${e}`),Ht.clear()}async addComment(e,t){this.ensureInitialized(),await ft.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Bs.get("teams");if(e)return e;let t=await ft.getTeams();return Bs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Js.get("projects");if(e)return e;let t=await ft.getProjects();return Js.set("projects",t),t}clearCache(){Eu()}getCacheStats(){return Au()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},At=new Yi;Ta();ee();Ps();F();var qx=/\b[A-Z]+-\d+\b/,Ph=1800*1e3,Qi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await At.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:Ph,issues:o};return A.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await At.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 At.markInProgress(t):n==="done"&&await At.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||Ph;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):[]}async reconcileQueue(e){let t=this.loadIssues(e);if(!t)return 0;let n=new Set;for(let[i,a]of Object.entries(t.issues))(a.status==="done"||a.status==="in_review")&&n.add(i);if(n.size===0)return 0;let s=await fe.getTasks(e),o=0;for(let i of s){if(i.completed)continue;let a=i.description.match(qx);a&&n.has(a[0])&&(await fe.completeTask(e,i.id),o++)}return o}loadIssues(e){try{return A.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){A.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=yd("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}}},Kx=new Qi;jt();ks();ke();ee();se();import{exec as Xx}from"node:child_process";import{promisify as Yx}from"node:util";var xh=Yx(Xx),qs="session-snapshot",Qx=30,Ru=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return A.setDoc(e,qs,u),u}getSnapshot(e){try{return A.getDoc(e,qs)}catch{return null}}clearSnapshot(e){try{A.deleteDoc(e,qs)}catch{}}async listAllSnapshots(){let e=await x.listProjects(),t=[];for(let n of e)try{if(!A.exists(n))continue;let s=A.getDoc(n,qs);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=Qx){let t=await x.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!A.exists(o))continue;let i=A.getDoc(o,qs);i&&new Date(i.timestamp).getTime()<n&&(A.deleteDoc(o,qs),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${nn(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${nn(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1481
- `)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${nn(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await xh("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await xh("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1482
- `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},In=new Ru;Xt();Gc();Ir();ll();F();Ts();Es();Jc();F();De();Iu();import Zx from"node:fs/promises";import eT from"node:os";import tT from"node:path";function nT(r){return tT.join(eT.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(nT,"getCredentialsPath");async function Zi(r){let e=nT(r);if(!await R(e))return{};try{return JSON.parse(await Zx.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(Zi,"getProjectCredentials");async function ju(r){let e=await Zi(r);return e.linear?.apiKey?e.linear.apiKey:Ki("linear-api-key")}l(ju,"getLinearApiKey");qn();tt();var oT=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Ks=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Ut(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Zi(o),k=await ju(o);if(k&&f.linear?.teamId){await At.initializeFromApiKey(k,f.linear.teamId);let S=await At.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await At.markInProgress(e))}}catch{}if(n.md){try{await on.ensureReady()}catch(Gt){return Ct("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(Gt)}),{success:!1,error:y(Gt)}}let f=await _.getCurrentTask(o);if(f)return Ct("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:me(),description:c,sessionId:me(),linearId:a});let k=x.getGlobalProjectPath(o),[S,I,j,q]=await Promise.all([iT(),Ue.getActive(o).catch(()=>null),aT(k),ui(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),Fe=null;try{let Gt=In.getSnapshot(o);Gt&&(Fe=In.formatContinuityContext(Gt),In.clearSnapshot(o))}catch{}let ct=Bc({description:c,branch:S,linearId:a}),Ve=cT(I,j),v=Kp(q.files.map(Gt=>({path:Gt.path,description:Gt.reasons.join(", ")}))),D=lT(j),Ie=uT(I),tr=dT(c,q.files,I),nr=ce([{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(N(Fe,ct,tr,Ve,v,D,Ie,nr)),await this.logToMemory(t,"task_started",{task:e,timestamp:z.getTimestamp()}),await Ut(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await wi.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:me(),description:c,sessionId:me(),linearId:a});let m=await Pl.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}),jr("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:z.getTimestamp()}),await Ut(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Sh,pointsToMinutes:Vi,pointsToTimeRange:bh,storeEstimate:l(async f=>{let k=Vi(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?Ct("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?z.calculateDuration(new Date(i.startedAt)):void 0,c=Bc({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?qp(u,d):"",p=ce([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(N(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?Ct("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?Ct("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 Ut(s,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=z.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await mt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:z.getTimestamp(),estimatedDuration:d?Th(d):"0m",actualDuration:c||"0m",variance:d?mT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${Th(d)}) \u2192 ${S}${k}%`}await _.completeTask(s,t.feedback);try{In.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Zi(s),k=await ju(s);k&&f.linear?.teamId&&(await At.initializeFromApiKey(k,f.linear.teamId),await At.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(N(he("Completed",`${a}${f}`),pt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),ce([{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}`),jr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:z.getTimestamp()}),await Ut(s,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await fe.getActiveTasks(s);if(o.length===0)return t.md?Ct("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(N(Z("Queue",`${o.length} task${o.length!==1?"s":""}`),xe(i,!0),ce([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?Ct("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=z.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await In.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(N(he("Task Paused",`**Paused:** ${i.description}`),pt({Reason:e||void 0,"Duration worked":a||void 0}),ce([{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})`:""}`),jr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:z.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?Ct("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(N(he("Task Resumed",`**Resumed:** ${a.description}`),ce([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),jr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?Ct("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,n);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,n);case"gate":return this._workflowGate(a.args,o,n);case"remove":return this._workflowRm(a.args,o,n);case"disable":return this._workflowDisable(a.args,o,n);case"reset":return this._workflowReset(o,n);case"init":return this._workflowInit(o,t,n);case"help":return this._workflowHelp(n);case"create":return this._workflowCreate(a.args,o,t,n);case"list":return this._workflowList(o,n);case"delete":return this._workflowDelete(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return this._workflowShow(a.args||null,o,n);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_detectIntent(e){let t=e.trim();for(let{type:n,patterns:s}of oT){let o=t.match(s);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:n,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let n=t.toLowerCase();return e.filter(s=>s.action.toLowerCase().includes(n)||(s.description?.toLowerCase().includes(n)??!1)||s.command.toLowerCase().includes(n)||String(s.id)===n)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=at.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=at.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=Pe.addRule(t,{type:"hook",command:c,position:a,action:s,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(he("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${s}\``),ce([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):h.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:d}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=at.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=at.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return n.md?console.log(`> ${p}`):h.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=Pe.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(he("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ce([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):h.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!Pe.removeRule(t,s)){let i=`Rule #${s} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(N(he("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=Pe.resetRules(e);return t.md?console.log(N(he("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowDisable(e,t,n){let s=e.trim(),o=parseInt(s,10);if(!Number.isNaN(o)){let c=Pe.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return Pe.updateRule(t,o,{enabled:!1}),n.md?console.log(N(he("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ce([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):h.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Pe.getAllRules(t),a=this._searchRules(i,s);if(a.length===0){let c=`No rules matching "${s}"`;return n.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Pe.updateRule(t,c.id,{enabled:!1}),n.md?console.log(N(he("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(n.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(N(Z("Multiple matches",`${a.length} rules match "${s}"`),xe(c),ce(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${s}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(N(Z("Workflow Help","Manage hooks, gates, and steps for your workflow"),Z("Commands",xe(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Z("Natural Language (EN/ES)",xe(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),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"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;if(e&&s.includes(e)?o=Pe.getRulesForCommand(t,e):o=Pe.getAllRules(t),o.length===0)return n.md?console.log(N(Z("Workflow Rules","No rules configured"),ce([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(n.md){let i=e?[e]:s,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(pT(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(N(Z(c,u),a.length>0?Jp(a.join(`
1483
-
1484
- `),""):null,ce([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let i=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(i),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let a of o){let c=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,n){let s=Pe.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(s.length>0){let u=`Ship workflow already has ${s.length} rule${s.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let o=await Zo(t),i=0,a=[],c=Pe.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(n.md)console.log(N(he("Workflow Initialized",`Added ${a.length} default ship rules`),xe(a),ce([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{h.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,n,s){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!at.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(at.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(at.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=at.createWorkflow(t,{name:i,description:a}),d=await Tu.generateWorkflowTemplate(i,a);if(!d.success){at.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return s.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return s.md?console.log(N(he("Workflow Created",`Created workflow: ${i}`),Z("Description",a),Z("Template",`Installed at ${d.path}`),ce([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(h.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1485
- Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return s.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let n=at.getAllWorkflows(e);if(n.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):h.warn(i),{success:!0,workflows:[]}}let s=n.filter(i=>i.isBuiltin),o=n.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(s.length>0){let a=s.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Z("Built-in Workflows",a.join(`
1486
- `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Z("Custom Workflows",a.join(`
1487
- `)))}console.log(N(...i,ce([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(h.done(`${n.length} workflow${n.length!==1?"s":""}`),s.length>0){console.log(`
1517
+ `}},ju=new Du;Zo();var ea=300*1e3,et=new Lt({ttl:ea,maxSize:100}),zt=new Lt({ttl:ea,maxSize:10}),Js=new Lt({ttl:ea,maxSize:5}),qs=new Lt({ttl:ea,maxSize:5});function $u(){et.clear(),zt.clear(),Js.clear(),qs.clear()}l($u,"clearLinearCache");function Mu(){return{issues:et.stats(),assignedIssues:zt.stats(),teams:Js.stats(),projects:qs.stats()}}l(Mu,"getLinearCacheStats");F();Ou();var lT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},uT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Oh={none:0,urgent:1,high:2,medium:3,low:4},na=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 ta("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?Oh[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=Oh[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:lT[t?.type||"backlog"]||"backlog",priority:uT[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):[]}},wt=new na;var sa=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&wt.isConfigured()}async initialize(e){this.initialized||(await wt.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=zt.get(t);if(n)return n;let s=await wt.fetchAssignedIssues(e);zt.set(t,s);for(let o of s)et.set(`issue:${o.id}`,o),et.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=zt.get(n);if(s)return s;let o=await wt.fetchTeamIssues(e,t);zt.set(n,o);for(let i of o)et.set(`issue:${i.id}`,i),et.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=et.get(t);if(n)return n;let s=await wt.fetchIssue(e);return s&&(et.set(`issue:${s.id}`,s),et.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await wt.createIssue(e);return et.set(`issue:${t.id}`,t),et.set(`issue:${t.externalId}`,t),zt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await wt.updateIssue(e,t);return et.set(`issue:${n.id}`,n),et.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await wt.markInProgress(e),et.delete(`issue:${e}`),zt.clear()}async markDone(e){this.ensureInitialized(),await wt.markDone(e),et.delete(`issue:${e}`),zt.clear()}async addComment(e,t){this.ensureInitialized(),await wt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Js.get("teams");if(e)return e;let t=await wt.getTeams();return Js.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=qs.get("projects");if(e)return e;let t=await wt.getProjects();return qs.set("projects",t),t}clearCache(){$u()}getCacheStats(){return Mu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Dt=new sa;ja();ee();Ts();F();var dT=/\b[A-Z]+-\d+\b/,Fh=1800*1e3,ra=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Dt.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Fh,issues:o};return A.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Dt.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Dt.markInProgress(t):n==="done"&&await Dt.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Fh;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):[]}async reconcileQueue(e){let t=this.loadIssues(e);if(!t)return 0;let n=new Set;for(let[i,a]of Object.entries(t.issues))(a.status==="done"||a.status==="in_review")&&n.add(i);if(n.size===0)return 0;let s=await he.getTasks(e),o=0;for(let i of s){if(i.completed)continue;let a=i.description.match(dT);a&&n.has(a[0])&&(await he.completeTask(e,i.id),o++)}return o}loadIssues(e){try{return A.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){A.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=vd("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}}},pT=new ra;$t();bs();ke();ee();se();import{exec as mT}from"node:child_process";import{promisify as gT}from"node:util";var _h=gT(mT),Ks="session-snapshot",fT=30,Fu=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return A.setDoc(e,Ks,u),u}getSnapshot(e){try{return A.getDoc(e,Ks)}catch{return null}}clearSnapshot(e){try{A.deleteDoc(e,Ks)}catch{}}async listAllSnapshots(){let e=await x.listProjects(),t=[];for(let n of e)try{if(!A.exists(n))continue;let s=A.getDoc(n,Ks);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=fT){let t=await x.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!A.exists(o))continue;let i=A.getDoc(o,Ks);i&&new Date(i.timestamp).getTime()<n&&(A.deleteDoc(o,Ks),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${sn(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${sn(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1518
+ `)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${sn(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await _h("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await _h("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1519
+ `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},jn=new Fu;Qt();Jc();Dr();gl();F();As();Rs();Qc();F();Me();Ou();import hT from"node:fs/promises";import yT from"node:os";import wT from"node:path";function kT(r){return wT.join(yT.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(kT,"getCredentialsPath");async function oa(r){let e=kT(r);if(!await D(e))return{};try{return JSON.parse(await hT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(oa,"getProjectCredentials");async function _u(r){let e=await oa(r);return e.linear?.apiKey?e.linear.apiKey:ta("linear-api-key")}l(_u,"getLinearApiKey");Kn();ot();var vT=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Xs=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Gt(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await oa(o),k=await _u(o);if(k&&f.linear?.teamId){await Dt.initializeFromApiKey(k,f.linear.teamId);let S=await Dt.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await Dt.markInProgress(e))}}catch{}if(n.md){try{await cn.ensureReady()}catch(Wt){return Et("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(Wt)}),{success:!1,error:y(Wt)}}let f=await _.getCurrentTask(o);if(f)return Et("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let k=x.getGlobalProjectPath(o),[S,I,R,G]=await Promise.all([PT(),Ge.getActive(o).catch(()=>null),CT(k),fi(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),$e=null;try{let Wt=jn.getSnapshot(o);Wt&&($e=jn.formatContinuityContext(Wt),jn.clearSnapshot(o))}catch{}let dt=Yc({description:c,branch:S,linearId:a}),qe=xT(I,R),v=em(G.files.map(Wt=>({path:Wt.path,description:Wt.reasons.join(", ")}))),j=TT(R),Ie=ET(I),sr=AT(c,G.files,I),rr=ie([{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(N($e,dt,sr,qe,v,j,Ie,rr)),await this.logToMemory(t,"task_started",{task:e,timestamp:W.getTimestamp()}),await Gt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Pi.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let m=await Rl.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}),$r("working"),Pt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:W.getTimestamp()}),await Gt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:jh,pointsToMinutes:Yi,pointsToTimeRange:$h,storeEstimate:l(async f=>{let k=Yi(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?Et("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?W.calculateDuration(new Date(i.startedAt)):void 0,c=Yc({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?Zp(u,d):"",p=ie([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(N(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?Et("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?Et("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 Gt(s,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=W.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await ht.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:W.getTimestamp(),estimatedDuration:d?Nh(d):"0m",actualDuration:c||"0m",variance:d?IT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${Nh(d)}) \u2192 ${S}${k}%`}await _.completeTask(s,t.feedback);try{jn.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await oa(s),k=await _u(s);k&&f.linear?.teamId&&(await Dt.initializeFromApiKey(k,f.linear.teamId),await Dt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(N(fe("Completed",`${a}${f}`),ft({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),ie([{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}`),$r("completed"),Pt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:W.getTimestamp()}),await Gt(s,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await he.getActiveTasks(s);if(o.length===0)return t.md?Et("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(N(Y("Queue",`${o.length} task${o.length!==1?"s":""}`),Ce(i,!0),ie([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),Pt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?Et("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=W.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await jn.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(N(fe("Task Paused",`**Paused:** ${i.description}`),ft({Reason:e||void 0,"Duration worked":a||void 0}),ie([{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})`:""}`),$r("paused"),Pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:W.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?Et("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(N(fe("Task Resumed",`**Resumed:** ${a.description}`),ie([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),$r("working"),Pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:W.getTimestamp()}),{success:!0,task:a.description}):(n.md?Et("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,n);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,n);case"gate":return this._workflowGate(a.args,o,n);case"instruction":return this._workflowInstruction(a.args,o,n);case"remove":return this._workflowRm(a.args,o,n);case"disable":return this._workflowDisable(a.args,o,n);case"reset":return this._workflowReset(o,n);case"init":return this._workflowInit(o,t,n);case"help":return this._workflowHelp(n);case"create":return this._workflowCreate(a.args,o,t,n);case"list":return this._workflowList(o,n);case"delete":return this._workflowDelete(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return this._workflowShow(a.args||null,o,n);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_detectIntent(e){let t=e.trim();for(let{type:n,patterns:s}of vT){let o=t.match(s);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:n,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let n=t.toLowerCase();return e.filter(s=>s.action.toLowerCase().includes(n)||(s.description?.toLowerCase().includes(n)??!1)||s.command.toLowerCase().includes(n)||String(s.id)===n)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=Ye.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ye.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=Pe.addRule(t,{type:"hook",command:c,position:a,action:s,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(fe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${s}\``),ie([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):h.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:d}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ye.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ye.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return n.md?console.log(`> ${p}`):h.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=Pe.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(fe("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ie([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):h.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ye.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let f=Ye.getAllWorkflows(t).map(S=>S.name).join(", "),k=`Workflow '${o}' not found. Available: ${f}`;return n.md?console.log(`> ${k}`):h.warn(k),{success:!1,error:k}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[m]=this._parseAction(d);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let p=Pe.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(fe("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),ie([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):h.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!Pe.removeRule(t,s)){let i=`Rule #${s} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(N(fe("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=Pe.resetRules(e);return t.md?console.log(N(fe("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowDisable(e,t,n){let s=e.trim(),o=parseInt(s,10);if(!Number.isNaN(o)){let c=Pe.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return Pe.updateRule(t,o,{enabled:!1}),n.md?console.log(N(fe("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ie([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):h.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Pe.getAllRules(t),a=this._searchRules(i,s);if(a.length===0){let c=`No rules matching "${s}"`;return n.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Pe.updateRule(t,c.id,{enabled:!1}),n.md?console.log(N(fe("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(n.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(N(Y("Multiple matches",`${a.length} rules match "${s}"`),Ce(c),ie(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${s}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(N(Y("Workflow Help","Manage hooks, gates, and steps for your workflow"),Y("Commands",Ce(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Y("Natural Language (EN/ES)",Ce(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),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"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;if(e&&s.includes(e)?o=Pe.getRulesForCommand(t,e):o=Pe.getAllRules(t),o.length===0)return n.md?console.log(N(Y("Workflow Rules","No rules configured"),ie([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(n.md){let i=e?[e]:s,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(RT(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(N(Y(c,u),a.length>0?Qp(a.join(`
1520
+
1521
+ `),""):null,ie([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let i=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(i),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let a of o){let c=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,n){let s=Pe.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(s.length>0){let u=`Ship workflow already has ${s.length} rule${s.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let o=await ri(t),i=0,a=[],c=Pe.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=Pe.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(n.md)console.log(N(fe("Workflow Initialized",`Added ${a.length} default ship rules`),Ce(a),ie([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{h.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,n,s){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Ye.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ye.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ye.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=Ye.createWorkflow(t,{name:i,description:a}),d=await ju.generateWorkflowTemplate(i,a);if(!d.success){Ye.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return s.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return s.md?console.log(N(fe("Workflow Created",`Created workflow: ${i}`),Y("Description",a),Y("Template",`Installed at ${d.path}`),ie([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(h.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1522
+ Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return s.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let n=Ye.getAllWorkflows(e);if(n.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):h.warn(i),{success:!0,workflows:[]}}let s=n.filter(i=>i.isBuiltin),o=n.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(s.length>0){let a=s.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Y("Built-in Workflows",a.join(`
1523
+ `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Y("Custom Workflows",a.join(`
1524
+ `)))}console.log(N(...i,ie([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(h.done(`${n.length} workflow${n.length!==1?"s":""}`),s.length>0){console.log(`
1488
1525
  Built-in:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1489
- Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:n}}async _workflowDelete(e,t,n){let s=e.trim();if(!s){let o="Usage: prjct workflow delete <name>";return n.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!at.deleteWorkflow(t,s)){let i=`Workflow '${s}' not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await Tu.deleteWorkflowTemplate(s),n.md?console.log(N(he("Workflow Deleted",`Deleted workflow: ${s}`))):h.done(`deleted workflow: ${s}`),{success:!0}}catch(o){let i=y(o);return n.md?console.log(`> Error: ${i}`):h.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let a=at.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=await Ut(o,i,"before",{projectPath:t});if(!c.success){if(n.md)Ct("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(h.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Ut(o,i,"after",{projectPath:t}),n.md?console.log(N(he(`Workflow: ${i}`,a.description||""),ce([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=y(s);return n.md?console.log(`> Error: ${o}`):h.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await In.cleanup();return t.md?console.log(he("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await In.listAllSnapshots();if(n.length===0)return t.md?Ct("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=z.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(N(Z("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),xe(s),ce([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=z.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Th(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(Th,"formatMinutesToDuration");async function iT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(iT,"getGitBranch");async function aT(r){try{let e=rT.join(r,"analysis","repo-analysis.json"),t=await sT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e),null}}l(aT,"loadRepoAnalysis");function cT(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=pt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
1490
- ${xe(g)}`}return[u?`### Project
1526
+ Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:n}}async _workflowDelete(e,t,n){let s=e.trim();if(!s){let o="Usage: prjct workflow delete <name>";return n.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!Ye.deleteWorkflow(t,s)){let i=`Workflow '${s}' not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await ju.deleteWorkflowTemplate(s),n.md?console.log(N(fe("Workflow Deleted",`Deleted workflow: ${s}`))):h.done(`deleted workflow: ${s}`),{success:!0}}catch(o){let i=y(o);return n.md?console.log(`> Error: ${i}`):h.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let a=Ye.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=await Gt(o,i,"before",{projectPath:t});if(!c.success){if(n.md)Et("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(h.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Gt(o,i,"after",{projectPath:t}),n.md?console.log(N(fe(`Workflow: ${i}`,a.description||""),ie([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=y(s);return n.md?console.log(`> Error: ${o}`):h.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await jn.cleanup();return t.md?console.log(fe("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await jn.listAllSnapshots();if(n.length===0)return t.md?Et("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=W.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(N(Y("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),Ce(s),ie([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=W.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Nh(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(Nh,"formatMinutesToDuration");async function PT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(PT,"getGitBranch");async function CT(r){try{let e=bT.join(r,"analysis","repo-analysis.json"),t=await ST.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(CT,"loadRepoAnalysis");function xT(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=ft(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
1527
+ ${Ce(g)}`}return[u?`### Project
1491
1528
  ${u}`:null,m].filter(Boolean).join(`
1492
1529
 
1493
- `)||null}l(cT,"buildProjectContext");function lT(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 Xp(e)}l(lT,"buildRules");function uT(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.slice(0,8).map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"",a=o.source?` [${o.source}]`:"";return`- **${o.name}**${a}: ${o.description}${i}`});e.push(`### Patterns (follow these)
1530
+ `)||null}l(xT,"buildProjectContext");function TT(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 tm(e)}l(TT,"buildRules");function ET(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.slice(0,8).map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"",a=o.source?` [${o.source}]`:"";return`- **${o.name}**${a}: ${o.description}${i}`});e.push(`### Patterns (follow these)
1494
1531
  ${s.join(`
1495
1532
  `)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s={high:0,medium:1,low:2},i=[...n].sort((a,c)=>{let u=s[a.severity||"low"]??2,d=s[c.severity||"low"]??2;return u-d}).slice(0,8).map(a=>{let c=(a.severity||"low").toUpperCase(),u=a.source?` [${a.source}]`:"";return`- **[${c}] ${a.issue}**${u} \u2014 \`${a.file}\` \u2192 ${a.suggestion}`});e.push(`### Anti-patterns (avoid these)
1496
1533
  ${i.join(`
1497
1534
  `)}`)}return e.length>0?e.join(`
1498
1535
 
1499
- `):null}l(uT,"buildPatterns");function dT(r,e,t){let n=e.slice(0,4).map(c=>`\`${c.path}\``),s=(t?.patterns||[]).slice(0,3).map(c=>c.name),o=l(c=>c==="high"?0:c==="medium"?1:2,"severityWeight"),i=(t?.antiPatterns||[]).sort((c,u)=>o(c.severity)-o(u.severity)).slice(0,3).map(c=>`${c.issue} (${c.file})`);return["### Context Contract",`- Goal: ${r}`,`- Key files: ${n.length>0?n.join(", "):"Run `prjct sync` to improve file targeting"}`,`- Patterns: ${s.length>0?s.join(" | "):"No patterns yet (run `prjct sync`)"}`,`- Must avoid: ${i.length>0?i.join(" | "):"No anti-patterns yet (run `prjct sync`)"}`,"- Do now: confirm approach, follow patterns, avoid anti-patterns before editing"].join(`
1500
- `)}l(dT,"buildContextContract");function pT(r,e){let t=e.filter(d=>d.type==="gate"&&d.position==="before"),n=e.filter(d=>d.type==="hook"&&d.position==="before"),s=e.filter(d=>d.type==="step"&&d.position==="before"),o=e.filter(d=>d.type==="hook"&&d.position==="after"),i=e.filter(d=>d.type==="step"&&d.position==="after"),a=[],c=l((d,m,p)=>{let g=m.map(I=>` ${I.enabled?p:"o"} #${I.id} ${I.action}`),f=[d,...g],S=Math.max(...f.map(I=>I.length))+2;a.push(`+${"-".repeat(S)}+`);for(let I of f)a.push(`| ${I.padEnd(S-1)}|`);a.push(`+${"-".repeat(S)}+`)},"drawBox"),u=l(d=>{d.push(" |"),d.push(" v")},"arrow");return t.length>0&&(c("GATES (must pass)",t,"#"),u(a)),n.length>0&&(c("HOOKS (before)",n,">"),u(a)),s.length>0&&(c("STEPS (before)",s,">"),u(a)),a.push(` [ ${r.toUpperCase()} ]`),o.length>0&&(u(a),c("HOOKS (after)",o,">")),i.length>0&&(u(a),c("STEPS (after)",i,">")),a.join(`
1501
- `)}l(pT,"buildFlowDiagram");function mT(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(mT,"formatVariance");var as=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ks,this.planning=new es,this.shipping=new Gs,this.analytics=new _s,this.performanceCmds=new Us,this.maintenance=new Ls,this.analysis=new os,this.setupCmds=new Hs,this.updateCmds=new Ws,this.velocityCmds=new Vs,this.contextCmds=new is,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(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)}},IB=new as;bi();var Eh={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}},Ah=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{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:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{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"]}];Si();kn();ke();F();De();tt();import{execSync as ea}from"node:child_process";import ht from"node:fs/promises";import gT from"node:os";import pn from"node:path";import fT from"node:readline";import ve from"chalk";var ta="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Br="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Rh(r){let e=0;try{let t=await ht.readdir(r,{withFileTypes:!0});for(let n of t){let s=pn.join(r,n.name);if(n.isDirectory())e+=await Rh(s);else try{let o=await ht.stat(s);e+=o.size}catch{}}}catch{}return e}l(Rh,"getDirectorySize");function Ih(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(Ih,"formatSize");async function hT(r){try{return(await ht.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(hT,"countDirectoryItems");function yT(){let r={homebrew:!1,npm:!1};try{ea("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ea("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(yT,"detectInstallation");async function wT(){let r=[],e=Xd(),t=x.getGlobalBasePath(),n=await R(t),s=n?await hT(pn.join(t,"projects")):0,o=n?await Rh(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=pn.join(e.claude.config,"CLAUDE.md"),a=await R(i),c=!1;if(a)try{let j=await ht.readFile(i,"utf-8");c=j.includes(ta)&&j.includes(Br)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await R(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=pn.join(e.claude.config,"prjct-statusline.sh"),p=await R(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,f=await R(g);r.push({path:g,type:"file",description:"Gemini router",exists:f});let k=pn.join(e.gemini.config,"GEMINI.md"),S=await R(k),I=!1;if(S)try{let j=await ht.readFile(k,"utf-8");I=j.includes(ta)&&j.includes(Br)}catch{}return S&&I&&r.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(wT,"gatherUninstallItems");async function kT(r){try{let e=await ht.readFile(r,"utf-8");if(!e.includes(ta)||!e.includes(Br))return!1;let t=e.indexOf(ta),n=e.indexOf(Br)+Br.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1502
-
1503
- `).trim(),!s||s.trim().length===0?await ht.unlink(r):await ht.writeFile(r,`${s}
1504
- `,"utf-8"),!0}catch{return!1}}l(kT,"removePrjctSection");async function ST(){let r=gT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=pn.join(r,`.prjct-backup-${e}`);try{await ht.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await R(n)&&await jh(n,pn.join(t,".prjct-cli")),t}catch{return null}}l(ST,"createBackup");async function jh(r,e){await ht.mkdir(e,{recursive:!0});let t=await ht.readdir(r,{withFileTypes:!0});for(let n of t){let s=pn.join(r,n.name),o=pn.join(e,n.name);n.isDirectory()?await jh(s,o):await ht.copyFile(s,o)}}l(jh,"copyDirectory");async function bT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await kT(o.path)&&n.push(o.path):o.type==="directory"?(await ht.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await ht.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||ea(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||ea("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(bT,"performUninstall");async function vT(r){let e=fT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(vT,"promptConfirmation");async function CT(r={},e=process.cwd()){let t=await wT(),n=yT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ve.yellow(`
1505
- 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(ve.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ve.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=x.getDisplayPath(c.path),d="";c.type==="section"?d=ve.dim("(section only)"):c.size&&(d=ve.dim(`(${Ih(c.size)})`)),console.log(` ${ve.cyan(u.padEnd(35))} ${d}`),console.log(` ${ve.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ve.cyan("Homebrew".padEnd(35))} ${ve.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ve.cyan("npm global".padEnd(35))} ${ve.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ve.dim(` Total size: ${Ih(o)}`)),console.log("")),r.dryRun)return console.log(ve.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ve.blue("Creating backup..."));let c=await ST();c?(console.log(ve.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(ve.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ve.yellow('Type "uninstall" to confirm:')),!await vT("> ")))return console.log(ve.yellow(`
1506
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ve.blue("Removing prjct..."));let{deleted:i,errors:a}=await bT(t,n,r);if(console.log(""),i.length>0&&console.log(ve.green(`Removed ${i.length} items`)),a.length>0){console.log(ve.yellow(`
1507
- ${a.length} errors:`));for(let c of a)console.log(ve.red(` - ${c}`))}return console.log(""),console.log(ve.green("prjct has been uninstalled.")),console.log(ve.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(CT,"uninstall");var na=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return CT(e,t)}};var cs=new Ks,sa=new es,PT=new Gs,Dh=new _s,xT=new Us,Xs=new Ls,Ys=new os,$h=new Hs,TT=new is,ET=new Vs,AT=new na,IT=new Ws;function RT(){for(let[r,e]of Object.entries(Eh))W.registerCategory(r,e)}l(RT,"registerCategories");function Mh(){if(W.has("work"))return;RT();let r=l(e=>Ah.find(t=>t.name===e),"getMeta");W.registerMethod("task",cs,"now",r("task")),W.registerMethod("done",cs,"done",r("done")),W.registerMethod("next",cs,"next",r("next")),W.registerMethod("pause",cs,"pause",r("pause")),W.registerMethod("resume",cs,"resume",r("resume")),W.registerMethod("workflow",cs,"workflow",r("workflow")),W.registerMethod("sessions",cs,"sessions",r("sessions")),W.registerMethod("init",sa,"init",r("init")),W.registerMethod("bug",sa,"bug",r("bug")),W.registerMethod("idea",sa,"idea",r("idea")),W.registerMethod("spec",sa,"spec",r("spec")),W.registerMethod("ship",PT,"ship",r("ship")),W.registerMethod("dash",Dh,"dash",r("dash")),W.registerMethod("help",Dh,"help",r("help")),W.registerMethod("perf",xT,"perf",r("perf")),W.registerMethod("velocity",ET,"velocity",r("velocity")),W.registerMethod("cleanup",Xs,"cleanup",r("cleanup")),W.registerMethod("design",Xs,"design",r("design")),W.registerMethod("recover",Xs,"recover",r("recover")),W.registerMethod("undo",Xs,"undo",r("undo")),W.registerMethod("redo",Xs,"redo",r("redo")),W.registerMethod("history",Xs,"history",r("history")),W.registerMethod("analyze",Ys,"analyze",r("analyze")),W.registerMethod("sync",Ys,"sync",r("sync")),W.registerMethod("stats",Ys,"stats",r("stats")),W.registerMethod("status",Ys,"status",r("status")),W.registerMethod("seal",Ys,"seal",r("seal")),W.registerMethod("verify",Ys,"verify",r("verify")),W.registerMethod("start",$h,"start",r("start")),W.registerMethod("setup",$h,"setup",r("setup")),W.registerMethod("uninstall",AT,"uninstall",r("uninstall")),W.registerMethod("update",IT,"update",r("update")),W.registerMethod("context",TT,"context",r("context"))}l(Mh,"registerAllCommands");Mh();wt();ya();$t();import{Hono as HT}from"hono";import{cors as GT}from"hono/cors";import{logger as zT}from"hono/logger";ke();ee();xr();Ps();Er();xs();F();Pn();import jT from"node:fs/promises";import DT from"node:path";import{Hono as $T}from"hono";function MT(r){return x.getGlobalProjectPath(r)}l(MT,"getProjectDataPath");function Oh(r,e){let t=new $T,n=MT(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await fe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Je.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=A.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await dt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),fe.read(r),Je.read(r),dt.read(r)]),u=A.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=DT.join(n,"context",`${o}.md`),c=await jT.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return C(a)||U.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Oh,"createRoutes");ke();ee();xr();Ps();Er();xs();import Qs from"node:fs/promises";import OT from"node:path";import{Hono as FT}from"hono";var _T=x.getGlobalBasePath(),Zs=OT.join(_T,"projects");function ra(r){return A.getDoc(r,"project")}l(ra,"getProjectConfig");async function Du(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(Du,"calculateDuration");function Fh(){let r=new FT;return r.get("/projects",async e=>{try{await Qs.mkdir(Zs,{recursive:!0});let n=(await Qs.readdir(Zs,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=ra(o),a=await _.read(o),c=await fe.read(o),u=await Je.read(o),d=await dt.read(o),m=a?.currentTask,p=await Du(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(ra(t)),_.read(t),fe.read(t),Je.read(t),dt.read(t)]),c=A.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await Du(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),fe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Je.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 Qs.mkdir(Zs,{recursive:!0});let n=(await Qs.readdir(Zs,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await fe.read(c),m=await Je.read(c),p=await dt.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 Qs.mkdir(Zs,{recursive:!0});let s=(await Qs.readdir(Zs,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=ra(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=ra(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Du(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(Fh,"createExtendedRoutes");ia();import{streamSSE as NT}from"hono/streaming";var _h=3600*1e3,LT=300*1e3,UT=3e4;function Nh(){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()>_h&&t(i)},LT),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 NT(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)}},UT),p=setTimeout(()=>{t(a)},_h);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(Nh,"createSSEManager");function Lh(r){let e=new HT,t=Nh();r.enableCors!==!1&&e.use("*",GT({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",zT()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:$e,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=Oh(r.projectId,r.projectPath);e.route("/api",n);let s=Fh();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(ar())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: ${ar()?"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(Lh,"createServer");var Uh=3478;var tn={runDir:l(()=>`${process.env.HOME||jn("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${tn.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${tn.runDir()}/daemon.pid`,"pid"),log:l(()=>`${tn.runDir()}/daemon.log`,"log")},Hh=1800*1e3;function $u(r){return Buffer.from(`${JSON.stringify(r)}
1508
- `)}l($u,"encodeMessage");var er=null,Jr=null,pe=null,He=null;async function Gh(r){let e=tn.socket(),t=tn.pid(),n=tn.runDir();if(It.mkdirSync(n,{recursive:!0}),It.existsSync(t)){let s=parseInt(It.readFileSync(t,"utf-8").trim(),10);KT(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),It.unlinkSync(t)}if(It.existsSync(e)&&It.unlinkSync(e),He={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Hh,idleTimer:null},pe=new as,er=WT(s=>VT(s)),er.listen(e,()=>{It.chmodSync(e,384),It.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),zh()}),er.on("error",s=>{console.error("Daemon socket error:",s.message),qr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||Uh;Jr=Lh({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Jr.start()}}catch{}if(process.on("SIGTERM",()=>qr(0)),process.on("SIGINT",()=>qr(0)),process.on("SIGHUP",()=>{pe=new as,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Gh,"startDaemon");function VT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1509
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await BT(o);r.write($u(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write($u(i))}}}),r.on("error",()=>{})}l(VT,"handleConnection");async function BT(r){if(!He||!pe)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(zh(),He.commandsServed++,He.lastActivity=Date.now(),r.command==="daemon")return qT(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 JT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1536
+ `):null}l(ET,"buildPatterns");function AT(r,e,t){let n=e.slice(0,4).map(c=>`\`${c.path}\``),s=(t?.patterns||[]).slice(0,3).map(c=>c.name),o=l(c=>c==="high"?0:c==="medium"?1:2,"severityWeight"),i=(t?.antiPatterns||[]).sort((c,u)=>o(c.severity)-o(u.severity)).slice(0,3).map(c=>`${c.issue} (${c.file})`);return["### Context Contract",`- Goal: ${r}`,`- Key files: ${n.length>0?n.join(", "):"Run `prjct sync` to improve file targeting"}`,`- Patterns: ${s.length>0?s.join(" | "):"No patterns yet (run `prjct sync`)"}`,`- Must avoid: ${i.length>0?i.join(" | "):"No anti-patterns yet (run `prjct sync`)"}`,"- Do now: confirm approach, follow patterns, avoid anti-patterns before editing"].join(`
1537
+ `)}l(AT,"buildContextContract");function RT(r,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),n=e.filter(p=>p.type==="instruction"&&p.position==="before"),s=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),c=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=l((p,g,f)=>{let k=g.map(G=>` ${G.enabled?f:"o"} #${G.id} ${G.action}`),S=[p,...k],R=Math.max(...S.map(G=>G.length))+2;u.push(`+${"-".repeat(R)}+`);for(let G of S)u.push(`| ${G.padEnd(R-1)}|`);u.push(`+${"-".repeat(R)}+`)},"drawBox"),m=l(p=>{p.push(" |"),p.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),m(u)),n.length>0&&(d("INSTRUCTIONS (before)",n,"\u{1F4CB}"),m(u)),s.length>0&&(d("HOOKS (before)",s,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(m(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(m(u),d("HOOKS (after)",a,">")),c.length>0&&(m(u),d("STEPS (after)",c,">")),u.join(`
1538
+ `)}l(RT,"buildFlowDiagram");function IT(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(IT,"formatVariance");var cs=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Xs,this.planning=new ts,this.shipping=new Ws,this.analytics=new Ls,this.performanceCmds=new Gs,this.maintenance=new Hs,this.analysis=new is,this.setupCmds=new zs,this.updateCmds=new Vs,this.velocityCmds=new Bs,this.contextCmds=new as,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(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)}},tJ=new cs;Ti();var Lh={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}},Uh=[{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,requiresLlm:!0,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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!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,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{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,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{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:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--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"]}];xi();an();ke();F();Me();ot();import{execSync as ia}from"node:child_process";import kt from"node:fs/promises";import DT from"node:os";import gn from"node:path";import jT from"node:readline";import ve from"chalk";var aa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Qr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Gh(r){let e=0;try{let t=await kt.readdir(r,{withFileTypes:!0});for(let n of t){let s=gn.join(r,n.name);if(n.isDirectory())e+=await Gh(s);else try{let o=await kt.stat(s);e+=o.size}catch{}}}catch{}return e}l(Gh,"getDirectorySize");function Hh(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(Hh,"formatSize");async function $T(r){try{return(await kt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l($T,"countDirectoryItems");function MT(){let r={homebrew:!1,npm:!1};try{ia("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ia("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(MT,"detectInstallation");async function OT(){let r=[],e=tp(),t=x.getGlobalBasePath(),n=await D(t),s=n?await $T(gn.join(t,"projects")):0,o=n?await Gh(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=gn.join(e.claude.config,"CLAUDE.md"),a=await D(i),c=!1;if(a)try{let R=await kt.readFile(i,"utf-8");c=R.includes(aa)&&R.includes(Qr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await D(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=gn.join(e.claude.config,"prjct-statusline.sh"),p=await D(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,f=await D(g);r.push({path:g,type:"file",description:"Gemini router",exists:f});let k=gn.join(e.gemini.config,"GEMINI.md"),S=await D(k),I=!1;if(S)try{let R=await kt.readFile(k,"utf-8");I=R.includes(aa)&&R.includes(Qr)}catch{}return S&&I&&r.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(OT,"gatherUninstallItems");async function FT(r){try{let e=await kt.readFile(r,"utf-8");if(!e.includes(aa)||!e.includes(Qr))return!1;let t=e.indexOf(aa),n=e.indexOf(Qr)+Qr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1539
+
1540
+ `).trim(),!s||s.trim().length===0?await kt.unlink(r):await kt.writeFile(r,`${s}
1541
+ `,"utf-8"),!0}catch{return!1}}l(FT,"removePrjctSection");async function _T(){let r=DT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=gn.join(r,`.prjct-backup-${e}`);try{await kt.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await D(n)&&await zh(n,gn.join(t,".prjct-cli")),t}catch{return null}}l(_T,"createBackup");async function zh(r,e){await kt.mkdir(e,{recursive:!0});let t=await kt.readdir(r,{withFileTypes:!0});for(let n of t){let s=gn.join(r,n.name),o=gn.join(e,n.name);n.isDirectory()?await zh(s,o):await kt.copyFile(s,o)}}l(zh,"copyDirectory");async function NT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await FT(o.path)&&n.push(o.path):o.type==="directory"?(await kt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await kt.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||ia(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||ia("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(NT,"performUninstall");async function LT(r){let e=jT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(LT,"promptConfirmation");async function UT(r={},e=process.cwd()){let t=await OT(),n=MT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ve.yellow(`
1542
+ 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(ve.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ve.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=x.getDisplayPath(c.path),d="";c.type==="section"?d=ve.dim("(section only)"):c.size&&(d=ve.dim(`(${Hh(c.size)})`)),console.log(` ${ve.cyan(u.padEnd(35))} ${d}`),console.log(` ${ve.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ve.cyan("Homebrew".padEnd(35))} ${ve.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ve.cyan("npm global".padEnd(35))} ${ve.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ve.dim(` Total size: ${Hh(o)}`)),console.log("")),r.dryRun)return console.log(ve.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ve.blue("Creating backup..."));let c=await _T();c?(console.log(ve.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(ve.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ve.yellow('Type "uninstall" to confirm:')),!await LT("> ")))return console.log(ve.yellow(`
1543
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ve.blue("Removing prjct..."));let{deleted:i,errors:a}=await NT(t,n,r);if(console.log(""),i.length>0&&console.log(ve.green(`Removed ${i.length} items`)),a.length>0){console.log(ve.yellow(`
1544
+ ${a.length} errors:`));for(let c of a)console.log(ve.red(` - ${c}`))}return console.log(""),console.log(ve.green("prjct has been uninstalled.")),console.log(ve.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(UT,"uninstall");var ca=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return UT(e,t)}};var ls=new Xs,la=new ts,HT=new Ws,Wh=new Ls,GT=new Gs,Ys=new Hs,Qs=new is,Vh=new zs,zT=new as,WT=new Bs,VT=new ca,BT=new Vs;function JT(){for(let[r,e]of Object.entries(Lh))V.registerCategory(r,e)}l(JT,"registerCategories");function Bh(){if(V.has("work"))return;JT();let r=l(e=>Uh.find(t=>t.name===e),"getMeta");V.registerMethod("task",ls,"now",r("task")),V.registerMethod("done",ls,"done",r("done")),V.registerMethod("next",ls,"next",r("next")),V.registerMethod("pause",ls,"pause",r("pause")),V.registerMethod("resume",ls,"resume",r("resume")),V.registerMethod("workflow",ls,"workflow",r("workflow")),V.registerMethod("sessions",ls,"sessions",r("sessions")),V.registerMethod("init",la,"init",r("init")),V.registerMethod("bug",la,"bug",r("bug")),V.registerMethod("idea",la,"idea",r("idea")),V.registerMethod("spec",la,"spec",r("spec")),V.registerMethod("ship",HT,"ship",r("ship")),V.registerMethod("dash",Wh,"dash",r("dash")),V.registerMethod("help",Wh,"help",r("help")),V.registerMethod("perf",GT,"perf",r("perf")),V.registerMethod("velocity",WT,"velocity",r("velocity")),V.registerMethod("cleanup",Ys,"cleanup",r("cleanup")),V.registerMethod("design",Ys,"design",r("design")),V.registerMethod("recover",Ys,"recover",r("recover")),V.registerMethod("undo",Ys,"undo",r("undo")),V.registerMethod("redo",Ys,"redo",r("redo")),V.registerMethod("history",Ys,"history",r("history")),V.registerMethod("analyze",Qs,"analyze",r("analyze")),V.registerMethod("sync",Qs,"sync",r("sync")),V.registerMethod("stats",Qs,"stats",r("stats")),V.registerMethod("status",Qs,"status",r("status")),V.registerMethod("seal",Qs,"seal",r("seal")),V.registerMethod("verify",Qs,"verify",r("verify")),V.registerMethod("start",Vh,"start",r("start")),V.registerMethod("setup",Vh,"setup",r("setup")),V.registerMethod("uninstall",VT,"uninstall",r("uninstall")),V.registerMethod("update",BT,"update",r("update")),V.registerMethod("context",zT,"context",r("context"))}l(Bh,"registerAllCommands");Bh();Tt();Pa();Ot();import{Hono as rE}from"hono";import{cors as oE}from"hono/cors";import{logger as iE}from"hono/logger";ke();ee();Er();Ts();Rr();Es();F();En();import qT from"node:fs/promises";import KT from"node:path";import{Hono as XT}from"hono";function YT(r){return x.getGlobalProjectPath(r)}l(YT,"getProjectDataPath");function Jh(r,e){let t=new XT,n=YT(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await he.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Xe.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=A.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await gt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),he.read(r),Xe.read(r),gt.read(r)]),u=A.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=KT.join(n,"context",`${o}.md`),c=await qT.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||L.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Jh,"createRoutes");ke();ee();Er();Ts();Rr();Es();import Zs from"node:fs/promises";import QT from"node:path";import{Hono as ZT}from"hono";var eE=x.getGlobalBasePath(),er=QT.join(eE,"projects");function ua(r){return A.getDoc(r,"project")}l(ua,"getProjectConfig");async function Nu(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(Nu,"calculateDuration");function qh(){let r=new ZT;return r.get("/projects",async e=>{try{await Zs.mkdir(er,{recursive:!0});let n=(await Zs.readdir(er,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=ua(o),a=await _.read(o),c=await he.read(o),u=await Xe.read(o),d=await gt.read(o),m=a?.currentTask,p=await Nu(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(ua(t)),_.read(t),he.read(t),Xe.read(t),gt.read(t)]),c=A.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await Nu(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),he.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Xe.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 Zs.mkdir(er,{recursive:!0});let n=(await Zs.readdir(er,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await he.read(c),m=await Xe.read(c),p=await gt.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 Zs.mkdir(er,{recursive:!0});let s=(await Zs.readdir(er,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=ua(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=ua(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Nu(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(qh,"createExtendedRoutes");pa();import{streamSSE as tE}from"hono/streaming";var Kh=3600*1e3,nE=300*1e3,sE=3e4;function Xh(){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()>Kh&&t(i)},nE),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 tE(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)}},sE),p=setTimeout(()=>{t(a)},Kh);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(Xh,"createSSEManager");function Yh(r){let e=new rE,t=Xh();r.enableCors!==!1&&e.use("*",oE({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",iE()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Oe,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=Jh(r.projectId,r.projectPath);e.route("/api",n);let s=qh();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(lr())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: ${lr()?"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(Yh,"createServer");var Qh=3478;Iu();var tr=null,Zr=null,me=null,xe=null;async function Zh(r){let e=Ne.socket(),t=Ne.pid(),n=Ne.runDir();if(Je.mkdirSync(n,{recursive:!0}),Je.existsSync(t)){let i=parseInt(Je.readFileSync(t,"utf-8").trim(),10);pE(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Je.unlinkSync(t)}Je.existsSync(e)&&Je.unlinkSync(e);let s=mE(),o=null;if(s)try{o=Je.statSync(s).mtimeMs}catch{}if(xe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ch,idleTimer:null,entryPath:s,entryMtime:o},me=new cs,tr=aE(i=>cE(i)),tr.listen(e,()=>{Je.chmodSync(e,384),Je.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),ey()}),tr.on("error",i=>{console.error("Daemon socket error:",i.message),nr(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||Qh;Zr=Yh({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Zr.start()}}catch{}if(process.on("SIGTERM",()=>nr(0)),process.on("SIGINT",()=>nr(0)),process.on("SIGHUP",()=>{me=new cs,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Zh,"startDaemon");function cE(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1545
+ `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await lE(o);r.write(qr(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(qr(i))}}}),r.on("error",()=>{})}l(cE,"handleConnection");async function lE(r){if(!xe||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(ey(),xe.commandsServed++,xe.lastActivity=Date.now(),ty()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),nr(0)},200)),r.command==="daemon")return dE(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 uE(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1510
1546
  `)||o.message||void 0,stderr:t.join(`
1511
- `)||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(BT,"handleRequest");async function JT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return pe.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 pe.status(r.cwd,{json:t.json===!0,md:n});case"stats":return pe.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return pe.diff(r.cwd,{json:t.json===!0,md:n});case"seal":return pe.seal(r.cwd,{json:t.json===!0});case"rollback":return pe.rollback(r.cwd,{json:t.json===!0,md:n});case"verify":return pe.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return pe.task(e,r.cwd,{md:n});case"done":return pe.done(r.cwd,{md:n});case"next":return pe.next(r.cwd,{md:n});case"pause":return pe.pause(e||"",r.cwd,{md:n});case"resume":return pe.resume(e,r.cwd,{md:n});case"bug":return pe.bug(e||"",r.cwd,{md:n});case"idea":return pe.idea(e||"",r.cwd,{md:n});case"ship":return pe.ship(e,r.cwd,{md:n});case"dash":return pe.dash(e||"default",r.cwd,{md:n});case"workflow":return pe.workflowPrefs(e,r.cwd,{md:n});case"sessions":return pe.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return pe.design(e||"",t);case"analysis-payload":return pe.analysisPayload(r.cwd,{json:t.json===!0,md:n});case"analysis-save-llm":return pe.saveLlmAnalysis(e||"",r.cwd,{md:n});case"analysis-llm":return pe.getLlmAnalysis(r.cwd,{json:t.json===!0,md:n});case"analyze":return pe.analyze(t);case"cleanup":return pe.cleanup(t);default:return W.execute(r.command,e,r.cwd)}}l(JT,"executeCommand");function qT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:tn.socket(),uptime:He?Date.now()-He.startedAt:0,commandsServed:He?.commandsServed??0,lastActivity:He?new Date(He.lastActivity).toISOString():null,registeredCommands:W.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>qr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(qT,"handleDaemonCommand");function zh(){He&&(He.idleTimer&&clearTimeout(He.idleTimer),He.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${He.idleTimeoutMs/1e3/60} minutes, shutting down`),qr(0)},He.idleTimeoutMs),He.idleTimer.unref&&He.idleTimer.unref())}l(zh,"resetIdleTimer");function qr(r){console.log("Daemon shutting down..."),He?.idleTimer&&clearTimeout(He.idleTimer),Jr&&(Jr.stop(),Jr=null),er&&(er.close(),er=null);let e=tn.socket(),t=tn.pid();try{It.existsSync(e)&&It.unlinkSync(e)}catch{}try{It.existsSync(t)&&It.unlinkSync(t)}catch{}process.exit(r)}l(qr,"shutdown");function KT(r){try{return process.kill(r,0),!0}catch{return!1}}l(KT,"isProcessRunning");var Mu=process.argv.slice(2),XT=parseInt(Mu.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,YT=Mu.includes("--no-http"),QT=Mu.includes("--foreground");Gh({port:XT,noHttp:YT,foreground:QT}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1547
+ `)||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(lE,"handleRequest");async function uE(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return me.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 me.status(r.cwd,{json:t.json===!0,md:n});case"stats":return me.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return me.diff(r.cwd,{json:t.json===!0,md:n});case"seal":return me.seal(r.cwd,{json:t.json===!0});case"rollback":return me.rollback(r.cwd,{json:t.json===!0,md:n});case"verify":return me.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return me.task(e,r.cwd,{md:n});case"done":return me.done(r.cwd,{md:n});case"next":return me.next(r.cwd,{md:n});case"pause":return me.pause(e||"",r.cwd,{md:n});case"resume":return me.resume(e,r.cwd,{md:n});case"bug":return me.bug(e||"",r.cwd,{md:n});case"idea":return me.idea(e||"",r.cwd,{md:n});case"ship":return me.ship(e,r.cwd,{md:n});case"dash":return me.dash(e||"default",r.cwd,{md:n});case"workflow":return me.workflowPrefs(e,r.cwd,{md:n});case"sessions":return me.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return me.design(e||"",t);case"analysis-payload":return me.analysisPayload(r.cwd,{json:t.json===!0,md:n});case"analysis-save-llm":return me.saveLlmAnalysis(e||"",r.cwd,{md:n});case"analysis-llm":return me.getLlmAnalysis(r.cwd,{json:t.json===!0,md:n});case"analyze":return me.analyze(t);case"cleanup":return me.cleanup(t);default:return V.execute(r.command,e,r.cwd)}}l(uE,"executeCommand");function dE(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ne.socket(),uptime:xe?Date.now()-xe.startedAt:0,commandsServed:xe?.commandsServed??0,lastActivity:xe?new Date(xe.lastActivity).toISOString():null,registeredCommands:V.list().length,stale:ty()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>nr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(dE,"handleDaemonCommand");function ey(){xe&&(xe.idleTimer&&clearTimeout(xe.idleTimer),xe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${xe.idleTimeoutMs/1e3/60} minutes, shutting down`),nr(0)},xe.idleTimeoutMs),xe.idleTimer.unref&&xe.idleTimer.unref())}l(ey,"resetIdleTimer");function nr(r){console.log("Daemon shutting down..."),xe?.idleTimer&&clearTimeout(xe.idleTimer),Zr&&(Zr.stop(),Zr=null),tr&&(tr.close(),tr=null);let e=Ne.socket(),t=Ne.pid();try{Je.existsSync(e)&&Je.unlinkSync(e)}catch{}try{Je.existsSync(t)&&Je.unlinkSync(t)}catch{}process.exit(r)}l(nr,"shutdown");function pE(r){try{return process.kill(r,0),!0}catch{return!1}}l(pE,"isProcessRunning");function mE(){let r=fn("node:path"),e=__dirname;for(let s=0;s<5;s++){if(Je.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Je.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let s of t)if(Je.existsSync(s))return s;let n=process.argv[1];return n&&Je.existsSync(n)?n:null}l(mE,"resolveEntryPath");function ty(){if(!xe?.entryPath||xe.entryMtime===null)return!1;try{return Je.statSync(xe.entryPath).mtimeMs!==xe.entryMtime}catch{return!1}}l(ty,"isCodeStale");var Lu=process.argv.slice(2),gE=parseInt(Lu.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,fE=Lu.includes("--no-http"),hE=Lu.includes("--foreground");Zh({port:gE,noHttp:fE,foreground:hE}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});