prjct-cli 1.38.6 → 1.39.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 Yr=Object.defineProperty;var ty=Object.getOwnPropertyDescriptor;var ny=Object.getOwnPropertyNames;var sy=Object.prototype.hasOwnProperty;var l=(r,e)=>Yr(r,"name",{value:e,configurable:!0}),Dn=(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 jn=(r,e)=>{for(var t in e)Yr(r,t,{get:e[t],enumerable:!0})},ry=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ny(e))!sy.call(r,s)&&s!==t&&Yr(r,s,{get:()=>e[s],enumerable:!(n=ty(e,s))||n.enumerable});return r};var Pt=r=>ry(Yr({},"__esModule",{value:!0}),r);var Nu=w(()=>{"use strict"});var Qr,Lu=w(()=>{"use strict";Qr={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 rr,Zr=w(()=>{"use strict";rr={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 Uu(r){return r instanceof Error&&"code"in r}function P(r){return Uu(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(Uu,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var Hu=w(()=>{"use strict"});var Gu=w(()=>{"use strict";Hu()});function eo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,zu,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"},zu=["frontend","backend","devops","docs","testing","database","general"];l(eo,"calculateConfidence")});var aa=w(()=>{"use strict"});var ca=w(()=>{"use strict";Nu();Lu();Zr();F();Gu();ls();aa()});var z={};jn(z,{calculateDuration:()=>hy,formatDate:()=>us,formatDuration:()=>nn,formatMonth:()=>ly,getDateKey:()=>uy,getDateRange:()=>my,getDaysAgo:()=>gn,getDaysFromNow:()=>py,getEndOfDay:()=>wy,getStartOfDay:()=>yy,getTimestamp:()=>b,getTodayKey:()=>Wu,getYearMonthDay:()=>la,isToday:()=>gy,isWithinLastDays:()=>fy,parseDate:()=>dy,toRelative:()=>ky});import{formatDistanceToNowStrict as cy}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 ly(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Wu(){return us(new Date)}function uy(r){return us(r)}function la(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function dy(r){return new Date(r)}function b(){return new Date().toISOString()}function gn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function py(r){let e=new Date;return e.setDate(e.getDate()+r),e}function my(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 gy(r){return us(r)===Wu()}function fy(r,e){let t=gn(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 hy(r,e=new Date){let t=e.getTime()-r.getTime();return nn(t)}function yy(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function wy(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function ky(r){let e=typeof r=="string"?new Date(r):r;return cy(e,{addSuffix:!0})}var oe=w(()=>{"use strict";l(us,"formatDate");l(ly,"formatMonth");l(Wu,"getTodayKey");l(uy,"getDateKey");l(la,"getYearMonthDay");l(dy,"parseDate");l(b,"getTimestamp");l(gn,"getDaysAgo");l(py,"getDaysFromNow");l(my,"getDateRange");l(gy,"isToday");l(fy,"isWithinLastDays");l(nn,"formatDuration");l(hy,"calculateDuration");l(yy,"getStartOfDay");l(wy,"getEndOfDay");l(ky,"toRelative")});import Ju from"node:fs/promises";async function qu(r,e){let t;try{t=await Ju.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Vu(r,t),Bu(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Vu(r,t),Bu(r,Sy(s.error)),null)}async function Vu(r,e){let t=`${r}.backup`;try{await Ju.writeFile(t,e,"utf-8")}catch{}}function Bu(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 Sy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ku=w(()=>{"use strict";F();l(qu,"safeRead");l(Vu,"createBackup");l(Bu,"logCorruption");l(Sy,"formatZodError")});var we={};jn(we,{appendLine:()=>ua,appendToFile:()=>Cy,atomicWrite:()=>by,copyFile:()=>Ay,deleteDir:()=>xy,deleteFile:()=>vy,dirExists:()=>to,ensureDir:()=>Rt,fileExists:()=>R,getFileExtension:()=>jy,getFileModifiedTime:()=>Ey,getFileNameWithoutExtension:()=>$y,getFileSize:()=>Ty,listFiles:()=>sn,moveFile:()=>Iy,prependToFile:()=>Py,readFile:()=>Qe,readJson:()=>zt,readLines:()=>Ry,writeFile:()=>Wt,writeJson:()=>$n,writeLines:()=>Dy});import ye from"node:fs/promises";import ds from"node:path";async function zt(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 $n(r,e,t=2){let n=JSON.stringify(e,null,t);await ye.writeFile(r,n,"utf-8")}async function Qe(r,e=""){try{return await ye.readFile(r,"utf-8")}catch(t){if(P(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 by(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 Cy(r,e){await ye.appendFile(r,e,"utf-8")}async function ua(r,e){let t=ds.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.appendFile(r,`${e}
9
- `,"utf-8")}async function Py(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 R(r){try{return await ye.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function to(r){try{return(await ye.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Rt(r){await ye.mkdir(r,{recursive:!0})}async function vy(r){try{return await ye.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function xy(r){try{return await ye.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(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(P(t))return[];throw t}}async function Ty(r){return(await ye.stat(r)).size}async function Ey(r){return(await ye.stat(r)).mtime}async function Ay(r,e){await ye.copyFile(r,e)}async function Iy(r,e){await ye.rename(r,e)}async function Ry(r){return(await Qe(r,"")).split(`
10
- `)}async function Dy(r,e){let t=e.join(`
11
- `);await Wt(r,t)}function jy(r){return ds.extname(r)}function $y(r){return ds.basename(r,ds.extname(r))}var Me=w(()=>{"use strict";Ku();F();l(zt,"readJson");l($n,"writeJson");l(Qe,"readFile");l(Wt,"writeFile");l(by,"atomicWrite");l(Cy,"appendToFile");l(ua,"appendLine");l(Py,"prependToFile");l(R,"fileExists");l(to,"dirExists");l(Rt,"ensureDir");l(vy,"deleteFile");l(xy,"deleteDir");l(sn,"listFiles");l(Ty,"getFileSize");l(Ey,"getFileModifiedTime");l(Ay,"copyFile");l(Iy,"moveFile");l(Ry,"readLines");l(Dy,"writeLines");l(jy,"getFileExtension");l($y,"getFileNameWithoutExtension")});import{z as Vt}from"zod";function Xu(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 JE,qE,KE,or,XE,ir=w(()=>{"use strict";JE=Vt.enum(["opus","sonnet","haiku"]),qE=Vt.enum(["2.5-pro","2.5-flash","2.0-flash"]),KE=Vt.string().min(1),or=Vt.object({provider:Vt.string(),model:Vt.string(),cliVersion:Vt.string().optional(),recordedAt:Vt.string()}),XE=Vt.object({preferredModel:Vt.string().optional(),lastAnalysisModel:or.optional()});l(Xu,"compareSemver")});import da from"node:fs/promises";import My from"node:os";import Yu from"node:path";async function ed(){try{let r=await da.readFile(Zu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Oy?null:e.detection}catch{return null}}async function td(r){let e={timestamp:new Date().toISOString(),detection:r};await da.mkdir(Qu,{recursive:!0}),await da.writeFile(Zu,JSON.stringify(e,null,2))}var Qu,Zu,Oy,nd=w(()=>{"use strict";Qu=Yu.join(My.homedir(),".prjct-cli","cache"),Zu=Yu.join(Qu,"providers.json"),Oy=600*1e3;l(ed,"readProviderCache");l(td,"writeProviderCache")});var ht={};jn(ht,{AntigravityProvider:()=>ma,ClaudeProvider:()=>no,CodexProvider:()=>ga,CursorProvider:()=>od,GeminiProvider:()=>pa,Providers:()=>ot,WindsurfProvider:()=>id,detectAllProviders:()=>ar,detectAntigravity:()=>oo,detectCodex:()=>Mn,detectCursorProject:()=>ld,detectProvider:()=>so,detectWindsurfProject:()=>ud,getActiveProvider:()=>Ly,getCommandsDir:()=>By,getGlobalContextPath:()=>zy,getGlobalSettingsPath:()=>Wy,getProjectCommandsPath:()=>Jy,getProviderBranding:()=>ro,getSkillsPath:()=>Vy,hasProviderConfig:()=>Uy,needsCursorRouterRegeneration:()=>Hy,needsWindsurfRouterRegeneration:()=>Gy,selectProvider:()=>fa,validateCliVersion:()=>cd});import{exec as Fy}from"node:child_process";import fn from"node:os";import Ne from"node:path";import{promisify as _y}from"node:util";async function ad(r){try{let{stdout:e}=await sd(`which ${r}`,{timeout:rd});return e.trim()}catch{return null}}async function Ny(r){try{let{stdout:e}=await sd(`${r} --version`,{timeout:rd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function so(r){let e=ot[r];if(!e.cliCommand)return{installed:!1};let t=await ad(e.cliCommand);if(!t)return{installed:!1};let n=await Ny(e.cliCommand),s=cd(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function cd(r,e){let t=ot[r];return!t.minCliVersion||!e?null:Xu(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 ar(r=!1){if(!r){let i=await ed();if(i)return i}let[e,t,n]=await Promise.all([so("claude"),so("gemini"),Mn()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await td(o).catch(()=>{}),o}async function Ly(r){if(r&&ot[r])return ot[r];let e=await ar();return e.claude.installed&&!e.gemini.installed?no:e.gemini.installed&&!e.claude.installed?pa:no}async function Uy(r){let e=ot[r];return e.configDir?R(e.configDir):!1}function ro(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 ld(r){let e=Ne.join(r,".cursor"),t=Ne.join(e,"rules"),n=Ne.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 Hy(r){let e=await ld(r);return e.detected&&!e.routerInstalled}async function ud(r){let e=Ne.join(r,".windsurf"),t=Ne.join(e,"rules"),n=Ne.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 Gy(r){let e=await ud(r);return e.detected&&!e.routerInstalled}async function oo(){let r=ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ne.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=ga.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await ad("codex"),t=Ne.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 zy(r){let e=ot[r];return e.configDir?Ne.join(e.configDir,e.contextFile):null}function Wy(r){let e=ot[r];return!e.configDir||!e.settingsFile?null:Ne.join(e.configDir,e.settingsFile)}function Vy(r){return ot[r].skillsDir}function By(r){return ot[r].commandsDir}function Jy(r,e){let t=ot[r];return Ne.join(e,t.commandsDir)}async function fa(){let r=await ar(),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 sd,rd,no,pa,ma,od,id,ga,ot,Ze=w(()=>{"use strict";ir();Me();nd();sd=_y(Fy),rd=2e3,no={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ne.join(fn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ne.join(fn.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"},pa={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ne.join(fn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ne.join(fn.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"},ma={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ne.join(fn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ne.join(fn.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},od={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},id={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},ga={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ne.join(fn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ne.join(fn.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},ot={claude:no,gemini:pa,cursor:od,antigravity:ma,windsurf:id,codex:ga};l(ad,"whichCommand");l(Ny,"getCliVersion");l(so,"detectProvider");l(cd,"validateCliVersion");l(ar,"detectAllProviders");l(Ly,"getActiveProvider");l(Uy,"hasProviderConfig");l(ro,"getProviderBranding");l(ld,"detectCursorProject");l(Hy,"needsCursorRouterRegeneration");l(ud,"detectWindsurfProject");l(Gy,"needsWindsurfRouterRegeneration");l(oo,"detectAntigravity");l(Mn,"detectCodex");l(zy,"getGlobalContextPath");l(Wy,"getGlobalSettingsPath");l(Vy,"getSkillsPath");l(By,"getCommandsDir");l(Jy,"getProjectCommandsPath");l(fa,"selectProvider")});import qy from"node:crypto";import Bt from"node:fs/promises";import ha from"node:os";import H from"node:path";import{globSync as Ky}from"glob";var ya,Xy,x,ke=w(()=>{"use strict";oe();Me();ya=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(ha.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 qy.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 to(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}=la(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 to(t)}getDisplayPath(e){let t=ha.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(ht)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ze(),Pt(ht)).getActiveProvider();return(Ze(),Pt(ht)).getGlobalSettingsPath(e.name)}getClaudeDir(){return H.join(ha.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=Ky(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}},Xy=new ya,x=Xy});function Yy(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function cr(){return Yy()==="bun"}var wa=w(()=>{"use strict";l(Yy,"detectRuntime");l(cr,"isBun")});import ka from"node:fs";import dd from"node:path";function Qy(r){if(cr()){let{Database:s}=Dn("bun:sqlite");return new s(r,{create:!0})}let e=Dn("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Zy,io,A,L,ne=w(()=>{"use strict";ke();wa();l(Qy,"openDatabase");Zy=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
8
+ var Kr=Object.defineProperty;var Xh=Object.getOwnPropertyDescriptor;var Yh=Object.getOwnPropertyNames;var Qh=Object.prototype.hasOwnProperty;var l=(r,e)=>Kr(r,"name",{value:e,configurable:!0}),mn=(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 k=(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})},Zh=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Yh(e))!Qh.call(r,s)&&s!==t&&Kr(r,s,{get:()=>e[s],enumerable:!(n=Xh(e,s))||n.enumerable});return r};var ut=r=>Zh(Kr({},"__esModule",{value:!0}),r);var _u=k(()=>{"use strict"});var Xr,Nu=k(()=>{"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 rr,Yr=k(()=>{"use strict";rr={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=k(()=>{"use strict";l(Lu,"isNodeError");l(C,"isNotFoundError");l(y,"getErrorMessage")});var Uu=k(()=>{"use strict"});var Hu=k(()=>{"use strict";Uu()});function Qr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Gu,ls=k(()=>{"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=k(()=>{"use strict"});var aa=k(()=>{"use strict";_u();Nu();Yr();F();Hu();ls();ia()});var W={};Dn(W,{calculateDuration:()=>dy,formatDate:()=>us,formatDuration:()=>nn,formatMonth:()=>ry,getDateKey:()=>oy,getDateRange:()=>cy,getDaysAgo:()=>gn,getDaysFromNow:()=>ay,getEndOfDay:()=>my,getStartOfDay:()=>py,getTimestamp:()=>b,getTodayKey:()=>zu,getYearMonthDay:()=>ca,isToday:()=>ly,isWithinLastDays:()=>uy,parseDate:()=>iy,toRelative:()=>gy});import{formatDistanceToNowStrict as sy}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 ry(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function zu(){return us(new Date)}function oy(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 iy(r){return new Date(r)}function b(){return new Date().toISOString()}function gn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function ay(r){let e=new Date;return e.setDate(e.getDate()+r),e}function cy(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 ly(r){return us(r)===zu()}function uy(r,e){let t=gn(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 dy(r,e=new Date){let t=e.getTime()-r.getTime();return nn(t)}function py(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function my(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function gy(r){let e=typeof r=="string"?new Date(r):r;return sy(e,{addSuffix:!0})}var se=k(()=>{"use strict";l(us,"formatDate");l(ry,"formatMonth");l(zu,"getTodayKey");l(oy,"getDateKey");l(ca,"getYearMonthDay");l(iy,"parseDate");l(b,"getTimestamp");l(gn,"getDaysAgo");l(ay,"getDaysFromNow");l(cy,"getDateRange");l(ly,"isToday");l(uy,"isWithinLastDays");l(nn,"formatDuration");l(dy,"calculateDuration");l(py,"getStartOfDay");l(my,"getEndOfDay");l(gy,"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,fy(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 fy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var qu=k(()=>{"use strict";F();l(Ju,"safeRead");l(Wu,"createBackup");l(Vu,"logCorruption");l(fy,"formatZodError")});var we={};Dn(we,{appendLine:()=>la,appendToFile:()=>yy,atomicWrite:()=>hy,copyFile:()=>Cy,deleteDir:()=>Sy,deleteFile:()=>ky,dirExists:()=>Zr,ensureDir:()=>Rt,fileExists:()=>j,getFileExtension:()=>Ey,getFileModifiedTime:()=>vy,getFileNameWithoutExtension:()=>Ay,getFileSize:()=>by,listFiles:()=>sn,moveFile:()=>Py,prependToFile:()=>wy,readFile:()=>Ze,readJson:()=>zt,readLines:()=>xy,writeFile:()=>Wt,writeJson:()=>$n,writeLines:()=>Ty});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 Ze(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 hy(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 yy(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 wy(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 j(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 ky(r){try{return await ye.unlink(r),!0}catch(e){if(C(e))return!1;throw e}}async function Sy(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 by(r){return(await ye.stat(r)).size}async function vy(r){return(await ye.stat(r)).mtime}async function Cy(r,e){await ye.copyFile(r,e)}async function Py(r,e){await ye.rename(r,e)}async function xy(r){return(await Ze(r,"")).split(`
10
+ `)}async function Ty(r,e){let t=e.join(`
11
+ `);await Wt(r,t)}function Ey(r){return ds.extname(r)}function Ay(r){return ds.basename(r,ds.extname(r))}var Me=k(()=>{"use strict";qu();F();l(zt,"readJson");l($n,"writeJson");l(Ze,"readFile");l(Wt,"writeFile");l(hy,"atomicWrite");l(yy,"appendToFile");l(la,"appendLine");l(wy,"prependToFile");l(j,"fileExists");l(Zr,"dirExists");l(Rt,"ensureDir");l(ky,"deleteFile");l(Sy,"deleteDir");l(sn,"listFiles");l(by,"getFileSize");l(vy,"getFileModifiedTime");l(Cy,"copyFile");l(Py,"moveFile");l(xy,"readLines");l(Ty,"writeLines");l(Ey,"getFileExtension");l(Ay,"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 HE,GE,zE,or,WE,ir=k(()=>{"use strict";HE=Vt.enum(["opus","sonnet","haiku"]),GE=Vt.enum(["2.5-pro","2.5-flash","2.0-flash"]),zE=Vt.string().min(1),or=Vt.object({provider:Vt.string(),model:Vt.string(),cliVersion:Vt.string().optional(),recordedAt:Vt.string()}),WE=Vt.object({preferredModel:Vt.string().optional(),lastAnalysisModel:or.optional()});l(Ku,"compareSemver")});import ua from"node:fs/promises";import Iy 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()>Ry?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,Ry,td=k(()=>{"use strict";Yu=Xu.join(Iy.homedir(),".prjct-cli","cache"),Qu=Xu.join(Yu,"providers.json"),Ry=600*1e3;l(Zu,"readProviderCache");l(ed,"writeProviderCache")});var it={};Dn(it,{AntigravityProvider:()=>pa,ClaudeProvider:()=>eo,CodexProvider:()=>ma,CursorProvider:()=>rd,GeminiProvider:()=>da,Providers:()=>ot,WindsurfProvider:()=>od,detectAllProviders:()=>ar,detectAntigravity:()=>so,detectCodex:()=>Mn,detectCursorProject:()=>cd,detectProvider:()=>to,detectWindsurfProject:()=>ld,getActiveProvider:()=>My,getCommandsDir:()=>Hy,getGlobalContextPath:()=>Ny,getGlobalSettingsPath:()=>Ly,getProjectCommandsPath:()=>Gy,getProviderBranding:()=>no,getSkillsPath:()=>Uy,hasProviderConfig:()=>Oy,needsCursorRouterRegeneration:()=>Fy,needsWindsurfRouterRegeneration:()=>_y,selectProvider:()=>ga,validateCliVersion:()=>ad});import{exec as jy}from"node:child_process";import fn from"node:os";import Ne from"node:path";import{promisify as Dy}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 $y(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=ot[r];if(!e.cliCommand)return{installed:!1};let t=await id(e.cliCommand);if(!t)return{installed:!1};let n=await $y(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=ot[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 ar(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 My(r){if(r&&ot[r])return ot[r];let e=await ar();return e.claude.installed&&!e.gemini.installed?eo:e.gemini.installed&&!e.claude.installed?da:eo}async function Oy(r){let e=ot[r];return e.configDir?j(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=Ne.join(r,".cursor"),t=Ne.join(e,"rules"),n=Ne.join(t,"prjct.mdc"),[s,o]=await Promise.all([j(e),j(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Fy(r){let e=await cd(r);return e.detected&&!e.routerInstalled}async function ld(r){let e=Ne.join(r,".windsurf"),t=Ne.join(e,"rules"),n=Ne.join(t,"prjct.md"),[s,o]=await Promise.all([j(e),j(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function _y(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=Ne.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([j(r),j(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=Ne.join(r,"skills","prjct","SKILL.md"),n=await j(t),s=!!e;return{installed:s,skillInstalled:n,configPath:s?r:void 0}}function Ny(r){let e=ot[r];return e.configDir?Ne.join(e.configDir,e.contextFile):null}function Ly(r){let e=ot[r];return!e.configDir||!e.settingsFile?null:Ne.join(e.configDir,e.settingsFile)}function Uy(r){return ot[r].skillsDir}function Hy(r){return ot[r].commandsDir}function Gy(r,e){let t=ot[r];return Ne.join(e,t.commandsDir)}async function ga(){let r=await ar(),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,ot,Ge=k(()=>{"use strict";ir();Me();td();nd=Dy(jy),sd=2e3,eo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ne.join(fn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ne.join(fn.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:Ne.join(fn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ne.join(fn.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:Ne.join(fn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ne.join(fn.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:Ne.join(fn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ne.join(fn.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},ot={claude:eo,gemini:da,cursor:rd,antigravity:pa,windsurf:od,codex:ma};l(id,"whichCommand");l($y,"getCliVersion");l(to,"detectProvider");l(ad,"validateCliVersion");l(ar,"detectAllProviders");l(My,"getActiveProvider");l(Oy,"hasProviderConfig");l(no,"getProviderBranding");l(cd,"detectCursorProject");l(Fy,"needsCursorRouterRegeneration");l(ld,"detectWindsurfProject");l(_y,"needsWindsurfRouterRegeneration");l(so,"detectAntigravity");l(Mn,"detectCodex");l(Ny,"getGlobalContextPath");l(Ly,"getGlobalSettingsPath");l(Uy,"getSkillsPath");l(Hy,"getCommandsDir");l(Gy,"getProjectCommandsPath");l(ga,"selectProvider")});import zy from"node:crypto";import Bt from"node:fs/promises";import fa from"node:os";import H from"node:path";import{globSync as Wy}from"glob";var ha,Vy,x,ke=k(()=>{"use strict";se();Me();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 zy.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 j(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(),ut(it)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ge(),ut(it)).getActiveProvider();return(Ge(),ut(it)).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 j(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=H.join(e,"package.json");if(await j(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 j(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=Wy(o,{cwd:e,absolute:!1});for(let a of i){let c=H.join(e,a),u=H.join(c,"package.json");if(await j(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 j(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}},Vy=new ha,x=Vy});function By(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function cr(){return By()==="bun"}var ya=k(()=>{"use strict";l(By,"detectRuntime");l(cr,"isBun")});import wa from"node:fs";import ud from"node:path";function Jy(r){if(cr()){let{Database:s}=mn("bun:sqlite");return new s(r,{create:!0})}let e=mn("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var qy,ro,A,U,ee=k(()=>{"use strict";ke();ya();l(Jy,"openDatabase");qy=[{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 Yr=Object.defineProperty;var ty=Object.getOwnPropertyDescriptor;var ny=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")}],io=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return dd.join(x.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=dd.dirname(n);ka.existsSync(s)||ka.mkdirSync(s,{recursive:!0});let o=Qy(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 ka.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")}],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=Jy(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(`
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 Zy)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 io,L=A});function ba(r){if(zu.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ao))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 Sa,ao,On,lr,ur,dr=w(()=>{"use strict";ne();ls();oe();Sa={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)},ao={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(ba,"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}},lr=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()}},ur=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 pr,Ca=w(()=>{"use strict";ne();ls();oe();dr();pr=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=eo(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=eo(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:eo(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 pd=w(()=>{"use strict"});import mr from"node:fs/promises";import hn from"node:path";import{z as K}from"zod";async function rw(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=hn.join(e,"package.json"),s=await mr.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 ow(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 lw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=sw[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 iw(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=hn.join(e,a);try{await mr.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 aw(r,e){let t=Date.now();try{let n=await uw(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 cw(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=hn.join(e,o.file);try{await mr.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 md(r,e){let t=Date.now(),n=await Promise.all([rw(r,e),ow(r,e),iw(r,e),aw(r,e),cw(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 lw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await mr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=hn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function uw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await mr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.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 ew,tw,nw,Pa,WA,sw,va=w(()=>{"use strict";F();ir();ew=K.enum(["draft","verified","sealed"]),tw=K.object({name:K.string(),description:K.string(),location:K.string().optional(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),nw=K.object({issue:K.string(),file:K.string(),suggestion:K.string(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),Pa=K.object({projectId:K.string(),languages:K.array(K.string()),frameworks:K.array(K.string()),packageManager:K.string().optional(),sourceDir:K.string().optional(),testDir:K.string().optional(),configFiles:K.array(K.string()),fileCount:K.number(),patterns:K.array(tw),antiPatterns:K.array(nw),analyzedAt:K.string(),modelMetadata:or.optional(),status:ew.default("draft"),commitHash:K.string().optional(),signature:K.string().optional(),sealedAt:K.string().optional(),verifiedAt:K.string().optional()}),WA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},sw={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(rw,"verifyFrameworks");l(ow,"verifyLanguages");l(iw,"verifyPatternLocations");l(aw,"verifyFileCount");l(cw,"verifyAntiPatternFiles");l(md,"semanticVerify");l(lw,"getProjectExtensions");l(uw,"countProjectFiles")});import{z as De}from"zod";var co,yn,dw,qA,xa,gd,gr=w(()=>{"use strict";co=De.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),yn=De.object({primaryDomain:co,secondaryDomains:De.array(co),confidence:De.number().min(0).max(1),filePatterns:De.array(De.string()),relevantAgents:De.array(De.string())}),dw=De.object({classification:yn,classifiedAt:De.string(),source:De.enum(["cache","history","llm","heuristic"]),descriptionHash:De.string(),projectId:De.string()}),qA=De.object({entries:De.record(De.string(),dw),confirmedPatterns:De.array(De.object({descriptionHash:De.string(),classification:yn,confirmedAt:De.string(),taskDescription:De.string()}))}),xa={entries:{},confirmedPatterns:[]},gd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as G}from"zod";var pw,mw,fd,gw,fw,hw,yw,ww,hd,YA,Ta=w(()=>{"use strict";pw=G.enum(["low","medium","high"]),mw=G.enum(["pending","converted","completed","archived","dormant"]),fd=G.enum(["high","medium","low"]),gw=G.object({impact:fd,effort:fd}),fw=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()}),hw=G.object({name:G.string(),description:G.string()}),yw=G.object({name:G.string(),description:G.string().optional()}),ww=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:pw,status:mw,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:gw.optional(),implementationNotes:G.string().optional(),stack:fw.optional(),modules:G.array(hw).optional(),roles:G.array(yw).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),hd=G.object({ideas:G.array(ww),lastUpdated:G.string()}),YA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as J}from"zod";function wd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var yd,kw,Sw,bw,Cw,tI,nI,Ea=w(()=>{"use strict";yd=J.enum(["linear","jira","github","monday","asana","none"]),kw=J.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Sw=J.enum(["none","urgent","high","medium","low"]),bw=J.enum(["feature","bug","improvement","task","chore","epic"]),Cw=J.object({id:J.string(),identifier:J.string(),title:J.string(),description:J.string().optional(),status:kw,priority:Sw,type:bw.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()}),tI=J.object({provider:yd,lastSync:J.string(),staleAfter:J.number().default(18e5),issues:J.record(J.string(),Cw)}),nI=J.object({provider:yd,fetched:J.number(),updated:J.number(),errors:J.array(J.object({issueId:J.string(),error:J.string()})),timestamp:J.string()});l(wd,"createEmptyIssues")});var Pd={};jn(Pd,{AgentAssignmentSchema:()=>kd,OUTPUT_SCHEMAS:()=>bd,SubtaskBreakdownSchema:()=>Sd,TaskClassificationSchema:()=>yn,renderSchemaForPrompt:()=>Aa});import{z as We}from"zod";function Aa(r){let e=bd[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 qy)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,U=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,lr,ur,dr=k(()=>{"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=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}},lr=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()}},ur=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 pr,ba=k(()=>{"use strict";ee();ls();se();dr();pr=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=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 dd=k(()=>{"use strict"});import mr from"node:fs/promises";import hn from"node:path";import{z as q}from"zod";async function Zy(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=hn.join(e,"package.json"),s=await mr.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 ew(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 rw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Qy[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 tw(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=hn.join(e,a);try{await mr.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 nw(r,e){let t=Date.now();try{let n=await ow(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 sw(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=hn.join(e,o.file);try{await mr.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([Zy(r,e),ew(r,e),tw(r,e),nw(r,e),sw(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 rw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await mr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=hn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function ow(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await mr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.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 Ky,Xy,Yy,va,NA,Qy,Ca=k(()=>{"use strict";F();ir();Ky=q.enum(["draft","verified","sealed"]),Xy=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()}),Yy=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()}),va=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(Xy),antiPatterns:q.array(Yy),analyzedAt:q.string(),modelMetadata:or.optional(),status:Ky.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),NA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Qy={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(Zy,"verifyFrameworks");l(ew,"verifyLanguages");l(tw,"verifyPatternLocations");l(nw,"verifyFileCount");l(sw,"verifyAntiPatternFiles");l(pd,"semanticVerify");l(rw,"getProjectExtensions");l(ow,"countProjectFiles")});import{z as je}from"zod";var io,yn,iw,GA,Pa,md,gr=k(()=>{"use strict";io=je.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),yn=je.object({primaryDomain:io,secondaryDomains:je.array(io),confidence:je.number().min(0).max(1),filePatterns:je.array(je.string()),relevantAgents:je.array(je.string())}),iw=je.object({classification:yn,classifiedAt:je.string(),source:je.enum(["cache","history","llm","heuristic"]),descriptionHash:je.string(),projectId:je.string()}),GA=je.object({entries:je.record(je.string(),iw),confirmedPatterns:je.array(je.object({descriptionHash:je.string(),classification:yn,confirmedAt:je.string(),taskDescription:je.string()}))}),Pa={entries:{},confirmedPatterns:[]},md={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var aw,cw,gd,lw,uw,dw,pw,mw,fd,VA,xa=k(()=>{"use strict";aw=z.enum(["low","medium","high"]),cw=z.enum(["pending","converted","completed","archived","dormant"]),gd=z.enum(["high","medium","low"]),lw=z.object({impact:gd,effort:gd}),uw=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()}),dw=z.object({name:z.string(),description:z.string()}),pw=z.object({name:z.string(),description:z.string().optional()}),mw=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:aw,status:cw,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:lw.optional(),implementationNotes:z.string().optional(),stack:uw.optional(),modules:z.array(dw).optional(),roles:z.array(pw).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),fd=z.object({ideas:z.array(mw),lastUpdated:z.string()}),VA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as J}from"zod";function yd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var hd,gw,fw,hw,yw,KA,XA,Ta=k(()=>{"use strict";hd=J.enum(["linear","jira","github","monday","asana","none"]),gw=J.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),fw=J.enum(["none","urgent","high","medium","low"]),hw=J.enum(["feature","bug","improvement","task","chore","epic"]),yw=J.object({id:J.string(),identifier:J.string(),title:J.string(),description:J.string().optional(),status:gw,priority:fw,type:hw.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()}),KA=J.object({provider:hd,lastSync:J.string(),staleAfter:J.number().default(18e5),issues:J.record(J.string(),yw)}),XA=J.object({provider:hd,fetched:J.number(),updated:J.number(),errors:J.array(J.object({issueId:J.string(),error:J.string()})),timestamp:J.string()});l(yd,"createEmptyIssues")});var vd={};Dn(vd,{AgentAssignmentSchema:()=>wd,OUTPUT_SCHEMAS:()=>Sd,SubtaskBreakdownSchema:()=>kd,TaskClassificationSchema:()=>yn,renderSchemaForPrompt:()=>Ea});import{z as ze}from"zod";function Ea(r){let e=Sd[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,68 @@ ${e.example}
314
314
  \`\`\`
315
315
 
316
316
  Fields:
317
- ${Pw(e.schema)}`:null}function Pw(r){if(r instanceof We.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Cd(n)}`).join(`
318
- `)}return"(see example above)"}function Cd(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 ${Cd(r.element)}`:r instanceof We.ZodObject?"object":"any"}var kd,Sd,bd,lo=w(()=>{"use strict";gr();gr();kd=We.object({agentName:We.string(),reasoning:We.string(),confidence:We.number().min(0).max(1)}),Sd=We.object({subtasks:We.array(We.object({description:We.string(),domain:co,agent:We.string(),dependsOn:We.array(We.number())})),effort:We.enum(["low","medium","high"])}),bd={classification:{schema:yn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:kd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Sd,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(Aa,"renderSchemaForPrompt");l(Pw,"describeSchema");l(Cd,"describeField")});import{z as T}from"zod";var vd,vw,xw,xd,Tw,Ew,Aw,Iw,Rw,Dw,jw,Td,$w,Mw,uI,Ed,Ad,Id,Rd,Ow,uo,Ia=w(()=>{"use strict";vd=T.number().min(1).max(5),vw=T.enum(["exceeded","met","partial","failed"]),xw=T.enum(["definitely","probably","maybe","no"]),xd=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Tw=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:xd.optional(),explanation:T.string().optional()})}),Ew=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),Aw=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Iw=T.object({metrics:T.array(Ew),acceptanceCriteria:T.array(Aw),overallSuccess:vw,successScore:T.number().min(0).max(100)}),Rw=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Dw=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Rw)}),jw=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:xw,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),Td=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:vd,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),$w=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:Tw,success:Iw.optional(),learnings:Dw,roi:jw,rating:vd,taskOutcomes:T.array(Td).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),Mw=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:xd,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),uI=T.object({outcomes:T.array($w),taskOutcomes:T.array(Td).optional(),aggregates:Mw.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),Ed={outcomes:[],taskOutcomes:[],lastUpdated:""},Ad=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"),Id=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Rd=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Ow=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),uo=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=>Ow(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 Le}from"zod";function Hw(){let r={};for(let e of Nw)r[e]="allow";for(let e of Lw)r[e]="ask";for(let e of Uw)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var po,gI,Fw,Ra,_w,fI,Nw,Lw,Uw,hI,Dd=w(()=>{"use strict";po=Le.enum(["allow","deny","ask"]),gI=Le.enum(["read","write","delete","create"]),Fw=Le.record(Le.string(),po),Ra=Le.record(Le.string(),po),_w=Le.object({enabled:Le.boolean().default(!0),allowedDomains:Le.array(Le.string()).optional(),blockedDomains:Le.array(Le.string()).optional()}),fI=Le.object({bash:Fw.optional(),files:Le.object({read:Ra.optional(),write:Ra.optional(),delete:Ra.optional()}).optional(),web:_w.optional(),skills:Le.record(Le.string(),po).optional(),doomLoop:Le.object({enabled:Le.boolean().default(!0),maxRetries:Le.number().default(3)}).optional(),externalDirectories:po.default("ask")}),Nw=["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*"],Lw=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Uw=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Hw,"buildDefaultPermissions");hI=Hw()});import{z as it}from"zod";var SI,bI,jd=w(()=>{"use strict";SI=it.object({projectId:it.string(),name:it.string(),repoPath:it.string(),description:it.string().optional(),version:it.string().optional(),cliVersion:it.string().optional(),techStack:it.array(it.string()),fileCount:it.number(),commitCount:it.number(),createdAt:it.string(),lastSync:it.string(),lastSyncCommit:it.string().optional(),lastSyncBranch:it.string().optional()}),bI={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Gw,zw,Ww,Vw,Bw,Jw,qw,Kw,Xw,Yw,Qw,Zw,ek,tk,nk,sk,rk,ok,xI,TI,$d=w(()=>{"use strict";Gw=E.enum(["planned","active","completed","shipped"]),zw=E.enum(["low","medium","high"]),Ww=E.enum(["feature","breaking_change","refactor","infrastructure"]),Vw=E.enum(["completed","active","planned"]),Bw=E.enum(["planned","active","completed"]),Jw=E.enum(["git","git-branch","manual","prd"]),qw=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),Kw=E.object({id:E.string(),name:E.string(),status:Vw,completedAt:E.string().optional()}),Xw=E.object({goal:E.string(),phases:E.array(Kw),successMetrics:E.array(E.string()).optional()}),Yw=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),Qw=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),Zw=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),ek=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),tk=E.object({estimated:Zw.nullable(),actual:ek.nullable()}),nk=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),sk=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:nk.optional(),status:Bw,startDate:E.string().optional(),endDate:E.string().optional()}),rk=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Gw,impact:zw,effort:E.string().optional(),progress:E.number(),type:Ww.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(qw),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:Yw.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:Jw.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:tk.optional(),valueScore:E.number().optional(),commits:E.array(Qw).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),ok=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()}),xI=E.object({strategy:Xw.nullable().optional(),features:E.array(rk),backlog:E.array(E.union([E.string(),ok])),lastUpdated:E.string(),quarters:E.array(sk).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),TI={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 ik from"node:crypto";import{homedir as ak}from"node:os";import{join as ck}from"node:path";function ge(){return ik.randomUUID()}var lk,Md=w(()=>{"use strict";l(ge,"generateUUID");lk=ck(ak(),".prjct-cli","projects")});import{z as et}from"zod";var OI,Od=w(()=>{"use strict";OI=et.object({sessionId:et.string(),projectId:et.string(),projectPath:et.string(),projectName:et.string().optional(),taskDescription:et.string(),taskStatus:et.enum(["active","paused"]),activeSubtaskIndex:et.number().optional(),subtaskCount:et.number().optional(),branch:et.string().optional(),linearId:et.string().optional(),filesModified:et.array(et.string()).optional(),durationWorkedSec:et.number().optional(),timestamp:et.string(),resumeHint:et.string()})});import{z as X}from"zod";var uk,Fd,dk,pk,mk,gk,fk,hk,yk,_d,Da=w(()=>{"use strict";uk=X.enum(["feature","fix","improvement","refactor"]),Fd=X.enum(["pass","warning","fail","skipped"]),dk=X.enum(["added","changed","fixed","removed"]),pk=X.object({hours:X.number(),minutes:X.number(),totalMinutes:X.number()}),mk=X.object({filesChanged:X.number().nullable().optional(),linesAdded:X.number().nullable().optional(),linesRemoved:X.number().nullable().optional(),commits:X.number().nullable().optional()}),gk=X.object({description:X.string(),type:dk.optional()}),fk=X.object({lintStatus:Fd.nullable().optional(),lintDetails:X.string().optional(),testStatus:Fd.nullable().optional(),testDetails:X.string().optional()}),hk=X.object({hash:X.string().optional(),message:X.string().optional(),branch:X.string().optional()}),yk=X.object({id:X.string(),name:X.string(),version:X.string().nullable().optional(),type:uk,agent:X.string().optional(),description:X.string().optional(),changes:X.array(gk).optional(),codeSnippets:X.array(X.string()).optional(),commit:hk.optional(),codeMetrics:mk.optional(),qualityMetrics:fk.optional(),quantitativeImpact:X.string().optional(),duration:pk.optional(),tasksCompleted:X.number().nullable().optional(),shippedAt:X.string(),featureId:X.string().optional()}),_d=X.object({shipped:X.array(yk),lastUpdated:X.string()})});import{z as v}from"zod";var wk,Ld,kk,Sk,bk,ja,Ud,Ck,Pk,Hd,Nd,vk,xk,Gd,zd,Wd,Tk,Ek,GI,mo=w(()=>{"use strict";ir();wk=v.enum(["low","medium","high","critical"]),Ld=v.enum(["feature","bug","improvement","chore"]),kk=v.enum(["active","backlog","previously_active"]),Sk=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),bk=v.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ja=v.object({title:v.string(),description:v.string(),filesChanged:v.array(v.object({path:v.string(),action:v.enum(["created","modified","deleted"])})),whatWasDone:v.array(v.string()).min(1),outputForNextAgent:v.string().min(1),notes:v.string().optional()}),Ud=v.object({output:v.string().min(1,"Subtask output is required"),summary:ja}),Ck=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:Sk,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:ja.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),Pk=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),Hd=v.object({id:v.string(),description:v.string(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(Ck).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:Pk.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:or.optional()}),Nd=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional()}),vk=v.object({stackConfirmed:v.array(v.string()).optional(),patternsDiscovered:v.array(v.string()).optional(),agentAccuracy:v.array(v.object({agent:v.string(),rating:v.enum(["helpful","neutral","inaccurate"]),note:v.string().optional()})).optional(),issuesEncountered:v.array(v.string()).optional()}),xk=v.object({taskId:v.string(),title:v.string(),classification:Ld,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(ja),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:vk.optional()}),Gd=v.object({currentTask:Hd.nullable(),previousTask:Nd.nullable().optional(),pausedTasks:v.array(Nd).optional(),taskHistory:v.array(xk).optional(),lastUpdated:v.string()}),zd=v.object({id:v.string(),description:v.string(),priority:wk,type:Ld,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:kk,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),Wd=v.object({tasks:v.array(zd),lastUpdated:v.string()}),Tk=v.object({tasksToday:v.number(),tasksThisWeek:v.number(),streak:v.number(),velocity:v.string(),avgDuration:v.string()}),Ek=v.object({type:bk,description:v.string(),timestamp:v.string(),duration:v.string().optional()}),GI=v.object({projectId:v.string(),currentTask:Hd.nullable(),queue:v.array(zd),stats:Tk,recentActivity:v.array(Ek),lastSync:v.string()})});import{z as ie}from"zod";var Ak,Ik,Vd,BI,JI,qI,wn,Bd,ps=w(()=>{"use strict";Ak=ie.enum(["improving","stable","declining"]),Ik=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Vd=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),BI=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),JI=ie.object({sprints:ie.array(Ik),averageVelocity:ie.number(),velocityTrend:Ak,estimationAccuracy:ie.number(),overEstimated:ie.array(Vd),underEstimated:ie.array(Vd),lastUpdated:ie.string()}),qI=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),wn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Bd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Dt=w(()=>{"use strict";pd();va();gr();Ta();Ea();lo();ir();Ia();Dd();jd();$d();Md();Od();Da();mo();ps()});var Fn,$a=w(()=>{"use strict";Dt();ls();oe();dr();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: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),D=(p.tags||[]).filter(B=>I.includes(B));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),D=0;for(let B of I)p.content.toLowerCase().includes(B)&&(D+=2),p.title.toLowerCase().includes(B)&&(D+=3);g.keywords=Math.min(15,D)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=Sa[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ao[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 ba(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 Ma,Rk,Ue,ms=w(()=>{"use strict";dr();Ca();$a();dr();Ca();$a();Ma=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Fn,this._patternStore=new pr,this._historyStore=new ur,this._sessionStore=new lr}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()}},Rk=new Ma,Ue=Rk});import{exec as Dk}from"node:child_process";import yt from"node:fs/promises";import jt from"node:path";import{promisify as jk}from"node:util";var _n,Oa,$k,Ve,Jd=w(()=>{"use strict";F();_n=jk(Dk),Oa=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=jt.join(this.projectPath,"package.json"),t=await yt.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=jt.join(this.projectPath,"Cargo.toml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=jt.join(this.projectPath,"requirements.txt");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=jt.join(this.projectPath,"go.mod");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=jt.join(this.projectPath,"Gemfile");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=jt.join(this.projectPath,"mix.exs");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=jt.join(this.projectPath,"pom.xml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=jt.join(this.projectPath,"composer.json"),t=await yt.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=jt.join(this.projectPath,"pyproject.toml");return await yt.readFile(e,"utf-8")}catch(e){if(P(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(P(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(P(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(jt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=jt.join(this.projectPath,e);return await yt.readFile(t,"utf-8")}catch(t){if(P(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[]}}},$k=new Oa,Ve=$k});import{z as Se}from"zod";function Mk(r){return r instanceof gs}function Y(r){return Mk(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var fs,GR,zR,WR,VR,BR,JR,gs,go,fo,fr,rn=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}},GR=fs.create("FileError",Se.object({path:Se.string(),operation:Se.enum(["read","write","delete","create","copy"]),reason:Se.string().optional()})),zR=fs.create("ValidationError",Se.object({field:Se.string(),expected:Se.string(),received:Se.string().optional(),message:Se.string().optional()})),WR=fs.create("PermissionError",Se.object({action:Se.string(),resource:Se.string(),reason:Se.string().optional()})),VR=fs.create("TaskError",Se.object({taskId:Se.string().optional(),operation:Se.enum(["create","update","complete","pause","resume","delete"]),reason:Se.string()})),BR=fs.create("SessionError",Se.object({sessionId:Se.string().optional(),reason:Se.string()})),JR=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)}},go=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")}},fo=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")}},fr=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(Mk,"isPrjctError");l(Y,"getErrorMessage")});import Fa from"node:fs";import yo from"node:path";function qd(){if(hr)return hr;let r=__dirname;for(let e=0;e<5;e++){let t=yo.join(r,"package.json");if(Fa.existsSync(t))try{if(JSON.parse(Fa.readFileSync(t,"utf-8")).name==="prjct-cli")return hr=r,r}catch{}r=yo.dirname(r)}return hr=yo.join(__dirname,"..","..",".."),hr}function _a(){if(ho)return ho;try{let r=yo.join(qd(),"package.json"),e=JSON.parse(Fa.readFileSync(r,"utf-8"));return ho=e.version,Ok=e,ho}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var ho,Ok,hr,Oe,ce,$t=w(()=>{"use strict";F();ho=null,Ok=null,hr=null;l(qd,"getPackageRoot");l(_a,"getVersion");Oe=_a(),ce=qd()});import La from"node:fs";import Fk from"node:fs/promises";import wo from"node:path";function Ua(){if(Kd)return Na;Kd=!0;let r=wo.join(ce,"dist","templates.json");try{let e=La.readFileSync(r,"utf-8");return Na=JSON.parse(e),Na}catch{return null}}function Nk(r){let e=Nn.indexOf(r);e>-1&&Nn.splice(e,1),Nn.push(r)}function Lk(){for(;hs.size>=_k&&Nn.length>0;){let r=Nn.shift();r&&hs.delete(r)}}function ko(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 Xd(r){if(hs.has(r))return Nk(r),hs.get(r);let e,t=Ua();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=wo.join(ce,"templates","commands",`${r}.md`);try{e=await Fk.readFile(s,"utf-8")}catch{throw fo.notFound(r)}}let n=ko(e);return Lk(),hs.set(r,n),Nn.push(r),n}async function Uk(r){return(await Xd(r)).frontmatter["allowed-tools"]||[]}function Hk(){hs.clear(),Nn.length=0}function le(r){let e=Ua();if(e?.[r])return e[r];let t=wo.join(ce,"templates",r);try{return La.readFileSync(t,"utf-8")}catch{return null}}function kn(r){let e=Ua();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=wo.join(ce,"templates",r);try{return La.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var _k,hs,Nn,Na,Kd,Gk,Ha,Jt=w(()=>{"use strict";rn();$t();_k=50,hs=new Map,Nn=[],Na=null,Kd=!1;l(Ua,"loadBundle");l(Nk,"updateLruOrder");l(Lk,"evictLru");l(ko,"parseFrontmatter");l(Xd,"load");l(Uk,"getAllowedTools");l(Hk,"clearCache");l(le,"getTemplateContent");l(kn,"listTemplates");Gk={load:Xd,parseFrontmatter:ko,getAllowedTools:Uk,clearCache:Hk,getTemplateContent:le,listTemplates:kn},Ha=Gk});import q from"node:fs/promises";import za from"node:os";import Q from"node:path";async function zk(){try{let r=le("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Q.join(ce,"templates/global/modules/module-config.json"),t=await q.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Wk(r){let e=await zk();if(!e){let i=le("global/CLAUDE.md");if(i)return i;let a=Q.join(ce,"templates/global/CLAUDE.md");return q.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=le("global/CLAUDE.md");if(a)return a;let c=Q.join(ce,"templates/global/CLAUDE.md");return q.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=le(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Q.join(ce,"templates/global/modules",i),u=await q.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 Vk(){try{let r=Q.join(za.homedir(),".prjct-cli","docs");await q.mkdir(r,{recursive:!0});let e=kn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=le(s);if(o){let i=Q.basename(s);await q.writeFile(Q.join(r,i),o,"utf-8")}}return{success:!0}}let t=Q.join(ce,"templates/global/docs"),n=await q.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Q.join(t,s),i=Q.join(r,s),a=await q.readFile(o,"utf-8");await q.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Bk(){let r=(Ze(),Pt(ht)),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 q.mkdir(e.configDir,{recursive:!0});let s=Q.join(e.configDir,e.contextFile),o=Q.join(ce,"templates","global",e.contextFile),i="";try{let u=le(`global/${e.contextFile}`);u?i=u:i=await q.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Wk()}catch{let d=le("global/CLAUDE.md");if(d)i=d;else{let m=Q.join(ce,"templates/global/CLAUDE.md");i=await q.readFile(m,"utf-8")}}else{let d=le("global/CLAUDE.md");if(d)i=d;else{let m=Q.join(ce,"templates/global/CLAUDE.md");i=await q.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await q.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 q.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
317
+ ${ww(e.schema)}`:null}function ww(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=k(()=>{"use strict";gr();gr();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:yn,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(ww,"describeSchema");l(bd,"describeField")});import{z as T}from"zod";var Cd,kw,Sw,Pd,bw,vw,Cw,Pw,xw,Tw,Ew,xd,Aw,Iw,rI,Td,Ed,Ad,Id,Rw,co,Aa=k(()=>{"use strict";Cd=T.number().min(1).max(5),kw=T.enum(["exceeded","met","partial","failed"]),Sw=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"]),bw=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()})}),vw=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),Cw=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Pw=T.object({metrics:T.array(vw),acceptanceCriteria:T.array(Cw),overallSuccess:kw,successScore:T.number().min(0).max(100)}),xw=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Tw=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(xw)}),Ew=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:Sw,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()}),Aw=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:bw,success:Pw.optional(),learnings:Tw,roi:Ew,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()}),Iw=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()}))}),rI=T.object({outcomes:T.array(Aw),taskOutcomes:T.array(xd).optional(),aggregates:Iw.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"),Rw=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=>Rw(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 Le}from"zod";function Fw(){let r={};for(let e of $w)r[e]="allow";for(let e of Mw)r[e]="ask";for(let e of Ow)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,cI,jw,Ia,Dw,lI,$w,Mw,Ow,uI,Rd=k(()=>{"use strict";lo=Le.enum(["allow","deny","ask"]),cI=Le.enum(["read","write","delete","create"]),jw=Le.record(Le.string(),lo),Ia=Le.record(Le.string(),lo),Dw=Le.object({enabled:Le.boolean().default(!0),allowedDomains:Le.array(Le.string()).optional(),blockedDomains:Le.array(Le.string()).optional()}),lI=Le.object({bash:jw.optional(),files:Le.object({read:Ia.optional(),write:Ia.optional(),delete:Ia.optional()}).optional(),web:Dw.optional(),skills:Le.record(Le.string(),lo).optional(),doomLoop:Le.object({enabled:Le.boolean().default(!0),maxRetries:Le.number().default(3)}).optional(),externalDirectories:lo.default("ask")}),$w=["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*"],Mw=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Ow=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Fw,"buildDefaultPermissions");uI=Fw()});import{z as at}from"zod";var gI,fI,jd=k(()=>{"use strict";gI=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),fI={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var _w,Nw,Lw,Uw,Hw,Gw,zw,Ww,Vw,Bw,Jw,qw,Kw,Xw,Yw,Qw,Zw,ek,kI,SI,Dd=k(()=>{"use strict";_w=E.enum(["planned","active","completed","shipped"]),Nw=E.enum(["low","medium","high"]),Lw=E.enum(["feature","breaking_change","refactor","infrastructure"]),Uw=E.enum(["completed","active","planned"]),Hw=E.enum(["planned","active","completed"]),Gw=E.enum(["git","git-branch","manual","prd"]),zw=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),Ww=E.object({id:E.string(),name:E.string(),status:Uw,completedAt:E.string().optional()}),Vw=E.object({goal:E.string(),phases:E.array(Ww),successMetrics:E.array(E.string()).optional()}),Bw=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),Jw=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),qw=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),Kw=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),Xw=E.object({estimated:qw.nullable(),actual:Kw.nullable()}),Yw=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),Qw=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:Yw.optional(),status:Hw,startDate:E.string().optional(),endDate:E.string().optional()}),Zw=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:_w,impact:Nw,effort:E.string().optional(),progress:E.number(),type:Lw.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(zw),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:Bw.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:Gw.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:Xw.optional(),valueScore:E.number().optional(),commits:E.array(Jw).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),ek=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()}),kI=E.object({strategy:Vw.nullable().optional(),features:E.array(Zw),backlog:E.array(E.union([E.string(),ek])),lastUpdated:E.string(),quarters:E.array(Qw).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),SI={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 tk from"node:crypto";import{homedir as nk}from"node:os";import{join as sk}from"node:path";function ge(){return tk.randomUUID()}var rk,$d=k(()=>{"use strict";l(ge,"generateUUID");rk=sk(nk(),".prjct-cli","projects")});import{z as et}from"zod";var II,Md=k(()=>{"use strict";II=et.object({sessionId:et.string(),projectId:et.string(),projectPath:et.string(),projectName:et.string().optional(),taskDescription:et.string(),taskStatus:et.enum(["active","paused"]),activeSubtaskIndex:et.number().optional(),subtaskCount:et.number().optional(),branch:et.string().optional(),linearId:et.string().optional(),filesModified:et.array(et.string()).optional(),durationWorkedSec:et.number().optional(),timestamp:et.string(),resumeHint:et.string()})});import{z as K}from"zod";var ok,Od,ik,ak,ck,lk,uk,dk,pk,Fd,Ra=k(()=>{"use strict";ok=K.enum(["feature","fix","improvement","refactor"]),Od=K.enum(["pass","warning","fail","skipped"]),ik=K.enum(["added","changed","fixed","removed"]),ak=K.object({hours:K.number(),minutes:K.number(),totalMinutes:K.number()}),ck=K.object({filesChanged:K.number().nullable().optional(),linesAdded:K.number().nullable().optional(),linesRemoved:K.number().nullable().optional(),commits:K.number().nullable().optional()}),lk=K.object({description:K.string(),type:ik.optional()}),uk=K.object({lintStatus:Od.nullable().optional(),lintDetails:K.string().optional(),testStatus:Od.nullable().optional(),testDetails:K.string().optional()}),dk=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:ok,agent:K.string().optional(),description:K.string().optional(),changes:K.array(lk).optional(),codeSnippets:K.array(K.string()).optional(),commit:dk.optional(),codeMetrics:ck.optional(),qualityMetrics:uk.optional(),quantitativeImpact:K.string().optional(),duration:ak.optional(),tasksCompleted:K.number().nullable().optional(),shippedAt:K.string(),featureId:K.string().optional()}),Fd=K.object({shipped:K.array(pk),lastUpdated:K.string()})});import{z as P}from"zod";var mk,Nd,gk,fk,hk,ja,Ld,yk,wk,Ud,_d,kk,Sk,Hd,Gd,zd,bk,vk,FI,uo=k(()=>{"use strict";ir();mk=P.enum(["low","medium","high","critical"]),Nd=P.enum(["feature","bug","improvement","chore"]),gk=P.enum(["active","backlog","previously_active"]),fk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),hk=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}),yk=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:fk,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()}),wk=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(yk).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:wk.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:or.optional()}),_d=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional()}),kk=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()}),Sk=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:kk.optional()}),Hd=P.object({currentTask:Ud.nullable(),previousTask:_d.nullable().optional(),pausedTasks:P.array(_d).optional(),taskHistory:P.array(Sk).optional(),lastUpdated:P.string()}),Gd=P.object({id:P.string(),description:P.string(),priority:mk,type:Nd,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:gk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),zd=P.object({tasks:P.array(Gd),lastUpdated:P.string()}),bk=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),vk=P.object({type:hk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),FI=P.object({projectId:P.string(),currentTask:Ud.nullable(),queue:P.array(Gd),stats:bk,recentActivity:P.array(vk),lastSync:P.string()})});import{z as re}from"zod";var Ck,Pk,Wd,UI,HI,GI,wn,Vd,ps=k(()=>{"use strict";Ck=re.enum(["improving","stable","declining"]),Pk=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()}),UI=re.object({totalPoints:re.number(),sprints:re.number(),estimatedDate:re.string()}),HI=re.object({sprints:re.array(Pk),averageVelocity:re.number(),velocityTrend:Ck,estimationAccuracy:re.number(),overEstimated:re.array(Wd),underEstimated:re.array(Wd),lastUpdated:re.string()}),GI=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)}),wn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Vd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var jt=k(()=>{"use strict";dd();Ca();gr();xa();Ta();ao();ir();Aa();Rd();jd();Dd();$d();Md();Ra();uo();ps()});var Fn,Da=k(()=>{"use strict";jt();ls();se();dr();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: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 R=this._getCommandTags(t.commandName),I=(p.tags||[]).filter(G=>R.includes(G));g.tagMatch=Math.min(20,I.length*8)}let w=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-w*.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 R=this._extractKeywordsFromText(t.taskDescription),I=0;for(let G of R)p.content.toLowerCase().includes(G)&&(I+=2),p.title.toLowerCase().includes(G)&&(I+=3);g.keywords=Math.min(15,I)}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,xk,tt,fr=k(()=>{"use strict";dr();ba();Da();dr();ba();Da();$a=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Fn,this._patternStore=new pr,this._historyStore=new ur,this._sessionStore=new lr}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()}},xk=new $a,tt=xk});import{exec as Tk}from"node:child_process";import wt from"node:fs/promises";import Dt from"node:path";import{promisify as Ek}from"node:util";var _n,Ma,Ak,We,Bd=k(()=>{"use strict";F();_n=Ek(Tk),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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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 wt.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[]}}},Ak=new Ma,We=Ak});import{z as Se}from"zod";function Ik(r){return r instanceof ms}function X(r){return Ik(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var gs,FR,_R,NR,LR,UR,HR,ms,po,mo,hr,rn=k(()=>{"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}},FR=gs.create("FileError",Se.object({path:Se.string(),operation:Se.enum(["read","write","delete","create","copy"]),reason:Se.string().optional()})),_R=gs.create("ValidationError",Se.object({field:Se.string(),expected:Se.string(),received:Se.string().optional(),message:Se.string().optional()})),NR=gs.create("PermissionError",Se.object({action:Se.string(),resource:Se.string(),reason:Se.string().optional()})),LR=gs.create("TaskError",Se.object({taskId:Se.string().optional(),operation:Se.enum(["create","update","complete","pause","resume","delete"]),reason:Se.string()})),UR=gs.create("SessionError",Se.object({sessionId:Se.string().optional(),reason:Se.string()})),HR=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")}},hr=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(Ik,"isPrjctError");l(X,"getErrorMessage")});import Oa from"node:fs";import fo from"node:path";function Jd(){if(yr)return yr;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 yr=r,r}catch{}r=fo.dirname(r)}return yr=fo.join(__dirname,"..","..",".."),yr}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,Rk=e,go}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var go,Rk,yr,Oe,ce,$t=k(()=>{"use strict";F();go=null,Rk=null,yr=null;l(Jd,"getPackageRoot");l(Fa,"getVersion");Oe=Fa(),ce=Jd()});import Na from"node:fs";import jk from"node:fs/promises";import ho from"node:path";function La(){if(qd)return _a;qd=!0;let r=ho.join(ce,"dist","templates.json");try{let e=Na.readFileSync(r,"utf-8");return _a=JSON.parse(e),_a}catch{return null}}function $k(r){let e=Nn.indexOf(r);e>-1&&Nn.splice(e,1),Nn.push(r)}function Mk(){for(;fs.size>=Dk&&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 $k(r),fs.get(r);let e,t=La();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ho.join(ce,"templates","commands",`${r}.md`);try{e=await jk.readFile(s,"utf-8")}catch{throw mo.notFound(r)}}let n=yo(e);return Mk(),fs.set(r,n),Nn.push(r),n}async function Ok(r){return(await Kd(r)).frontmatter["allowed-tools"]||[]}function Fk(){fs.clear(),Nn.length=0}function ue(r){let e=La();if(e?.[r])return e[r];let t=ho.join(ce,"templates",r);try{return Na.readFileSync(t,"utf-8")}catch{return null}}function kn(r){let e=La();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ho.join(ce,"templates",r);try{return Na.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Dk,fs,Nn,_a,qd,_k,Ua,Jt=k(()=>{"use strict";rn();$t();Dk=50,fs=new Map,Nn=[],_a=null,qd=!1;l(La,"loadBundle");l($k,"updateLruOrder");l(Mk,"evictLru");l(yo,"parseFrontmatter");l(Kd,"load");l(Ok,"getAllowedTools");l(Fk,"clearCache");l(ue,"getTemplateContent");l(kn,"listTemplates");_k={load:Kd,parseFrontmatter:yo,getAllowedTools:Ok,clearCache:Fk,getTemplateContent:ue,listTemplates:kn},Ua=_k});import de from"node:fs/promises";import Ga from"node:os";import oe from"node:path";async function Nk(){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 Lk(r){let e=await Nk();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 Uk(){try{let r=oe.join(Ga.homedir(),".prjct-cli","docs");await de.mkdir(r,{recursive:!0});let e=kn("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 Hk(){let r=(Ge(),ut(it)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await 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 Lk()}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(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),w=p+f+g;return await de.writeFile(s,w,"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 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,Gk,Te,Sn=k(()=>{"use strict";Jt();F();$t();l(Nk,"loadModuleConfig");l(Lk,"composeGlobalTemplate");l(Uk,"installDocs");l(Hk,"installGlobalConfig");Ha=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Ga.homedir(),this.templatesDir=oe.join(ce,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ge(),ut(it)).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(C(e))return!1;throw e}}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=kn("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(Ge(),ut(it)).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(),ut(it)).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(Ge(),ut(it)).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(C(t))return{installed:!1,providerDetected:!0,commands:[]};throw t}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async installRouter(){let t=await(Ge(),ut(it)).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(C(n))return!1;throw n}}async installStaticRouter(e){let n=await(Ge(),ut(it)).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(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`---
326
+ description: 'prjct CLI - Context layer for AI agents'
327
+ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep, Task, AskUserQuestion, TodoWrite, WebFetch]
328
+ ---
329
+
330
+ # prjct Command Router
331
+
332
+ **ARGUMENTS**: $ARGUMENTS
333
+
334
+ All commands use the \`p.\` prefix.
335
+
336
+ ## Quick Reference
337
+
338
+ | Command | Description |
339
+ |---------|-------------|
340
+ ${n.join(`
341
+ `)}
342
+
343
+ ## Execution
344
+
345
+ \`\`\`
346
+ 1. PARSE: $ARGUMENTS \u2192 extract command (first word)
347
+ 2. GET npm root: npm root -g
348
+ 3. LOAD template: {npmRoot}/prjct-cli/templates/commands/{command}.md
349
+ 4. EXECUTE template
350
+ \`\`\`
351
+
352
+ ## Command Aliases
353
+
354
+ | Input | Redirects To |
355
+ |-------|--------------|
356
+ | \`p. undo\` | \`p. history undo\` |
357
+ | \`p. redo\` | \`p. history redo\` |
358
+
359
+ ## State Context
360
+
361
+ All state is managed by the \`prjct\` CLI via SQLite (prjct.db).
362
+ Templates should use CLI commands for data operations \u2014 never read/write JSON storage files directly.
324
363
 
325
- ${i}`;return await q.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await q.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Yd(){let r=za.homedir();return{claude:{commands:Q.join(r,".claude","commands","p"),config:Q.join(r,".claude"),router:Q.join(r,".claude","commands","p.md")},gemini:{commands:Q.join(r,".gemini","commands"),config:Q.join(r,".gemini"),router:Q.join(r,".gemini","commands","p.toml")}}}var Ga,Jk,xe,Sn=w(()=>{"use strict";Jt();F();$t();l(zk,"loadModuleConfig");l(Wk,"composeGlobalTemplate");l(Vk,"installDocs");l(Bk,"installGlobalConfig");Ga=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=za.homedir(),this.templatesDir=Q.join(ce,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ze(),Pt(ht)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Q.join(t.configDir,"commands"):this.claudeCommandsPath=Q.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await q.access(this.claudeConfigPath),!0}catch(e){if(P(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=kn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await q.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Ze(),Pt(ht)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await q.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Q.join(this.claudeCommandsPath,a),u=le(`commands/${a}`);if(u)await q.writeFile(c,u,"utf-8");else{let d=Q.join(this.templatesDir,a),m=await q.readFile(d,"utf-8");await q.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:y(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=Q.join(this.claudeCommandsPath,s);await q.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await q.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await q.access(this.claudeCommandsPath);let n=(await q.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(P(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(le(`commands/${e}.md`))return!0;try{let n=Q.join(this.templatesDir,`${e}.md`);return await q.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Ze(),Pt(ht)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Q.join(t.configDir,"commands",n);await q.mkdir(Q.dirname(s),{recursive:!0});let o=le(`commands/${n}`);if(o)return await q.writeFile(s,o,"utf-8"),!0;let i=Q.join(this.templatesDir,n),a=await q.readFile(i,"utf-8");return await q.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Ze(),Pt(ht)).getActiveProvider(),n=Q.join(t.configDir,"commands"),s=0;try{let i=(await q.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await q.unlink(Q.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await q.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await q.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(P(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=Q.join(this.claudeCommandsPath,o),a=n.includes(o),c=le(`commands/${o}`);if(c)await q.writeFile(i,c,"utf-8");else{let u=Q.join(this.templatesDir,o),d=await q.readFile(u,"utf-8");await q.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:y(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Bk()}async installDocs(){return Vk()}};l(Yd,"getProviderPaths");Jk=new Ga,xe=Jk});import{z as je}from"zod";function tp(r,e="default"){let t=Qd[e]||Qd.default;return r/1e3*t}function So(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var qk,Kk,Zd,ep,Qd,bo=w(()=>{"use strict";qk=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),Kk=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),Zd=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(Kk),dailyStats:je.array(qk),firstSync:je.string(),lastUpdated:je.string()}),ep={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Qd={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(tp,"estimateCostSaved");l(So,"formatCost")});function Xk(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Yk(r){let e=[],t=Xk(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Wa,o+i.length);if(c===-1)continue;let u=c+Wa.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Va(r,e){let t=Yk(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
364
+ ## Error Handling
365
+
366
+ | Error | Action |
367
+ |-------|--------|
368
+ | Unknown command | "Unknown command: {command}. Run \`p. help\` for available commands." |
369
+ | No project | "No prjct project. Run \`p. init\` first." |
370
+ | Template not found | "Template not found: {command}.md" |
371
+
372
+ ## NOW: Execute
373
+
374
+ 1. Parse command from $ARGUMENTS
375
+ 2. Handle aliases (undo \u2192 history undo, redo \u2192 history redo)
376
+ 3. Run \`npm root -g\` to get template path
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 Hk()}async installDocs(){return Uk()}};l(Xd,"getProviderPaths");Gk=new Ha,Te=Gk});import{z as De}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 zk,Wk,Qd,Zd,Yd,ko=k(()=>{"use strict";zk=De.object({date:De.string(),tokensSaved:De.number(),syncs:De.number(),avgCompressionRate:De.number(),totalDuration:De.number()}),Wk=De.object({agentName:De.string(),usageCount:De.number(),tokensSaved:De.number()}),Qd=De.object({totalTokensSaved:De.number(),avgCompressionRate:De.number(),syncCount:De.number(),watchTriggers:De.number(),avgSyncDuration:De.number(),totalSyncDuration:De.number(),agentUsage:De.array(Wk),dailyStats:De.array(zk),firstSync:De.string(),lastUpdated:De.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 Vk(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Bk(r){let e=[],t=Vk(),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=Bk(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
326
379
 
327
380
  ---
328
381
 
@@ -333,11 +386,11 @@ ${i}`;return await q.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
333
386
  `;for(let s of t)n+=s.content,n+=`
334
387
 
335
388
  `;return`${n.trimEnd()}
336
- `}function Ba(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(`
337
- `);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(Wa)&&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 Wa,Ja=w(()=>{"use strict";Wa="<!-- /prjct:preserve -->";l(Xk,"createPreserveStartRegex");l(Yk,"extractPreservedSections");l(Va,"mergePreservedSections");l(Ba,"validatePreserveBlocks")});function yr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Qk.has(e.code))return!0;if(e.code&&sp.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 Po(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&sp.has(e.code))}function np(r,e,t){let n=bn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(bn.delete(r),!1):!0:!1}function qa(r,e){let t=bn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bn.set(r,t)}function Zk(r){bn.delete(r)}var Qk,sp,bn,Co,rp,wr,vo=w(()=>{"use strict";Qk=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),sp=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(yr,"isTransientError");l(Po,"isPermanentError");bn=new Map;l(np,"isCircuitOpen");l(qa,"recordFailure");l(Zk,"recordSuccess");Co=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(np(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 Zk(t),o}catch(o){if(n=o,s++,Po(o))throw qa(t,this.options.circuitBreakerThreshold),o;if(!(yr(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 yr(e)}isCircuitOpen(e){return np(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bn.get(e)}resetCircuit(e){bn.delete(e)}resetAllCircuits(){bn.clear()}},rp=new Co({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),wr=new Co({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var op=w(()=>{"use strict";Ja();vo()});import{exec as eS}from"node:child_process";import{promisify as tS}from"node:util";async function xo(r){try{let{stdout:e}=await nS(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function sS(){let r=await xo("gh api user --jq .login");return r.success&&r.output||(r=await xo("git config --global github.user"),r.success&&r.output)?r.output:null}async function rS(){let r=await xo("git config user.name");return r.success&&r.output?r.output:null}async function oS(){let r=await xo("git config user.email");return r.success&&r.output?r.output:null}async function ys(){let[r,e,t]=await Promise.all([sS(),rS(),oS()]);return{github:r,email:t,name:e||r||"Unknown"}}var nS,To=w(()=>{"use strict";nS=tS(eS);l(xo,"execCommand");l(sS,"detectGitHubUsername");l(rS,"detectGitName");l(oS,"detectGitEmail");l(ys,"detect")});import Ln from"node:fs/promises";import iS from"node:path";import*as Eo from"jsonc-parser";function ip(r){let e=[],t=Eo.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}: ${Eo.printParseErrorCode(n.error)}`)}return t}var Xa,aS,$,wt=w(()=>{"use strict";rn();F();oe();$t();To();ke();l(ip,"parseJsonc");Xa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await Ln.readFile(t,"utf-8");return ip(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${Y(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}
338
- `,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await Ln.readFile(t,"utf-8");return ip(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${Y(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}
339
- `,"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 Ln.readdir(iS.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 ys(),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))}}},aS=new Xa,$=aS});import Ao from"node:fs/promises";import Ya from"node:path";var Qa,ap,cp=w(()=>{"use strict";wt();ke();F();Qa=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 Ao.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Ao.readFile(Ya.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=Ya.join(this.agentsPath,`${e}.md`),n=await Ao.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=Ya.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})}
340
- `;await Ao.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},ap=Qa});import lp from"node:path";async function uS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await R(lp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await R(lp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function dS(){return{...cS}}function pS(){return{...lS}}async function up(){return Io||(Io=await uS()?dS():pS(),Io)}var Io,cS,lS,dp=w(()=>{"use strict";Me();Io=null,cS={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},lS={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(uS,"isClaudeEnvironment");l(dS,"getClaudeAgent");l(pS,"getTerminalAgent");l(up,"detect")});import kr from"node:fs/promises";var Za,pp,mp=w(()=>{"use strict";F();Za=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(P(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 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=k(()=>{"use strict";za="<!-- /prjct:preserve -->";l(Vk,"createPreserveStartRegex");l(Bk,"extractPreservedSections");l(Wa,"mergePreservedSections");l(Va,"validatePreserveBlocks")});function wr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Jk.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=bn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(bn.delete(r),!1):!0:!1}function Ja(r,e){let t=bn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bn.set(r,t)}function qk(r){bn.delete(r)}var Jk,np,bn,So,sp,kr,vo=k(()=>{"use strict";Jk=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),np=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(wr,"isTransientError");l(bo,"isPermanentError");bn=new Map;l(tp,"isCircuitOpen");l(Ja,"recordFailure");l(qk,"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 qk(t),o}catch(o){if(n=o,s++,bo(o))throw Ja(t,this.options.circuitBreakerThreshold),o;if(!(wr(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 wr(e)}isCircuitOpen(e){return tp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bn.get(e)}resetCircuit(e){bn.delete(e)}resetAllCircuits(){bn.clear()}},sp=new So({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),kr=new So({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var rp=k(()=>{"use strict";Ba();vo()});import{exec as Kk}from"node:child_process";import{promisify as Xk}from"node:util";async function Co(r){try{let{stdout:e}=await Yk(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Qk(){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 Zk(){let r=await Co("git config user.name");return r.success&&r.output?r.output:null}async function eS(){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([Qk(),Zk(),eS()]);return{github:r,email:t,name:e||r||"Unknown"}}var Yk,Po=k(()=>{"use strict";Yk=Xk(Kk);l(Co,"execCommand");l(Qk,"detectGitHubUsername");l(Zk,"detectGitName");l(eS,"detectGitEmail");l(hs,"detect")});import Ln from"node:fs/promises";import tS 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,nS,$,kt=k(()=>{"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: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 Ln.readdir(tS.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))}}},nS=new Ka,$=nS});import To from"node:fs/promises";import Xa from"node:path";var Ya,ip,ap=k(()=>{"use strict";kt();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 oS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await j(cp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await j(cp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function iS(){return{...sS}}function aS(){return{...rS}}async function lp(){return Eo||(Eo=await oS()?iS():aS(),Eo)}var Eo,sS,rS,up=k(()=>{"use strict";Me();Eo=null,sS={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}},rS={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(oS,"isClaudeEnvironment");l(iS,"getClaudeAgent");l(aS,"getTerminalAgent");l(lp,"detect")});import Sr from"node:fs/promises";var Qa,dp,pp=k(()=>{"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 Sr.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 Sr.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 Sr.readdir(e)}async fileExists(e){try{return await Sr.access(e),!0}catch(t){if(C(t))return!1;throw t}}async createDirectory(e){await Sr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
341
394
  ${e.map((t,n)=>`${n+1}. ${t}`).join(`
342
395
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
343
396
 
@@ -382,7 +435,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
382
435
 
383
436
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
384
437
 
385
- 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}}},pp=Za});var gS,Ro,ws,gp=w(()=>{"use strict";cp();rn();dp();mp();vo();gS=["claude"],Ro=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new ap}async initialize(){return this.agent?this.agent:await rp.execute(async()=>{if(this.agentInfo=await up(),!this.agentInfo?.isSupported)throw fr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!gS.includes(e))throw fr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new pp,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}}},dp=Qa});var lS,Ao,ys,mp=k(()=>{"use strict";ap();rn();up();pp();vo();lS=["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 hr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!lS.includes(e))throw hr.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:`
386
439
  AGENTIC EXECUTION:
387
440
  - Read: templates/agentic/orchestrator.md
388
441
  - Analyze task: "${e}"
@@ -390,14 +443,14 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
390
443
  - Claude decides which agent(s) to use
391
444
  - Always prefer specialists over generalist
392
445
  - Fragment complex tasks into subtasks
393
- `}}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}},ws=new Ro});var Do,jo,fp=w(()=>{"use strict";Do=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"}},jo=new Do});import hp from"node:path";var fS,hS,Sr,yp=w(()=>{"use strict";oe();Me();fS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],hS=`# 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}},ys=new Ao});var Io,Ro,gp=k(()=>{"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 uS,dS,br,hp=k(()=>{"use strict";se();Me();uS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],dS=`# Changelog
394
447
 
395
448
  All notable changes to this project will be documented in this file.
396
449
 
397
450
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
398
451
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
399
- `,Sr=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of fS){let s=hp.join(this.projectPath,n);if(await R(s)){let o=await Qe(s),i=this.detectFormat(o);return{filePath:s,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=hp.join(this.projectPath,e);return await Wt(t,`${hS}
400
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Qe(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
+ `,br=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of uS){let s=fp.join(this.projectPath,n);if(await j(s)){let o=await Ze(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,`${dS}
453
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Ze(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}
401
454
  ${a}`}return`${e.trimEnd()}
402
455
 
403
456
  ${s}`}insertMarkdownEntry(e,t,n){let s=this.formatMarkdownEntry(t,n),o=e.indexOf(`
@@ -407,18 +460,18 @@ ${a}`}return`${s}
407
460
 
408
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(`
409
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(`
410
- `)}}});import yS from"node:crypto";import $o from"node:fs/promises";import wp from"node:path";function kp(){return{version:Mt,lastUpdated:"",checksums:{}}}var Mt,ec,Je,br=w(()=>{"use strict";ke();F();oe();ne();Mt="1.0.0";l(kp,"getDefaultChecksums");ec=class{static{l(this,"IndexStorage")}getIndexPath(e){return wp.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await $o.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 kp()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await $o.readFile(e);return yS.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 $o.readdir(t);await Promise.all(n.map(s=>$o.unlink(wp.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!==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)}},Je=new ec});var Sp,wS,Mo,kS,bp=w(()=>{"use strict";br();Sp=8e4,wS={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"]},Mo=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||Sp,[c,u,d]=await Promise.all([Je.readIndex(t),Je.readDomains(t),Je.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let D of m){let B=d.domainIndex[D]||[];for(let ve of B)p.add(ve)}if(i&&d.domainIndex.general){let D=d.domainIndex.general.slice(0,10);for(let B of D)p.add(B)}let g=c.relevantFiles.filter(D=>p.has(D.path)&&D.score>=o);g.sort((D,B)=>B.score-D.score);let f=0,k=[];for(let D of g){let B=Math.ceil(D.size/this.CHARS_PER_TOKEN);if(f+B>a||k.length>=s)break;k.push(D),f+=B}let S=Math.ceil(c.relevantFiles.reduce((D,B)=>D+B.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(wS))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 Je.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 Je.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Je.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||Sp,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)}},kS=new Mo});import{execFile as SS}from"node:child_process";import tc from"node:fs/promises";import Cp from"node:os";import nc from"node:path";import{promisify as bS}from"node:util";function vS(){let r=le("mcp-config.json");if(!r)return{mcpServers:{context7:sc}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:sc}}}}function xp(){return vS().mcpServers?.context7||sc}function Pp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?nc.join(Cp.tmpdir(),"prjct-context7-test","mcp.json"):nc.join(Cp.homedir(),".claude","mcp.json")}async function vp(r){try{let e=await tc.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e))return{};throw e}}async function xS(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=xp(),e=[...r.args||[],"--help"];await CS(r.command||"npx",e,{timeout:15e3})}var CS,sc,PS,ks,rc,Tp,on,Ss=w(()=>{"use strict";Jt();F();CS=bS(SS),sc={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},PS=300*1e3,ks=null;l(vS,"parseTemplateConfig");l(xp,"getContext7Config");l(Pp,"getConfigPath");l(vp,"readConfig");l(xS,"runSmokeCheck");rc=class{static{l(this,"Context7Service")}async install(){let e=Pp(),t=nc.dirname(e);await tc.mkdir(t,{recursive:!0});let n=await vp(e),s=n.mcpServers||{};return s.context7=xp(),n.mcpServers=s,await tc.writeFile(e,JSON.stringify(n,null,2),"utf-8"),ks=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(ks&&Date.now()-ks.at<PS)return ks.status;let e=Pp(),s=((await vp(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 xS();let o={installed:!0,verified:!0,configPath:e};return ks={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return ks={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}},Tp=new rc,on=Tp});import Ep from"node:path";var oc,Oo,TS,Ap=w(()=>{"use strict";br();oe();oc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],Oo=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of oc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Ep.dirname(i.path);n.get(u).add(`**/${Ep.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=oc.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 oc)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 Je.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 Je.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Je.readDomains(e),Je.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 Je.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 Je.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 Je.writeCategories(e,m)}return o}},TS=new Oo});import ic from"node:path";var ac,ES,AS,Fo,Ip,cc=w(()=>{"use strict";ac=30,ES=[/^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$/],AS=[/^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],Fo=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=ac){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=ic.basename(e.path);for(let n of ES)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ic.basename(e.path);for(let s of AS)if(s.test(t))return 15;let n=ic.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}},Ip=new Fo});function bs(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 IS[r]}var te,lc,uc,_o,IS,Ot,Rp,an=w(()=>{"use strict";te={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},lc=["feature","spec","design","refactor","migrate"],uc=["ship","cleanup","git","migrate"],_o=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],IS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(bs,"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},Rp={HISTORY_MAX:100}});function dc(r,e){return{...rr[r],...e}}function No(r,e,t){return{message:r,hint:e,...t}}var Lo=w(()=>{"use strict";Zr();Zr();l(dc,"getError");l(No,"createError")});import{execSync as pc}from"node:child_process";var Uo,mc,Ho,Cs,Go=w(()=>{"use strict";Lo();Uo={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},mc=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Uo[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Uo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Ho(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=Uo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
411
- `);throw new Ho({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
412
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Uo),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=pc(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:No(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return pc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return pc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:No(`${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())}},Ho=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}},Cs=new mc});import{exec as RS}from"node:child_process";import{promisify as DS}from"node:util";var e0,Dp=w(()=>{"use strict";an();Go();e0=DS(RS)});var qt,gc,kt,Cn=w(()=>{"use strict";Dt();oe();ne();qt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},gc=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}},kt=new gc});var zo,lt,fc=w(()=>{"use strict";wt();Cn();ne();zo=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}}},lt=new zo});var jp=w(()=>{"use strict";ke();Me()});import{execSync as jS}from"node:child_process";import $S from"node:fs/promises";import Wo from"node:path";function MS(r){return r.trim().toLowerCase()}async function OS(r){try{return await $S.access(r),!0}catch{return!1}}function FS(){let r=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(r)return r;try{let e=Dn.resolve("prjct-cli/package.json");return Wo.dirname(e)}catch{return null}}function _S(){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 jS("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim().replace(/\r?\n/g,"")}catch{return null}}function NS(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||ce}function LS(){let r=[],e=FS();e&&r.push({source:"package-resolve",root:e});let t=_S();return t&&r.push({source:"npm-root-g",root:Wo.join(t,"prjct-cli")}),r.push({source:"local-dev",root:NS()}),r}function US(){let e=kn("commands/").filter(t=>t.endsWith(".md")).map(t=>Wo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function yc(r){return r instanceof Error&&typeof r.code=="string"&&typeof r.message=="string"}var Cr,hc,wc,kc=w(()=>{"use strict";Jt();$t();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(MS,"normalizeCommand");l(OS,"fileExists");l(FS,"getPackageResolveRoot");l(_S,"getNpmGlobalRoot");l(NS,"getLocalDevRoot");l(LS,"getCandidateRoots");l(US,"getCatalogFromTemplates");hc=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return US()}validatePCommand(e){let t=MS(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"]);for(let n of LS()){let s=Wo.join(n.root,"templates","commands",`${t.command}.md`);if(await OS(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(yc,"isPCommandResolveError");wc=new hc});import{createHash as HS}from"node:crypto";import Mp from"node:fs/promises";import bc from"node:path";function Un(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function zS(r){let e=bc.resolve(r);return HS("sha256").update(e).digest("hex").slice(0,16)}function Vo(r){let e=le(r);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function WS(r){let e=[],t=[r];for(;t.length>0&&e.length<$p;){let n=t.pop();if(!n)break;let s=await Mp.readdir(n,{withFileTypes:!0});for(let o of s){if(e.length>=$p)break;let i=bc.join(n,o.name);if(o.isDirectory()){GS.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 VS(r,e){let t=[],n=[],s=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=bc.relative(r,d),p=await Mp.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 BS(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 JS(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 GS,$p,Sc,Op,Fp,Cc=w(()=>{"use strict";Jt();ne();GS=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),$p=400;l(Un,"normalizeKey");l(zS,"repoHash");l(Vo,"parseBaselineFile");l(WS,"listSourceFiles");l(VS,"detectRepoRules");l(BS,"dedupePatterns");l(JS,"dedupeAntiPatterns");Sc=class{static{l(this,"PatternExtractor")}async extract(e){let t=zS(e.projectPath),n=await WS(e.projectPath),s=[],o=[];for(let p of e.languages){let g=Un(p),f=Vo(`baseline/patterns/${g}.json`),k=Vo(`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=Vo(`baseline/patterns/${g}.json`),k=Vo(`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 VS(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=BS([...s,...i.patterns,...a]),d=JS([...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}}},Op=new Sc,Fp=Op});import{exec as KS}from"node:child_process";import{promisify as XS}from"node:util";var O0,_p=w(()=>{"use strict";br();oe();cc();O0=XS(KS)});import Hn from"chalk";var Np,YS,QS,Ft,Lp=w(()=>{"use strict";Ze();Np=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],YS=80,QS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Np,speed:YS},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(Np[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")=>ro(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>ro(r).signature,"getSignature")},Ft=QS});import se from"chalk";function tb(){return ZS[eb]}var B0,Pc,ZS,eb,Gn,Ps,vc,St,Pn,nb,sb,h,zn=w(()=>{"use strict";Lp();an();Lo();Lo();B0=Ft.spinner.frames,Pc=Ft.spinner.speed,ZS={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}},eb="compact";l(tb,"getTierConfig");Gn={success:se.green("\u2713"),fail:se.red("\u2717"),warn:se.yellow("\u26A0"),info:se.blue("\u2139"),debug:se.dim("\u{1F527}"),bullet:se.dim("\u2022"),arrow:se.dim("\u2192"),check:se.green("\u2713"),cross:se.red("\u2717"),spinner:se.cyan("\u25D0")},Ps=null,vc=0,St=!1,Pn=l((r,e)=>{let t=e??(tb().maxCharsPerLine||Ot.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),nb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ot.CLEAR_WIDTH)}\r`):!0,"clear"),sb={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?(Ps=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(vc++,Pn(r,Ot.SPINNER_MSG))}`)},Pc),this):(process.stdout.write(`${Ft.cli.spin(0,Pn(r,Ot.SPINNER_MSG))}
413
- `),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=se.dim(` [${n.join(" | ")}]`))}console.log(`${Gn.success} ${Pn(r,Ot.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Gn.fail} ${Pn(r,Ot.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?dc(r):r;return console.error(),console.error(`${Gn.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),St||console.log(`${Gn.warn} ${Pn(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} ${se.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(se.dim(s)),console.log(se.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(`
414
- `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(se.dim(`\u250C${s}\u2510`)),console.log(`${se.dim("\u2502")} ${se.bold(r.padEnd(n))} ${se.dim("\u2502")}`),console.log(se.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${se.dim("\u2502")} ${o.padEnd(n)} ${se.dim("\u2502")}`);return console.log(se.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),St?this:(console.log(`
415
- ${se.bold(r)}`),console.log(se.dim("\u2500".repeat(r.length))),this)},stop(){return Ps&&(clearInterval(Ps),Ps=null,nb()),this},step(r,e,t){if(St)return this;this.stop();let n=se.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(vc++,`${n} ${Pn(t,Ot.STEP_MSG)}`)}`)},Pc),this):(process.stdout.write(`${Ft.cli.spin(0,`${n} ${Pn(t,Ot.STEP_MSG)}`)}
416
- `),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=se.cyan("\u2588".repeat(s))+se.dim("\u2591".repeat(o)),a=t?` ${Pn(t,Ot.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(vc++,`[${i}] ${n}%${a}`)}`)},Pc),this):(process.stdout.write(`${Ft.cli.spin(0,`[${i}] ${n}%${a}`)}
417
- `),this)}},h=sb});function Up(r,e){let t=[];Pr("Languages",r.languages,e.languages,t),Pr("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)"}),Pr("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);Pr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Pr("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 xc(r){if(!r.hasChanges)return`## Analysis Diff
463
+ `)}}});import pS from"node:crypto";import jo from"node:fs/promises";import yp from"node:path";function wp(){return{version:Mt,lastUpdated:"",checksums:{}}}var Mt,Za,Je,vr=k(()=>{"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 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: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)}},Je=new Za});var kp,mS,Do,gS,Sp=k(()=>{"use strict";vr();kp=8e4,mS={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([Je.readIndex(t),Je.readDomains(t),Je.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let I of m){let G=d.domainIndex[I]||[];for(let $e of G)p.add($e)}if(i&&d.domainIndex.general){let I=d.domainIndex.general.slice(0,10);for(let G of I)p.add(G)}let g=c.relevantFiles.filter(I=>p.has(I.path)&&I.score>=o);g.sort((I,G)=>G.score-I.score);let f=0,w=[];for(let I of g){let G=Math.ceil(I.size/this.CHARS_PER_TOKEN);if(f+G>a||w.length>=s)break;w.push(I),f+=G}let S=Math.ceil(c.relevantFiles.reduce((I,G)=>I+G.size,0)/this.CHARS_PER_TOKEN),R=S>0?(S-f)/S:0;return{files:w,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:w.length,compressionRate:R,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(mS))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 Je.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 Je.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Je.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)}},gS=new Do});import{execFile as fS}from"node:child_process";import ec from"node:fs/promises";import bp from"node:os";import tc from"node:path";import{promisify as hS}from"node:util";function kS(){let r=ue("mcp-config.json");if(!r)return{mcpServers:{context7:nc}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:nc}}}}function Pp(){return kS().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 SS(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Pp(),e=[...r.args||[],"--help"];await yS(r.command||"npx",e,{timeout:15e3})}var yS,nc,wS,ws,sc,xp,on,ks=k(()=>{"use strict";Jt();F();yS=hS(fS),nc={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},wS=300*1e3,ws=null;l(kS,"parseTemplateConfig");l(Pp,"getContext7Config");l(vp,"getConfigPath");l(Cp,"readConfig");l(SS,"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<wS)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 SS();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,bS,Ep=k(()=>{"use strict";vr();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 Je.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 Je.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Je.readDomains(e),Je.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 Je.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 Je.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 Je.writeCategories(e,m)}return o}},bS=new $o});import oc from"node:path";var ic,vS,CS,Mo,Ap,ac=k(()=>{"use strict";ic=30,vS=[/^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$/],CS=[/^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 vS)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=oc.basename(e.path);for(let s of CS)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 PS[r]}var Z,cc,lc,Oo,PS,Ot,Ip,vn=k(()=>{"use strict";Z={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"],PS={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{...rr[r],...e}}function Fo(r,e,t){return{message:r,hint:e,...t}}var _o=k(()=>{"use strict";Yr();Yr();l(uc,"getError");l(Fo,"createError")});import{execSync as dc}from"node:child_process";var No,pc,Lo,bs,Uo=k(()=>{"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 xS}from"node:child_process";import{promisify as TS}from"node:util";var qD,Rp=k(()=>{"use strict";vn();Uo();qD=TS(xS)});var qt,mc,St,Cn=k(()=>{"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=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}},St=new mc});var Ho,dt,gc=k(()=>{"use strict";kt();Cn();ee();Ho=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<=qt.MEMORY_MAX_ENTRIES)return 0;let s=n-qt.MEMORY_MAX_ENTRIES,o=U.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);St.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&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}}},dt=new Ho});var jp=k(()=>{"use strict";ke();Me()});import{execSync as ES}from"node:child_process";import AS from"node:fs/promises";import Go from"node:path";function IS(r){return r.trim().toLowerCase()}async function RS(r){try{return await AS.access(r),!0}catch{return!1}}function jS(){let r=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(r)return r;try{let e=mn.resolve("prjct-cli/package.json");return Go.dirname(e)}catch{return null}}function DS(){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 ES("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).trim().replace(/\r?\n/g,"")}catch{return null}}function $S(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||ce}function MS(){let r=[],e=jS();e&&r.push({source:"package-resolve",root:e});let t=DS();return t&&r.push({source:"npm-root-g",root:Go.join(t,"prjct-cli")}),r.push({source:"local-dev",root:$S()}),r}function OS(){let e=kn("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 Cr,fc,yc,wc=k(()=>{"use strict";Jt();$t();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(IS,"normalizeCommand");l(RS,"fileExists");l(jS,"getPackageResolveRoot");l(DS,"getNpmGlobalRoot");l($S,"getLocalDevRoot");l(MS,"getCandidateRoots");l(OS,"getCatalogFromTemplates");fc=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return OS()}validatePCommand(e){let t=IS(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 MS()){let s=Go.join(n.root,"templates","commands",`${t.command}.md`);if(await RS(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(hc,"isPCommandResolveError");yc=new fc});import{createHash as FS}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 NS(r){let e=Sc.resolve(r);return FS("sha256").update(e).digest("hex").slice(0,16)}function zo(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 LS(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()){_S.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 US(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 HS(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 GS(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 _S,Dp,kc,Mp,Op,bc=k(()=>{"use strict";Jt();ee();_S=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),Dp=400;l(Un,"normalizeKey");l(NS,"repoHash");l(zo,"parseBaselineFile");l(LS,"listSourceFiles");l(US,"detectRepoRules");l(HS,"dedupePatterns");l(GS,"dedupeAntiPatterns");kc=class{static{l(this,"PatternExtractor")}async extract(e){let t=NS(e.projectPath),n=await LS(e.projectPath),s=[],o=[];for(let p of e.languages){let g=Un(p),f=zo(`baseline/patterns/${g}.json`),w=zo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,language:p,source:"baseline",confidence:S.confidence??.8}))),o.push(...w.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`),w=zo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,framework:p,source:"baseline",confidence:S.confidence??.82}))),o.push(...w.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 US(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=HS([...s,...i.patterns,...a]),d=GS([...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 WS}from"node:child_process";import{promisify as VS}from"node:util";var I0,Fp=k(()=>{"use strict";vr();se();ac();I0=VS(WS)});import Hn from"chalk";var _p,BS,JS,Ft,Np=k(()=>{"use strict";Ge();_p=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],BS=80,JS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:_p,speed:BS},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=JS});import te from"chalk";function XS(){return qS[KS]}var U0,vc,qS,KS,Gn,vs,Cc,bt,Pn,YS,QS,h,zn=k(()=>{"use strict";Np();vn();_o();_o();U0=Ft.spinner.frames,vc=Ft.spinner.speed,qS={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}},KS="compact";l(XS,"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,bt=!1,Pn=l((r,e)=>{let t=e??(XS().maxCharsPerLine||Ot.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),YS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ot.CLEAR_WIDTH)}\r`):!0,"clear"),QS={start(){return bt||console.log(Ft.cli.header()),this},end(){return bt||console.log(Ft.cli.footer()),this},spin(r){return bt?this:(this.stop(),process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(Cc++,Pn(r,Ot.SPINNER_MSG))}`)},vc),this):(process.stdout.write(`${Ft.cli.spin(0,Pn(r,Ot.SPINNER_MSG))}
466
+ `),this))},done(r,e){if(this.stop(),!bt){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} ${Pn(r,Ot.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Gn.fail} ${Pn(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(),bt||console.log(`${Gn.warn} ${Pn(r,Ot.WARN_MSG)}`),this},info(r){return this.stop(),bt||console.log(`${Gn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!bt&&e&&console.log(`${Gn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),bt)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(),bt||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(),bt)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(),bt?this:(console.log(`
468
+ ${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return vs&&(clearInterval(vs),vs=null,YS()),this},step(r,e,t){if(bt)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} ${Pn(t,Ot.STEP_MSG)}`)}`)},vc),this):(process.stdout.write(`${Ft.cli.spin(0,`${n} ${Pn(t,Ot.STEP_MSG)}`)}
469
+ `),this)},progress(r,e,t){if(bt)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?` ${Pn(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=QS});function Lp(r,e){let t=[];Pr("Languages",r.languages,e.languages,t),Pr("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)"}),Pr("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);Pr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Pr("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
418
471
 
419
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(`
420
- `)}function Hp(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(`
421
- `)}function Pr(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 Tc=w(()=>{"use strict";l(Up,"generateAnalysisDiff");l(xc,"formatAnalysisDiffMd");l(Hp,"formatAnalysisDiffText");l(Pr,"diffStringArray")});function ob(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(rb.has(r)||r.includes("prjct"))return{level:vs.debug,name:"debug"};let e=vs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Bo(r,e,t){return Gp>=r?(...n)=>console[t](e,...n):ab}var vs,rb,Gp,ib,ab,cb,U,vn=w(()=>{"use strict";vs={error:0,warn:1,info:2,debug:3},rb=new Set(["1","true","*"]);l(ob,"getLogLevel");({level:Gp,name:ib}=ob()),ab=l(()=>{},"noop");l(Bo,"createLogMethod");cb={error:Bo(vs.error,"[prjct:error]","error"),warn:Bo(vs.warn,"[prjct:warn]","warn"),info:Bo(vs.info,"[prjct:info]","log"),debug:Bo(vs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Gp>=0,"isEnabled"),level:l(()=>ib,"level")},U=cb});var Jo,lb,zp=w(()=>{"use strict";rn();ne();ca();an();vn();Jo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Rp.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(Qr.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(Qr.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:",Y(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())}},lb=new Jo});var qo,Ko,Wp=w(()=>{"use strict";ke();oe();Me();qo=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)}},Ko=new qo});var Ec=w(()=>{"use strict";zp();Wp()});var _t,Xo=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 He,Kt=w(()=>{"use strict";Ec();Xo();oe();ne();He=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 Ko.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 db}from"node:crypto";var Ac,Ge,vr=w(()=>{"use strict";va();Tc();oe();Kt();Ac=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"};Pa.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 Pa.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:Up(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 md(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 db("sha256").update(JSON.stringify(t)).digest("hex")}},Ge=new Ac});var Ic,qe,xr=w(()=>{"use strict";Dt();Ta();oe();Cn();Kt();Ic=class extends He{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",hd)}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=gn(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}},qe=new Ic});var Rc,Wn,Yo=w(()=>{"use strict";bo();oe();Kt();Rc=class extends He{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Zd)}getDefault(){return{...ep}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(I=>I.date>=f),S=[...i.agentUsage];if(t.agents)for(let I of t.agents){let D=S.findIndex(B=>B.agentName===I);D>=0?S[D]={...S[D],usageCount:S[D].usageCount+1,tokensSaved:S[D].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:S,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:tp(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 Rc});import at from"node:fs/promises";import pe 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=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await pb(s,o,i),A.getDb(r);for(let{filename:a,key:c}of $c){let u=pe.join(s,a),d=await Vn(u);if(d===null){t.skippedFiles.push(a);continue}try{A.setDoc(r,c,d),Vp(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=pe.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()),Bp(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Sb(r,o,t),await bb(r,o,t),await Cb(r,i,t),await Pb(r,i,t),t.errors.length===0&&await vb(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 pb(r,e,t){let n=pe.join(r,"backup");return await at.mkdir(n,{recursive:!0}),await at.mkdir(pe.join(n,"index"),{recursive:!0}),await at.mkdir(pe.join(n,"memory"),{recursive:!0}),await Dc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Dc(e,pe.join(n,"index")),await Dc(t,pe.join(n,"memory")),n}async function Dc(r,e,t){try{let n=await at.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 at.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Vp(r,e,t){switch(e){case"state":mb(r,t);break;case"queue":gb(r,t);break;case"ideas":fb(r,t);break;case"shipped":hb(r,t);break;case"metrics":yb(r,t);break;case"analysis":wb(r,t);break}}function mb(r,e){let t=A.getDb(r),n=t.prepare(`
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 Pr(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=k(()=>{"use strict";l(Lp,"generateAnalysisDiff");l(Pc,"formatAnalysisDiffMd");l(Up,"formatAnalysisDiffText");l(Pr,"diffStringArray")});function eb(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(ZS.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):nb}var Cs,ZS,Hp,tb,nb,sb,L,xn=k(()=>{"use strict";Cs={error:0,warn:1,info:2,debug:3},ZS=new Set(["1","true","*"]);l(eb,"getLogLevel");({level:Hp,name:tb}=eb()),nb=l(()=>{},"noop");l(Wo,"createLogMethod");sb={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(()=>tb,"level")},L=sb});var Vo,rb,Gp=k(()=>{"use strict";rn();ee();aa();vn();xn();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"&&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(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 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())}},rb=new Vo});var Bo,Jo,zp=k(()=>{"use strict";ke();se();Me();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=k(()=>{"use strict";Gp();zp()});var _t,qo=k(()=>{"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 Ue,Kt=k(()=>{"use strict";Tc();qo();se();ee();Ue=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 ib}from"node:crypto";var Ec,He,xr=k(()=>{"use strict";Ca();xc();se();Kt();Ec=class extends Ue{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 ib("sha256").update(JSON.stringify(t)).digest("hex")}},He=new Ec});var Ac,qe,Tr=k(()=>{"use strict";jt();xa();se();Cn();Kt();Ac=class extends Ue{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: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=gn(qt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},qe=new Ac});var Ic,Wn,Ko=k(()=>{"use strict";ko();se();Kt();Ic=class extends Ue{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(R=>R.date===o);if(p>=0){let R=m[p];m[p]={...R,tokensSaved:R.tokensSaved+n,syncs:R.syncs+1,avgCompressionRate:(R.avgCompressionRate*R.syncs+s)/(R.syncs+1),totalDuration:R.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],w=m.filter(R=>R.date>=f),S=[...i.agentUsage];if(t.agents)for(let R of t.agents){let I=S.findIndex(G=>G.agentName===R);I>=0?S[I]={...S[I],usageCount:S[I].usageCount+1,tokensSaved:S[I].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:R,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:w,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 ct from"node:fs/promises";import pe from"node:path";async function Er(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 ab(s,o,i),A.getDb(r);for(let{filename:a,key:c}of Dc){let u=pe.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=pe.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 fb(r,o,t),await hb(r,o,t),await yb(r,i,t),await wb(r,i,t),t.errors.length===0&&await kb(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 ab(r,e,t){let n=pe.join(r,"backup");return await ct.mkdir(n,{recursive:!0}),await ct.mkdir(pe.join(n,"index"),{recursive:!0}),await ct.mkdir(pe.join(n,"memory"),{recursive:!0}),await Rc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Rc(e,pe.join(n,"index")),await Rc(t,pe.join(n,"memory")),n}async function Rc(r,e,t){try{let n=await ct.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 ct.copyFile(o,i)}}catch(n){if(!C(n))throw n}}function Wp(r,e,t){switch(e){case"state":cb(r,t);break;case"queue":lb(r,t);break;case"ideas":ub(r,t);break;case"shipped":db(r,t);break;case"metrics":pb(r,t);break;case"analysis":mb(r,t);break}}function cb(r,e){let t=A.getDb(r),n=t.prepare(`
422
475
  INSERT OR REPLACE INTO tasks
423
476
  (id, description, type, status, parent_description, branch, linear_id,
424
477
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -429,83 +482,83 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r
429
482
  (id, task_id, description, status, domain, agent, sort_order,
430
483
  depends_on, started_at, completed_at, output, summary)
431
484
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
432
- `),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 gb(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 lb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
433
486
  INSERT OR REPLACE INTO queue_tasks
434
487
  (id, description, type, priority, section, created_at, completed, completed_at,
435
488
  feature_id, feature_name)
436
489
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
437
- `);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 fb(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 ub(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
438
491
  INSERT OR REPLACE INTO ideas
439
492
  (id, text, status, priority, tags, added_at, converted_to, details, data)
440
493
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
441
- `);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 hb(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 db(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
442
495
  INSERT OR REPLACE INTO shipped_features
443
496
  (id, name, shipped_at, version, description, type, duration, data)
444
497
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
445
- `);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 yb(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(`
446
499
  INSERT OR REPLACE INTO metrics_daily
447
500
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
448
501
  VALUES (?, ?, ?, ?, ?)
449
- `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function wb(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 mb(r,e){let n=A.getDb(r).prepare(`
450
503
  INSERT OR REPLACE INTO analysis
451
504
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
452
505
  VALUES (?, ?, ?, ?, ?, ?, ?)
453
- `),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 Bp(r,e,t){e==="categories-cache"&&kb(r,t)}function kb(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 Vp(r,e,t){e==="categories-cache"&&gb(r,t)}function gb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=A.getDb(r).prepare(`
454
507
  INSERT OR REPLACE INTO index_files
455
508
  (path, categories, domain, score, size, mtime, language)
456
509
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
457
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Sb(r,e,t){let n=pe.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 bb(r,e,t){let n=pe.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 fb(r,e,t){let n=pe.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 hb(r,e,t){let n=pe.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(`
458
511
  INSERT OR REPLACE INTO index_files
459
512
  (path, score, size, mtime, language, categories, domain)
460
513
  VALUES (?, ?, ?, ?, NULL,
461
514
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
462
515
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
463
- `);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 Cb(r,e,t){let n=pe.join(e,"events.jsonl");try{let o=(await at.readFile(n,"utf-8")).split(`
464
- `).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 Pb(r,e,t){let n=pe.join(e,"learnings.jsonl");try{let o=(await at.readFile(n,"utf-8")).split(`
465
- `).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 vb(r,e,t,n){let s=l(async(i,a)=>{try{await at.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 Vn(r){try{let e=await at.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Qo(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 Vn(m);if(p!==null){A.setDoc(r,d,p),Vp(r,d,p);try{await at.unlink(m)}catch{}n++}}let s=pe.join(e,"project.json"),o=await Vn(s);if(o!==null){A.setDoc(r,"project",o);try{await at.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 at.readFile(d,"utf-8")).split(`
466
- `).filter(f=>f.trim());if(p.length===0){await at.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,k,S.timestamp??S.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k),I=`learning:${S.taskId??S.timestamp??Date.now()}`,D=S.tags;f.run(I,D?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await at.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...jc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.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()),Bp(r,p.key,m));try{await at.unlink(d)}catch{}n++}return n}var $c,jc,Zo=w(()=>{"use strict";ke();F();ne();$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"}],jc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Tr,"migrateJsonToSqlite");l(pb,"createBackup");l(Dc,"copyFiles");l(Vp,"populateNormalized");l(mb,"populateTasksFromState");l(gb,"populateQueueTasks");l(fb,"populateIdeas");l(hb,"populateShippedFeatures");l(yb,"populateMetricsDaily");l(wb,"populateAnalysis");l(Bp,"populateIndexTables");l(kb,"populateCategoriesIndex");l(Sb,"migrateChecksums");l(bb,"migrateFileScores");l(Cb,"migrateEventsJsonl");l(Pb,"migrateLearningsJsonl");l(vb,"cleanupJsonFiles");l(Vn,"readJsonSafe");l(Qo,"sweepLegacyJson")});var Mc,fe,xs=w(()=>{"use strict";Dt();mo();oe();Cn();Kt();Mc=class extends He{static{l(this,"QueueStorage")}constructor(){super("queue.json",Wd)}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=gn(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 Mc});var Oc,ut,Er=w(()=>{"use strict";Dt();Da();oe();Cn();Kt();Oc=class extends He{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",_d)}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=gn(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}},ut=new Oc});var Ar,Fc,Bn,_c=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"}},Fc=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 Fc});var Nc,_,Ts=w(()=>{"use strict";Dt();mo();oe();_c();Cn();Kt();Nc=class extends He{static{l(this,"StateStorage")}constructor(){super("state.json",Gd)}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: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){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];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=Ud.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 yb(r,e,t){let n=pe.join(e,"events.jsonl");try{let o=(await ct.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 wb(r,e,t){let n=pe.join(e,"learnings.jsonl");try{let o=(await ct.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 kb(r,e,t,n){let s=l(async(i,a)=>{try{await ct.unlink(i)}catch(c){C(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Dc)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 Vn(r){try{let e=await ct.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=pe.join(e,"storage"),n=0;A.getDb(r);for(let{filename:u,key:d}of Dc){let m=pe.join(t,u),p=await Vn(m);if(p!==null){A.setDoc(r,d,p),Wp(r,d,p);try{await ct.unlink(m)}catch{}n++}}let s=pe.join(e,"project.json"),o=await Vn(s);if(o!==null){A.setDoc(r,"project",o);try{await ct.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 ct.readFile(d,"utf-8")).split(`
519
+ `).filter(f=>f.trim());if(p.length===0){await ct.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 w of p)try{let S=JSON.parse(w);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,w,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 w of p)try{let S=JSON.parse(w),R=`learning:${S.taskId??S.timestamp??Date.now()}`,I=S.tags;f.run(R,I?.[0]??null,w,1,S.timestamp??new Date().toISOString())}catch{}})()}await ct.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...jc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.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 ct.unlink(d)}catch{}n++}return n}var Dc,jc,Yo=k(()=>{"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(Er,"migrateJsonToSqlite");l(ab,"createBackup");l(Rc,"copyFiles");l(Wp,"populateNormalized");l(cb,"populateTasksFromState");l(lb,"populateQueueTasks");l(ub,"populateIdeas");l(db,"populateShippedFeatures");l(pb,"populateMetricsDaily");l(mb,"populateAnalysis");l(Vp,"populateIndexTables");l(gb,"populateCategoriesIndex");l(fb,"migrateChecksums");l(hb,"migrateFileScores");l(yb,"migrateEventsJsonl");l(wb,"migrateLearningsJsonl");l(kb,"cleanupJsonFiles");l(Vn,"readJsonSafe");l(Xo,"sweepLegacyJson")});var $c,he,Ps=k(()=>{"use strict";jt();uo();se();Cn();Kt();$c=class extends Ue{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: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=gn(qt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated: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 $c});var Mc,pt,Ar=k(()=>{"use strict";jt();Ra();se();Cn();Kt();Mc=class extends Ue{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: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=gn(qt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},pt=new Mc});var Ir,Oc,Bn,Fc=k(()=>{"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"}},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=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}`}})}},Bn=new Oc});var _c,_,xs=k(()=>{"use strict";jt();uo();se();Fc();Cn();Kt();_c=class extends Ue{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: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[];St.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated: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(w=>`${w.path.join(".")}: ${w.message}`);throw new Error(`Subtask completion requires handoff data:
467
520
  ${f.join(`
468
- `)}`)}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 Nc});var Jp=w(()=>{"use strict";Ec();F()});var Lc,Uc,Hc=w(()=>{"use strict";ps();Kt();Lc=class extends He{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Bd,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}},Uc=new Lc});var Gc,ct,zc=w(()=>{"use strict";ne();Gc=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)
469
- 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}}},ct=new Gc});function Wc(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 Vc,Te,Ir=w(()=>{"use strict";zc();ne();l(Wc,"rowToRule");Vc=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)
470
- 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?Wc(n):null}getRulesForCommand(e,t){let n=ct.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(Wc)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Wc)}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}},Te=new Vc});var Xt=w(()=>{"use strict";vr();Cn();ne();xr();br();Yo();Zo();xs();Er();Ts();Jp();Kt();Hc();Ir()});function xb(){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 _c});var Bp=k(()=>{"use strict";Tc();F()});var Nc,Lc,Uc=k(()=>{"use strict";ps();Kt();Nc=class extends Ue{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,Ke,Gc=k(()=>{"use strict";ee();Hc=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}}},Ke=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,Ce,Rr=k(()=>{"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=Ke.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}},Ce=new Wc});var Xt=k(()=>{"use strict";xr();Cn();ee();Tr();vr();Ko();Yo();Ps();Ar();xs();Bp();Kt();Uc();Rr()});function Sb(){return`\u26A1 prjct
471
524
 
472
- ---`}function Tb(){return`---
473
- \u26A1 prjct \xB7 v${_a()}`}function N(...r){return Eb(xb(),...r.filter(Boolean),Tb())}function Bc(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
474
- `)}function qp(r,e=""){return`\`\`\`${e}
525
+ ---`}function bb(){return`---
526
+ \u26A1 prjct \xB7 v${Fa()}`}function N(...r){return vb(Sb(),...r.filter(Boolean),bb())}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}
475
528
  ${r}
476
- \`\`\``}function Z(r,e,t=3){return`### ${r}
529
+ \`\`\``}function Y(r,e,t=3){return`### ${r}
477
530
  ${e}`}function Pe(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
478
- `)}function Jc(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?`
479
- > ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Kp(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
480
- ${Bc(t,n)}`}function Xp(r){return r.length===0?"":`### Relevant Files
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
481
534
  ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
482
- `)}`}function Yp(r){return`### Rules
483
- ${Pe(r)}`}function ue(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
484
- ${Bc(e,t)}`}function dt(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 Bc(t,n)}function he(r,e){return e?`## \u2705 ${r}
485
- > ${e}`:`## \u2705 ${r}`}function Qp(r){return`> \u26A0\uFE0F **${r}**`}function Eb(...r){return r.filter(Boolean).join(`
486
-
487
- `)}function vt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Es=w(()=>{"use strict";$t();l(xb,"mdHeader");l(Tb,"mdFooter");l(N,"mdOutput");l(Bc,"mdTable");l(qp,"mdCodeBlock");l(Z,"mdSection");l(Pe,"mdList");l(Jc,"mdTaskHeader");l(Kp,"mdSubtasks");l(Xp,"mdRelevantFiles");l(Yp,"mdRules");l(ue,"mdNextSteps");l(dt,"mdStats");l(he,"mdDone");l(Qp,"mdWarn");l(Eb,"mdJoin");l(vt,"mdActionRequired")});import Rr from"chalk";function bt(r,e={}){if(e.quiet)return;let t=em[r]||"idle",n=Bn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Zp[o]||o}));console.log(Rr.dim(`
488
- Next:`));for(let o of s){let i=Rr.cyan(o.cmd.padEnd(12));console.log(Rr.dim(` ${i} \u2192 ${o.desc}`))}}function ei(r){let e=em[r]||"idle";return Bn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Zp[n]||n}))}function Dr(r){let e=Bn.getStateInfo(r);console.log(Rr.dim(`\u{1F4CD} State: ${Rr.white(r.toUpperCase())} - ${e.description}`))}var Zp,em,As=w(()=>{"use strict";_c();Zp={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"},em={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(ei,"getNextSteps");l(Dr,"showStateInfo")});import tt from"node:path";async function Ab(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(tt.join(r,"pnpm-lock.yaml"))?"pnpm":await R(tt.join(r,"yarn.lock"))?"yarn":await R(tt.join(r,"bun.lockb"))||await R(tt.join(r,"bun.lock"))?"bun":(await R(tt.join(r,"package-lock.json")),"npm")}function tm(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function Ib(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 Rb)if(await R(tt.join(r,s)))return s;let n=(e??await sn(r)).find(s=>s.endsWith(Db));if(n)return n}async function cn(r){for(let e of jb)if(await R(tt.join(r,e)))return e}async function ti(r){let e=tt.join(r,"package.json"),t=await zt(e,null);if(t){let a=await Ab(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:tm(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:tm(a,"typecheck")}),c.test&&(u.test={tool:a,command:Ib(a)}),u.versionFile=await Is(r),u.changelogFile=await cn(r),u}if(await R(tt.join(r,"pytest.ini"))){let a=await Is(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await Qe(tt.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await Is(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"Cargo.toml"))){let a=await cn(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await R(tt.join(r,"go.mod"))){let a=await Is(r),c=await cn(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 Is(r,s),c=await cn(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"pom.xml"))){let a=await cn(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await R(tt.join(r,"gradlew"))&&(await R(tt.join(r,"build.gradle"))||await R(tt.join(r,"build.gradle.kts")))){let a=await cn(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Is(r),i=await cn(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var Rb,Db,jb,qc=w(()=>{"use strict";Me();l(Ab,"detectPackageManager");l(tm,"pmRun");l(Ib,"pmTest");Rb=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Db=".csproj",jb=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Is,"detectVersionFile");l(cn,"detectChangelogFile");l(ti,"detectProjectCommands")});import*as re from"@clack/prompts";import Jn from"chalk";var ni,nm,Rs,sm=w(()=>{"use strict";zn();ni=[{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."}],nm=[{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"}],Rs=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(){re.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 re.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=ni.findIndex(n=>n.value===this.detectedType),t=await re.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ni.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?ni[e].value:void 0});return re.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await re.multiselect({message:"Which AI agents do you use?",options:nm.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return re.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);re.note(e,"Detected stack");let t=await re.confirm({message:"Is this stack correct?",initialValue:!0});if(re.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await re.group({language:l(()=>re.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>re.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 re.group({verbosity:l(()=>re.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(()=>re.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(`
489
- `);re.note(e,"Configuration Summary");let t=await re.confirm({message:"Generate configuration with these settings?",initialValue:!0});return re.isCancel(t)||!t?(re.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,re.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ni.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return nm.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 Kc from"node:path";var $b,Mb,si,Ob,pt,qn=w(()=>{"use strict";ke();Dt();Me();$b="outcomes",Mb="outcomes.jsonl",si=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return Kc.join(t,$b)}getOutcomesPath(e){return Kc.join(this.getOutcomesDir(e),Mb)}async record(e,t){let n={...t,id:ge()},s=this.getOutcomesPath(e);return await Rt(Kc.dirname(s)),await ua(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await R(t))return[];let n=await Qe(t);return n.trim()?n.trim().split(`
490
- `).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}},Ob=new si,pt=Ob});var ri,Fb,Xc,rm=w(()=>{"use strict";qn();ri=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await pt.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 pt.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 pt.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 pt.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 pt.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}},Fb=new ri,Xc=Fb});var jr,oi,Yc,Qc=w(()=>{"use strict";ls();oe();jr=3,oi=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>=jr){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}/${jr} 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>=jr){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}/${jr} 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>=jr&&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(`
491
- `)}},Yc=new oi});var ii,om,Zc=w(()=>{"use strict";Ia();Kt();oe();ii=class extends He{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Ed,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:uo([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?uo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:uo(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=Ad(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Id(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:Rd(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}},om=new ii});var el=w(()=>{"use strict";sm();rm();Qc();qn();Zc()});import Yt from"chalk";function _b(r){return im[r.toLowerCase()]||im.default}var im,tl,ai,am=w(()=>{"use strict";im={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(_b,"getIcon");tl=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 Xp(r){return`### Rules
536
+ ${Pe(r)}`}function ie(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
537
+ ${Vc(e,t)}`}function mt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Vc(t,n)}function fe(r,e){return e?`## \u2705 ${r}
538
+ > ${e}`:`## \u2705 ${r}`}function Yp(r){return`> \u26A0\uFE0F **${r}**`}function vb(...r){return r.filter(Boolean).join(`
539
+
540
+ `)}function xt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Ts=k(()=>{"use strict";$t();l(Sb,"mdHeader");l(bb,"mdFooter");l(N,"mdOutput");l(Vc,"mdTable");l(Jp,"mdCodeBlock");l(Y,"mdSection");l(Pe,"mdList");l(Bc,"mdTaskHeader");l(qp,"mdSubtasks");l(Kp,"mdRelevantFiles");l(Xp,"mdRules");l(ie,"mdNextSteps");l(mt,"mdStats");l(fe,"mdDone");l(Yp,"mdWarn");l(vb,"mdJoin");l(xt,"mdActionRequired")});import jr from"chalk";function vt(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(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 Qo(r){let e=Zp[r]||"idle";return Bn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Qp[n]||n}))}function Dr(r){let e=Bn.getStateInfo(r);console.log(jr.dim(`\u{1F4CD} State: ${jr.white(r.toUpperCase())} - ${e.description}`))}var Qp,Zp,Es=k(()=>{"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(vt,"showNextSteps");l(Qo,"getNextSteps");l(Dr,"showStateInfo")});import nt from"node:path";async function Cb(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 j(nt.join(r,"pnpm-lock.yaml"))?"pnpm":await j(nt.join(r,"yarn.lock"))?"yarn":await j(nt.join(r,"bun.lockb"))||await j(nt.join(r,"bun.lock"))?"bun":(await j(nt.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 Pb(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 xb)if(await j(nt.join(r,s)))return s;let n=(e??await sn(r)).find(s=>s.endsWith(Tb));if(n)return n}async function an(r){for(let e of Eb)if(await j(nt.join(r,e)))return e}async function Zo(r){let e=nt.join(r,"package.json"),t=await zt(e,null);if(t){let a=await Cb(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:Pb(a)}),u.versionFile=await As(r),u.changelogFile=await an(r),u}if(await j(nt.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 Ze(nt.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 j(nt.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 j(nt.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 j(nt.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 j(nt.join(r,"gradlew"))&&(await j(nt.join(r,"build.gradle"))||await j(nt.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 xb,Tb,Eb,Jc=k(()=>{"use strict";Me();l(Cb,"detectPackageManager");l(em,"pmRun");l(Pb,"pmTest");xb=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Tb=".csproj",Eb=["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=k(()=>{"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 Ab,Ib,ti,Rb,gt,qn=k(()=>{"use strict";ke();jt();Me();Ab="outcomes",Ib="outcomes.jsonl",ti=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return qc.join(t,Ab)}getOutcomesPath(e){return qc.join(this.getOutcomesDir(e),Ib)}async record(e,t){let n={...t,id:ge()},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 j(t))return[];let n=await Ze(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}},Rb=new ti,gt=Rb});var ni,jb,Kc,sm=k(()=>{"use strict";qn();ni=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.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 gt.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 gt.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(w=>w.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((w,S)=>w+S.qualityScore,0)/a,m=i.filter(w=>{if(!w.variance)return!1;let S=this.parseVariance(w.variance),R=this.parseDuration(w.estimatedDuration);return R===0?!1:Math.abs(S)/R<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let w of i.filter(S=>S.completedAsPlanned))for(let S of w.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((w,S)=>S[1]-w[1]).slice(0,3).map(([w])=>w);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 gt.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 gt.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}},jb=new ni,Kc=jb});var $r,si,Xc,Yc=k(()=>{"use strict";ls();se();$r=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>=$r){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}/${$r} 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>=$r){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}/${$r} 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>=$r&&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=k(()=>{"use strict";Aa();Kt();se();ri=class extends Ue{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=k(()=>{"use strict";nm();sm();Yc();qn();Qc()});import Yt from"chalk";function Db(r){return om[r.toLowerCase()]||om.default}var om,el,oi,im=k(()=>{"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(Db,"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(`
492
545
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
493
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=_b(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})`)}
494
- `),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`}},ai=new tl});import Ke from"chalk";function Nb(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%cm.length;return cm[t]}function Lb(r,e,t="\u25B6"){let n=Ke.dim(String(r+1).padStart(2)),o=Nb(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=Ke.green("\u2713 Complete");break;case"in_progress":a=Ke.yellow(`${t} Working...`);break;case"pending":a=Ke.gray("\u25CB Pending");break;case"failed":a=Ke.red("\u2717 Failed");break;case"blocked":a=Ke.gray("\u2298 Blocked");break;default:a=Ke.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function Ub(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ke.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ke.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Lb(t,r[t]));return e.push(""),e.join(`
495
- `)}function lm(r){console.log(Ub(r))}var cm,um=w(()=>{"use strict";cm=[Ke.cyan,Ke.magenta,Ke.yellow,Ke.blue,Ke.green,Ke.redBright,Ke.magentaBright,Ke.cyanBright];l(Nb,"getDomainColor");l(Lb,"formatSubtaskLine");l(Ub,"renderSubtaskProgress");l(lm,"printSubtaskProgress")});function Hb(r){return dm.includes(r)}async function Gb(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 zb(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(`
496
- `)}var dm,Wb,ci,pm=w(()=>{"use strict";dm=["ship","feature","spec","cleanup","migrate"];l(Hb,"requiresReasoning");l(Gb,"reason");l(zb,"formatPlan");Wb={requiresReasoning:Hb,reason:Gb,formatPlan:zb,REASONING_REQUIRED_COMMANDS:dm},ci=Wb});import $r from"node:fs/promises";var nl,Vb,mt,sl=w(()=>{"use strict";wt();ke();F();Xo();nl=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(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([$r.readFile(d,"utf-8"),$r.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 $r.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 $r.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Vb=new nl,mt=Vb});import{exec as Bb}from"node:child_process";import Ee from"node:fs/promises";import mm from"node:os";import xn from"node:path";import{promisify as Jb}from"node:util";function gm(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 rl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Kb(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=Db(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 Xe from"chalk";function $b(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 Mb(r,e,t="\u25B6"){let n=Xe.dim(String(r+1).padStart(2)),o=$b(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=Xe.green("\u2713 Complete");break;case"in_progress":a=Xe.yellow(`${t} Working...`);break;case"pending":a=Xe.gray("\u25CB Pending");break;case"failed":a=Xe.red("\u2717 Failed");break;case"blocked":a=Xe.gray("\u2298 Blocked");break;default:a=Xe.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function Ob(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Xe.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Xe.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Mb(t,r[t]));return e.push(""),e.join(`
548
+ `)}function cm(r){console.log(Ob(r))}var am,lm=k(()=>{"use strict";am=[Xe.cyan,Xe.magenta,Xe.yellow,Xe.blue,Xe.green,Xe.redBright,Xe.magentaBright,Xe.cyanBright];l($b,"getDomainColor");l(Mb,"formatSubtaskLine");l(Ob,"renderSubtaskProgress");l(cm,"printSubtaskProgress")});function Fb(r){return um.includes(r)}async function _b(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 Nb(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,Lb,ii,dm=k(()=>{"use strict";um=["ship","feature","spec","cleanup","migrate"];l(Fb,"requiresReasoning");l(_b,"reason");l(Nb,"formatPlan");Lb={requiresReasoning:Fb,reason:_b,formatPlan:Nb,REASONING_REQUIRED_COMMANDS:um},ii=Lb});import Mr from"node:fs/promises";var tl,Ub,ft,nl=k(()=>{"use strict";kt();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 Mr.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([Mr.readFile(d,"utf-8"),Mr.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 Mr.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 Mr.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Ub=new tl,ft=Ub});import{exec as Hb}from"node:child_process";import Ee from"node:fs/promises";import pm from"node:os";import Tn from"node:path";import{promisify as Gb}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 Wb(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
497
550
  `;return r.warnings.forEach(t=>{e+=` - ${t}
498
551
  `}),r.recommendations.length>0&&(e+=`
499
552
  Recommendations:
500
553
  `,r.recommendations.forEach(t=>{e+=` -> ${t}
501
- `})),e}async function fm(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=gm(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(xn.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 hm(r){let e=[],t=[],n={};try{let{stdout:i}=await qb("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
502
- `).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 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}.*${rl(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 ym(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(rl(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 wm(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 km(r){let e=[],t=[],n={},s=xn.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=xn.join(mm.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 Sm(r){let e=[],t=[],n={},s=xn.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=xn.join(mm.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 bm(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(xn.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(xn.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 Cm(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 vm(r,e,t){let n=Pm[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 Xb(r,e,t){let n=await vm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Yb(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var qb,Pm,Qb,li,xm=w(()=>{"use strict";F();qb=Jb(Bb);l(gm,"formatDuration");l(rl,"escapeRegex");l(Kb,"formatWarnings");l(fm,"verifyDone");l(hm,"verifyShip");l(ym,"verifyFeature");l(wm,"verifyNow");l(km,"verifyInit");l(Sm,"verifySync");l(bm,"verifyAnalyze");l(Cm,"verifySpec");Pm={done:fm,ship:hm,feature:ym,now:wm,init:km,sync:Sm,analyze:bm,spec:Cm};l(vm,"verify");l(Xb,"prepareCommand");l(Yb,"requiresVerification");Qb={verify:vm,prepareCommand:Xb,requiresVerification:Yb,verifiers:Pm,formatWarnings:Kb,formatDuration:gm,escapeRegex:rl,verifyDone:fm,verifyShip:hm,verifyFeature:ym,verifyNow:wm,verifyInit:km,verifySync:Sm,verifyAnalyze:bm,verifySpec:Cm},li=Qb});function eC(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 tC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of Zb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:eC(t)};return{detected:!1}}function nC(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 sC(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 rC(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 oC(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 Zb,ol,iC,Ds,Tm=w(()=>{"use strict";Zb=[{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(eC,"getHallucinationSuggestion");l(tC,"detectHallucination");l(nC,"isSimilarError");l(sC,"analyzeErrorPattern");l(rC,"generateEscalationMessage");l(oC,"generateSuggestion");ol=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=>nC(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=sC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:rC(e,o,this.maxAttempts),suggestion:oC(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 tC(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}}},iC=new ol,Ds=iC});function il(r,e){let t=Mr(e),n=aC[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 cC(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 lC(r,e,t){let n=Mr(t),s=il(r,t),o=il(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function ui(r,e=wn){let t=Mr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=uC(r,e),s=dC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=gC(o),a=pC(o),c=mC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=fC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Am(r,e,t=wn){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 uC(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=lC(i,s,e);if(!t.has(a)){let c=il(i,e),u=cC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function dC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+hC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>cl(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 pC(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 mC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=cl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function gC(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 fC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=cl(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 cl(r){if(!r.variance)return 0;let e=al(r.estimatedDuration),t=al(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function al(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 Im(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(`
503
- `)}function hC(r){if(!r.estimatedDuration)return 0;let e=al(r.estimatedDuration);if(e<=0)return 0;let t=Em[0],n=Number.POSITIVE_INFINITY;for(let s of Em){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 aC,Em,ll=w(()=>{"use strict";ps();aC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(il,"getSprintStart");l(cC,"getSprintEnd");l(lC,"getSprintNumber");l(ui,"calculateVelocity");l(Am,"projectCompletion");l(uC,"bucketBySprint");l(dC,"buildSprintVelocities");l(pC,"detectTrend");l(mC,"calculateOverallAccuracy");l(gC,"calculateAverageVelocity");l(fC,"detectEstimationPatterns");l(cl,"parseVariancePercent");l(al,"parseDurationMinutes");l(Im,"formatVelocityContext");Em=[{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(hC,"derivePoints");l(Mr,"resolveConfig")});import{exec as yC}from"node:child_process";import wC from"node:fs/promises";import di from"node:path";import{promisify as kC}from"node:util";async function pi(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=vC(r),c=await xC(e),u=await TC(e),d=[];for(let p of c){if(!i&&AC(p))continue;let g=EC(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 vC(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 xC(r){let e=[];async function t(n,s=""){try{let o=await wC.readdir(n,{withFileTypes:!0});for(let i of o){let a=di.join(n,i.name),c=di.join(s,i.name);if(i.isDirectory()){if(PC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=di.extname(i.name).toLowerCase();CC.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(r),e}async function TC(r){let e=new Map;try{let{stdout:t}=await SC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
554
+ `})),e}async function gm(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=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 Ee.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 Ee.access(Tn.dirname(i),Ee.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 zb("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=Tn.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(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 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}.*${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 Ee.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 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(C(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(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 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(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 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(C(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(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=Tn.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(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=Tn.join(pm.homedir(),".prjct-cli");try{await Ee.access(o,Ee.constants.W_OK),n.globalPathWritable=!0}catch(i){if(C(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 km(r){let e=[],t=[],n={},s=Tn.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(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=Tn.join(pm.homedir(),".prjct-cli/projects",o||"");try{await Ee.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 Ee.access(Tn.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 Ee.stat(Tn.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 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(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 Vb(r,e,t){let n=await Cm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Bb(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var zb,vm,Jb,ai,Pm=k(()=>{"use strict";F();zb=Gb(Hb);l(mm,"formatDuration");l(sl,"escapeRegex");l(Wb,"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(Vb,"prepareCommand");l(Bb,"requiresVerification");Jb={verify:Cm,prepareCommand:Vb,requiresVerification:Bb,verifiers:vm,formatWarnings:Wb,formatDuration:mm,escapeRegex:sl,verifyDone:gm,verifyShip:fm,verifyFeature:hm,verifyNow:ym,verifyInit:wm,verifySync:km,verifyAnalyze:Sm,verifySpec:bm},ai=Jb});function Kb(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 Xb(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of qb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:Kb(t)};return{detected:!1}}function Yb(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 Qb(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 Zb(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 ev(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 qb,rl,tv,Rs,xm=k(()=>{"use strict";qb=[{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(Kb,"getHallucinationSuggestion");l(Xb,"detectHallucination");l(Yb,"isSimilarError");l(Qb,"analyzeErrorPattern");l(Zb,"generateEscalationMessage");l(ev,"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=>Yb(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=Qb(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:Zb(e,o,this.maxAttempts),suggestion:ev(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 Xb(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}}},tv=new rl,Rs=tv});function ol(r,e){let t=Or(e),n=nv[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 sv(r,e){let t=Or(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function rv(r,e,t){let n=Or(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=wn){let t=Or(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=ov(r,e),s=iv(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=lv(o),a=av(o),c=cv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=uv(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Em(r,e,t=wn){let n=Or(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 ov(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=rv(i,s,e);if(!t.has(a)){let c=ol(i,e),u=sv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function iv(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+dv(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 av(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 cv(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 lv(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 uv(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 dv(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 Or(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var nv,Tm,cl=k(()=>{"use strict";ps();nv={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(ol,"getSprintStart");l(sv,"getSprintEnd");l(rv,"getSprintNumber");l(ci,"calculateVelocity");l(Em,"projectCompletion");l(ov,"bucketBySprint");l(iv,"buildSprintVelocities");l(av,"detectTrend");l(cv,"calculateOverallAccuracy");l(lv,"calculateAverageVelocity");l(uv,"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(dv,"derivePoints");l(Or,"resolveConfig")});import{exec as pv}from"node:child_process";import mv from"node:fs/promises";import li from"node:path";import{promisify as gv}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=kv(r),c=await Sv(e),u=await bv(e),d=[];for(let p of c){if(!i&&Cv(p))continue;let g=vv(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 kv(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 Sv(r){let e=[];async function t(n,s=""){try{let o=await mv.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(wv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=li.extname(i.name).toLowerCase();yv.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(r),e}async function bv(r){let e=new Map;try{let{stdout:t}=await fv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
504
557
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
505
558
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
506
559
  END { for (f in files) print files[f], lastmod[f], f }
507
560
  '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
508
- `).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 EC(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(bC))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=di.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 AC(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 SC,bC,CC,PC,ul=w(()=>{"use strict";F();SC=kC(yC),bC={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"]},CC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),PC=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(pi,"findRelevantFiles");l(vC,"extractKeywords");l(xC,"getAllCodeFiles");l(TC,"getGitRecency");l(EC,"scoreFile");l(AC,"isTestFile")});import{exec as IC}from"node:child_process";import{promisify as RC}from"node:util";async function Rm(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 $C(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await jC(r,t);return o=o.filter(c=>!MC(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 jC(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 vv(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(hv))for(let w of f)if(c.includes(w)&&e.some(R=>f.includes(R)||R.includes(g)||g.includes(R))){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 Cv(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 fv,hv,yv,wv,ll=k(()=>{"use strict";F();fv=gv(pv),hv={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"]},yv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),wv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(ui,"findRelevantFiles");l(kv,"extractKeywords");l(Sv,"getAllCodeFiles");l(bv,"getGitRecency");l(vv,"scoreFile");l(Cv,"isTestFile")});import{exec as Pv}from"node:child_process";import{promisify as xv}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 Av(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Ev(r,t);return o=o.filter(c=>!Iv(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 Ev(r,e){let{stdout:t}=await Fr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
509
562
  /^[0-9]+$/ { timestamp=$1; next }
510
563
  NF {
511
564
  count[$0]++
@@ -515,8 +568,8 @@ Recommendations:
515
568
  for (f in count) print count[f], lastmod[f], f
516
569
  }
517
570
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
518
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),S=u/i,I=k*.6+S*.4,D;f<1?D="just now":f<24?D=`${f}h ago`:g<7?D=`${g}d ago`:g<30?D=`${Math.floor(g/7)}w ago`:D=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(I*100)/100,lastChanged:D,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function $C(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(`
519
- `).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),w=Math.max(0,1-g/30),S=u/i,R=w*.6+S*.4,I;f<1?I="just now":f<24?I=`${f}h ago`:g<7?I=`${g}d ago`:g<30?I=`${Math.floor(g/7)}w ago`:I=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(R*100)/100,lastChanged:I,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function Av(r){let{stdout:e}=await Fr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Fr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Fr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
572
+ `).filter(Boolean),{stdout:i}=await Fr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
520
573
  /^[0-9]+$/ { timestamp=$1; next }
521
574
  NF {
522
575
  count[$0]++
@@ -526,10 +579,10 @@ Recommendations:
526
579
  for (f in count) print count[f], lastmod[f], f
527
580
  }
528
581
  '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
529
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],S=u-f,I=Math.floor(S/86400),D=Math.floor(S/3600),B=Math.max(0,1-I/14),ve=g/d,$e=B*.5+ve*.5,Be;D<1?Be="just now":D<24?Be=`${D}h ago`:Be=`${I}d ago`,a.push({path:k,changes:g,heatScore:Math.round($e*100)/100,lastChanged:Be,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function MC(r){let e=r.split("/").pop()||"";for(let t of DC)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Or,DC,Dm=w(()=>{"use strict";Or=RC(IC),DC=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Rm,"getRecentFiles");l(jC,"getHotFilesFromCommits");l($C,"getBranchOnlyFiles");l(MC,"shouldIgnore")});function dl(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function jm(r,e){let t=OC[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function _C(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Mm(r,e){let t=dl(r),n=dl(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=jm(s,FC),a=$m.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:_C(i.total),byModel:a}}}function pl(r){let e=dl(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 OC,FC,$m,Om=w(()=>{"use strict";OC={"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}},FC="claude-sonnet-4.5";l(dl,"countTokens");$m=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(jm,"calculateModelCost");l(_C,"formatCostSaved");l(Mm,"measureCompression");l(pl,"noCompression")});import NC from"node:fs/promises";import ml from"node:path";async function Nm(r,e=process.cwd()){let t=ml.isAbsolute(r)?r:ml.join(e,r),n;try{n=await NC.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:pl("")};throw u}let s=ml.extname(r).toLowerCase(),o=LC[s]||"unknown",i=zC[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:pl(n)};let a=WC(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
530
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:Mm(n,c)}}function WC(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),w=p[3],S=u-f,R=Math.floor(S/86400),I=Math.floor(S/3600),G=Math.max(0,1-R/14),$e=g/d,lt=G*.5+$e*.5,Be;I<1?Be="just now":I<24?Be=`${I}h ago`:Be=`${R}d ago`,a.push({path:w,changes:g,heatScore:Math.round(lt*100)/100,lastChanged:Be,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function Iv(r){let e=r.split("/").pop()||"";for(let t of Tv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Fr,Tv,Rm=k(()=>{"use strict";Fr=xv(Pv),Tv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Im,"getRecentFiles");l(Ev,"getHotFilesFromCommits");l(Av,"getBranchOnlyFiles");l(Iv,"shouldIgnore")});function ul(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function jm(r,e){let t=Rv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Dv(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,jv),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:Dv(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 Rv,jv,Dm,Mm=k(()=>{"use strict";Rv={"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}},jv="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(Dv,"formatCostSaved");l($m,"measureCompression");l(dl,"noCompression")});import $v 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 $v.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=Mv[s]||"unknown",i=Nv[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=Lv(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 Lv(r,e){let t=[],n=r.split(`
531
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(`
532
- `).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:VC(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function VC(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var LC,Fm,UC,HC,GC,_m,zC,Lm=w(()=>{"use strict";F();Om();LC={".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"},Fm=[{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}],UC=[{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}],HC=[{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}],GC=[{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}],_m=[{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}],zC={typescript:Fm,javascript:Fm,python:UC,go:HC,rust:GC,java:_m,csharp:_m,php:[],ruby:[],unknown:[]};l(Nm,"extractSignatures");l(WC,"extractFromContent");l(VC,"cleanSignature")});import{createHash as BC}from"node:crypto";import Gm from"node:fs/promises";import zm from"node:path";function Um(r){return BC("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Hm(r){try{let e=zm.join(r,"storage","classification-cache.json"),t=await Gm.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?xa:(console.warn("[classifier] Failed to load cache:",y(e)),xa)}}async function gl(r,e){try{let t=zm.join(r,"storage","classification-cache.json");await Gm.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function qC(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>JC?null:n.classification}function KC(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function XC(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Wm(e),s=Aa("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:Uv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Uv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Mv,Om,Ov,Fv,_v,Fm,Nv,Nm=k(()=>{"use strict";F();Mm();Mv={".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}],Ov=[{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}],Fv=[{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}],_v=[{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}],Nv={typescript:Om,javascript:Om,python:Ov,go:Fv,rust:_v,java:Fm,csharp:Fm,php:[],ruby:[],unknown:[]};l(_m,"extractSignatures");l(Lv,"extractFromContent");l(Uv,"cleanSignature")});import{createHash as Hv}from"node:crypto";import Hm from"node:fs/promises";import Gm from"node:path";function Lm(r){return Hv("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 zv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>Gv?null:n.classification}function Wv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function Vv(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.
533
586
 
534
587
  Task: "${r}"
535
588
 
@@ -537,19 +590,19 @@ Available domains in this project: ${n.join(", ")}
537
590
  Available agents: ${e.agents.join(", ")||"none"}
538
591
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
539
592
 
540
- ${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=yn.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 QC(r,e){let t=Wm(e),n=new Map;for(let[p,g]of Object.entries(YC)){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 gd;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=ZC(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 Wm(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 ZC(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 JC,YC,fl,eP,Vm,Bm=w(()=>{"use strict";gr();lo();F();JC=3600*1e3;l(Um,"hashDescription");l(Hm,"loadCache");l(gl,"saveCache");l(qC,"lookupCache");l(KC,"lookupPatterns");l(XC,"classifyWithLLM");YC={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(QC,"classifyWithHeuristic");l(Wm,"buildAvailableDomains");l(ZC,"getFilePatterns");fl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Um(e),i=await Hm(n),a=qC(i,o,t);if(a)return{classification:a,source:"cache"};let c=KC(i,o);if(c)return{classification:c,source:"history"};let u=await XC(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await gl(n,i),{classification:u,source:"llm"};let d=QC(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await gl(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=Um(e),o=await Hm(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await gl(n,o))}},eP=new fl,Vm=eP});import{exec as tP}from"node:child_process";import Fr from"node:fs/promises";import nP from"node:os";import Kn from"node:path";import{promisify as sP}from"node:util";var Jm,qm,hl,rP,mi,yl=w(()=>{"use strict";ll();wt();ke();ps();Xt();ul();Dm();Lm();F();qn();Bm();Jt();Jm=sP(tP),qm=["database","backend","frontend","testing","devops"],hl=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(($e,Be)=>{if($e.status==="fulfilled")return $e.value;g.push(p[Be]),console.warn(`Context tool "${p[Be]}" failed: ${y($e.reason)}`)}),[k,S,I]=f,D={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},B=this.shouldFragment(a,t),ve=null;return B&&e==="task"&&(ve=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:B,subtasks:ve,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:S??null,velocityContext:I??null,contextDegradation:D}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),pi(e,t,{maxFiles:10,minScore:.15}),Rm(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Nm(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(`
541
- `);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([Jm("git branch --show-current",{cwd:e}),Jm("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
542
- `).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 pt.getAll(e);if(t.length===0)return null;let n=ui(t,wn);return n.sprints.length===0?null:Im(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 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 Vm.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=ko(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(nP.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=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?"...":""}`}},rP=new hl,mi=rP});function oP(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 wl,iP,Fe,Km=w(()=>{"use strict";Dt();oe();an();an();l(oP,"generateApprovalPrompt");wl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return lc.includes(e)}isDestructive(e){return uc.includes(e)}isToolAllowedInPlanning(e){return _o.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>_o.includes(n)):t}startPlanning(e,t,n){let s={id:ge(),projectId:e,command:t,params:n,status:te.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?[te.GATHERING,te.ANALYZING,te.PROPOSING,te.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===te.APPROVED?n.approvedAt=b():t===te.EXECUTING?n.executionStartedAt=b():(t===te.COMPLETED||t===te.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=te.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=te.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!==te.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=te.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=te.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!==te.APPROVED?null:(t.status=te.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==te.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!==te.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=te.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=te.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 oP(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[te.GATHERING]:"\u{1F50D}",[te.ANALYZING]:"\u{1F9E0}",[te.PROPOSING]:"\u{1F4DD}",[te.PENDING_APPROVAL]:"\u23F3",[te.APPROVED]:"\u2705",[te.EXECUTING]:"\u26A1",[te.COMPLETED]:"\u{1F389}",[te.REJECTED]:"\u274C",[te.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===te.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
543
- `)}_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`}},iP=new wl,Fe=iP});function aP(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return gi[t]?gi[t]:gi[e]?gi[e]:e}function fi(r){let e=new Set,t=[];for(let n of r){let s=aP(n);e.has(s)||(e.add(s),t.push(n))}return t}var gi,kl=w(()=>{"use strict";gi={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(aP,"normalizeFrameworkName");l(fi,"deduplicateTechStack")});import{z as _e}from"zod";function Xm(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
544
- `);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=fi(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])=>cP[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=yn.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 Jv(r,e){let t=zm(e),n=new Map;for(let[p,g]of Object.entries(Bv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let w of g)r.match(new RegExp(w,"gi"))&&(f+=w.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=qv(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 qv(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 Gv,Bv,gl,Kv,Wm,Vm=k(()=>{"use strict";gr();ao();F();Gv=3600*1e3;l(Lm,"hashDescription");l(Um,"loadCache");l(ml,"saveCache");l(zv,"lookupCache");l(Wv,"lookupPatterns");l(Vv,"classifyWithLLM");Bv={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(Jv,"classifyWithHeuristic");l(zm,"buildAvailableDomains");l(qv,"getFilePatterns");gl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Lm(e),i=await Um(n),a=zv(i,o,t);if(a)return{classification:a,source:"cache"};let c=Wv(i,o);if(c)return{classification:c,source:"history"};let u=await Vv(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=Jv(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))}},Kv=new gl,Wm=Kv});import{exec as Xv}from"node:child_process";import _r from"node:fs/promises";import Yv from"node:os";import Kn from"node:path";import{promisify as Qv}from"node:util";var Bm,Jm,fl,Zv,di,hl=k(()=>{"use strict";cl();kt();ke();ps();Xt();ll();Rm();Nm();F();qn();Vm();Jt();Bm=Qv(Xv),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((lt,Be)=>{if(lt.status==="fulfilled")return lt.value;g.push(p[Be]),console.warn(`Context tool "${p[Be]}" failed: ${y(lt.reason)}`)}),[w,S,R]=f,I={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:w,sealedAnalysis:S??null,velocityContext:R??null,contextDegradation:I}}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 He.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 gt.getAll(e);if(t.length===0)return null;let n=ci(t,wn);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 _r.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 _r.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 _r.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(Yv.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 _r.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await _r.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?"...":""}`}},Zv=new fl,di=Zv});function eC(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,tC,Fe,qm=k(()=>{"use strict";jt();se();vn();vn();l(eC,"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: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 eC(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`}},tC=new yl,Fe=tC});function nC(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=nC(n);e.has(s)||(e.add(s),t.push(n))}return t}var pi,wl=k(()=>{"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(nC,"normalizeFrameworkName");l(mi,"deduplicateTechStack")});import{z as _e}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])=>sC[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(`
545
598
  Context: ${r.fileCount} files in project.`),e.join(`
546
- `)}var d_,cP,Ym=w(()=>{"use strict";kl();d_=_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()}),cP={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Xm,"buildAntiHallucinationBlock")});import{z as Nt}from"zod";var lP,Qm,Zm=w(()=>{"use strict";lP=Nt.object({agents:Nt.boolean(),patterns:Nt.boolean(),checklist:Nt.boolean(),modules:Nt.array(Nt.string())}),Qm=Nt.object({version:Nt.string(),description:Nt.string().optional(),commands:Nt.record(Nt.string(),lP).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Sl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function eg(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Sl(o,uP),a=Sl(o,dP),c=Sl(o,pP);return s.some(d=>mP.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 uP,dP,pP,mP,tg=w(()=>{"use strict";uP=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],dP=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],pP=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],mP=["Write","Edit","Bash"];l(Sl,"countMatches");l(eg,"classifyCommand")});import bl from"node:fs/promises";import gP from"node:path";async function sg(){if(_r)return _r;let r=await bl.readFile(Cl,"utf-8"),e=JSON.parse(r);return _r=Qm.parse(e),_r}function fP(r){return rg.get(r)}function hP(r,e){rg.set(r,e)}function wP(r,e){let t=r,n=ng.get(t);return n&&SP(n.entry,e)?(n.count++,n.count>=yP):(ng.set(t,{entry:e,count:1}),!1)}async function kP(r,e){let t=await bl.readFile(Cl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await bl.writeFile(Cl,`${JSON.stringify(n,null,2)}
547
- `,"utf-8"),_r=null}function SP(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 og(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=fP(e);if(n)return{entry:n,source:"cache"};if(t){let s=eg(e,t);return hP(e,s),wP(e,s)&&kP(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Cl,_r,rg,ng,yP,ig=w(()=>{"use strict";Zm();$t();tg();Cl=gP.join(ce,"core/config/command-context.config.json"),_r=null;l(sg,"loadCommandContextConfig");rg=new Map;l(fP,"getCachedClassification");l(hP,"cacheClassification");ng=new Map,yP=3;l(wP,"trackClassification");l(kP,"persistClassification");l(SP,"isSameEntry");l(og,"resolveCommandContextFull")});import bP from"node:os";import{z as Qt}from"zod";function CP(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function PP(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function ag(r){let e=r.platform??bP.platform(),t=r.runtime??CP(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
548
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",PP(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
599
+ `)}var o_,sC,Xm=k(()=>{"use strict";wl();o_=_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()}),sC={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 rC,Ym,Qm=k(()=>{"use strict";rC=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(),rC).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,oC),a=kl(o,iC),c=kl(o,aC);return s.some(d=>cC.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 oC,iC,aC,cC,eg=k(()=>{"use strict";oC=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],iC=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],aC=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],cC=["Write","Edit","Bash"];l(kl,"countMatches");l(Zm,"classifyCommand")});import Sl from"node:fs/promises";import lC from"node:path";async function ng(){if(Nr)return Nr;let r=await Sl.readFile(bl,"utf-8"),e=JSON.parse(r);return Nr=Ym.parse(e),Nr}function uC(r){return sg.get(r)}function dC(r,e){sg.set(r,e)}function mC(r,e){let t=r,n=tg.get(t);return n&&fC(n.entry,e)?(n.count++,n.count>=pC):(tg.set(t,{entry:e,count:1}),!1)}async function gC(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"),Nr=null}function fC(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=uC(e);if(n)return{entry:n,source:"cache"};if(t){let s=Zm(e,t);return dC(e,s),mC(e,s)&&gC(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var bl,Nr,sg,tg,pC,og=k(()=>{"use strict";Qm();$t();eg();bl=lC.join(ce,"core/config/command-context.config.json"),Nr=null;l(ng,"loadCommandContextConfig");sg=new Map;l(uC,"getCachedClassification");l(dC,"cacheClassification");tg=new Map,pC=3;l(mC,"trackClassification");l(gC,"persistClassification");l(fC,"isSameEntry");l(rg,"resolveCommandContextFull")});import hC from"node:os";import{z as Qt}from"zod";function yC(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function wC(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function ig(r){let e=r.platform??hC.platform(),t=r.runtime??yC(),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",wC(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
549
602
  `)}
550
- </env>`}var E_,cg=w(()=>{"use strict";E_=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(CP,"detectRuntime");l(PP,"normalizePlatform");l(ag,"buildEnvironmentBlock")});function ug(r){let e=r.getAllocationFor("injection");return{...yi,totalPrompt:e}}function Xn(r,e){let t=e*dg;return r.length<=t?r:`${r.substring(0,t)}
551
- ... (truncated to ~${e} tokens)`}function lg(r){return Math.ceil(r.length/dg)}function pg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=vP[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 yi,dg,vP,hi,mg=w(()=>{"use strict";yi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ug,"budgetsFromCoordinator");dg=4;l(Xn,"truncateToTokenBudget");l(lg,"estimateTokens");vP={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(pg,"filterSkillsByDomains");hi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...yi,...e}}addSection(e,t){let n=Xn(e,t),s=lg(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+=lg(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 gg from"node:fs/promises";import Yn from"node:path";var Pl,xP,fg,hg=w(()=>{"use strict";Xt();F();Me();$t();el();Ym();ig();cg();mg();kl();Jt();Pl=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 gg.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?ug(this._coordinator):yi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=le(`global/modules/${e}`);if(t)return t;let n=Yn.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=kn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=le(s);if(o){let i=Yn.basename(s,".md");t[i]=o}}}else{let s=Yn.join(ce,"templates","checklists");if(await R(s)){let o=(await gg.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){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),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(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 Xc.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(`
552
- `);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 C=await sg();p=og(C,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 b_,ag=k(()=>{"use strict";b_=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(yC,"detectRuntime");l(wC,"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=kC[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,kC,gi,pg=k(()=>{"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");kC={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,SC,gg,fg=k(()=>{"use strict";Xt();F();Me();$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 j(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=ue(`global/modules/${e}`);if(t)return t;let n=Yn.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=kn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ue(s);if(o){let i=Yn.basename(s,".md");t[i]=o}}}else{let s=Yn.join(ce,"templates","checklists");if(await j(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),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(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}
553
606
  `),s.role&&d.push(`Role: ${s.role}
554
607
  `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
555
608
  `),d.push(`
@@ -558,117 +611,117 @@ Apply specialized expertise. Read agent file for details if needed.
558
611
  `)),d.push(`TASK: ${e.frontmatter.description}
559
612
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
560
613
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
561
- `);let k=t.projectPath;if(k){let C=u?.project?.id?Yn.basename(k):Yn.basename(k),j=ag({projectName:C,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
562
- ${j}
563
- `)}if(u){let C=u.sealedAnalysis;if(d.push(`
614
+ `);let w=t.projectPath;if(w){let v=u?.project?.id?Yn.basename(w):Yn.basename(w),D=ig({projectName:v,projectPath:w,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
615
+ ${D}
616
+ `)}if(u){let v=u.sealedAnalysis;if(d.push(`
564
617
  ## PROJECT ANALYSIS (Sealed)
565
618
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
566
619
  `),d.push(`**Primary Domain**: ${u.primaryDomain}
567
620
  `),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
568
- `),C){if(C.languages?.length>0&&d.push(`**Languages**: ${C.languages.join(", ")}
569
- `),C.frameworks?.length>0&&d.push(`**Frameworks**: ${C.frameworks.join(", ")}
570
- `),C.packageManager&&d.push(`**Package Manager**: ${C.packageManager}
571
- `),C.sourceDir&&d.push(`**Source Dir**: ${C.sourceDir}
572
- `),C.testDir&&d.push(`**Test Dir**: ${C.testDir}
573
- `),d.push(`**Files Analyzed**: ${C.fileCount}
574
- `),d.push(`**Analysis Status**: ${C.status}${C.commitHash?` (commit: ${C.commitHash.slice(0,8)})`:""}
575
- `),C.patterns?.length>0){d.push(`
621
+ `),v){if(v.languages?.length>0&&d.push(`**Languages**: ${v.languages.join(", ")}
622
+ `),v.frameworks?.length>0&&d.push(`**Frameworks**: ${v.frameworks.join(", ")}
623
+ `),v.packageManager&&d.push(`**Package Manager**: ${v.packageManager}
624
+ `),v.sourceDir&&d.push(`**Source Dir**: ${v.sourceDir}
625
+ `),v.testDir&&d.push(`**Test Dir**: ${v.testDir}
626
+ `),d.push(`**Files Analyzed**: ${v.fileCount}
627
+ `),d.push(`**Analysis Status**: ${v.status}${v.commitHash?` (commit: ${v.commitHash.slice(0,8)})`:""}
628
+ `),v.patterns?.length>0){d.push(`
576
629
  ### Code Patterns (Follow These)
577
- `);for(let j of C.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
578
- `)}if(C.antiPatterns?.length>0){d.push(`
630
+ `);for(let D of v.patterns)d.push(`- **${D.name}**: ${D.description}${D.location?` (${D.location})`:""}
631
+ `)}if(v.antiPatterns?.length>0){d.push(`
579
632
  ### Anti-Patterns (Avoid These)
580
- `);for(let j of C.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
633
+ `);for(let D of v.antiPatterns)d.push(`- **${D.issue}** in \`${D.file}\` \u2014 ${D.suggestion}
581
634
  `)}}d.push(`
582
- `)}let S=p.patterns,I=n?.codePatterns||"";if(S&&I&&I.trim()){let C=this.extractPatternSummary(I);C&&(d.push(`## CODE PATTERNS
583
- `),d.push(C),d.push(`
635
+ `)}let S=p.patterns,R=n?.codePatterns||"";if(S&&R&&R.trim()){let v=this.extractPatternSummary(R);v&&(d.push(`## CODE PATTERNS
636
+ `),d.push(v),d.push(`
584
637
  Full patterns: Read analysis/patterns.md
585
- `))}let D=n?.analysis||"";if(S&&D&&D.trim()){let C=D.match(/Stack[:\s]+([^\n]+)/i)||D.match(/Technology[:\s]+([^\n]+)/i),j=C?C[1].trim():"detected";d.push(`
638
+ `))}let I=n?.analysis||"";if(S&&I&&I.trim()){let v=I.match(/Stack[:\s]+([^\n]+)/i)||I.match(/Technology[:\s]+([^\n]+)/i),D=v?v[1].trim():"detected";d.push(`
586
639
  ## STACK
587
- Stack: ${j}
588
- `),I||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
640
+ Stack: ${D}
641
+ `),R||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
589
642
  `)}if(u){if(u.agents.length>0){d.push(`
590
643
  ### LOADED AGENTS (Project-Specific Specialists)
591
644
 
592
- `);for(let j of u.agents){d.push(`#### Agent: ${j.name} (${j.domain})
593
- `),j.effort&&d.push(`Effort: ${j.effort}
594
- `),j.model&&d.push(`Model: ${j.model}
595
- `),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
596
- `);let Re=Xn(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
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 Re=Xn(D.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
597
650
  ${Re}
598
651
  \`\`\`
599
652
 
600
- `)}}let C=pg(u.skills,u.detectedDomains);if(C.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
653
+ `)}}let v=dg(u.skills,u.detectedDomains);if(v.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
601
654
 
602
- `);for(let j of C){d.push(`#### Skill: ${j.name}
603
- `);let Re=Xn(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
655
+ `);for(let D of v){d.push(`#### Skill: ${D.name}
656
+ `);let Re=Xn(D.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
604
657
  ${Re}
605
658
  \`\`\`
606
659
 
607
- `)}}}let B=this.getModulesForCommand(m,p);if(B.length>0)for(let C of B){let j=await this.loadModule(C);j&&(d.push(`
608
- `),d.push(j))}if(c?.isPlanning&&(d.push(`
660
+ `)}}}let G=this.getModulesForCommand(m,p);if(G.length>0)for(let v of G){let D=await this.loadModule(v);D&&(d.push(`
661
+ `),d.push(D))}if(c?.isPlanning&&(d.push(`
609
662
  ## PLAN MODE
610
663
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
611
664
  `),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
612
665
  `)),c?.requiresApproval&&d.push(`
613
666
  ## APPROVAL REQUIRED
614
667
  Show changes, list affected files, ask for confirmation.
615
- `),k){let C=u?.sealedAnalysis,j=[...C?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Re={projectPath:k,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:fi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(nr=>nr.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};d.push(`
616
- ${Xm(Re)}
617
- `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let C=u.contextDegradation;d.push(`
668
+ `),w){let v=u?.sealedAnalysis,D=[...v?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Re={projectPath:w,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(nr=>nr.name)||[],analysisLanguages:v?.languages||[],analysisFrameworks:v?.frameworks||[],analysisPackageManager:v?.packageManager};d.push(`
669
+ ${Km(Re)}
670
+ `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let v=u.contextDegradation;d.push(`
618
671
  ### CONTEXT DEGRADATION NOTICE
619
672
 
620
- `),d.push(`**Level**: ${C.level}
621
- `),d.push(`**Unavailable**: ${C.failedTools.join(", ")}
673
+ `),d.push(`**Level**: ${v.level}
674
+ `),d.push(`**Unavailable**: ${v.failedTools.join(", ")}
622
675
  `),d.push(`Some context tools failed. Explore the codebase manually for missing context.
623
676
 
624
- `)}if(u?.realContext){let C=u.realContext;if(d.push(`
677
+ `)}if(u?.realContext){let v=u.realContext;if(d.push(`
625
678
  ### CODEBASE CONTEXT
626
679
 
627
- `),d.push(`**Git State**: Branch \`${C.gitBranch}\` | ${C.gitStatus}
680
+ `),d.push(`**Git State**: Branch \`${v.gitBranch}\` | ${v.gitStatus}
628
681
 
629
- `),C.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
682
+ `),v.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
630
683
  `),d.push(`| Score | File | Why |
631
684
  `),d.push(`|-------|------|-----|
632
- `);for(let j of C.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
685
+ `);for(let D of v.relevantFiles.slice(0,8))d.push(`| ${D.score} | ${D.path} | ${D.reason} |
633
686
  `);d.push(`
634
- `)}if(C.signatures.length>0){d.push(`**Code Signatures** (top files):
635
- `);for(let j of C.signatures)d.push(`\`\`\`typescript
636
- // ${j.path}
637
- ${j.content}
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}
638
691
  \`\`\`
639
692
  `);d.push(`
640
- `)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let j=C.recentFiles.slice(0,5).map(Re=>`${Re.path} (${Re.lastChanged})`).join(", ");d.push(`${j}
693
+ `)}if(v.recentFiles.length>0){d.push("**Recently Changed**: ");let D=v.recentFiles.slice(0,5).map(Re=>`${Re.path} (${Re.lastChanged})`).join(", ");d.push(`${D}
641
694
 
642
- `)}}let ve=t.files||[];if(ve.length>0){let C=ve.slice(0,5).join(", ");d.push(`
643
- ## FILES: ${ve.length} available. Top: ${C}
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}
644
697
  `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
645
698
 
646
- `)}else k&&d.push(`
647
- ## PROJECT: ${k}
699
+ `)}else w&&d.push(`
700
+ ## PROJECT: ${w}
648
701
  Read files before modifying.
649
702
 
650
- `);let $e=this.filterRelevantState(n);if($e&&(d.push(`
703
+ `);let lt=this.filterRelevantState(n);if(lt&&(d.push(`
651
704
  ## PRJCT STATE (Project Management Data)
652
- `),d.push($e),d.push(`
705
+ `),d.push(lt),d.push(`
653
706
  `)),u?.velocityContext&&(d.push(`
654
707
  ### VELOCITY (Historical Estimation Data)
655
708
 
656
709
  `),d.push(u.velocityContext),d.push(`
657
710
 
658
- `)),o&&Object.keys(o).some(C=>o[C])){d.push(`
711
+ `)),o&&Object.keys(o).some(v=>o[v])){d.push(`
659
712
  ## PROJECT DEFAULTS (apply automatically)
660
- `);for(let[C,j]of Object.entries(o))j&&d.push(`- ${C}: ${j}
713
+ `);for(let[v,D]of Object.entries(o))D&&d.push(`- ${v}: ${D}
661
714
  `)}if(i?.plan&&i.plan.length>0){if(d.push(`
662
715
  ## THINK FIRST (reasoning from analysis)
663
716
  `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
664
- `);for(let C of i.conclusions)d.push(` \u2192 ${C}
717
+ `);for(let v of i.conclusions)d.push(` \u2192 ${v}
665
718
  `)}d.push(`Plan:
666
- `);for(let C=0;C<i.plan.length;C++)d.push(` ${C+1}. ${i.plan[C]}
719
+ `);for(let v=0;v<i.plan.length;v++)d.push(` ${v+1}. ${i.plan[v]}
667
720
  `);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
668
721
  `)}if(a&&a.length>0){d.push(`
669
722
  ## CONTEXT (apply these)
670
- `);for(let C of a)d.push(`- **${C.title}**: ${C.content}
671
- `),C.tags&&C.tags.length>0&&d.push(` Tags: ${C.tags.join(", ")}
723
+ `);for(let v of a)d.push(`- **${v.title}**: ${v.content}
724
+ `),v.tags&&v.tags.length>0&&d.push(` Tags: ${v.tags.join(", ")}
672
725
  `)}if(d.push(`
673
726
  ---
674
727
  `),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
@@ -676,34 +729,34 @@ Read files before modifying.
676
729
 
677
730
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
678
731
  `),d.push(`|---|--------|-------------|--------|
679
- `);for(let j of u.subtasks){let Re=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} | ${Re} |
680
- `)}let C=u.subtasks.find(j=>j.status==="in_progress");if(C&&(d.push(`
681
- **FOCUS ON SUBTASK #${C.order}**: ${C.description}
682
- `),d.push(`Agent: ${C.agent} | Domain: ${C.domain}
683
- `),C.dependsOn.length>0&&d.push(`Dependencies: ${C.dependsOn.join(", ")}
684
- `),C.handoff)){let j=C.handoff;d.push(`
732
+ `);for(let D of u.subtasks){let Re=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} | ${Re} |
733
+ `)}let v=u.subtasks.find(D=>D.status==="in_progress");if(v&&(d.push(`
734
+ **FOCUS ON SUBTASK #${v.order}**: ${v.description}
735
+ `),d.push(`Agent: ${v.agent} | Domain: ${v.domain}
736
+ `),v.dependsOn.length>0&&d.push(`Dependencies: ${v.dependsOn.join(", ")}
737
+ `),v.handoff)){let D=v.handoff;d.push(`
685
738
  ### Previous Subtask Handoff
686
739
 
687
- `),d.push(`**From:** ${j.fromSubtask}
740
+ `),d.push(`**From:** ${D.fromSubtask}
688
741
 
689
742
  `),d.push(`**What was done:**
690
- `);for(let Re of j.whatWasDone)d.push(`- ${Re}
691
- `);if(j.filesChanged.length>0){d.push(`
743
+ `);for(let Re of D.whatWasDone)d.push(`- ${Re}
744
+ `);if(D.filesChanged.length>0){d.push(`
692
745
  **Files changed:**
693
- `);for(let Re of j.filesChanged)d.push(`- \`${Re.path}\` (${Re.action})
746
+ `);for(let Re of D.filesChanged)d.push(`- \`${Re.path}\` (${Re.action})
694
747
  `)}d.push(`
695
748
  **Context for this subtask:**
696
- ${j.outputForNextAgent}
749
+ ${D.outputForNextAgent}
697
750
  `)}d.push(`
698
- `)}let Be=this.getSchemaTypeForCommand(m);if(Be){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>(lo(),Pd)),j=C(Be);j&&d.push(`
699
- ${j}
700
- `)}if(p.checklist){let C=await this.loadChecklistRouting(),j=await this.loadChecklists();C&&Object.keys(j).length>0&&(d.push(`
751
+ `)}let Be=this.getSchemaTypeForCommand(m);if(Be){let{renderSchemaForPrompt:v}=await Promise.resolve().then(()=>(ao(),vd)),D=v(Be);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(`
701
754
  ## QUALITY CHECKLISTS
702
755
  `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
703
- `),d.push(`Available: ${Object.keys(j).join(", ")}
756
+ `),d.push(`Available: ${Object.keys(D).join(", ")}
704
757
  `),d.push(`Path: templates/checklists/{name}.md
705
758
  `),d.push(`Use Read tool to load checklists you determine are relevant.
706
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new hi({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 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}
707
760
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
708
761
 
709
762
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -737,7 +790,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
737
790
  - Prefer structured output (JSON) over free text when applicable.
738
791
 
739
792
  EXECUTE: Follow flow. Use tools. Decide.
740
- `}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}}}},xP=new Pl,fg=xP});import yg from"node:fs/promises";import xt from"node:path";var TP,EP,vl,xl,wi,Tl=w(()=>{"use strict";wt();ke();F();TP=["task","done","ship","resume","bug","enrich"],EP=["init","sync","pause","next","dash","history","undo","redo"],vl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return xt.dirname(Dn.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(ht)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=xt.join(u,"templates")}catch{c=xt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:xt.join(c,"agentic","orchestrator.md"),agentRouting:xt.join(c,"agentic","agent-routing.md"),taskFragmentation:xt.join(c,"agentic","task-fragmentation.md"),commandTemplate:xt.join(c,"commands",`${e}.md`),repoAnalysis:xt.join(o,"analysis","repo-analysis.json"),agentsDir:xt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:xt.join(o,"storage","state.json")}}}requiresOrchestration(e){return TP.includes(e)?!0:!EP.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await yg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await yg.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}}}},SC=new vl,gg=SC});import hg from"node:fs/promises";import Tt from"node:path";var bC,vC,Cl,Pl,hi,xl=k(()=>{"use strict";kt();ke();F();bC=["task","done","ship","resume","bug","enrich"],vC=["init","sync","pause","next","dash","history","undo","redo"],Cl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Tt.dirname(mn.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(),ut(it)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Tt.join(u,"templates")}catch{c=Tt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:Tt.join(c,"agentic","orchestrator.md"),agentRouting:Tt.join(c,"agentic","agent-routing.md"),taskFragmentation:Tt.join(c,"agentic","task-fragmentation.md"),commandTemplate:Tt.join(c,"commands",`${e}.md`),repoAnalysis:Tt.join(o,"analysis","repo-analysis.json"),agentsDir:Tt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:Tt.join(o,"storage","state.json")}}}requiresOrchestration(e){return bC.includes(e)?!0:!vC.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Tt.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=Tt.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:`
741
794
  ## Agentic Execution Mode
742
795
 
743
796
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -820,13 +873,13 @@ When fragmenting tasks:
820
873
  2. Track progress: currentSubtaskIndex, subtaskProgress
821
874
  3. Each completed subtask generates a summary
822
875
  4. Pass summary to next agent for context handoff
823
- `,context:e,requiresOrchestration:t}}},xl=new vl,wi=xl});import{exec as AP}from"node:child_process";import wg from"node:fs/promises";import{promisify as IP}from"node:util";var RP,Qn,Xe,El=w(()=>{"use strict";vo();RP=IP(AP),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 wg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Po(e)||yr(e),null}});Qn.register("Write",async(r,e)=>{try{return await wr.execute(async()=>await wg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Po(t)||yr(t),!1}});Qn.register("Bash",async r=>{try{return await wr.execute(async()=>await RP(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());Xe=Qn});import Al from"node:fs/promises";import DP from"node:os";import kg from"node:path";async function jP(r){try{let e=kg.dirname(ki);await R(e)||await Al.mkdir(e,{recursive:!0}),await Al.writeFile(ki,`/p:${r}`)}catch{}}async function $P(){try{await R(ki)&&await Al.unlink(ki)}catch{}}var ki,Il,MP,Si,Rl=w(()=>{"use strict";F();am();Me();um();pm();sl();xm();Tm();ms();yl();Km();hg();Tl();Jt();El();ki=kg.join(DP.homedir(),".prjct-cli",".running");l(jP,"signalStart");l($P,"signalEnd");Il=class{static{l(this,"CommandExecutor")}async signalStart(e){await jP(e)}async signalEnd(){await $P()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Ds.shouldEscalate(e,s)){let o=Ds.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ha.load(e),i=await mt.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(li.requiresVerification(e)){let C=await mt.loadStateForCommand(i,e);m=await li.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(li.formatWarnings(m))}let p=null;if(ci.requiresReasoning(e)){let C=await mt.loadStateForCommand(i,e);p=await ci.reason(e,i,C),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(ci.formatPlan(p)))}let g=t.task||t.description||"",f=await wi.buildContext(e,g,n),k=wi.buildAgenticPrompt(f),S=null;if(wi.requiresOrchestration(e)&&g)try{S=await mi.execute(e,g,n),S.detectedDomains.length>0&&ai.orchestrate(S.detectedDomains);for(let C of S.agents){let j=C.domain||C.name.replace(".md","");ai.startAgent(C.name,j,`Loading ${j} specialist...`),ai.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let C=S.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));lm(C)}}catch(C){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(C)}`)}let I={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},D=await mt.loadState(i),B=null,ve=null;i.projectId&&(B={commit_footer:await Ue.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ue.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ue.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ue.getSmartDecision(i.projectId,`preferred_agent_${e}`)},ve=await Ue.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let $e={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Be=await fg.build(o,I,D,null,B,null,ve,$e,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Ds.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:D,prompt:Be,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:B,relevantMemories:ve,orchestratorContext:S,memory:{create:l(C=>Ue.createMemory(i.projectId,C),"create"),autoRemember:l((C,j,Re)=>Ue.autoRemember(i.projectId,C,j,Re),"autoRemember"),search:l(C=>Ue.searchMemories(i.projectId,C),"search"),findByTags:l(C=>Ue.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>Ue.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>Fe.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>Fe.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>Fe.proposePlan(i.projectId,C),"propose"),approve:l(C=>Fe.approvePlan(i.projectId,C),"approve"),reject:l(C=>Fe.rejectPlan(i.projectId,C),"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(C=>Fe.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>Fe.failStep(i.projectId,C),"failStep"),abort:l(C=>Fe.abortPlan(i.projectId,C),"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=Ds.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Ds.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(!Xe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Xe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Ha.load(e)).frontmatter["allowed-tools"]||[],i=await mt.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)}}}},MP=new Il,Si=MP});import bi from"node:fs/promises";import OP from"node:https";import FP from"node:os";import Dl from"node:path";import Lt from"chalk";var jl,Sg,bg=w(()=>{"use strict";F();Me();jl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Dl.join(FP.homedir(),".prjct-cli","config"),this.cacheFile=Dl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Dl.join(__dirname,"..","..","package.json");return JSON.parse(await bi.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=OP.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 bi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await R(this.cacheDir)||await bi.mkdir(this.cacheDir,{recursive:!0}),await bi.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:`
876
+ `,context:e,requiresOrchestration:t}}},Pl=new Cl,hi=Pl});import{exec as CC}from"node:child_process";import yg from"node:fs/promises";import{promisify as PC}from"node:util";var xC,Qn,Ye,Tl=k(()=>{"use strict";vo();xC=PC(CC),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 kr.execute(async()=>await yg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return bo(e)||wr(e),null}});Qn.register("Write",async(r,e)=>{try{return await kr.execute(async()=>await yg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return bo(t)||wr(t),!1}});Qn.register("Bash",async r=>{try{return await kr.execute(async()=>await xC(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());Ye=Qn});import El from"node:fs/promises";import TC from"node:os";import wg from"node:path";async function EC(r){try{let e=wg.dirname(yi);await j(e)||await El.mkdir(e,{recursive:!0}),await El.writeFile(yi,`/p:${r}`)}catch{}}async function AC(){try{await j(yi)&&await El.unlink(yi)}catch{}}var yi,Al,IC,wi,Il=k(()=>{"use strict";F();im();Me();lm();dm();nl();Pm();xm();fr();hl();qm();fg();xl();Jt();Tl();yi=wg.join(TC.homedir(),".prjct-cli",".running");l(EC,"signalStart");l(AC,"signalEnd");Al=class{static{l(this,"CommandExecutor")}async signalStart(e){await EC(e)}async signalEnd(){await AC()}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 ft.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(ai.requiresVerification(e)){let v=await ft.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 ft.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),w=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 R={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},I=await ft.loadState(i),G=null,$e=null;i.projectId&&(G={commit_footer:await tt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await tt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await tt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await tt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},$e=await tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let lt={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Be=await gg.build(o,R,I,null,G,null,$e,lt,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),w.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Rs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:R,state:I,prompt:Be,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:w.prompt,requiresOrchestration:w.requiresOrchestration,agentsPath:R.agentsPath,agentRoutingPath:R.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:G,relevantMemories:$e,orchestratorContext:S,memory:{create:l(v=>tt.createMemory(i.projectId,v),"create"),autoRemember:l((v,D,Re)=>tt.autoRemember(i.projectId,v,D,Re),"autoRemember"),search:l(v=>tt.searchMemories(i.projectId,v),"search"),findByTags:l(v=>tt.findByTags(i.projectId,v),"findByTags"),getStats:l(()=>tt.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=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(!Ye.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ye.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 ft.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)}}}},IC=new Al,wi=IC});import ki from"node:fs/promises";import RC from"node:https";import jC from"node:os";import Rl from"node:path";import Lt from"chalk";var jl,kg,Sg=k(()=>{"use strict";F();Me();jl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(jC.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=RC.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 j(this.cacheFile))return JSON.parse(await ki.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await j(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:`
824
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")+`
825
878
  `+Lt.yellow("\u2502")+" "+Lt.bold("Update available!")+" "+Lt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Lt.yellow("\u2502")+`
826
879
  `+Lt.yellow("\u2502")+" "+Lt.yellow("\u2502")+`
827
880
  `+Lt.yellow("\u2502")+" Run: "+Lt.cyan("npm update -g prjct-cli")+" "+Lt.yellow("\u2502")+`
828
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")+`
829
- `}},Sg=jl});var be,nt=w(()=>{"use strict";Rl();sl();El();wt();ke();bg();ln();oe();Me();zn();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Sg,this.updateNotificationShown=!1,this.commandExecutor=Si}get agent(){return ws.getAgent()}get agentInfo(){return ws.getInfo()}get currentAuthor(){return Tn.getCurrentAuthor()}async initializeAgent(){return ws.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 lt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Tn.isEmptyDirectory(e)}async _detectExistingCode(e){return Tn.hasExistingCode(e)}_breakdownFeatureTasks(e){return jo.breakdownFeature(e)}_detectBugSeverity(e){return jo.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ws.assignForTask(e,t,n)}}});var Cg={};jn(Cg,{PlanningCommands:()=>es});import Zn from"node:path";async function _P(){if(!$l){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Pi(),Pg));$l=new r}return $l}var $l,es,Ci=w(()=>{"use strict";To();Sn();Dt();Xt();Ir();F();Es();As();qc();el();nt();$l=null;l(_P,"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 Rs(t).runNonInteractive());else if(a=await new Rs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await ys(),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
882
+ `}},kg=jl});var be,st=k(()=>{"use strict";Il();nl();Tl();kt();ke();Sg();cn();se();Me();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 En.getCurrentAuthor()}async initializeAgent(){return ys.initialize()}async ensureProjectInit(e){return En.ensureInit(e)}async ensureAuthor(){return En.ensureAuthor()}async getGlobalProjectPath(e){return En.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return dt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return En.isEmptyDirectory(e)}async _detectExistingCode(e){return En.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 DC(){if(!Dl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(bi(),vg));Dl=new r}return Dl}var Dl,es,Si=k(()=>{"use strict";Po();Sn();jt();Xt();Rr();F();Ts();Es();Jc();Zc();st();Dl=null;l(DC,"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
830
883
 
831
884
  No current task. Use \`/p:now\` to set focus.
832
885
  `,"core/next.md":`# NEXT
@@ -846,7 +899,7 @@ No current task. Use \`/p:now\` to set focus.
846
899
  `,"planning/roadmap.md":`# ROADMAP
847
900
 
848
901
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
849
- `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[I,D]of Object.entries(g))await Xe.get("Write")(Zn.join(p,I),D);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let I=await _P();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"),D=`# 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[R,I]of Object.entries(g))await Ye.get("Write")(Zn.join(p,R),I);let f=await this._detectEmptyDirectory(t),w=await this._detectExistingCode(t);if(w||!f){h.step(3,4,"Analyzing project...");let R=await DC();if((await R.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await R.sync(t,{aiTools:a.agents}):await R.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let S=n.idea;if(f&&!w){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 R=Zn.join(p,"planning","architect-session.md"),I=`# Architect Session
850
903
 
851
904
  ## Idea
852
905
  ${S}
@@ -855,7 +908,7 @@ ${S}
855
908
  Initialized - awaiting stack recommendation
856
909
 
857
910
  Generated: ${new Date().toLocaleString()}
858
- `;return await Xe.get("Write")(I,D),await xe.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await xe.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 mt.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 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 mt.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),dt({Severity:a,Priority:m,Agent:u}),ue([{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
911
+ `;return await Ye.get("Write")(R,I),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 ft.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 ft.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),mt({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}`),vt("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
859
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.
860
913
 
861
914
  Create a plan first:
@@ -877,7 +930,7 @@ The architect plan is ready. Claude will now:
877
930
  4. Create starter files with boilerplate
878
931
  `),console.log(`
879
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.
880
- `),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=Zn.join(c,"planning","architect-session.md"),d=`# Architect Session
881
934
 
882
935
  ## Idea
883
936
  ${e}
@@ -892,13 +945,13 @@ Initialized - awaiting architecture design
892
945
  4. Generate roadmap
893
946
 
894
947
  Generated: ${new Date().toLocaleString()}
895
- `;return await Xe.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),dt({Mode:"architecture"}),ue([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
948
+ `;return await Ye.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),mt({Mode:"architecture"}),ie([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
896
949
  \u{1F4A1} Use /p:architect execute to continue planning
897
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await qe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(N(Z("Idea Captured",e),dt({Mode:"capture"}),ue([{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 qe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(N(Y("Idea Captured",e),mt({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)}`),vt("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(w=>w.endsWith(".md")&&w!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
898
951
  \u{1F4A1} Create one with /p:spec "feature name"
899
952
  `),{success:!0,specs:[]}):(console.log(`
900
953
  \u{1F4CB} SPECIFICATIONS
901
- `),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)}
954
+ `),console.log("\u2550".repeat(50)),f.forEach((w,S)=>{let R=w.replace(".md","").replace(/-/g," ");console.log(` ${S+1}. ${R}`)}),console.log(`${"\u2550".repeat(50)}
902
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}
903
956
 
904
957
  ## Overview
@@ -929,19 +982,19 @@ Generated: ${new Date().toLocaleString()}
929
982
  ---
930
983
  Created: ${new Date().toLocaleString()}
931
984
  Status: Draft
932
- `;return await Xe.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 Ye.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:W.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
933
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
934
- `),{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 ti(t),s=0;Te.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&&Te.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&&Te.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,vg=w(()=>{"use strict";rn();To();wt();ke();F();Me();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(()=>(Ci(),Cg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw go.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 ys();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 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 sn(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)}},Tn=new vi});var NP,xg,Tg,Ml,Eg,Ag=w(()=>{"use strict";ne();oe();NP=1800*1e3,xg=50,Tg=200,Ml=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:NP}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=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>xg&&(s.current.commands=s.current.commands.slice(-xg)),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>Tg&&(s.current.files=s.current.files.slice(-Tg)),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}},Eg=new Ml});import{exec as LP}from"node:child_process";import{promisify as UP}from"node:util";var Ol,HP,xi,Nr,Ig=w(()=>{"use strict";ne();F();Ag();Ol=UP(LP),HP={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},xi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...HP,...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 Ol("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([Ol(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ol(`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 Zo(t),s=0;Ce.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&&Ce.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&&Ce.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,En,Cg=k(()=>{"use strict";rn();Po();kt();ke();F();Me();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)}},En=new vi});var $C,Pg,xg,$l,Tg,Eg=k(()=>{"use strict";ee();se();$C=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:$C}}}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 MC}from"node:child_process";import{promisify as OC}from"node:util";var Ml,FC,Ci,Lr,Ag=k(()=>{"use strict";ee();F();Eg();Ml=OC(MC),FC={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={...FC,...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(`
935
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(`
936
- `)}async getSessionInfo(e){return Eg.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),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(`
937
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(`
938
- `)}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 xi(r,e),"createStalenessChecker")});import jg from"node:fs/promises";import Ti 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 WP(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&&!$g.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function VP(r){return r.split(/\s+/).flatMap(e=>js(e)).filter(e=>e.length>1&&!$g.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Mg(r,e){let t=[],n=await jg.readdir(r,{withFileTypes:!0});for(let s of n){if(zP.has(s.name))continue;let o=Ti.join(r,s.name);if(s.isDirectory())t.push(...await Mg(o,e));else if(s.isFile()){let i=Ti.extname(s.name).toLowerCase();GP.has(i)&&t.push(Ti.relative(e,o))}}return t}async function BP(r){let e=await Mg(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(Ti.join(r,d),"utf-8"),p=WP(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 JP(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function qP(r,e){let t=VP(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=JP(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(Rg+1),m=c+Rg*(1-Dg+Dg*(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 KP(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,Og,t)}function XP(r){let e=L.getDoc(r,Og);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 Fg(r,e){let t=await BP(r);return KP(e,t),t}function _g(r,e,t=15){let n=XP(r);return n?qP(e,n).slice(0,t):[]}var Rg,Dg,GP,$g,zP,Og,Fl=w(()=>{"use strict";ne();Rg=1.2,Dg=.75,GP=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"]),zP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(js,"splitIdentifier");l(WP,"tokenizeFile");l(VP,"tokenizeQuery");l(Mg,"listFiles");l(BP,"buildIndex");l(JP,"idf");l(qP,"score");Og="bm25-index";l(KP,"saveIndex");l(XP,"loadIndex");l(Fg,"indexProject");l(_g,"queryFiles")});import _l from"node:fs/promises";import un from"node:path";function tv(r){let e=[],t,n=new RegExp(ev.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function nv(r,e,t){let n;if(r.startsWith("@/"))n=un.join(t,"src",r.slice(2));else{let s=un.dirname(un.join(t,e));n=un.resolve(s,r)}for(let s of ZP){let o=n+s;try{if((await _l.stat(o)).isFile())return un.relative(t,o)}catch{}}return null}async function Ng(r,e){let t=[],n=await _l.readdir(r,{withFileTypes:!0});for(let s of n){if(QP.has(s.name))continue;let o=un.join(r,s.name);if(s.isDirectory())t.push(...await Ng(o,e));else if(s.isFile()){let i=un.extname(s.name).toLowerCase();YP.has(i)&&t.push(un.relative(e,o))}}return t}async function sv(r){let e=await Ng(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 _l.readFile(un.join(r,u),"utf-8"),m=tv(d),p=[];for(let g of m){let f=await nv(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 rv(r,e){L.setDoc(r,Lg,e)}function Ug(r){return L.getDoc(r,Lg)}async function Hg(r,e){let t=await sv(r);return rv(e,t),t}var YP,QP,ZP,ev,Lg,Nl=w(()=>{"use strict";ne();YP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),QP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),ZP=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ev=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(tv,"extractImportSources");l(nv,"resolveImport");l(Ng,"listFiles");l(sv,"buildGraph");Lg="import-graph";l(rv,"saveGraph");l(Ug,"loadGraph");l(Hg,"indexImports")});function Gg(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Ug(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 zg(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 Wg=w(()=>{"use strict";Nl();l(Gg,"propagateChanges");l(zg,"affectedDomains")});import Ll from"node:fs/promises";import Ei from"node:path";async function Vg(r,e){let t=[],n=await Ll.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(iv.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Ei.join(r,o);if(s.isDirectory())t.push(...await Vg(i,e));else if(s.isFile()){let a=Ei.extname(o).toLowerCase();ov.has(a)&&t.push(Ei.relative(e,i))}}return t}function av(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 cv(r){let e=await Vg(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=Ei.join(r,a),[u,d]=await Promise.all([Ll.readFile(c,"utf-8"),Ll.stat(c)]);return{path:a,hash:av(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 lv(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 Ul(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 uv(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 Hl(r,e){let[t,n]=await Promise.all([cv(r),Promise.resolve(uv(e))]);return{diff:lv(t,n),currentHashes:t}}function Bg(r){return L.hasDoc(r,"file-hashes-meta")}var ov,iv,Jg=w(()=>{"use strict";ne();ov=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),iv=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Vg,"listProjectFiles");l(av,"hashContent");l(cv,"computeHashes");l(lv,"diffHashes");l(Ul,"saveHashes");l(uv,"loadHashes");l(Hl,"detectChanges");l(Bg,"hasHashRegistry")});import{exec as dv}from"node:child_process";import{promisify as pv}from"node:util";async function fv(r,e=100){try{let{stdout:t}=await mv(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
939
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Kg&&n.push(s),s=new Set):i&&s&&hv(i)&&s.add(i)}return s&&s.size>0&&s.size<=Kg&&n.push(s),n}catch{return[]}}function hv(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 yv(r,e=100){let t=await fv(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=wv(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<gv||(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 wv(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Sv(r,e){L.setDoc(r,kv,e)}async function Xg(r,e,t=100){let n=await yv(r,t);return Sv(e,n),n}var mv,gv,qg,Kg,kv,Yg=w(()=>{"use strict";ne();mv=pv(dv),gv=.1,qg=2,Kg=30;l(fv,"parseGitLog");l(hv,"isSourceFile");l(yv,"buildMatrix");l(wv,"pairKey");kv="cochange-index";l(Sv,"saveMatrix");l(Xg,"indexCoChanges")});import $s from"node:fs/promises";import bv from"node:os";import Qg from"node:path";var Gl,Cv,Zg,ef=w(()=>{"use strict";F();Gl=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=bv.homedir(),this.configDir=Qg.join(this.homeDir,".prjct-cli","config"),this.configFile=Qg.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await $s.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await $s.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,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await $s.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||e.editor||"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 $s.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 $s.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await $s.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Cv=new Gl,Zg=Cv});var Wl={};jn(Wl,{installAntigravitySkill:()=>of,installCodexSkill:()=>zl,needsAntigravityInstallation:()=>Av,run:()=>rf,verifyCodexPRouterReady:()=>Ii});import{execSync as Pv}from"node:child_process";import{createHash as vv}from"node:crypto";import V from"node:fs/promises";import ts from"node:os";import ee from"node:path";import de from"chalk";async function xv(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Cs.isAvailable("npm"))return console.log(`${de.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${de.dim(`Install ${r.displayName} using one of:`)}`),console.log(de.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(de.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(de.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(de.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Pv(`npm install -g ${e}`,{stdio:"inherit",timeout:bs("NPM_INSTALL")}),console.log(""),console.log(`${de.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(de.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(de.dim("The npm install took too long. Try:")),console.log(de.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(de.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(de.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(de.dim("Alternative installation methods:")),console.log(de.dim(` \u2022 npm: npm install -g ${e}`)),console.log(de.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(de.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(de.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function rf(){let r=await ar(),e=await fa(),t=ot[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=ot[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await xv(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await xe.detectClaude()){let p=await xe.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await xe.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await xe.installDocs(),await jv(),await on.ensureReady()}}else if(a==="gemini"){await Tv()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await Ev();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await oo()).installed&&(await of()).success&&console.log(` ${de.green("\u2713")} Antigravity skill installed`),(await Mn()).installed){if(!(await zl()).success)throw new Error("Codex skill installation failed");let c=await Ii({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${de.green("\u2713")} Codex skill installed`),console.log(` ${de.green("\u2713")} Codex p. router ready`)}await Zg.saveConfig(Oe,await xe.getInstallPath(),e.provider),await Dv();for(let a of n.providers)$v(a,ot[a.provider]);return n}async function Tv(){try{let r=ee.join(ts.homedir(),".gemini","commands"),e=ee.join(r,"p.toml");await V.mkdir(r,{recursive:!0});let t=le("commands/p.toml");if(t)return await V.writeFile(e,t,"utf-8"),!0;let n=ee.join(ce,"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 Ev(){try{let r=ee.join(ts.homedir(),".gemini"),e=ee.join(r,"GEMINI.md");await V.mkdir(r,{recursive:!0});let t=le("global/GEMINI.md");if(!t){let p=ee.join(ce,"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(P(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}},Lr=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 LC(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 UC(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(NC.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();_C.has(i)&&t.push(Pi.relative(e,o))}}return t}async function HC(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=LC(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 GC(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function zC(r,e){let t=UC(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=GC(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 WC(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,Mg,t)}function VC(r){let e=U.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 HC(r);return WC(e,t),t}function Fg(r,e,t=15){let n=VC(r);return n?zC(e,n).slice(0,t):[]}var Ig,Rg,_C,Dg,NC,Mg,Ol=k(()=>{"use strict";ee();Ig=1.2,Rg=.75,_C=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"]),NC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(js,"splitIdentifier");l(LC,"tokenizeFile");l(UC,"tokenizeQuery");l($g,"listFiles");l(HC,"buildIndex");l(GC,"idf");l(zC,"score");Mg="bm25-index";l(WC,"saveIndex");l(VC,"loadIndex");l(Og,"indexProject");l(Fg,"queryFiles")});import Fl from"node:fs/promises";import ln from"node:path";function XC(r){let e=[],t,n=new RegExp(KC.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function YC(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 qC){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(JC.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();BC.has(i)&&t.push(ln.relative(e,o))}}return t}async function QC(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=XC(d),p=[];for(let g of m){let f=await YC(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 ZC(r,e){U.setDoc(r,Ng,e)}function Lg(r){return U.getDoc(r,Ng)}async function Ug(r,e){let t=await QC(r);return ZC(e,t),t}var BC,JC,qC,KC,Ng,_l=k(()=>{"use strict";ee();BC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),JC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),qC=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],KC=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(XC,"extractImportSources");l(YC,"resolveImport");l(_g,"listFiles");l(QC,"buildGraph");Ng="import-graph";l(ZC,"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=k(()=>{"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(tP.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();eP.has(a)&&t.push(xi.relative(e,i))}}return t}function nP(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 sP(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:nP(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 rP(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=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 oP(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 Ul(r,e){let[t,n]=await Promise.all([sP(r),Promise.resolve(oP(e))]);return{diff:rP(t,n),currentHashes:t}}function Vg(r){return U.hasDoc(r,"file-hashes-meta")}var eP,tP,Bg=k(()=>{"use strict";ee();eP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),tP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Wg,"listProjectFiles");l(nP,"hashContent");l(sP,"computeHashes");l(rP,"diffHashes");l(Ll,"saveHashes");l(oP,"loadHashes");l(Ul,"detectChanges");l(Vg,"hasHashRegistry")});import{exec as iP}from"node:child_process";import{promisify as aP}from"node:util";async function uP(r,e=100){try{let{stdout:t}=await cP(`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&&dP(i)&&s.add(i)}return s&&s.size>0&&s.size<=qg&&n.push(s),n}catch{return[]}}function dP(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 pP(r,e=100){let t=await uP(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=mP(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<lP||(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 mP(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function fP(r,e){U.setDoc(r,gP,e)}async function Kg(r,e,t=100){let n=await pP(r,t);return fP(e,n),n}var cP,lP,Jg,qg,gP,Xg=k(()=>{"use strict";ee();cP=aP(iP),lP=.1,Jg=2,qg=30;l(uP,"parseGitLog");l(dP,"isSourceFile");l(pP,"buildMatrix");l(mP,"pairKey");gP="cochange-index";l(fP,"saveMatrix");l(Kg,"indexCoChanges")});import Ds from"node:fs/promises";import hP from"node:os";import Yg from"node:path";var Hl,yP,Qg,Zg=k(()=>{"use strict";F();Hl=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=hP.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}}},yP=new Hl,Qg=yP});var zl={};Dn(zl,{installAntigravitySkill:()=>rf,installCodexSkill:()=>Gl,needsAntigravityInstallation:()=>CP,run:()=>sf,verifyCodexPRouterReady:()=>Ei});import{execSync as wP}from"node:child_process";import{createHash as kP}from"node:crypto";import B from"node:fs/promises";import ts from"node:os";import Q from"node:path";import le from"chalk";async function SP(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(""),wP(`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 ar(),e=await ga(),t=ot[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=ot[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await SP(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 EP(),await on.ensureReady()}}else if(a==="gemini"){await bP()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await vP();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(Oe,await Te.getInstallPath(),e.provider),await TP();for(let a of n.providers)AP(a,ot[a.provider]);return n}async function bP(){try{let r=Q.join(ts.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 j(n)?(await B.copyFile(n,e),!0):!1}catch(r){return L.warn(`Gemini router warning: ${y(r)}`),!1}}async function vP(){try{let r=Q.join(ts.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(C(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}
940
993
 
941
- ${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 of(){try{let r=ee.join(ts.homedir(),".gemini","antigravity","skills"),e=ee.join(r,"prjct"),t=ee.join(e,"SKILL.md");await V.mkdir(e,{recursive:!0});let n=await R(t),s=le("antigravity/SKILL.md");if(!s){let o=ee.join(ce,"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 Av(){let r=await oo();return r.installed&&!r.skillInstalled}function cf(){return ee.join(ts.homedir(),".codex","skills","prjct","SKILL.md")}function Iv(r){return`<!-- ${af}: ${JSON.stringify({version:Oe,templateHash:r})} -->`}function tf(r){let e=r.match(new RegExp(`<!--\\s*${af}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Rv(r){return vv("sha256").update(r).digest("hex")}async function lf(){let r=le("codex/SKILL.md");if(r)return r;let e=ee.join(ce,"templates","codex","SKILL.md");return await R(e)?V.readFile(e,"utf-8"):null}function uf(r){let e=r.trimEnd(),t=Rv(e),n=Iv(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 rf(){try{let r=Q.join(ts.homedir(),".gemini","antigravity","skills"),e=Q.join(r,"prjct"),t=Q.join(e,"SKILL.md");await B.mkdir(e,{recursive:!0});let n=await j(t),s=ue("antigravity/SKILL.md");if(!s){let o=Q.join(ce,"templates","antigravity","SKILL.md");if(!await j(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 CP(){let r=await so();return r.installed&&!r.skillInstalled}function af(){return Q.join(ts.homedir(),".codex","skills","prjct","SKILL.md")}function PP(r){return`<!-- ${of}: ${JSON.stringify({version:Oe,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 xP(r){return kP("sha256").update(r).digest("hex")}async function cf(){let r=ue("codex/SKILL.md");if(r)return r;let e=Q.join(ce,"templates","codex","SKILL.md");return await j(e)?B.readFile(e,"utf-8"):null}function lf(r){let e=r.trimEnd(),t=xP(e),n=PP(t);return{content:`${e}
942
995
 
943
996
  ${n}
944
- `,templateHash:t}}async function zl(){try{let r=cf(),e=ee.dirname(r);await V.mkdir(e,{recursive:!0});let t=await R(r),n=await lf();if(!n)return U.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=uf(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 Ii(r={}){let e=cf();if(!(await Mn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await lf();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=uf(n),o=l(async()=>r.autoRepair?(await zl()).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=tf(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 V.readFile(e,"utf-8").catch(()=>""),a=tf(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 wc.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=yc(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 Dv(){try{let r=ee.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!==Oe&&(s.cliVersion=Oe,A.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${Oe}`)}catch(r){P(r)||U.warn(`Migration warning: ${y(r)}`)}}async function nf(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 jv(){try{let r=ee.join(ts.homedir(),".claude"),e=ee.join(r,"settings.json"),t=ee.join(r,"prjct-statusline.sh"),n=ee.join(ts.homedir(),".prjct-cli","statusline"),s=ee.join(n,"statusline.sh"),o=ee.join(n,"themes"),i=ee.join(n,"lib"),a=ee.join(n,"components"),c=ee.join(n,"config.json"),u=ee.join(ce,"assets","statusline"),d=ee.join(u,"statusline.sh"),m=ee.join(u,"themes"),p=ee.join(u,"lib"),g=ee.join(u,"components"),f=ee.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]!==Oe){let I=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`);await V.writeFile(s,I,{mode:493})}await Ai(p,i),await Ai(g,a),await sf(t,s),await nf(e,t);return}}if(await R(d)){let k=await V.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`),await V.writeFile(s,k,{mode:493}),await Ai(p,i),await Ai(g,a),await R(m)){let S=await V.readdir(m);for(let I of S){let D=ee.join(m,I),B=ee.join(o,I);await V.copyFile(D,B)}}!await R(c)&&await R(f)&&await V.copyFile(f,c)}else{let k=`#!/bin/bash
997
+ `,templateHash:t}}async function Gl(){try{let r=af(),e=Q.dirname(r);await B.mkdir(e,{recursive:!0});let t=await j(r),n=await cf();if(!n)return L.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=lf(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 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 j(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=ef(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=ef(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 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 TP(){try{let r=Q.join(ts.homedir(),".prjct-cli","projects");if(!await j(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){C(r)||L.warn(`Migration warning: ${y(r)}`)}}async function tf(r,e){let t={};if(await j(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 EP(){try{let r=Q.join(ts.homedir(),".claude"),e=Q.join(r,"settings.json"),t=Q.join(r,"prjct-statusline.sh"),n=Q.join(ts.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 j(r)||await B.mkdir(r,{recursive:!0}),await j(n)||await B.mkdir(n,{recursive:!0}),await j(o)||await B.mkdir(o,{recursive:!0}),await j(i)||await B.mkdir(i,{recursive:!0}),await j(a)||await B.mkdir(a,{recursive:!0}),await j(s)){let w=await B.readFile(s,"utf8");if(w.includes("CLI_VERSION=")){let S=w.match(/CLI_VERSION="([^"]*)"/);if(S&&S[1]!==Oe){let R=w.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`);await B.writeFile(s,R,{mode:493})}await Ti(p,i),await Ti(g,a),await nf(t,s),await tf(e,t);return}}if(await j(d)){let w=await B.readFile(d,"utf8");if(w=w.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`),await B.writeFile(s,w,{mode:493}),await Ti(p,i),await Ti(g,a),await j(m)){let S=await B.readdir(m);for(let R of S){let I=Q.join(m,R),G=Q.join(o,R);await B.copyFile(I,G)}}!await j(c)&&await j(f)&&await B.copyFile(f,c)}else{let w=`#!/bin/bash
945
998
  # prjct Status Line for Claude Code
946
999
  CLI_VERSION="${Oe}"
947
1000
  input=$(cat)
@@ -972,25 +1025,25 @@ if [ -f "$CONFIG" ]; then
972
1025
  fi
973
1026
  fi
974
1027
  echo "prjct"
975
- `;await V.writeFile(s,k,{mode:493})}await sf(t,s),await nf(e,t)}catch(r){P(r)||U.warn(`Status line warning: ${y(r)}`)}}async function Ai(r,e){if(!await R(r))return;let t=await V.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=ee.join(r,n),o=ee.join(e,n);await V.copyFile(s,o),await V.chmod(o,493)}}async function sf(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){P(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function $v(r,e){if(console.log(""),r.cliInstalled?console.log(` ${de.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${de.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(` ${de.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${de.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${de.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${de.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${de.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var af,Mv,Ri=w(()=>{"use strict";Jt();Ss();Go();kc();ne();F();an();Me();vn();$t();Ze();Sn();ef();l(xv,"installAICLI");l(rf,"run");l(Tv,"installGeminiRouter");l(Ev,"installGeminiGlobalConfig");l(of,"installAntigravitySkill");l(Av,"needsAntigravityInstallation");af="prjct-codex-router";l(cf,"getCodexSkillPath");l(Iv,"getCodexSkillMetadata");l(tf,"parseCodexSkillMetadata");l(Rv,"hashContent");l(lf,"loadCodexSkillTemplate");l(uf,"buildCodexSkillContent");l(zl,"installCodexSkill");l(Ii,"verifyCodexPRouterReady");l(Dv,"migrateProjectsCliVersion");l(nf,"ensureStatusLineSettings");l(jv,"installStatusLine");l(Ai,"installStatusLineModules");l(sf,"ensureStatusLineSymlink");l($v,"showResults");Mv=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Mv&&rf().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});function Tt(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 Vl=w(()=>{"use strict";l(Tt,"cite");l(ns,"defaultSources")});function Di(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,w,{mode:493})}await nf(t,s),await tf(e,t)}catch(r){C(r)||L.warn(`Status line warning: ${y(r)}`)}}async function Ti(r,e){if(!await j(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 nf(r,e){try{if(await j(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 j(e)&&(await B.copyFile(e,r),await B.chmod(r,493))}catch(n){C(n)||L.warn(`Symlink fallback warning: ${n.message}`)}}}function AP(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,IP,Ai=k(()=>{"use strict";Jt();ks();Uo();wc();ee();F();vn();Me();xn();$t();Ge();Sn();Zg();l(SP,"installAICLI");l(sf,"run");l(bP,"installGeminiRouter");l(vP,"installGeminiGlobalConfig");l(rf,"installAntigravitySkill");l(CP,"needsAntigravityInstallation");of="prjct-codex-router";l(af,"getCodexSkillPath");l(PP,"getCodexSkillMetadata");l(ef,"parseCodexSkillMetadata");l(xP,"hashContent");l(cf,"loadCodexSkillTemplate");l(lf,"buildCodexSkillContent");l(Gl,"installCodexSkill");l(Ei,"verifyCodexPRouterReady");l(TP,"migrateProjectsCliVersion");l(tf,"ensureStatusLineSettings");l(EP,"installStatusLine");l(Ti,"installStatusLineModules");l(nf,"ensureStatusLineSymlink");l(AP,"showResults");IP=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");IP&&sf().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});function Et(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=k(()=>{"use strict";l(Et,"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(`
976
1029
  `)),t.push("")),r.learnings.resolvedBugs.length>0&&(t.push("### Resolved Bugs"),t.push(r.learnings.resolvedBugs.map(n=>`- ${n.description}`).join(`
977
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(`
978
1031
  `)),t.push(""))),t.join(`
979
- `)}function Lr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
980
- `)}function Ur(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
981
- `)}function Bl(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 Ur(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
1033
+ `)}function Hr(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?`
982
1035
  ### Project Structure
983
1036
 
984
1037
  ${e.join(`
985
1038
  `)}
986
- `:""}function Ov(r){let e=[];return r.patterns?.length>0&&e.push(`
1039
+ `:""}function RP(r){let e=[];return r.patterns?.length>0&&e.push(`
987
1040
  ### Code Patterns (Follow These)
988
1041
 
989
- ${Lr(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
1042
+ ${Ur(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
990
1043
  ### Anti-Patterns (Avoid These)
991
1044
 
992
- ${Ur(r.antiPatterns)}`),e.push(Bl(r)),e.join(`
993
- `)}function Fv(r,e){let t=r.sources||ns();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
1045
+ ${Hr(r.antiPatterns)}`),e.push(Vl(r)),e.join(`
1046
+ `)}function jP(r,e){let t=r.sources||ns();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
994
1047
  # ${r.name} - Project Rules
995
1048
  <!-- projectId: ${r.projectId} -->
996
1049
  <!-- Generated: ${new Date().toISOString()} -->
@@ -998,13 +1051,13 @@ ${Ur(r.antiPatterns)}`),e.push(Bl(r)),e.join(`
998
1051
 
999
1052
  ## THIS PROJECT (${r.ecosystem})
1000
1053
 
1001
- ${Tt(t.ecosystem)}
1054
+ ${Et(t.ecosystem)}
1002
1055
  **Type:** ${r.projectType}
1003
1056
  **Path:** ${r.repoPath}
1004
1057
 
1005
1058
  ### Commands (USE THESE, NOT OTHERS)
1006
1059
 
1007
- ${Tt(t.commands)}
1060
+ ${Et(t.commands)}
1008
1061
  | Action | Command |
1009
1062
  |--------|---------|
1010
1063
  | Install dependencies | \`${r.commands.install}\` |
@@ -1016,11 +1069,11 @@ ${Tt(t.commands)}
1016
1069
 
1017
1070
  ### Code Conventions
1018
1071
 
1019
- ${Tt(t.languages)}
1072
+ ${Et(t.languages)}
1020
1073
  - **Languages**: ${r.languages.join(", ")||"Not detected"}
1021
- ${Tt(t.frameworks)}
1074
+ ${Et(t.frameworks)}
1022
1075
  - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
1023
- ${r.analysis?Ov(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
1076
+ ${r.analysis?RP(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
1024
1077
  ---
1025
1078
 
1026
1079
  ## PRJCT RULES
@@ -1046,7 +1099,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
1046
1099
 
1047
1100
  ## PROJECT STATE
1048
1101
 
1049
- ${Tt(t.name)}
1102
+ ${Et(t.name)}
1050
1103
  | Field | Value |
1051
1104
  |-------|-------|
1052
1105
  | Name | ${r.name} |
@@ -1083,16 +1136,16 @@ ${r.learnings.shippedFeatures.length>0?r.learnings.shippedFeatures.map(n=>`- **$
1083
1136
  `):"_(No shipped features yet)_"}
1084
1137
  `:"> Run `p. sync` to populate learnings from task history"}
1085
1138
  <!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->
1086
- `}function _v(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(Tt(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(Tt(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=Bl(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.push(""),n.push(Di(r,"concise")),n.join(`
1087
- `)}function Nv(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(Tt(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(Tt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push(Di(r,"concise")),n.join(`
1088
- `)}function Lv(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(Tt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(Tt(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(Di(r,"concise")),n.join(`
1089
- `)}function Uv(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(`
1090
- `),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 Hv(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(Bl(r.analysis))):(t.push(""),t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("---"),t.push(""),t.push(Di(r,"full")),t.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
1091
- `)}function df(r){return{claude:Fv,cursor:_v,copilot:Nv,windsurf:Lv,continue:Uv,codex:Hv}[r]||null}var Jl=w(()=>{"use strict";Vl();l(Di,"formatOperationalContext");l(Lr,"formatPatterns");l(Ur,"formatAntiPatterns");l(Bl,"formatStructure");l(Ov,"formatAnalysisForClaude");l(Fv,"formatForClaude");l(_v,"formatForCursor");l(Nv,"formatForCopilot");l(Lv,"formatForWindsurf");l(Uv,"formatForContinue");l(Hv,"formatForCodex");l(df,"getFormatter")});import{exec as Gv}from"node:child_process";import pf from"node:os";import Zt from"node:path";import{promisify as zv}from"node:util";function mf(r){return $i[r]||null}function gf(r){let e=pf.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 ji(r){try{return await Wv(`which ${r}`),!0}catch{return!1}}async function Mi(r=process.cwd()){let e=[];return await ji("claude")&&e.push("claude"),(await ji("cursor")||await R(Zt.join(r,".cursor")))&&e.push("cursor"),await R(Zt.join(r,".github"))&&e.push("copilot"),(await ji("windsurf")||await R(Zt.join(r,".windsurf")))&&e.push("windsurf"),(await R(Zt.join(r,".continue"))||await R(Zt.join(pf.homedir(),".continue")))&&e.push("continue"),(await ji("codex")||await R(Zt.join(r,".agents")))&&e.push("codex"),e}async function ff(r,e=process.cwd()){if(r==="auto"){let t=await Mi(e);return t.length>0?t:["claude"]}return r==="all"?Vv:r.filter(t=>$i[t])}var Wv,$i,Ms,Vv,ql=w(()=>{"use strict";Me();Wv=zv(Gv),$i={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"}},Ms=["claude"],Vv=Object.keys($i);l(mf,"getAIToolConfig");l(gf,"getGlobalConfigPath");l(ji,"commandExists");l(Mi,"detectInstalledTools");l(ff,"resolveToolIds")});import Hr from"node:fs/promises";import Bv from"node:path";function yf(r){let e=r.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function Jv(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=yf(a);c&&e.push({projectId:c,startIndex:o,endIndex:i+n.length,content:a}),s=i+n.length}return e}function qv(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 wf(r,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let n=yf(t);if(n!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${n||"none"}`);await Hr.mkdir(Bv.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 hf(r,t);return}let o=qv(s),i=Jv(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 DP(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(Et(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(Et(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),r.analysis){r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(Ur(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Hr(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 $P(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(Et(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(Ur(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(Hr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(Et(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 MP(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(Et(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(Et(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(Ur(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Hr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.push(""),n.push(Ii(r,"concise")),n.join(`
1142
+ `)}function OP(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 FP(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(Ur(r.analysis.patterns))),r.analysis.antiPatterns?.length>0&&(t.push(""),t.push("### Anti-Patterns (Avoid These)"),t.push(""),t.push(Hr(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:jP,cursor:DP,copilot:$P,windsurf:MP,continue:OP,codex:FP}[r]||null}var Bl=k(()=>{"use strict";Wl();l(Ii,"formatOperationalContext");l(Ur,"formatPatterns");l(Hr,"formatAntiPatterns");l(Vl,"formatStructure");l(RP,"formatAnalysisForClaude");l(jP,"formatForClaude");l(DP,"formatForCursor");l($P,"formatForCopilot");l(MP,"formatForWindsurf");l(OP,"formatForContinue");l(FP,"formatForCodex");l(uf,"getFormatter")});import{exec as _P}from"node:child_process";import df from"node:os";import Zt from"node:path";import{promisify as NP}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 LP(`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 j(Zt.join(r,".cursor")))&&e.push("cursor"),await j(Zt.join(r,".github"))&&e.push("copilot"),(await Ri("windsurf")||await j(Zt.join(r,".windsurf")))&&e.push("windsurf"),(await j(Zt.join(r,".continue"))||await j(Zt.join(df.homedir(),".continue")))&&e.push("continue"),(await Ri("codex")||await j(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"?UP:r.filter(t=>ji[t])}var LP,ji,$s,UP,Jl=k(()=>{"use strict";Me();LP=NP(_P),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"],UP=Object.keys(ji);l(pf,"getAIToolConfig");l(mf,"getGlobalConfigPath");l(Ri,"commandExists");l(Di,"detectInstalledTools");l(gf,"resolveToolIds")});import Gr from"node:fs/promises";import HP from"node:path";function hf(r){let e=r.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function GP(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 zP(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 Gr.mkdir(HP.dirname(r),{recursive:!0});let s="";try{s=await Gr.readFile(r,"utf-8")}catch(d){if(d.code!=="ENOENT")throw d}if(!s.trim()){await ff(r,t);return}let o=zP(s),i=GP(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}
1092
1145
 
1093
1146
  `);for(let d of c)u+=d.content,d!==c[c.length-1]&&(u+=`
1094
1147
 
1095
- `);await hf(r,u)}async function hf(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 kf=w(()=>{"use strict";l(yf,"extractProjectId");l(Jv,"findProjectSections");l(qv,"extractGlobalSection");l(wf,"updateProjectSection");l(hf,"writeFileAtomic")});import Kl from"node:fs/promises";import Xl from"node:path";async function Sf(r,e,t,n=Ms){let s=[];for(let o of n){let i=mf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await Kv(r,i,e,t);s.push(a)}return s}async function Kv(r,e,t,n){let s=df(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=Xl.join(n,e.outputFile);else{let a=gf(e.id);a?i=a:i=Xl.join(t,"context",e.outputFile)}if(await Kl.mkdir(Xl.dirname(i),{recursive:!0}),e.outputPath==="global")await wf(i,r.projectId,o);else{try{let a=await Kl.readFile(i,"utf-8"),c=Ba(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Va(o,a)}catch{}await Kl.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 bf=w(()=>{"use strict";F();Ja();Jl();ql();kf();l(Sf,"generateAIToolContexts");l(Kv,"generateForTool")});var Cf=w(()=>{"use strict";Jl();bf();ql()});async function Pf(r){try{let e=A.getDb(r),t=e.prepare(`
1148
+ `);await ff(r,u)}async function ff(r,e){let t=`${r}.tmp.${Date.now()}`;try{await Gr.writeFile(t,e,"utf-8"),await Gr.rename(t,r)}catch(n){try{await Gr.unlink(t)}catch{}throw n}}var wf=k(()=>{"use strict";l(hf,"extractProjectId");l(GP,"findProjectSections");l(zP,"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 WP(r,i,e,t);s.push(a)}return s}async function WP(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=k(()=>{"use strict";F();Ba();Bl();Jl();wf();l(kf,"generateAIToolContexts");l(WP,"generateForTool")});var bf=k(()=>{"use strict";Bl();Sf();Jl()});async function vf(r){try{let e=A.getDb(r),t=e.prepare(`
1096
1149
  SELECT description, completed_at, branch
1097
1150
  FROM tasks
1098
1151
  WHERE status = 'done' OR status = 'shipped'
@@ -1110,8 +1163,8 @@ ${r.learnings.shippedFeatures.length>0?r.learnings.shippedFeatures.map(n=>`- **$
1110
1163
  FROM shipped_features
1111
1164
  ORDER BY shipped_at DESC
1112
1165
  LIMIT 5
1113
- `).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 vf=w(()=>{"use strict";ne();l(Pf,"extractLearningsFromDB")});import Gr from"node:fs/promises";import zr from"node:path";var Yl,xf,Ql,Tf,Ef=w(()=>{"use strict";F();Yl=".prjct/.prjct-state.md",xf=".prjct-state.md",Ql=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=zr.join(e,Yl);await Gr.mkdir(zr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await Gr.writeFile(n,s,"utf-8");try{let o=zr.join(e,xf);await Gr.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[Yl,xf])try{await Gr.unlink(zr.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=zr.join(e,Yl);try{return await Gr.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(`
1114
- `)}},Tf=new Ql});import Zl from"node:fs/promises";import Xv from"node:os";import Af from"node:path";function eu(){return Af.join(Xv.homedir(),".prjct-cli","skills",Yv)}function Qv(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Wr(){try{let r=await Zl.readFile(eu(),"utf-8");return JSON.parse(r)}catch{return Qv()}}async function tu(r){let e=eu();await Zl.mkdir(Af.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Zl.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function Zv(r){let e=await Wr();e.skills[r.name]=r,await tu(e)}async function ex(r){let e=await Wr();return r in e.skills?(delete e.skills[r],await tu(e),!0):!1}async function tx(r){return(await Wr()).skills[r]||null}async function nx(){return(await Wr()).skills}function sx(){return eu()}var Yv,Vr,If=w(()=>{"use strict";Yv=".skill-lock.json";l(eu,"getLockFilePath");l(Qv,"createEmptyLockFile");l(Wr,"read");l(tu,"write");l(Zv,"addEntry");l(ex,"removeEntry");l(tx,"getEntry");l(nx,"getAll");l(sx,"getPath");Vr={read:Wr,write:tu,addEntry:Zv,removeEntry:ex,getEntry:tx,getAll:nx,getPath:sx}});import{exec as rx}from"node:child_process";import dn from"node:fs/promises";import su from"node:os";import st from"node:path";import{promisify as ox}from"node:util";import{glob as Rf}from"glob";function jf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?st.join(su.homedir(),r.slice(1)):st.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 $f(r){let e=[];try{let s=st.join(r,"SKILL.md");await dn.access(s);let o=st.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Rf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=st.basename(st.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Rf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=st.basename(st.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function ix(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 Cf=k(()=>{"use strict";ee();l(vf,"extractLearningsFromDB")});import $i from"node:fs/promises";import Mi from"node:path";var Xl,Yl,Pf,xf=k(()=>{"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 VP from"node:os";import Tf from"node:path";function Zl(){return Tf.join(VP.homedir(),".prjct-cli","skills",BP)}function JP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function zr(){try{let r=await Ql.readFile(Zl(),"utf-8");return JSON.parse(r)}catch{return JP()}}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 qP(r){let e=await zr();e.skills[r.name]=r,await eu(e)}async function KP(r){let e=await zr();return r in e.skills?(delete e.skills[r],await eu(e),!0):!1}async function XP(r){return(await zr()).skills[r]||null}async function YP(){return(await zr()).skills}function QP(){return Zl()}var BP,Wr,Ef=k(()=>{"use strict";BP=".skill-lock.json";l(Zl,"getLockFilePath");l(JP,"createEmptyLockFile");l(zr,"read");l(eu,"write");l(qP,"addEntry");l(KP,"removeEntry");l(XP,"getEntry");l(YP,"getAll");l(QP,"getPath");Wr={read:zr,write:eu,addEntry:qP,removeEntry:KP,getEntry:XP,getAll:YP,getPath:QP}});import{exec as ZP}from"node:child_process";import un from"node:fs/promises";import nu from"node:os";import rt from"node:path";import{promisify as ex}from"node:util";import{glob as Af}from"glob";function Rf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?rt.join(nu.homedir(),r.slice(1)):rt.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=rt.join(r,"SKILL.md");await un.access(s);let o=rt.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=rt.basename(rt.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=rt.basename(rt.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function tx(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()}
1115
1168
  ${s.join(`
1116
1169
  `)}`;return r.replace(o,`---
1117
1170
  ${c}
@@ -1120,10 +1173,10 @@ ${s.join(`
1120
1173
  `)}
1121
1174
  ---
1122
1175
 
1123
- ${r}`}function ru(){return st.join(su.homedir(),".claude","skills")}async function nu(r,e,t,n){let s=ru(),o=st.join(s,e),i=st.join(o,"SKILL.md"),a=await dn.readFile(r,"utf-8"),c=ix(a,t,n);return await dn.mkdir(o,{recursive:!0}),await dn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function ax(r){let e={installed:[],skipped:[],errors:[]};if(!Cs.isAvailable("git")){let n=Cs.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=st.join(su.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Df(`git clone --depth 1 ${n} ${t}`,{timeout:bs("GIT_CLONE")});let s;try{let{stdout:a}=await Df("git rev-parse HEAD",{cwd:t,timeout:bs("TOOL_CHECK")});s=a.trim()}catch{}let o=await $f(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 nu(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 dn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function cx(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await dn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await dn.stat(t)).isFile()){let s=st.basename(st.dirname(t));try{let o=await nu(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 $f(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 nu(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 lx(r){let e=ru(),t=st.join(e,r);try{await dn.rm(t,{recursive:!0,force:!0})}catch{}let n=st.join(e,`${r}.md`);try{await dn.rm(n,{force:!0})}catch{}return Vr.removeEntry(r)}async function ux(r){let e=jf(r);switch(e.type){case"github":return ax(e);case"local":return cx(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Df,Mf,Of=w(()=>{"use strict";F();an();Go();If();Df=ox(rx);l(jf,"parseSource");l($f,"discoverSkills");l(ix,"injectSourceMetadata");l(ru,"getInstallDir");l(nu,"installSkillFile");l(ax,"installFromGitHub");l(cx,"installFromLocal");l(lx,"remove");l(ux,"install");Mf={install:ux,remove:lx,parseSource:jf,getInstallDir:ru}});import Et from"node:fs/promises";import dx from"node:os";import Ct from"node:path";async function Ff(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await Et.readdir(o);for(let u of c)u.endsWith(".md")&&await Et.unlink(Ct.join(o,u))}catch(c){U.debug("Failed to purge old agents",{path:o,error:Y(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>px(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=>mx(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 _f(r){let e=Ct.join(r,"agents"),t=[];try{let n=await Et.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 Nf(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=le(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Et.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 px(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Et.readFile(n,"utf-8"),t=await Nf(t)}catch(n){U.debug("Workflow agent template not found, generating minimal",{name:r,error:Y(n)}),t=fx(r)}await Et.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function mx(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Et.readFile(i,"utf-8"),o=await Nf(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:Y(i)}),o=hx(r,t,n)}o=gx(o,r,s),await Et.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function gx(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 su(){return rt.join(nu.homedir(),".claude","skills")}async function tu(r,e,t,n){let s=su(),o=rt.join(s,e),i=rt.join(o,"SKILL.md"),a=await un.readFile(r,"utf-8"),c=tx(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 nx(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=rt.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 Wr.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 sx(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=rt.basename(rt.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 Wr.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 Wr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function rx(r){let e=su(),t=rt.join(e,r);try{await un.rm(t,{recursive:!0,force:!0})}catch{}let n=rt.join(e,`${r}.md`);try{await un.rm(n,{force:!0})}catch{}return Wr.removeEntry(r)}async function ox(r){let e=Rf(r);switch(e.type){case"github":return nx(e);case"local":return sx(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var If,Df,$f=k(()=>{"use strict";F();vn();Uo();Ef();If=ex(ZP);l(Rf,"parseSource");l(jf,"discoverSkills");l(tx,"injectSourceMetadata");l(su,"getInstallDir");l(tu,"installSkillFile");l(nx,"installFromGitHub");l(sx,"installFromLocal");l(rx,"remove");l(ox,"install");Df={install:ox,remove:rx,parseSource:Rf,getInstallDir:su}});import At from"node:fs/promises";import ix from"node:os";import Ct from"node:path";async function Mf(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await At.readdir(o);for(let u of c)u.endsWith(".md")&&await At.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=>ax(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=>cx(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=Ct.join(r,"agents"),t=[];try{let n=await At.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=ue(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await At.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 ax(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await At.readFile(n,"utf-8"),t=await Ff(t)}catch(n){L.debug("Workflow agent template not found, generating minimal",{name:r,error:X(n)}),t=ux(r)}await At.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function cx(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await At.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){L.debug("Domain agent template not found, generating minimal",{name:r,error:X(i)}),o=dx(r,t,n)}o=lx(o,r,s),await At.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function lx(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=[`
1124
1177
  ## Recent Learnings (from completed tasks)
1125
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(`
1126
- `)}function fx(r){return`---
1179
+ `)}function ux(r){return`---
1127
1180
  name: ${r}
1128
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"}
1129
1182
  tools: Read, Write, Glob
@@ -1139,7 +1192,7 @@ When invoked:
1139
1192
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
1140
1193
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
1141
1194
  3. Execute requested operation
1142
- `}function hx(r,e,t){return`---
1195
+ `}function dx(r,e,t){return`---
1143
1196
  name: ${r}
1144
1197
  description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
1145
1198
  tools: Read, Write, Glob, Grep
@@ -1159,21 +1212,21 @@ Domain specialist for ${r} tasks.
1159
1212
  ## Your Role
1160
1213
 
1161
1214
  You are the ${r} expert for this project. Apply best practices for the detected stack.
1162
- `}function Lf(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 Et.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{U.debug("Failed to write skills.json",{error:Y(o)})}),n}async function Uf(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Et.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(dx.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 Et.access(m),g=!0}catch{try{await Et.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 Mf.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:Y(f)})}}}catch(t){U.debug("Skill auto-installation failed (non-critical)",{error:Y(t)})}return e}var Hf=w(()=>{"use strict";Jt();rn();oe();vn();Of();l(Ff,"generateAgents");l(_f,"loadExistingAgents");l(Nf,"resolveTemplateIncludes");l(px,"generateWorkflowAgent");l(mx,"generateDomainAgent");l(gx,"injectFeedbackSection");l(fx,"generateMinimalWorkflowAgent");l(hx,"generateMinimalDomainAgent");l(Lf,"configureSkills");l(Uf,"autoInstallSkills")});import Gf from"node:fs/promises";import zf from"node:path";var Oi,Wf=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=zf.join(this.projectPath,"package.json"),t=await Gf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Gf.access(zf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as yx}from"node:child_process";import Vf from"node:fs/promises";import ou from"node:path";import{promisify as wx}from"node:util";async function Bf(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(`
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 At.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 Nf(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await At.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(ix.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 At.access(m),g=!0}catch{try{await At.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),w;f.length===3?w=`${f[0]}/${f[1]}@${f[2]}`:w=c;let S=await Df.install(w);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 Lf=k(()=>{"use strict";Jt();rn();se();xn();$f();l(Mf,"generateAgents");l(Of,"loadExistingAgents");l(Ff,"resolveTemplateIncludes");l(ax,"generateWorkflowAgent");l(cx,"generateDomainAgent");l(lx,"injectFeedbackSection");l(ux,"generateMinimalWorkflowAgent");l(dx,"generateMinimalDomainAgent");l(_f,"configureSkills");l(Nf,"autoInstallSkills")});import Uf from"node:fs/promises";import Hf from"node:path";var Oi,Gf=k(()=>{"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 px}from"node:child_process";import zf from"node:fs/promises";import ru from"node:path";import{promisify as mx}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(`
1163
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(`
1164
- `).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:Y(t)})}return e}async function en(r,e){try{return await Vf.access(ou.join(r,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:Y(t)}),!1}}async function Jf(r){let e={fileCount:0,version:"0.0.0",name:ou.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:Y(t)}),e.fileCount=0}try{let t=ou.join(r,"package.json"),n=JSON.parse(await Vf.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:Y(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 qf(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 Kf(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 Xf(r){return new Oi(r).detect()}var ss,Yf=w(()=>{"use strict";rn();Vl();vn();Wf();ss=wx(yx);l(Bf,"analyzeGit");l(en,"fileExists");l(Jf,"gatherStats");l(qf,"detectCommands");l(Kf,"buildSources");l(Xf,"detectStack")});import{exec as kx}from"node:child_process";import iu from"node:fs/promises";import Fi from"node:path";import{promisify as Sx}from"node:util";var bx,au,cu,Qf,Zf=w(()=>{"use strict";Xt();F();bx=Sx(kx),au={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 iu.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){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=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 iu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await iu.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(!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}}},cu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[au.contextFilesExist(t),au.jsonFilesValid(t),au.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 bx(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}}}},Qf=new cu});import _i from"node:fs/promises";import Ni from"node:path";var Li,En,lu=w(()=>{"use strict";ms();Fl();Wg();Jg();Yg();Nl();rn();Ze();Sn();wt();ke();Ri();vr();Cn();ne();xr();Yo();Zo();xs();Er();Ts();Cf();vf();oe();vn();Qc();Zc();Ss();Ef();fc();Cc();Hf();Yf();Zf();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 Mi(e),a=i.filter(u=>Ms.includes(u)||u==="codex"),c=i.filter(u=>!Ms.includes(u)&&u!=="codex");s=[...a.length>0?a:Ms,...c],s=Array.from(new Set(s))}else t.aiTools[0]==="auto"?(s=await Mi(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await ff("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 Ii({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:Y(O)},error:`Context7 MCP is required but not ready: ${Y(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 Qo(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:Y(O)})}let[c,u,d,m]=await Promise.all([Bf(this.projectPath),Jf(this.projectPath),qf(this.projectPath),Xf(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,S=new Set;if(!p&&Bg(this.projectId))try{let{diff:O,currentHashes:Qh}=await Hl(this.projectPath,this.projectId),_u=O.added.length+O.modified.length+O.deleted.length;if(_u===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let ia=Gg(O,this.projectId);S=zg(ia.allAffected);let Zh=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=ia.allAffected.some(Rn=>{let ey=Rn.substring(Rn.lastIndexOf("."));return Zh.has(ey)}),k=ia.directlyChanged.some(Rn=>Rn==="package.json"||Rn==="tsconfig.json"||Rn.includes("Dockerfile")||Rn.includes("docker-compose")),g={isIncremental:!0,filesChanged:_u,filesUnchanged:O.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(S)}}Ul(this.projectId,Qh)}catch(O){U.debug("Incremental detection failed, falling back to full sync",{error:Y(O)})}else try{let{currentHashes:O}=await Hl(this.projectPath,this.projectId);Ul(this.projectId,O)}catch(O){U.debug("Hash computation failed (non-critical)",{error:Y(O)})}if(f)try{await Promise.all([Fg(this.projectPath,this.projectId),Hg(this.projectPath,this.projectId),Xg(this.projectPath,this.projectId)])}catch(O){U.debug("File ranking index build failed (non-critical)",{error:Y(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 D=k?await Ff(this.globalPath,m,u,I):await _f(this.globalPath),B=Lf(D,this.projectId,this.globalPath),ve=k?await Uf(D):[],$e=Kf(u,d),Be=[],C;try{let O=await Ge.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(C={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let j;try{j=await Pf(this.projectId)}catch{}let Re={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:D.filter(O=>O.type==="workflow").map(O=>O.name),domain:D.filter(O=>O.type==="domain").map(O=>O.name)},sources:$e,analysis:C,learnings:j},nr=await Sf(Re,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 sr=await Ge.getActive(this.projectId),Gt={patterns:sr?.patterns?.length||0,antiPatterns:sr?.antiPatterns?.length||0,criticalAntiPatterns:sr?.antiPatterns?.filter(O=>O.severity==="high").length||0},Xh=Date.now()-n,Yh=await this.recordSyncMetrics(u,Be,D,Xh);await this.archiveStaleData(),await this.autoLearnFromHistory(),await xe.installGlobalConfig(),await xe.syncCommands();let Fu;try{let O=await $.readConfig(this.projectPath);Fu=await Qf.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){U.debug("Verification failed (non-critical)",{error:Y(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:D,skills:B,skillsInstalled:ve,contextFiles:Be,aiTools:nr.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Gt,syncMetrics:Yh,verification:Fu,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:Y(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 Tf.generate(this.projectPath,s)}catch(o){U.debug("Local state generation failed (optional)",{error:Y(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:Y(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:Y(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:Y(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 Fp.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){U.debug("Failed to save draft analysis (non-critical)",{error:Y(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([ut.archiveOldShipped(this.projectId).catch(()=>0),qe.markDormantIdeas(this.projectId).catch(()=>0),fe.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),lt.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:Y(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Fn,n=await Yc.learnFromTaskHistory(this.projectId,e,t);try{let s=await om.getFeatureOutcomes(this.projectId);s.length>0&&await Yc.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:Y(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:Y(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 Cx}from"node:child_process";import Os from"node:path";import{promisify as Px}from"node:util";function th(r){return/^\d+\.\d+\.\d+/.test(r)}function Fs(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,n,s]=e;return`${t}.${n}.${Number(s)+1}`}function vx(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function xx(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 Tx(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var eh,Br,nh=w(()=>{"use strict";Me();eh=Px(Cx),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=Os.join(this.projectPath,"package.json"),t=await zt(e,null);return t?.version?{current:t.version,next:Fs(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Os.join(this.projectPath,"Cargo.toml"),t=await Qe(e,"");if(!t)return null;let n=vx(t);return n?{current:n,next:Fs(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Os.join(this.projectPath,"pyproject.toml"),t=await Qe(e,"");if(!t)return null;let n=xx(t);return n?{current:n,next:Fs(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await sn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Os.join(this.projectPath,e[0]),n=await Qe(t,"");if(!n)return null;let s=Tx(n);return s?{current:s,next:Fs(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Os.join(this.projectPath,e),n=await Qe(t,"");if(!n)return null;let s=n.trim();return th(s)?{current:s,next:Fs(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await eh("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1165
- `);for(let n of t){let s=n.trim().replace(/^v/,"");if(th(s))return{current:s,next:Fs(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Os.join(this.projectPath,"VERSION");return await Wt(e,`0.1.0
1166
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await eh(`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}
1167
- `);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 Qe(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 Qe(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Wt(e,s)}};l(th,"isSemver");l(Fs,"bumpPatch");l(vx,"parseTomlVersion");l(xx,"parsePyprojectVersion");l(Tx,"parseCsprojVersion")});var ln=w(()=>{"use strict";op();gp();fp();yp();bp();Ss();Ap();cc();Dp();fc();jp();kc();Cc();_p();vg();Ig();lu();nh()});var uu,Ex,_s,du=w(()=>{"use strict";oe();ne();uu=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}})}},Ex=new uu,_s=Ex});import sh from"node:fs/promises";import rh from"node:path";async function oh(r,e,t,n){let[s,o,i,a]=await Promise.all([Rx(r,e,n),Dx(r),jx(r),$x(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,Ax).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 Rx(r,e,t){let n=[],s=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=_g(r,s,pu*2);for(let a of o){if(n.length>=pu)break;try{let c=rh.join(e,a.path),u=await sh.readFile(c,"utf-8");u.length>Ui*3?n.push({path:a.path,content:`${u.slice(0,Ui)}
1168
- // ... 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>=pu)break;if(!n.some(c=>c.path===a))try{let c=rh.join(e,a),u=await sh.readFile(c,"utf-8");n.push({path:a,content:u.slice(0,Ui),reason:"entry point"})}catch{}}return n}async function Dx(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 jx(r){try{return(await _.getTaskHistory(r)).slice(0,Ix).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function $x(r){try{let e=_s.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,pu,Ax,Ix,ih=w(()=>{"use strict";Fl();vr();du();Ts();vn();Ui=3e3,pu=15,Ax=15,Ix=10;l(oh,"buildAnalysisPayload");l(Rx,"selectCodeSamples");l(Dx,"getExistingPatterns");l(jx,"getTaskHistory");l($x,"getPreviousAnalysisSummary")});import pn from"chalk";function ah(r){return Math.ceil(r.length/Mx)}function ch(r){let e=r.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){L.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 L.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){L.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){L.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=k(()=>{"use strict";rn();Wl();xn();Gf();ss=mx(px);l(Wf,"analyzeGit");l(en,"fileExists");l(Vf,"gatherStats");l(Bf,"detectCommands");l(Jf,"buildSources");l(qf,"detectStack")});import{exec as gx}from"node:child_process";import ou from"node:fs/promises";import Fi from"node:path";import{promisify as fx}from"node:util";var hx,iu,au,Xf,Yf=k(()=>{"use strict";Xt();F();hx=fx(gx),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(w=>w.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 hx(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,An,cu=k(()=>{"use strict";fr();Ol();zg();Bg();Xg();_l();rn();Ge();Sn();kt();ke();Ai();xr();Cn();ee();Tr();Ko();Yo();Ps();Ar();xs();bf();Cf();se();xn();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(this.globalPath=x.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),(await Mn()).installed){let O=await Ei({autoRepair:!0});O.verified||L.warn(`Codex p. router not ready: ${O.message||"verification failed"}`)}try{o=await on.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 Er(this.projectId);try{let O=await Xo(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([Wf(this.projectPath),Vf(this.projectPath),Bf(this.projectPath),qf(this.projectPath)]),p=t.full===!0,g,f=!0,w=!0,S=new Set;if(!p&&Vg(this.projectId))try{let{diff:O,currentHashes:Jh}=await Ul(this.projectPath,this.projectId),Fu=O.added.length+O.modified.length+O.deleted.length;if(Fu===0&&!t.changedFiles?.length)f=!1,w=!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 qh=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=oa.allAffected.some(jn=>{let Kh=jn.substring(jn.lastIndexOf("."));return qh.has(Kh)}),w=oa.directlyChanged.some(jn=>jn==="package.json"||jn==="tsconfig.json"||jn.includes("Dockerfile")||jn.includes("docker-compose")),g={isIncremental:!0,filesChanged:Fu,filesUnchanged:O.unchanged.length,indexesRebuilt:f,agentsRegenerated:w,affectedDomains:Array.from(S)}}Ll(this.projectId,Jh)}catch(O){L.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){L.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){L.debug("File ranking index build failed (non-critical)",{error:X(O)})}let R;if(w)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(R=O)}catch{}let I=w?await Mf(this.globalPath,m,u,R):await Of(this.globalPath),G=_f(I,this.projectId,this.globalPath),$e=w?await Nf(I):[],lt=Jf(u,d),Be=[],v;try{let O=await He.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 Re={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:I.filter(O=>O.type==="workflow").map(O=>O.name),domain:I.filter(O=>O.type==="domain").map(O=>O.name)},sources:lt,analysis:v,learnings:D},nr=await kf(Re,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 sr=await He.getActive(this.projectId),Gt={patterns:sr?.patterns?.length||0,antiPatterns:sr?.antiPatterns?.length||0,criticalAntiPatterns:sr?.antiPatterns?.filter(O=>O.severity==="high").length||0},Vh=Date.now()-n,Bh=await this.recordSyncMetrics(u,Be,I,Vh);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Te.installGlobalConfig(),await Te.syncCommands();let Ou;try{let O=await $.readConfig(this.projectPath);Ou=await Xf.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:I,skills:G,skillsInstalled:$e,contextFiles:Be,aiTools:nr.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Gt,syncMetrics:Bh,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){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=Ni.join(this.globalPath,m),g=await _i.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=Ni.join(this.globalPath,"agents",`${m.name}.md`),g=await _i.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 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){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 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 He.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([pt.archiveOldShipped(this.projectId).catch(()=>0),qe.markDormantIdeas(this.projectId).catch(()=>0),he.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),dt.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=St.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 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&&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=Ni.join(__dirname,"..","..","package.json");return JSON.parse(await _i.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:[]}}},An=new Li});import{exec as yx}from"node:child_process";import Ms from"node:path";import{promisify as wx}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 kx(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Sx(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 bx(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Qf,Vr,eh=k(()=>{"use strict";Me();Qf=wx(yx),Vr=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 Ze(e,"");if(!t)return null;let n=kx(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 Ze(e,"");if(!t)return null;let n=Sx(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 Ze(t,"");if(!n)return null;let s=bx(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 Ze(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 Ze(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 Ze(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Wt(e,s)}};l(Zf,"isSemver");l(Os,"bumpPatch");l(kx,"parseTomlVersion");l(Sx,"parsePyprojectVersion");l(bx,"parseCsprojVersion")});var cn=k(()=>{"use strict";rp();mp();gp();hp();Sp();ks();Ep();ac();Rp();gc();jp();wc();bc();Fp();Cg();Ag();cu();eh()});var lu,vx,Fs,uu=k(()=>{"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}})}},vx=new lu,Fs=vx});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([xx(r,e,n),Tx(r),Ex(r),Ax(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,Cx).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 xx(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 Tx(r){try{let e=await He.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 Ex(r){try{return(await _.getTaskHistory(r)).slice(0,Px).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Ax(r){try{let e=Fs.getActiveSummary(r);return Promise.resolve(e)}catch(e){return L.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Ui,du,Cx,Px,rh=k(()=>{"use strict";Ol();xr();uu();xs();xn();Ui=3e3,du=15,Cx=15,Px=10;l(sh,"buildAnalysisPayload");l(xx,"selectCodeSamples");l(Tx,"getExistingPatterns");l(Ex,"getTaskHistory");l(Ax,"getPreviousAnalysisSummary")});import dn from"chalk";function oh(r){return Math.ceil(r.length/Ix)}function ih(r){let e=r.split(`
1169
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+=`
1170
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function mu(r){return r.includes("<!-- prjct:preserve")}function lh(r,e){let t=ch(r),n=ch(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:ah(r),tokensAfter:ah(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)mu(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1171
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(mu(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 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(`
1172
1225
  `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
1173
- `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!mu(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1174
- `).length}),s.hasChanges=!0)}return s}function uh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?pn.green:p=>p,o=t?pn.red:p=>p,i=t?pn.yellow:p=>p,a=t?pn.dim:p=>p,c=t?pn.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)&&!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(`
1175
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(`
1176
- `)}function dh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?pn.green:c=>c,o=t?pn.red:c=>c,i=t?pn.cyan:c=>c,a=t?pn.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 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(`
1177
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(`
1178
1231
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1179
1232
  `).length>5&&n.push(a(` ... ${c.before.split(`
@@ -1184,11 +1237,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function mu(r){return r.incl
1184
1237
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1185
1238
  `).length>5&&n.push(a(` ... ${c.before.split(`
1186
1239
  `).length-5} more lines`))}n.push("")}return n.join(`
1187
- `)}var Mx,ph=w(()=>{"use strict";Mx=4;l(ah,"estimateTokens");l(ch,"parseMarkdownSections");l(mu,"isPreservedSection");l(lh,"generateSyncDiff");l(uh,"formatDiffPreview");l(dh,"formatFullDiff")});import Ox from"node:path";async function gu(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 xe.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(`
1188
- `));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 mh(r){try{let e=await lt.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 Jr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function fu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function gh(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 fh(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 | ${So(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 | ${fu(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(`
1189
- `)}function hh(r,e){let t=[];t.push(`# Repository Analysis
1240
+ `)}var Ix,uh=k(()=>{"use strict";Ix=4;l(oh,"estimateTokens");l(ih,"parseMarkdownSections");l(pu,"isPreservedSection");l(ah,"generateSyncDiff");l(ch,"formatDiffPreview");l(lh,"formatFullDiff")});import Rx 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 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 vt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function dh(r){try{let e=await dt.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 Br(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 | ${Br(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: ${Br(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
1242
+ `)}function gh(r,e){let t=[];t.push(`# Repository Analysis
1190
1243
  `),t.push(`Generated: ${new Date().toLocaleString()}
1191
- `);let n=Ox.basename(e);if(t.push(`## Project: ${n}
1244
+ `);let n=Rx.basename(e);if(t.push(`## Project: ${n}
1192
1245
  `),t.push(`## Stack Detected
1193
1246
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
1194
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
@@ -1204,34 +1257,68 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function mu(r){return r.incl
1204
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
1205
1258
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1206
1259
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1207
- `)}var yh=w(()=>{"use strict";Sn();bo();ln();As();zn();nt();l(gu,"showSyncResult");l(mh,"getSessionActivity");l(Jr,"formatTokens");l(fu,"formatDuration");l(gh,"generateSparkline");l(fh,"generateStatsMarkdown");l(hh,"generateAnalysisSummary")});var Pg={};jn(Pg,{AnalysisCommands:()=>os});import hu from"node:fs/promises";import wh from"node:path";import*as rs from"@clack/prompts";var os,Pi=w(()=>{"use strict";ms();Jd();Sn();bo();ln();Tc();ih();ph();vr();ne();du();Yo();F();Es();As();zn();yh();nt();os=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1208
- `),Ve.init(t);let n=await mt.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=hh(s,t),i=await $.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await Xe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:z.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ze(),Pt(ht)).getActiveProvider(),d=await xe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1260
+ `)}var fh=k(()=>{"use strict";Sn();ko();cn();Es();zn();st();l(mu,"showSyncResult");l(dh,"getSessionActivity");l(Br,"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=k(()=>{"use strict";fr();Bd();Sn();ko();cn();xc();rh();uh();xr();ee();uu();Ko();F();Ts();Es();zn();fh();st();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 ft.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 Ye.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:W.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ge(),ut(it)).getActiveProvider(),d=await Te.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1209
1262
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1210
- `),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=wh.join(o,"context","CLAUDE.md"),c=null;try{c=await hu.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 hu.readFile(a,"utf-8")}catch{p=""}let g=lh(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 hu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let D of g.added)S.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)S.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)S.push(`Removed: ${D.name} (${D.lineCount} lines)`);let I=N("## \u26A1 Sync Preview",S.length>0?Z("Changes",Pe(S)):"No section changes.",dt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(I),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let 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(uh(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(`
1211
- ${dh(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"),gu(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 Ge.diff(s);I?.hasChanges&&(f=xc(I))}catch{}let k=ei("sync"),S=N(he("Sync Complete"),dt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Qp("Uncommitted changes detected"):null,ue(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 gu(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&&_s.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 oh(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."}:(_s.save(o,i),n.md?console.log(N(he("LLM Analysis Saved"),dt({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=_s.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",Pe(o.architecture.insights))),o.patterns.length>0&&i.push(Z("Patterns",Pe(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Z("Anti-Patterns",Pe(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Z("Tech Debt",Pe(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Z("Conventions",Pe(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 mh(s),c=await Ue.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: ${Jr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${So(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${fu(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=gh(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=fh(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 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=wh.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}`,dt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Z("Analysis",Pe(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(xc(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(Hp(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(he("Analysis Rolled Back"),dt({"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}}}}});import{exec as Xx}from"node:child_process";import{promisify as Yx}from"node:util";async function Xi(r){if(process.platform!=="darwin")return Ih(r);try{let{stdout:e}=await Qx(`security find-generic-password -s "${Zx}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Ih(r)}}function Ih(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var Qx,Zx,Iu=w(()=>{"use strict";F();Qx=Yx(Xx),Zx="prjct-cli";l(Xi,"getCredential");l(Ih,"getEnvFallback")});import It from"node:fs";import{createServer as QT}from"node:net";ca();Pi();ln();Xt();F();Es();nt();import Fx from"node:path";wt();ke();F();oe();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 Ns=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=Fx.basename(t),a=await _.getCurrentTask(o),c=await fe.getActiveTasks(o),u=await ut.getRecent(o,5),d=await qe.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(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
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(w=>w.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await An.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=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 An.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(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 fu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let I of g.added)S.push(`Added: ${I.name} (${I.lineCount} lines)`);for(let I of g.modified)S.push(`Modified: ${I.name} (${I.lineCount} lines)`);for(let I of g.removed)S.push(`Removed: ${I.name} (${I.lineCount} lines)`);let R=N("## \u26A1 Sync Preview",S.length>0?Y("Changes",Pe(S)):"No section changes.",mt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(R),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let S={added:g.added.map(R=>({name:R.name,lineCount:R.lineCount})),modified:g.modified.map(R=>({name:R.name,lineCount:R.lineCount})),removed:g.removed.map(R=>({name:R.name,lineCount:R.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 w=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(w)||w==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(w==="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 An.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 He.diff(s);I?.hasChanges&&(f=Pc(I))}catch{}let w=`## 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=Qo("sync"),R=N(fe("Sync Complete"),mt({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,w,ie(S.map(I=>({label:I.desc,command:I.cmd}))));return console.log(R),{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 An.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(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 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(fe("LLM Analysis Saved"),mt({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=[fe(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Y("Architecture Insights",Pe(o.architecture.insights))),o.patterns.length>0&&i.push(Y("Patterns",Pe(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Y("Anti-Patterns",Pe(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Y("Tech Debt",Pe(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Y("Conventions",Pe(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 tt.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: ${Br(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} ${Br(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=Lr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await He.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}`,mt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Y("Analysis",Pe(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 He.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 He.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 He.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"),mt({"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 He.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 He.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 zx}from"node:child_process";import{promisify as Wx}from"node:util";async function Ki(r){if(process.platform!=="darwin")return vh(r);try{let{stdout:e}=await Vx(`security find-generic-password -s "${Bx}" -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 Vx,Bx,Iu=k(()=>{"use strict";F();Vx=Wx(zx),Bx="prjct-cli";l(Ki,"getCredential");l(vh,"getEnvFallback")});import Ve from"node:fs";import{createServer as VT}from"node:net";aa();bi();cn();Xt();F();Ts();st();import jx from"node:path";kt();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()}},V=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=jx.basename(t),a=await _.getCurrentTask(o),c=await he.getActiveTasks(o),u=await pt.getRecent(o,5),d=await qe.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(I=>({...JSON.parse(I.data),timestamp:I.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(`
1212
1299
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1213
- `),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(`
1214
- Activity: ${k}
1215
- `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await mt.build(t),p=await Xe.get("Read")(m.paths.roadmap);if(console.log(`
1300
+ `),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 w=this._generateSparkline(g,m);return console.log(`
1301
+ Activity: ${w}
1302
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Ye.get("Read")(m.paths.roadmap);if(console.log(`
1216
1303
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1217
1304
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1218
- `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let S=f.split(`
1219
- `)[0].trim();console.log(` ${k+1}. ${S}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1220
- `),{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})`,Pe(p,!0)),Z("Recent Ships",Pe(g)),Z("Ideas",`${d.length} pending`),ue([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1305
+ `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,w)=>{let S=f.split(`
1306
+ `)[0].trim();console.log(` ${w+1}. ${S}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1307
+ `),{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(w=>{let S=w.priority?` [${w.priority}]`:"";return`${w.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(w=>{let S=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";return`${w.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=N(`## \u26A1 Dashboard: ${i}`,Y("Current Focus",m),Y(`Queue (${c.length})`,Pe(p,!0)),Y("Recent Ships",Pe(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(`
1221
1308
  \u{1F4CA} DASHBOARD - ${i}
1222
- `),console.log("\u2550".repeat(50));let m=Nr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1309
+ `),console.log("\u2550".repeat(50));let m=Lr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1223
1310
  ${g}`),console.log(`
1224
- \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(`
1225
- \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(`
1226
- \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(`
1311
+ \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(`
1312
+ \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,w)=>{let S=f.priority?`[${f.priority}]`:"";console.log(` ${w+1}. ${f.description.slice(0,40)} ${S}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1313
+ \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let w=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${w?`(${w})`:""}`)}),console.log(`
1227
1314
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1228
1315
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1229
- `)}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(`
1316
+ `)}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(`
1230
1317
  PRJCT COMMANDS
1231
- `),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(`
1318
+ `),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(`
1232
1319
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1233
1320
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1234
- `),{success:!0,topic:"overview"}}let n=W.getByName(e);if(n){if(console.log(`
1321
+ `),{success:!0,topic:"overview"}}let n=V.getByName(e);if(n){if(console.log(`
1235
1322
  \u{1F4DA} HELP: /p:${n.name}
1236
1323
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1237
1324
  Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
@@ -1241,7 +1328,7 @@ ${"\u2550".repeat(50)}
1241
1328
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1242
1329
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1243
1330
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1244
- `),{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("")}};yl();wt();ke();Xt();F();import _x from"node:fs/promises";import Nx 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 mi.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=Nx.join(e,"analysis","repo-analysis.json"),n=await _x.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}}},bz=new is;nt();ln();Xt();ne();F();nt();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 yu(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 qe.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 lt.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(yu,"cleanup");ln();F();nt();import kh from"node:path";async function wu(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=kh.join(x.getGlobalProjectPath(i),"planning","designs");await we.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1331
+ `),{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();kt();ke();Xt();F();import Dx from"node:fs/promises";import $x 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=$x.join(e,"analysis","repo-analysis.json"),n=await Dx.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}}},fz=new is;st();cn();Xt();ee();F();st();async function Gi(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(Gi,"cleanupMemory");async function zi(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(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=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 qe.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 zi(e),await dt.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(hu,"cleanup");cn();F();st();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}
1245
1332
 
1246
1333
  *Use templates/design/architecture.md for full design*
1247
1334
  `;break;case"api":c=`# API Design: ${o}
@@ -1256,12 +1343,12 @@ ${"\u2550".repeat(50)}
1256
1343
  `;break;case"flow":c=`# Flow Design: ${o}
1257
1344
 
1258
1345
  *Use templates/design/flow.md for full design*
1259
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=kh.join(a,u);return await we.writeFile(d,c),await lt.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(wu,"design");ln();F();nt();import Ls from"node:path";async function ku(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(`
1346
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=yh.join(a,u);return await we.writeFile(d,c),await dt.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(yu,"design");cn();F();st();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(`
1260
1347
  Found abandoned session:
1261
- `),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(`
1348
+ `),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(`
1262
1349
  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
1263
- `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(ku,"recover");async function Su(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=Ls.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=Ls.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 lt.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(Su,"undo");async function bu(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=Ls.join(x.getGlobalProjectPath(e),"snapshots"),n=Ls.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(`
1264
- `).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 lt.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(bu,"redo");async function Cu(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=Ls.join(x.getGlobalProjectPath(e),"snapshots"),n=Ls.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(`
1350
+ `),{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 dt.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(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(`
1351
+ `).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 dt.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(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(`
1265
1352
  SNAPSHOT HISTORY
1266
1353
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1267
1354
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1269,20 +1356,20 @@ ${"\u2550".repeat(50)}
1269
1356
  `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1270
1357
  `)):(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
1271
1358
  `)),console.log(`${"=".repeat(50)}
1272
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Cu,"history");var Us=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?yu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?wu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ku(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Su(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?bu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Cu(e):t}};import Ae from"chalk";ne();var Pu=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}},Lx=new Pu,Sh=Lx;F();nt();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?Ae.green("\u2713"):Ae.yellow("\u26A0"):r>=e?Ae.green("\u2713"):Ae.yellow("\u26A0")}l(Wi,"statusIcon");var Hs=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 Sh.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1359
+ `),{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 Ae 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){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(w=>Math.round(w/1048576*10)/10,"toMB"),g=a.map(w=>w.value),f=c.map(w=>w.value);o.memory={avgHeapMB:p(g.reduce((w,S)=>w+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((w,S)=>w+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((w,S)=>w+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Mx=new vu,wh=Mx;F();st();var In={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?Ae.green("\u2713"):Ae.yellow("\u26A0"):r>=e?Ae.green("\u2713"):Ae.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(`
1273
1360
  ${Ae.dim("No performance data yet.")}`),console.log(`${Ae.dim("Metrics are collected automatically as you use the CLI.")}
1274
1361
  `),{success:!0,message:"No data"};if(console.log(`
1275
- ${Ae.cyan("Performance Report")} ${Ae.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 ${Ae.bold(`${i.startup.avg}ms`)} ${Ae.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ae.dim(`target: <${An.startup.max}ms`)}`)}if(i.memory){let c=Wi(i.memory.peakHeapMB,An.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: <${An.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Wi(i.contextCorrectness.rate,An.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: ${An.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Wi(i.subtaskHandoff.rate,An.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: ${An.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1276
- ${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)}}}};Ci();Sn();ke();Ss();F();Me();$t();nt();import vu from"node:fs/promises";import Ux from"node:path";import ae from"chalk";var Gs=class extends be{static{l(this,"SetupCommands")}async start(){let e=await xe.checkInstallation(),t=(Ze(),Pt(ht)),n=await t.detectCodex(),s=e.claudeDetected,o=s?await t.getActiveProvider():null,i=s?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1362
+ ${Ae.cyan("Performance Report")} ${Ae.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Wi(i.startup.avg,In.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: <${In.startup.max}ms`)}`)}if(i.memory){let c=Wi(i.memory.peakHeapMB,In.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: <${In.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Wi(i.contextCorrectness.rate,In.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: ${In.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Wi(i.subtaskHandoff.rate,In.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: ${In.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1363
+ ${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)}}}};Si();Sn();ke();ks();F();Me();$t();st();import Cu from"node:fs/promises";import Ox from"node:path";import ae from"chalk";var Hs=class extends be{static{l(this,"SetupCommands")}async start(){let e=await Te.checkInstallation(),t=(Ge(),ut(it)),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}...
1277
1364
  `),!s&&!n.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1278
1365
 
1279
1366
  Please install one first:
1280
1367
  - Claude Code: https://docs.anthropic.com/claude-code
1281
1368
  - Gemini CLI: https://geminicli.com/docs
1282
- - OpenAI Codex: https://github.com/openai/codex`};if(s){console.log("\u{1F4E6} Installing /p:* commands...");let a=await xe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1369
+ - 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(`
1283
1370
  \u2705 Installed ${a.installed?.length??0} commands to:
1284
1371
  ${x.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1285
- \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(()=>(Ri(),Wl));await a();let u=await c({autoRepair:!0});if(!u.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
1372
+ \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.
1286
1373
 
1287
1374
  ${u.message||"router verification failed"}
1288
1375
 
@@ -1297,11 +1384,11 @@ Fix:
1297
1384
  2. Re-run: prjct start`}}return console.log(`
1298
1385
  \u{1F389} Setup complete!`),console.log(`
1299
1386
  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...
1300
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await xe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await xe.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1387
+ `),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(`
1301
1388
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1302
1389
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1303
- \u{1F4DD} Installing global configuration...`);let n=await xe.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(ht)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1304
- \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(()=>(Ri(),Wl));await c();let d=await u({autoRepair:!0});if(!d.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
1390
+ \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=(Ge(),ut(it)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1391
+ \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.
1305
1392
 
1306
1393
  ${d.message||"router verification failed"}
1307
1394
 
@@ -1315,7 +1402,7 @@ Fix:
1315
1402
  1. Ensure Node+npx is installed
1316
1403
  2. Re-run: prjct setup`}}return console.log(`
1317
1404
  \u{1F389} Setup complete!
1318
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=Ux.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1405
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=Ox.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1319
1406
  # prjct Status Line for Claude Code
1320
1407
  # Shows version update notifications and current task
1321
1408
 
@@ -1371,27 +1458,25 @@ fi
1371
1458
 
1372
1459
  # Default: show prjct branding
1373
1460
  echo "\u26A1 prjct"
1374
- `;await vu.writeFile(n,s,{mode:493});let o={};if(await R(t))try{o=JSON.parse(await vu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await vu.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("")}};ms();ln();lu();Xt();F();Es();As();Ir();F();import{exec as zx}from"node:child_process";import{promisify as Wx}from"node:util";import rt from"chalk";ms();F();an();import{exec as Hx}from"node:child_process";import{promisify as Gx}from"node:util";import PW from"chalk";var EW=Gx(Hx),bh=new Map,Ch=new Map;function Ph(r,e){return`workflow:${r}_${e}`}l(Ph,"prefKey");async function vh(r,e){let t={};for(let n of["before","after","skip"]){let s=Ph(n,e),o=Ch.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=bh.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Ue.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(vh,"getWorkflowPreferences");async function xh(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=Ph(o,s),a=Ch.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=bh.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Ue.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(xh,"listWorkflowPreferences");var Vi=Wx(zx);async function Ut(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=Te.getRulesForCommand(r,e).filter(p=>p.position===t),a=await vh(r,e);if(a.skip)return s;let c=a[t],u=i.filter(p=>p.type==="gate");for(let p of u){let g=p.description||p.action;console.log(`
1375
- ${rt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let f=Date.now();await Vi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let k=Date.now()-f,S=k>1e3?`${(k/1e3).toFixed(1)}s`:`${k}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`gate passed (${S})`)}`)}catch(f){return console.log(`${rt.red("\u2717")} gate failed: ${g}`),s.gatesFailed.push(g),s.success=!1,s.output+=`Gate failed: ${g}
1376
- ${y(f)}
1377
- `,s}}let d=i.filter(p=>p.type==="hook");for(let p of d){console.log(`
1378
- ${rt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await Vi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`(${k})`)}`)}catch(g){console.log(`${rt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),s.hooksFailed.push(p.description||p.action),s.output+=`Hook failed: ${p.action}
1461
+ `;await Cu.writeFile(n,s,{mode:493});let o={};if(await j(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(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("")}};fr();cn();cu();Xt();F();Ts();Es();Rr();F();import{exec as Fx}from"node:child_process";import{promisify as _x}from"node:util";import Pt from"chalk";var Pu=_x(Fx);async function Ut(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(n.skipRules)return s;let i=Ce.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(`
1462
+ ${Pt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await Pu(m.action,{timeout:m.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,w=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${Pt.green("\u2713")} ${Pt.dim(`gate passed (${w})`)}`)}catch(g){return console.log(`${Pt.red("\u2717")} gate failed: ${p}`),s.gatesFailed.push(p),s.success=!1,s.output+=`Gate failed: ${p}
1379
1463
  ${y(g)}
1380
- `}}if(c){console.log(`
1381
- ${rt.dim(`[legacy] ${t}-${e}: ${c}`)}`);try{let p=Date.now();await Vi(c,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`(${f})`)}`)}catch(p){console.log(`${rt.yellow("\u26A0")} legacy hook failed: ${c}`),s.hooksFailed.push(c),s.output+=`Legacy hook failed: ${c}
1464
+ `,s}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
1465
+ ${Pt.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(`
1466
+ ${Pt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await Pu(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(`${Pt.green("\u2713")} ${Pt.dim(`(${f})`)}`)}catch(p){console.log(`${Pt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),s.hooksFailed.push(m.description||m.action),s.output+=`Hook failed: ${m.action}
1382
1467
  ${y(p)}
1383
- `}}let m=i.filter(p=>p.type==="step");for(let p of m){console.log(`
1384
- ${rt.dim(`[step] ${e}: ${p.action}`)}`);try{let g=Date.now();await Vi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`step passed (${k})`)}`),s.stepsRun.push(p.description||p.action)}catch(g){return console.log(`${rt.red("\u2717")} step failed: ${p.action}`),s.gatesFailed.push(p.description||p.action),s.success=!1,s.output+=`Step failed: ${p.action}
1385
- ${y(g)}
1386
- `,s}}return s}l(Ut,"executeWorkflowRules");nt();var zs=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 Br(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 ut.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:z.getTimestamp()}),await Ue.learnDecision(o,"commit_footer","prjct","ship"),await Ue.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=ei("ship"),k=N(he(`Shipped: ${i}`,`Version: ${d}`),Z("Results",Pe([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),ue(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 Xe.get("Bash")("git add .");let n=`feat: ${e}
1468
+ `}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
1469
+ ${Pt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await Pu(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(`${Pt.green("\u2713")} ${Pt.dim(`step passed (${f})`)}`),s.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${Pt.red("\u2717")} step failed: ${m.action}`),s.gatesFailed.push(m.description||m.action),s.success=!1,s.output+=`Step failed: ${m.action}
1470
+ ${y(p)}
1471
+ `,s}}return s}l(Ut,"executeWorkflowRules");st();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 Vr(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new br(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 pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:W.getTimestamp()}),await tt.learnDecision(o,"commit_footer","prjct","ship"),await tt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let f=await Ut(o,"ship","after",{projectPath:t,skipRules:n.skipHooks}),w=[...c.instructions,...f.instructions];try{n.md||h.step(4,4,"Updating AI context..."),await An.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=Qo("ship"),R=N(fe(`Shipped: ${i}`,`Version: ${d}`),Y("Results",Pe([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),w.length>0?Y("Agent Instructions",Pe(w)):null,ie(S.map(I=>({label:I.desc,command:I.cmd}))));console.log(R)}else h.done(`v${d} shipped`),vt("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 Ye.get("Bash")("git add .");let n=`feat: ${e}
1387
1472
 
1388
- Generated with [p/](https://www.prjct.app/)`;return await Xe.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 Xe.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)"}}}};wt();ke();Zo();F();zn();nt();import Vx from"node:fs/promises";import Bx from"node:path";import Ws from"chalk";var Vs=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(Ws.dim(`[dry-run] Would update ${o.length} project(s)
1389
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ws.dim("would update")} ${m}`);continue}try{let p=await Tr(d),g=await Qo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ws.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ws.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Ws.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ws.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=Bx.join(x.getGlobalBasePath(),"projects");try{return(await Vx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};ll();ps();Hc();F();qn();nt();import Ie 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 pt.getAll(s);if(i.length===0)return console.log(`
1473
+ Generated with [p/](https://www.prjct.app/)`;return await Ye.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 Ye.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)"}}}};kt();ke();Yo();F();zn();st();import Nx from"node:fs/promises";import Lx 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)
1474
+ `));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 Er(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 w of p.errors)console.log(` ${zs.yellow("\u26A0")} ${w.file}: ${w.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=Lx.join(x.getGlobalBasePath(),"projects");try{return(await Nx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};cl();ps();Uc();F();qn();st();import Ie 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 gt.getAll(s);if(i.length===0)return console.log(`
1390
1475
  ${Ie.dim("No velocity data yet.")}`),console.log(`${Ie.dim("Complete tasks with estimates to build velocity history.")}
1391
- `),{success:!0,message:"No data"};let a=ui(i,o);await Uc.saveMetrics(s,a),console.log(`
1476
+ `),{success:!0,message:"No data"};let a=ci(i,o);await Lc.saveMetrics(s,a),console.log(`
1392
1477
  ${Ie.cyan("Sprint Velocity")} ${Ie.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?Ie.green:m.estimationAccuracy>=60?Ie.yellow:Ie.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ie.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ie.green("\u2191"):a.velocityTrend==="declining"?Ie.red("\u2193"):Ie.dim("\u2192");if(console.log(` Average: ${Ie.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ie.bold(`${a.estimationAccuracy}%`)} ${Ie.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1393
- ${Ie.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ie.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ie.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ie.green("\u2713")} ${m.category} tasks estimated within ${Ie.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Am(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1394
- ${Ie.dim("Projection:")}`),console.log(` Backlog: ${Ie.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ie.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{...wn,...n.velocity}}catch{}return wn}};Rl();Tl();import dT from"node:fs/promises";import pT from"node:path";qn();var Jx=[1,2,3,5,8,13,21],qx={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}},Eh=l(r=>Jx.includes(r),"isValidPoint"),Bi=l(r=>qx[r],"pointsToMinutes"),Th=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"),Ah=l(r=>{let e=Bi(r);return`${Th(e.min)}\u2013${Th(e.max)}`},"pointsToTimeRange");ke();F();import Ji from"node:fs/promises";import Kx from"node:os";import qi from"node:path";var xu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=qi.join(Kx.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Ji.mkdir(this.commandsPath,{recursive:!0});let n=qi.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await Ji.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=qi.join(this.commandsPath,`${e}.md`);return await Ji.unlink(t),{success:!0}}catch(t){return P(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=qi.join(this.commandsPath,`${e}.md`);return await Ji.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
1478
+ ${Ie.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ie.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ie.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ie.green("\u2713")} ${m.category} tasks estimated within ${Ie.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(`
1479
+ ${Ie.dim("Projection:")}`),console.log(` Backlog: ${Ie.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ie.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{...wn,...n.velocity}}catch{}return wn}};Il();xl();import rT from"node:fs/promises";import oT from"node:path";qn();var Ux=[1,2,3,5,8,13,21],Hx={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=>Ux.includes(r),"isValidPoint"),Vi=l(r=>Hx[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 Gx from"node:os";import Ji from"node:path";var xu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ji.join(Gx.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`---
1395
1480
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1396
1481
  ---
1397
1482
 
@@ -1427,35 +1512,35 @@ Suggest relevant actions based on the workflow results:
1427
1512
  - View rules: \`prjct workflow ${e} --md\`
1428
1513
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1429
1514
  - Run again: \`p. ${e}\`
1430
- `}},Tu=new xu;Xo();var Ki=300*1e3,Ye=new _t({ttl:Ki,maxSize:100}),Ht=new _t({ttl:Ki,maxSize:10}),Js=new _t({ttl:Ki,maxSize:5}),qs=new _t({ttl:Ki,maxSize:5});function Eu(){Ye.clear(),Ht.clear(),Js.clear(),qs.clear()}l(Eu,"clearLinearCache");function Au(){return{issues:Ye.stats(),assignedIssues:Ht.stats(),teams:Js.stats(),projects:qs.stats()}}l(Au,"getLinearCacheStats");F();Iu();var eT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},tT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Rh={none:0,urgent:1,high:2,medium:3,low:4},Yi=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 Xi("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?Rh[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=Rh[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:eT[t?.type||"backlog"]||"backlog",priority:tT[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):[]}},gt=new Yi;var Qi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&gt.isConfigured()}async initialize(e){this.initialized||(await gt.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 gt.fetchAssignedIssues(e);Ht.set(t,s);for(let o of s)Ye.set(`issue:${o.id}`,o),Ye.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 gt.fetchTeamIssues(e,t);Ht.set(n,o);for(let i of o)Ye.set(`issue:${i.id}`,i),Ye.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Ye.get(t);if(n)return n;let s=await gt.fetchIssue(e);return s&&(Ye.set(`issue:${s.id}`,s),Ye.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await gt.createIssue(e);return Ye.set(`issue:${t.id}`,t),Ye.set(`issue:${t.externalId}`,t),Ht.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await gt.updateIssue(e,t);return Ye.set(`issue:${n.id}`,n),Ye.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await gt.markInProgress(e),Ye.delete(`issue:${e}`),Ht.clear()}async markDone(e){this.ensureInitialized(),await gt.markDone(e),Ye.delete(`issue:${e}`),Ht.clear()}async addComment(e,t){this.ensureInitialized(),await gt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Js.get("teams");if(e)return e;let t=await gt.getTeams();return Js.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=qs.get("projects");if(e)return e;let t=await gt.getProjects();return qs.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 Qi;Ea();ne();xs();F();var nT=/\b[A-Z]+-\d+\b/,Dh=1800*1e3,Zi=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:Dh,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||Dh;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(nT);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=wd("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}}},sT=new Zi;Dt();Ss();ke();ne();oe();import{exec as rT}from"node:child_process";import{promisify as oT}from"node:util";var jh=oT(rT),Ks="session-snapshot",iT=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,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=iT){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: ${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(`
1431
- `)}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 jh("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await jh("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1432
- `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},In=new Ru;Xt();zc();Ir();ul();F();Es();As();qc();F();Me();Iu();import aT from"node:fs/promises";import cT from"node:os";import lT from"node:path";function uT(r){return lT.join(cT.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(uT,"getCredentialsPath");async function ea(r){let e=uT(r);if(!await R(e))return{};try{return JSON.parse(await aT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(ea,"getProjectCredentials");async function Du(r){let e=await ea(r);return e.linear?.apiKey?e.linear.apiKey:Xi("linear-api-key")}l(Du,"getLinearApiKey");qn();nt();var mT=[{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}],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 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 ea(o),k=await Du(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 vt("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 vt("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,D,B]=await Promise.all([gT(),Ge.getActive(o).catch(()=>null),fT(k),pi(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),ve=null;try{let Gt=In.getSnapshot(o);Gt&&(ve=In.formatContinuityContext(Gt),In.clearSnapshot(o))}catch{}let $e=Jc({description:c,branch:S,linearId:a}),Be=hT(I,D),C=Xp(B.files.map(Gt=>({path:Gt.path,description:Gt.reasons.join(", ")}))),j=yT(D),Re=wT(I),nr=kT(c,B.files,I),sr=ue([{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(ve,$e,nr,Be,C,j,Re,sr)),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 Si.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 xl.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}),Dr("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:Eh,pointsToMinutes:Bi,pointsToTimeRange:Ah,storeEstimate:l(async f=>{let k=Bi(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?vt("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=Jc({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?Kp(u,d):"",p=ue([{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")?vt("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?vt("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 pt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:z.getTimestamp(),estimatedDuration:d?$h(d):"0m",actualDuration:c||"0m",variance:d?bT(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 (${$h(d)}) \u2192 ${S}${k}%`}await _.completeTask(s,t.feedback);try{In.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await ea(s),k=await Du(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}`),dt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),ue([{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}`),Dr("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?vt("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":""}`),Pe(i,!0),ue([{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?vt("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}`),dt({Reason:e||void 0,"Duration worked":a||void 0}),ue([{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})`:""}`),Dr("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?vt("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}`),ue([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Dr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?vt("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 mT){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=ct.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=ct.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=Te.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}\``),ue([{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=ct.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=ct.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=Te.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}\``),ue([{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(!Te.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=Te.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=Te.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 Te.updateRule(t,o,{enabled:!1}),n.md?console.log(N(he("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ue([{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=Te.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 Te.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}"`),Pe(c),ue(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",Pe(["`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)",Pe(['`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;e&&s.includes(e)?o=Te.getRulesForCommand(t,e):o=Te.getAllRules(t);let i=await xh(t);if(o.length===0&&i.length===0)return n.md?console.log(N(Z("Workflow Rules","No rules configured"),ue([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[],legacy:i};if(n.md){let a=e?[e]:s,c=[];for(let p of a){let g=o.filter(f=>f.command===p);g.length!==0&&c.push(ST(p,g))}let u=null;if(i.length>0){let p=i.map(g=>`[legacy] ${g.key} \u2192 \`${g.action}\` (${g.scope})`);u=Z("Legacy Preferences",Pe(p))}let d=e?`Workflow: ${e}`:"Workflow Rules",m=`${o.length} rule${o.length!==1?"s":""}`;console.log(N(Z(d,m),c.length>0?qp(c.join(`
1433
-
1434
- `),""):null,u,ue([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let a=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(a),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let c of o){let u=c.enabled?"":" (disabled)";console.log(` #${c.id} [${c.type}] ${c.position.padEnd(6)} ${c.command.padEnd(5)} \u2192 ${c.action}${u}`)}if(i.length>0){console.log(""),console.log(" Legacy preferences:");for(let c of i)console.log(` [legacy] ${c.key.padEnd(15)} \u2192 ${c.action} (${c.scope})`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o,legacy:i}}async _workflowInit(e,t,n){let s=Te.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 ti(t),i=0,a=[],c=Te.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=Te.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=Te.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`),Pe(a),ue([{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(!ct.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(ct.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(ct.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=ct.createWorkflow(t,{name:i,description:a}),d=await Tu.generateWorkflowTemplate(i,a);if(!d.success){ct.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}`),ue([{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(`
1435
- 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=ct.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(`
1436
- `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Z("Custom Workflows",a.join(`
1437
- `)))}console.log(N(...i,ue([{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(`
1515
+ `}},Tu=new xu;qo();var qi=300*1e3,Qe=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(){Qe.clear(),Ht.clear(),Bs.clear(),Js.clear()}l(Eu,"clearLinearCache");function Au(){return{issues:Qe.stats(),assignedIssues:Ht.stats(),teams:Bs.stats(),projects:Js.stats()}}l(Au,"getLinearCacheStats");F();Iu();var Jx={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},qx={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:Jx[t?.type||"backlog"]||"backlog",priority:qx[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):[]}},ht=new Xi;var Yi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&ht.isConfigured()}async initialize(e){this.initialized||(await ht.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 ht.fetchAssignedIssues(e);Ht.set(t,s);for(let o of s)Qe.set(`issue:${o.id}`,o),Qe.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 ht.fetchTeamIssues(e,t);Ht.set(n,o);for(let i of o)Qe.set(`issue:${i.id}`,i),Qe.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Qe.get(t);if(n)return n;let s=await ht.fetchIssue(e);return s&&(Qe.set(`issue:${s.id}`,s),Qe.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await ht.createIssue(e);return Qe.set(`issue:${t.id}`,t),Qe.set(`issue:${t.externalId}`,t),Ht.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await ht.updateIssue(e,t);return Qe.set(`issue:${n.id}`,n),Qe.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await ht.markInProgress(e),Qe.delete(`issue:${e}`),Ht.clear()}async markDone(e){this.ensureInitialized(),await ht.markDone(e),Qe.delete(`issue:${e}`),Ht.clear()}async addComment(e,t){this.ensureInitialized(),await ht.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Bs.get("teams");if(e)return e;let t=await ht.getTeams();return Bs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Js.get("projects");if(e)return e;let t=await ht.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`.")}},It=new Yi;Ta();ee();Ps();F();var Kx=/\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 It.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 It.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 It.markInProgress(t):n==="done"&&await It.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 he.getTasks(e),o=0;for(let i of s){if(i.completed)continue;let a=i.description.match(Kx);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=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}}},Xx=new Qi;jt();ks();ke();ee();se();import{exec as Yx}from"node:child_process";import{promisify as Qx}from"node:util";var xh=Qx(Yx),qs="session-snapshot",Zx=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=Zx){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(`
1516
+ `)}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(`
1517
+ `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},Rn=new Ru;Xt();Gc();Rr();ll();F();Ts();Es();Jc();F();Me();Iu();import eT from"node:fs/promises";import tT from"node:os";import nT from"node:path";function sT(r){return nT.join(tT.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(sT,"getCredentialsPath");async function Zi(r){let e=sT(r);if(!await j(e))return{};try{return JSON.parse(await eT.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();st();var iT=[{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}],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),w=await ju(o);if(w&&f.linear?.teamId){await It.initializeFromApiKey(w,f.linear.teamId);let S=await It.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await It.markInProgress(e))}}catch{}if(n.md){try{await on.ensureReady()}catch(Gt){return xt("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 xt("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 w=x.getGlobalProjectPath(o),[S,R,I,G]=await Promise.all([aT(),He.getActive(o).catch(()=>null),cT(w),ui(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),$e=null;try{let Gt=Rn.getSnapshot(o);Gt&&($e=Rn.formatContinuityContext(Gt),Rn.clearSnapshot(o))}catch{}let lt=Bc({description:c,branch:S,linearId:a}),Be=lT(R,I),v=Kp(G.files.map(Gt=>({path:Gt.path,description:Gt.reasons.join(", ")}))),D=uT(I),Re=dT(R),nr=pT(c,G.files,R),sr=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,lt,nr,Be,v,D,Re,sr)),await this.logToMemory(t,"task_started",{task:e,timestamp:W.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:ge(),description:c,sessionId:ge(),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}),Dr("working"),vt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:W.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 w=Vi(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:w.typical}),w},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?xt("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=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=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")?xt("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?xt("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=W.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:W.getTimestamp(),estimatedDuration:d?Th(d):"0m",actualDuration:c||"0m",variance:d?gT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,w=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${Th(d)}) \u2192 ${S}${w}%`}await _.completeTask(s,t.feedback);try{Rn.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Zi(s),w=await ju(s);w&&f.linear?.teamId&&(await It.initializeFromApiKey(w,f.linear.teamId),await It.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(N(fe("Completed",`${a}${f}`),mt({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}`),Dr("completed"),vt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:W.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 he.getActiveTasks(s);if(o.length===0)return t.md?xt("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":""}`),Pe(i,!0),ie([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),vt("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?xt("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 Rn.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}`),mt({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})`:""}`),Dr("paused"),vt("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?xt("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)}`),Dr("working"),vt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:W.getTimestamp()}),{success:!0,task:a.description}):(n.md?xt("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 iT){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=Ke.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ke.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=Ce.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=Ke.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ke.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=Ce.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=Ke.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let f=Ke.getAllWorkflows(t).map(S=>S.name).join(", "),w=`Workflow '${o}' not found. Available: ${f}`;return n.md?console.log(`> ${w}`):h.warn(w),{success:!1,error:w}}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=Ce.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(!Ce.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=Ce.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=Ce.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 Ce.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=Ce.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 Ce.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}"`),Pe(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",Pe(["`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)",Pe(['`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=Ce.getRulesForCommand(t,e):o=Ce.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(mT(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?Jp(a.join(`
1518
+
1519
+ `),""):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=Ce.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=Ce.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=Ce.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=Ce.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`),Pe(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(!Ke.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(Ke.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ke.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=Ke.createWorkflow(t,{name:i,description:a}),d=await Tu.generateWorkflowTemplate(i,a);if(!d.success){Ke.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(`
1520
+ 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=Ke.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(`
1521
+ `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Y("Custom Workflows",a.join(`
1522
+ `)))}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(`
1438
1523
  Built-in:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1439
- 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(!ct.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=ct.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)vt("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||""),ue([{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?vt("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`),Pe(s),ue([{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 $h(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($h,"formatMinutesToDuration");async function gT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(gT,"getGitBranch");async function fT(r){try{let e=pT.join(r,"analysis","repo-analysis.json"),t=await dT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(fT,"loadRepoAnalysis");function hT(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=dt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
1524
+ 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(!Ke.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(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=Ke.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)xt("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(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 Rn.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 Rn.listAllSnapshots();if(n.length===0)return t.md?xt("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`),Pe(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 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 aT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(aT,"getGitBranch");async function cT(r){try{let e=oT.join(r,"analysis","repo-analysis.json"),t=await rT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e),null}}l(cT,"loadRepoAnalysis");function lT(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=mt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,w])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${w}\``);m=`### Commands
1440
1525
  ${Pe(g)}`}return[u?`### Project
1441
1526
  ${u}`:null,m].filter(Boolean).join(`
1442
1527
 
1443
- `)||null}l(hT,"buildProjectContext");function yT(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 Yp(e)}l(yT,"buildRules");function wT(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)
1528
+ `)||null}l(lT,"buildProjectContext");function uT(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(uT,"buildRules");function dT(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)
1444
1529
  ${s.join(`
1445
1530
  `)}`)}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)
1446
1531
  ${i.join(`
1447
1532
  `)}`)}return e.length>0?e.join(`
1448
1533
 
1449
- `):null}l(wT,"buildPatterns");function kT(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(`
1450
- `)}l(kT,"buildContextContract");function ST(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(`
1451
- `)}l(ST,"buildFlowDiagram");function bT(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(bT,"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 Xs,this.planning=new es,this.shipping=new zs,this.analytics=new Ns,this.performanceCmds=new Hs,this.maintenance=new Us,this.analysis=new os,this.setupCmds=new Gs,this.updateCmds=new Vs,this.velocityCmds=new Bs,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)}},XB=new as;Pi();var Mh={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}},Oh=[{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"]}];Ci();Sn();ke();F();Me();nt();import{execSync as ta}from"node:child_process";import ft from"node:fs/promises";import CT from"node:os";import mn from"node:path";import PT from"node:readline";import Ce from"chalk";var na="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",qr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function ju(r){let e=0;try{let t=await ft.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name);if(n.isDirectory())e+=await ju(s);else try{let o=await ft.stat(s);e+=o.size}catch{}}}catch{}return e}l(ju,"getDirectorySize");function Fh(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(Fh,"formatSize");async function vT(r){try{return(await ft.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(vT,"countDirectoryItems");function xT(){let r={homebrew:!1,npm:!1};try{ta("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ta("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(xT,"detectInstallation");async function TT(){let r=[],e=Yd(),t=x.getGlobalBasePath(),n=await R(t),s=n?await vT(mn.join(t,"projects")):0,o=n?await ju(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=mn.join(e.claude.config,"CLAUDE.md"),a=await R(i),c=!1;if(a)try{let $e=await ft.readFile(i,"utf-8");c=$e.includes(na)&&$e.includes(qr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await R(u),m=d?await ju(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await R(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=mn.join(e.claude.config,"prjct-statusline.sh"),k=await R(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let S=e.gemini.router,I=await R(S);r.push({path:S,type:"file",description:"Gemini router",exists:I});let D=mn.join(e.gemini.config,"GEMINI.md"),B=await R(D),ve=!1;if(B)try{let $e=await ft.readFile(D,"utf-8");ve=$e.includes(na)&&$e.includes(qr)}catch{}return B&&ve&&r.push({path:D,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(TT,"gatherUninstallItems");async function ET(r){try{let e=await ft.readFile(r,"utf-8");if(!e.includes(na)||!e.includes(qr))return!1;let t=e.indexOf(na),n=e.indexOf(qr)+qr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1452
-
1453
- `).trim(),!s||s.trim().length===0?await ft.unlink(r):await ft.writeFile(r,`${s}
1454
- `,"utf-8"),!0}catch{return!1}}l(ET,"removePrjctSection");async function AT(){let r=CT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=mn.join(r,`.prjct-backup-${e}`);try{await ft.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await R(n)&&await _h(n,mn.join(t,".prjct-cli")),t}catch{return null}}l(AT,"createBackup");async function _h(r,e){await ft.mkdir(e,{recursive:!0});let t=await ft.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name),o=mn.join(e,n.name);n.isDirectory()?await _h(s,o):await ft.copyFile(s,o)}}l(_h,"copyDirectory");async function IT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await ET(o.path)&&n.push(o.path):o.type==="directory"?(await ft.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await ft.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||ta(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||ta("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(IT,"performUninstall");async function RT(r){let e=PT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(RT,"promptConfirmation");async function DT(r={},e=process.cwd()){let t=await TT(),n=xT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(Ce.yellow(`
1455
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ce.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=x.getDisplayPath(c.path),d="";c.type==="section"?d=Ce.dim("(section only)"):c.size&&(d=Ce.dim(`(${Fh(c.size)})`)),console.log(` ${Ce.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ce.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Ce.cyan("Homebrew".padEnd(35))} ${Ce.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Ce.cyan("npm global".padEnd(35))} ${Ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ce.dim(` Total size: ${Fh(o)}`)),console.log("")),r.dryRun)return console.log(Ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(Ce.blue("Creating backup..."));let c=await AT();c?(console.log(Ce.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(Ce.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Ce.yellow('Type "uninstall" to confirm:')),!await RT("> ")))return console.log(Ce.yellow(`
1456
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await IT(t,n,r);if(console.log(""),i.length>0&&console.log(Ce.green(`Removed ${i.length} items`)),a.length>0){console.log(Ce.yellow(`
1457
- ${a.length} errors:`));for(let c of a)console.log(Ce.red(` - ${c}`))}return console.log(""),console.log(Ce.green("prjct has been uninstalled.")),console.log(Ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(DT,"uninstall");var sa=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return DT(e,t)}};var cs=new Xs,ra=new es,jT=new zs,Nh=new Ns,$T=new Hs,Ys=new Us,Qs=new os,Lh=new Gs,MT=new is,OT=new Bs,FT=new sa,_T=new Vs;function NT(){for(let[r,e]of Object.entries(Mh))W.registerCategory(r,e)}l(NT,"registerCategories");function Uh(){if(W.has("work"))return;NT();let r=l(e=>Oh.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",ra,"init",r("init")),W.registerMethod("bug",ra,"bug",r("bug")),W.registerMethod("idea",ra,"idea",r("idea")),W.registerMethod("spec",ra,"spec",r("spec")),W.registerMethod("ship",jT,"ship",r("ship")),W.registerMethod("dash",Nh,"dash",r("dash")),W.registerMethod("help",Nh,"help",r("help")),W.registerMethod("perf",$T,"perf",r("perf")),W.registerMethod("velocity",OT,"velocity",r("velocity")),W.registerMethod("cleanup",Ys,"cleanup",r("cleanup")),W.registerMethod("design",Ys,"design",r("design")),W.registerMethod("recover",Ys,"recover",r("recover")),W.registerMethod("undo",Ys,"undo",r("undo")),W.registerMethod("redo",Ys,"redo",r("redo")),W.registerMethod("history",Ys,"history",r("history")),W.registerMethod("analyze",Qs,"analyze",r("analyze")),W.registerMethod("sync",Qs,"sync",r("sync")),W.registerMethod("stats",Qs,"stats",r("stats")),W.registerMethod("status",Qs,"status",r("status")),W.registerMethod("seal",Qs,"seal",r("seal")),W.registerMethod("verify",Qs,"verify",r("verify")),W.registerMethod("start",Lh,"start",r("start")),W.registerMethod("setup",Lh,"setup",r("setup")),W.registerMethod("uninstall",FT,"uninstall",r("uninstall")),W.registerMethod("update",_T,"update",r("update")),W.registerMethod("context",MT,"context",r("context"))}l(Uh,"registerAllCommands");Uh();wt();wa();$t();import{Hono as KT}from"hono";import{cors as XT}from"hono/cors";import{logger as YT}from"hono/logger";ke();ne();xr();xs();Er();Ts();F();vn();import LT from"node:fs/promises";import UT from"node:path";import{Hono as HT}from"hono";function GT(r){return x.getGlobalProjectPath(r)}l(GT,"getProjectDataPath");function Hh(r,e){let t=new HT,n=GT(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 qe.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 ut.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),fe.read(r),qe.read(r),ut.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=UT.join(n,"context",`${o}.md`),c=await LT.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||U.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Hh,"createRoutes");ke();ne();xr();xs();Er();Ts();import Zs from"node:fs/promises";import zT from"node:path";import{Hono as WT}from"hono";var VT=x.getGlobalBasePath(),er=zT.join(VT,"projects");function oa(r){return A.getDoc(r,"project")}l(oa,"getProjectConfig");async function $u(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($u,"calculateDuration");function Gh(){let r=new WT;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=oa(o),a=await _.read(o),c=await fe.read(o),u=await qe.read(o),d=await ut.read(o),m=a?.currentTask,p=await $u(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(oa(t)),_.read(t),fe.read(t),qe.read(t),ut.read(t)]),c=A.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await $u(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 qe.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 fe.read(c),m=await qe.read(c),p=await ut.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=oa(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=oa(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await $u(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(Gh,"createExtendedRoutes");aa();import{streamSSE as BT}from"hono/streaming";var zh=3600*1e3,JT=300*1e3,qT=3e4;function Wh(){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()>zh&&t(i)},JT),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 BT(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)}},qT),p=setTimeout(()=>{t(a)},zh);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(Wh,"createSSEManager");function Vh(r){let e=new KT,t=Wh();r.enableCors!==!1&&e.use("*",XT({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",YT()),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=Hh(r.projectId,r.projectPath);e.route("/api",n);let s=Gh();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(cr())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: ${cr()?"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(Vh,"createServer");var Bh=3478;var tn={runDir:l(()=>`${process.env.HOME||Dn("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")},Jh=1800*1e3;function Mu(r){return Buffer.from(`${JSON.stringify(r)}
1458
- `)}l(Mu,"encodeMessage");var tr=null,Kr=null,me=null,ze=null;async function qh(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);sE(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),It.unlinkSync(t)}if(It.existsSync(e)&&It.unlinkSync(e),ze={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Jh,idleTimer:null},me=new as,tr=QT(s=>ZT(s)),tr.listen(e,()=>{It.chmodSync(e,384),It.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Kh()}),tr.on("error",s=>{console.error("Daemon socket error:",s.message),Xr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||Bh;Kr=Vh({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Kr.start()}}catch{}if(process.on("SIGTERM",()=>Xr(0)),process.on("SIGINT",()=>Xr(0)),process.on("SIGHUP",()=>{me=new as,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(qh,"startDaemon");function ZT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1459
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await eE(o);r.write(Mu(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Mu(i))}}}),r.on("error",()=>{})}l(ZT,"handleConnection");async function eE(r){if(!ze||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Kh(),ze.commandsServed++,ze.lastActivity=Date.now(),r.command==="daemon")return nE(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 tE(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1534
+ `):null}l(dT,"buildPatterns");function pT(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(`
1535
+ `)}l(pT,"buildContextContract");function mT(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 w=g.map(G=>` ${G.enabled?f:"o"} #${G.id} ${G.action}`),S=[p,...w],I=Math.max(...S.map(G=>G.length))+2;u.push(`+${"-".repeat(I)}+`);for(let G of S)u.push(`| ${G.padEnd(I-1)}|`);u.push(`+${"-".repeat(I)}+`)},"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(`
1536
+ `)}l(mT,"buildFlowDiagram");function gT(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(gT,"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)}},jB=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();Sn();ke();F();Me();st();import{execSync as ea}from"node:child_process";import yt from"node:fs/promises";import fT from"node:os";import pn from"node:path";import hT from"node:readline";import ve from"chalk";var ta="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Jr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Rh(r){let e=0;try{let t=await yt.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 yt.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 yT(r){try{return(await yt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(yT,"countDirectoryItems");function wT(){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(wT,"detectInstallation");async function kT(){let r=[],e=Xd(),t=x.getGlobalBasePath(),n=await j(t),s=n?await yT(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 j(i),c=!1;if(a)try{let I=await yt.readFile(i,"utf-8");c=I.includes(ta)&&I.includes(Jr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await j(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=pn.join(e.claude.config,"prjct-statusline.sh"),p=await j(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,f=await j(g);r.push({path:g,type:"file",description:"Gemini router",exists:f});let w=pn.join(e.gemini.config,"GEMINI.md"),S=await j(w),R=!1;if(S)try{let I=await yt.readFile(w,"utf-8");R=I.includes(ta)&&I.includes(Jr)}catch{}return S&&R&&r.push({path:w,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(kT,"gatherUninstallItems");async function ST(r){try{let e=await yt.readFile(r,"utf-8");if(!e.includes(ta)||!e.includes(Jr))return!1;let t=e.indexOf(ta),n=e.indexOf(Jr)+Jr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1537
+
1538
+ `).trim(),!s||s.trim().length===0?await yt.unlink(r):await yt.writeFile(r,`${s}
1539
+ `,"utf-8"),!0}catch{return!1}}l(ST,"removePrjctSection");async function bT(){let r=fT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=pn.join(r,`.prjct-backup-${e}`);try{await yt.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await j(n)&&await jh(n,pn.join(t,".prjct-cli")),t}catch{return null}}l(bT,"createBackup");async function jh(r,e){await yt.mkdir(e,{recursive:!0});let t=await yt.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 yt.copyFile(s,o)}}l(jh,"copyDirectory");async function vT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await ST(o.path)&&n.push(o.path):o.type==="directory"?(await yt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await yt.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(vT,"performUninstall");async function CT(r){let e=hT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(CT,"promptConfirmation");async function PT(r={},e=process.cwd()){let t=await kT(),n=wT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ve.yellow(`
1540
+ 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 bT();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 CT("> ")))return console.log(ve.yellow(`
1541
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ve.blue("Removing prjct..."));let{deleted:i,errors:a}=await vT(t,n,r);if(console.log(""),i.length>0&&console.log(ve.green(`Removed ${i.length} items`)),a.length>0){console.log(ve.yellow(`
1542
+ ${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(PT,"uninstall");var na=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return PT(e,t)}};var cs=new Ks,sa=new es,xT=new Gs,Dh=new _s,TT=new Us,Xs=new Ls,Ys=new os,$h=new Hs,ET=new is,AT=new Vs,IT=new na,RT=new Ws;function jT(){for(let[r,e]of Object.entries(Eh))V.registerCategory(r,e)}l(jT,"registerCategories");function Mh(){if(V.has("work"))return;jT();let r=l(e=>Ah.find(t=>t.name===e),"getMeta");V.registerMethod("task",cs,"now",r("task")),V.registerMethod("done",cs,"done",r("done")),V.registerMethod("next",cs,"next",r("next")),V.registerMethod("pause",cs,"pause",r("pause")),V.registerMethod("resume",cs,"resume",r("resume")),V.registerMethod("workflow",cs,"workflow",r("workflow")),V.registerMethod("sessions",cs,"sessions",r("sessions")),V.registerMethod("init",sa,"init",r("init")),V.registerMethod("bug",sa,"bug",r("bug")),V.registerMethod("idea",sa,"idea",r("idea")),V.registerMethod("spec",sa,"spec",r("spec")),V.registerMethod("ship",xT,"ship",r("ship")),V.registerMethod("dash",Dh,"dash",r("dash")),V.registerMethod("help",Dh,"help",r("help")),V.registerMethod("perf",TT,"perf",r("perf")),V.registerMethod("velocity",AT,"velocity",r("velocity")),V.registerMethod("cleanup",Xs,"cleanup",r("cleanup")),V.registerMethod("design",Xs,"design",r("design")),V.registerMethod("recover",Xs,"recover",r("recover")),V.registerMethod("undo",Xs,"undo",r("undo")),V.registerMethod("redo",Xs,"redo",r("redo")),V.registerMethod("history",Xs,"history",r("history")),V.registerMethod("analyze",Ys,"analyze",r("analyze")),V.registerMethod("sync",Ys,"sync",r("sync")),V.registerMethod("stats",Ys,"stats",r("stats")),V.registerMethod("status",Ys,"status",r("status")),V.registerMethod("seal",Ys,"seal",r("seal")),V.registerMethod("verify",Ys,"verify",r("verify")),V.registerMethod("start",$h,"start",r("start")),V.registerMethod("setup",$h,"setup",r("setup")),V.registerMethod("uninstall",IT,"uninstall",r("uninstall")),V.registerMethod("update",RT,"update",r("update")),V.registerMethod("context",ET,"context",r("context"))}l(Mh,"registerAllCommands");Mh();kt();ya();$t();import{Hono as GT}from"hono";import{cors as zT}from"hono/cors";import{logger as WT}from"hono/logger";ke();ee();Tr();Ps();Ar();xs();F();xn();import DT from"node:fs/promises";import $T from"node:path";import{Hono as MT}from"hono";function OT(r){return x.getGlobalProjectPath(r)}l(OT,"getProjectDataPath");function Oh(r,e){let t=new MT,n=OT(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 qe.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 pt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),he.read(r),qe.read(r),pt.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=$T.join(n,"context",`${o}.md`),c=await DT.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return C(a)||L.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Oh,"createRoutes");ke();ee();Tr();Ps();Ar();xs();import Qs from"node:fs/promises";import FT from"node:path";import{Hono as _T}from"hono";var NT=x.getGlobalBasePath(),Zs=FT.join(NT,"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 _T;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 he.read(o),u=await qe.read(o),d=await pt.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),he.read(t),qe.read(t),pt.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),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 qe.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 he.read(c),m=await qe.read(c),p=await pt.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 LT}from"hono/streaming";var _h=3600*1e3,UT=300*1e3,HT=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)},UT),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 LT(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)}},HT),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 GT,t=Nh();r.enableCors!==!1&&e.use("*",zT({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",WT()),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=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(cr())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: ${cr()?"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||mn("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)}
1543
+ `)}l($u,"encodeMessage");var er=null,qr=null,me=null,xe=null;async function Gh(r){let e=tn.socket(),t=tn.pid(),n=tn.runDir();if(Ve.mkdirSync(n,{recursive:!0}),Ve.existsSync(t)){let i=parseInt(Ve.readFileSync(t,"utf-8").trim(),10);XT(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ve.unlinkSync(t)}Ve.existsSync(e)&&Ve.unlinkSync(e);let s=YT(),o=null;if(s)try{o=Ve.statSync(s).mtimeMs}catch{}if(xe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Hh,idleTimer:null,entryPath:s,entryMtime:o},me=new as,er=VT(i=>BT(i)),er.listen(e,()=>{Ve.chmodSync(e,384),Ve.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),zh()}),er.on("error",i=>{console.error("Daemon socket error:",i.message),tr(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||Uh;qr=Lh({port:c,projectId:a,projectPath:i,enableLogging:!1}),await qr.start()}}catch{}if(process.on("SIGTERM",()=>tr(0)),process.on("SIGINT",()=>tr(0)),process.on("SIGHUP",()=>{me=new as,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Gh,"startDaemon");function BT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1544
+ `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await JT(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(BT,"handleConnection");async function JT(r){if(!xe||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(zh(),xe.commandsServed++,xe.lastActivity=Date.now(),Wh()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),tr(0)},200)),r.command==="daemon")return KT(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 qT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1460
1545
  `)||o.message||void 0,stderr:t.join(`
1461
- `)||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(eE,"handleRequest");async function tE(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 W.execute(r.command,e,r.cwd)}}l(tE,"executeCommand");function nE(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:ze?Date.now()-ze.startedAt:0,commandsServed:ze?.commandsServed??0,lastActivity:ze?new Date(ze.lastActivity).toISOString():null,registeredCommands:W.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Xr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(nE,"handleDaemonCommand");function Kh(){ze&&(ze.idleTimer&&clearTimeout(ze.idleTimer),ze.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${ze.idleTimeoutMs/1e3/60} minutes, shutting down`),Xr(0)},ze.idleTimeoutMs),ze.idleTimer.unref&&ze.idleTimer.unref())}l(Kh,"resetIdleTimer");function Xr(r){console.log("Daemon shutting down..."),ze?.idleTimer&&clearTimeout(ze.idleTimer),Kr&&(Kr.stop(),Kr=null),tr&&(tr.close(),tr=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(Xr,"shutdown");function sE(r){try{return process.kill(r,0),!0}catch{return!1}}l(sE,"isProcessRunning");var Ou=process.argv.slice(2),rE=parseInt(Ou.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,oE=Ou.includes("--no-http"),iE=Ou.includes("--foreground");qh({port:rE,noHttp:oE,foreground:iE}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1546
+ `)||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(JT,"handleRequest");async function qT(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(qT,"executeCommand");function KT(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:xe?Date.now()-xe.startedAt:0,commandsServed:xe?.commandsServed??0,lastActivity:xe?new Date(xe.lastActivity).toISOString():null,registeredCommands:V.list().length,stale:Wh()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>tr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(KT,"handleDaemonCommand");function zh(){xe&&(xe.idleTimer&&clearTimeout(xe.idleTimer),xe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${xe.idleTimeoutMs/1e3/60} minutes, shutting down`),tr(0)},xe.idleTimeoutMs),xe.idleTimer.unref&&xe.idleTimer.unref())}l(zh,"resetIdleTimer");function tr(r){console.log("Daemon shutting down..."),xe?.idleTimer&&clearTimeout(xe.idleTimer),qr&&(qr.stop(),qr=null),er&&(er.close(),er=null);let e=tn.socket(),t=tn.pid();try{Ve.existsSync(e)&&Ve.unlinkSync(e)}catch{}try{Ve.existsSync(t)&&Ve.unlinkSync(t)}catch{}process.exit(r)}l(tr,"shutdown");function XT(r){try{return process.kill(r,0),!0}catch{return!1}}l(XT,"isProcessRunning");function YT(){let r=mn("node:path"),e=__dirname;for(let s=0;s<5;s++){if(Ve.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ve.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(Ve.existsSync(s))return s;let n=process.argv[1];return n&&Ve.existsSync(n)?n:null}l(YT,"resolveEntryPath");function Wh(){if(!xe?.entryPath||xe.entryMtime===null)return!1;try{return Ve.statSync(xe.entryPath).mtimeMs!==xe.entryMtime}catch{return!1}}l(Wh,"isCodeStale");var Mu=process.argv.slice(2),QT=parseInt(Mu.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,ZT=Mu.includes("--no-http"),eE=Mu.includes("--foreground");Gh({port:QT,noHttp:ZT,foreground:eE}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});