prjct-cli 1.47.0 → 1.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,11 @@ import { dirname as __pathDirname } from 'path';
5
5
  var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
- var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Object.getOwnPropertyNames;var Nh=Object.prototype.hasOwnProperty;var l=(s,e)=>Kr(s,"name",{value:e,configurable:!0}),vt=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});var b=(s,e)=>()=>(s&&(e=s(s=0)),e);var un=(s,e)=>{for(var t in e)Kr(s,t,{get:e[t],enumerable:!0})},Fh=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of _h(e))!Nh.call(s,r)&&r!==t&&Kr(s,r,{get:()=>e[r],enumerable:!(n=Oh(e,r))||n.enumerable});return s};var lt=s=>Fh(Kr({},"__esModule",{value:!0}),s);var z={};un(z,{calculateDuration:()=>Jh,formatDate:()=>ls,formatDuration:()=>Kt,formatMonth:()=>Uh,getDateKey:()=>Hh,getDateRange:()=>Wh,getDaysAgo:()=>dn,getDaysFromNow:()=>Vh,getEndOfDay:()=>Kh,getStartOfDay:()=>qh,getTimestamp:()=>v,getTodayKey:()=>Tu,getYearMonthDay:()=>Vi,isToday:()=>Bh,isWithinLastDays:()=>zh,parseDate:()=>Gh,toRelative:()=>Xh});import{formatDistanceToNowStrict as Lh}from"date-fns";function ls(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0"),n=s.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function Uh(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Tu(){return ls(new Date)}function Hh(s){return ls(s)}function Vi(s){return{year:s.getFullYear().toString(),month:(s.getMonth()+1).toString().padStart(2,"0"),day:s.getDate().toString().padStart(2,"0")}}function Gh(s){return new Date(s)}function v(){return new Date().toISOString()}function dn(s){let e=new Date;return e.setDate(e.getDate()-s),e}function Vh(s){let e=new Date;return e.setDate(e.getDate()+s),e}function Wh(s,e){let t=[],n=new Date(s);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Bh(s){return ls(s)===Tu()}function zh(s,e){let t=dn(e);return s>=t}function Kt(s){let e=Math.floor(s/1e3),t=Math.floor(e/60),n=Math.floor(t/60),r=Math.floor(n/24);return r>0?`${r}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function Jh(s,e=new Date){let t=e.getTime()-s.getTime();return Kt(t)}function qh(s){let e=new Date(s);return e.setHours(0,0,0,0),e}function Kh(s){let e=new Date(s);return e.setHours(23,59,59,999),e}function Xh(s){let e=typeof s=="string"?new Date(s):s;return Lh(e,{addSuffix:!0})}var fe=b(()=>{"use strict";l(ls,"formatDate");l(Uh,"formatMonth");l(Tu,"getTodayKey");l(Hh,"getDateKey");l(Vi,"getYearMonthDay");l(Gh,"parseDate");l(v,"getTimestamp");l(dn,"getDaysAgo");l(Vh,"getDaysFromNow");l(Wh,"getDateRange");l(Bh,"isToday");l(zh,"isWithinLastDays");l(Kt,"formatDuration");l(Jh,"calculateDuration");l(qh,"getStartOfDay");l(Kh,"getEndOfDay");l(Xh,"toRelative")});function Yh(s){return s instanceof Error&&"code"in s}function P(s){return Yh(s)&&s.code==="ENOENT"}function y(s){return s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var U=b(()=>{"use strict";l(Yh,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});import Eu from"node:fs/promises";async function xu(s,e){let t;try{t=await Eu.readFile(s,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Pu(s,t),Cu(s,"Malformed JSON"),null}let r=e.safeParse(n);return r.success?n:(await Pu(s,t),Cu(s,Qh(r.error)),null)}async function Pu(s,e){let t=`${s}.backup`;try{await Eu.writeFile(t,e,"utf-8")}catch{}}function Cu(s,e){console.error(`[prjct] Warning: Corrupted storage file: ${s}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function Qh(s){return s.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Au=b(()=>{"use strict";U();l(xu,"safeRead");l(Pu,"createBackup");l(Cu,"logCorruption");l(Qh,"formatZodError")});var Ee={};un(Ee,{appendLine:()=>Wi,appendToFile:()=>ey,atomicWrite:()=>Zh,copyFile:()=>iy,deleteDir:()=>sy,deleteFile:()=>ny,dirExists:()=>Xr,ensureDir:()=>jt,fileExists:()=>D,getFileExtension:()=>uy,getFileModifiedTime:()=>oy,getFileNameWithoutExtension:()=>dy,getFileSize:()=>ry,listFiles:()=>Xt,moveFile:()=>ay,prependToFile:()=>ty,readFile:()=>et,readJson:()=>Ut,readLines:()=>cy,writeFile:()=>Ht,writeJson:()=>An,writeLines:()=>ly});import ke from"node:fs/promises";import us from"node:path";async function Ut(s,e=null,t){if(t)return await xu(s,t)??e;try{let n=await ke.readFile(s,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function An(s,e,t=2){let n=JSON.stringify(e,null,t);await ke.writeFile(s,n,"utf-8")}async function et(s,e=""){try{return await ke.readFile(s,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Ht(s,e){let t=us.dirname(s);await ke.mkdir(t,{recursive:!0}),await ke.writeFile(s,e,"utf-8")}async function Zh(s,e){let t=us.dirname(s);await ke.mkdir(t,{recursive:!0});let n=`${s}.${Date.now()}.tmp`;await ke.writeFile(n,e,"utf-8"),await ke.rename(n,s)}async function ey(s,e){await ke.appendFile(s,e,"utf-8")}async function Wi(s,e){let t=us.dirname(s);await ke.mkdir(t,{recursive:!0}),await ke.appendFile(s,`${e}
9
- `,"utf-8")}async function ty(s,e){try{let t=await ke.readFile(s,"utf-8");await ke.writeFile(s,e+t,"utf-8")}catch(t){if(P(t))await ke.writeFile(s,e,"utf-8");else throw t}}async function D(s){try{return await ke.access(s),!0}catch(e){if(P(e))return!1;throw e}}async function Xr(s){try{return(await ke.stat(s)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function jt(s){await ke.mkdir(s,{recursive:!0})}async function ny(s){try{return await ke.unlink(s),!0}catch(e){if(P(e))return!1;throw e}}async function sy(s){try{return await ke.rm(s,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function Xt(s,e={}){try{let n=await ke.readdir(s,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(r=>r.isFile())),e.dirsOnly&&(n=n.filter(r=>r.isDirectory())),e.extension&&(n=n.filter(r=>r.name.endsWith(e.extension))),n.map(r=>r.name)}catch(t){if(P(t))return[];throw t}}async function ry(s){return(await ke.stat(s)).size}async function oy(s){return(await ke.stat(s)).mtime}async function iy(s,e){await ke.copyFile(s,e)}async function ay(s,e){await ke.rename(s,e)}async function cy(s){return(await et(s,"")).split(`
10
- `)}async function ly(s,e){let t=e.join(`
11
- `);await Ht(s,t)}function uy(s){return us.extname(s)}function dy(s){return us.basename(s,us.extname(s))}var We=b(()=>{"use strict";Au();U();l(Ut,"readJson");l(An,"writeJson");l(et,"readFile");l(Ht,"writeFile");l(Zh,"atomicWrite");l(ey,"appendToFile");l(Wi,"appendLine");l(ty,"prependToFile");l(D,"fileExists");l(Xr,"dirExists");l(jt,"ensureDir");l(ny,"deleteFile");l(sy,"deleteDir");l(Xt,"listFiles");l(ry,"getFileSize");l(oy,"getFileModifiedTime");l(iy,"copyFile");l(ay,"moveFile");l(cy,"readLines");l(ly,"writeLines");l(uy,"getFileExtension");l(dy,"getFileNameWithoutExtension")});import{z as Gt}from"zod";function Ru(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=n[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var kE,SE,bE,ds,vE,Yr=b(()=>{"use strict";kE=Gt.enum(["opus","sonnet","haiku"]),SE=Gt.enum(["2.5-pro","2.5-flash","2.0-flash"]),bE=Gt.string().min(1),ds=Gt.object({provider:Gt.string(),model:Gt.string(),cliVersion:Gt.string().optional(),recordedAt:Gt.string()}),vE=Gt.object({preferredModel:Gt.string().optional(),lastAnalysisModel:ds.optional()});l(Ru,"compareSemver")});import Bi from"node:fs/promises";import py from"node:os";import Du from"node:path";async function $u(){try{let s=await Bi.readFile(Iu,"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Date.now()-new Date(e.timestamp).getTime()>my?null:e.detection}catch{return null}}async function Mu(s){let e={timestamp:new Date().toISOString(),detection:s};await Bi.mkdir(ju,{recursive:!0}),await Bi.writeFile(Iu,JSON.stringify(e,null,2))}var ju,Iu,my,Ou=b(()=>{"use strict";ju=Du.join(py.homedir(),".prjct-cli","cache"),Iu=Du.join(ju,"providers.json"),my=600*1e3;l($u,"readProviderCache");l(Mu,"writeProviderCache")});var ct={};un(ct,{AntigravityProvider:()=>Ji,ClaudeProvider:()=>Qr,CodexProvider:()=>qi,CursorProvider:()=>Fu,GeminiProvider:()=>zi,Providers:()=>at,WindsurfProvider:()=>Lu,detectAllProviders:()=>nr,detectAntigravity:()=>to,detectCodex:()=>Rn,detectCursorProject:()=>Gu,detectProvider:()=>Zr,detectWindsurfProject:()=>Vu,getActiveProvider:()=>ky,getCapabilities:()=>yy,getCommandsDir:()=>Ey,getGlobalContextPath:()=>Ty,getGlobalSettingsPath:()=>Py,getProjectCommandsPath:()=>xy,getProviderBranding:()=>eo,getSkillsPath:()=>Cy,hasProviderConfig:()=>Sy,needsCursorRouterRegeneration:()=>by,needsWindsurfRouterRegeneration:()=>vy,selectProvider:()=>Ki,validateCliVersion:()=>Hu});import{exec as gy}from"node:child_process";import pn from"node:os";import Ge from"node:path";import{promisify as fy}from"node:util";function yy(s,e){return{...hy[s],...e}}async function Uu(s){try{let{stdout:e}=await _u(`which ${s}`,{timeout:Nu});return e.trim()}catch{return null}}async function wy(s){try{let{stdout:e}=await _u(`${s} --version`,{timeout:Nu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Zr(s){let e=at[s];if(!e.cliCommand)return{installed:!1};let t=await Uu(e.cliCommand);if(!t)return{installed:!1};let n=await wy(e.cliCommand),r=Hu(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function Hu(s,e){let t=at[s];return!t.minCliVersion||!e?null:Ru(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 nr(s=!1){if(!s){let i=await $u();if(i)return i}let[e,t,n]=await Promise.all([Zr("claude"),Zr("gemini"),Rn()]),r={installed:n.installed},o={claude:e,gemini:t,codex:r};return await Mu(o).catch(()=>{}),o}async function ky(s){if(s&&at[s])return at[s];let e=await nr();return e.claude.installed&&!e.gemini.installed?Qr:e.gemini.installed&&!e.claude.installed?zi:Qr}async function Sy(s){let e=at[s];return e.configDir?D(e.configDir):!1}function eo(s){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"}[s]||"\u26A1 prjct"}}async function Gu(s){let e=Ge.join(s,".cursor"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.mdc"),[r,o]=await Promise.all([D(e),D(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function by(s){let e=await Gu(s);return e.detected&&!e.routerInstalled}async function Vu(s){let e=Ge.join(s,".windsurf"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.md"),[r,o]=await Promise.all([D(e),D(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function vy(s){let e=await Vu(s);return e.detected&&!e.routerInstalled}async function to(){let s=Ji.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=Ge.join(s,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([D(s),D(e)]);return{installed:t,skillInstalled:n,configPath:t?s:void 0}}async function Rn(){let s=qi.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Uu("codex"),t=Ge.join(s,"skills","prjct","SKILL.md"),n=await D(t),r=!!e;return{installed:r,skillInstalled:n,configPath:r?s:void 0}}function Ty(s){let e=at[s];return e.configDir?Ge.join(e.configDir,e.contextFile):null}function Py(s){let e=at[s];return!e.configDir||!e.settingsFile?null:Ge.join(e.configDir,e.settingsFile)}function Cy(s){return at[s].skillsDir}function Ey(s){return at[s].commandsDir}function xy(s,e){let t=at[s];return Ge.join(e,t.commandsDir)}async function Ki(){let s=await nr(),e=s.claude.installed,t=s.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:s}:e&&!t?{provider:"claude",userSelected:!1,detection:s}:t&&!e?{provider:"gemini",userSelected:!1,detection:s}:{provider:"claude",userSelected:!0,detection:s}}var _u,Nu,hy,Qr,zi,Ji,Fu,Lu,qi,at,Be=b(()=>{"use strict";Yr();We();Ou();_u=fy(gy),Nu=2e3,hy={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(yy,"getCapabilities");Qr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ge.join(pn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ge.join(pn.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",capabilityTier:"full"},zi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ge.join(pn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ge.join(pn.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",capabilityTier:"standard"},Ji={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ge.join(pn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ge.join(pn.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,capabilityTier:"basic"},Fu={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,capabilityTier:"basic"},Lu={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,capabilityTier:"basic"},qi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ge.join(pn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ge.join(pn.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,capabilityTier:"basic"},at={claude:Qr,gemini:zi,cursor:Fu,antigravity:Ji,windsurf:Lu,codex:qi};l(Uu,"whichCommand");l(wy,"getCliVersion");l(Zr,"detectProvider");l(Hu,"validateCliVersion");l(nr,"detectAllProviders");l(ky,"getActiveProvider");l(Sy,"hasProviderConfig");l(eo,"getProviderBranding");l(Gu,"detectCursorProject");l(by,"needsCursorRouterRegeneration");l(Vu,"detectWindsurfProject");l(vy,"needsWindsurfRouterRegeneration");l(to,"detectAntigravity");l(Rn,"detectCodex");l(Ty,"getGlobalContextPath");l(Py,"getGlobalSettingsPath");l(Cy,"getSkillsPath");l(Ey,"getCommandsDir");l(xy,"getProjectCommandsPath");l(Ki,"selectProvider")});import Ay from"node:crypto";import Vt from"node:fs/promises";import Xi from"node:os";import V from"node:path";import{globSync as Ry}from"glob";var Yi,Dy,A,Se=b(()=>{"use strict";fe();We();Yi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?V.resolve(e):V.join(Xi.homedir(),".prjct-cli"),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=V.resolve(e),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}generateProjectId(e){return Ay.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return V.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return V.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return V.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return V.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Xr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await D(t)}async ensureGlobalStructure(){await jt(this.globalBaseDir),await jt(this.globalProjectsDir),await jt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let r of n)await jt(V.join(t,r));return await jt(V.join(t,"planning","tasks")),await jt(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:r,day:o}=Vi(t);return V.join(this.getGlobalProjectPath(e),"sessions",n,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await jt(n),n}async listSessions(e,t=null,n=null){let r=V.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Vt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=V.join(r,a.name),u=await Vt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=V.join(c,d.name),p=await Vt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:V.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 V.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Vt.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 Xr(t)}getDisplayPath(e){let t=Xi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return V.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return V.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return V.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return V.join(this.globalBaseDir,".running")}getDocsPath(){return V.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),lt(ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),lt(ct)).getActiveProvider();return(Be(),lt(ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(Xi.homedir(),".claude")}getClaudeSettingsPath(){return V.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?V.join(this.getGlobalProjectPath(e),"agents"):V.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return V.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return V.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 r of n){let o=V.join(e,r.file);if(await D(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=V.join(e,"package.json");if(await D(r))try{let o=await Vt.readFile(r,"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=[],r=[];try{if(t==="pnpm"){let i=(await Vt.readFile(V.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
12
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=V.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let c=V.join(e,"lerna.json");if(await D(c)){let u=await Vt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(r=d.packages)}}}else if(t==="nx")r=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=V.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(r=a.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let o of r){if(o.startsWith("!"))continue;let i=Ry(o,{cwd:e,absolute:!1});for(let a of i){let c=V.join(e,a),u=V.join(c,"package.json");if(await D(u))try{let d=await Vt.readFile(u,"utf-8"),m=JSON.parse(d),p=V.join(c,"PRJCT.md");n.push({name:m.name||V.basename(a),path:c,relativePath:a,hasPrjctMd:await D(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=V.resolve(e);for(let r of t.packages){let o=V.resolve(r.path);if(n.startsWith(o))return r}return null}async findMonorepoRoot(e){let t=V.resolve(e),n=V.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=V.dirname(t)}return null}},Dy=new Yi,A=Dy});function Wu(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Qi(){if(Wu()==="bun")return!0;try{let{execSync:s}=vt("node:child_process");return s("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Dn(){return Wu()==="bun"}var sr=b(()=>{"use strict";l(Wu,"detectRuntime");l(Qi,"isBunAvailable");l(Dn,"isBun")});import Zi from"node:fs";import Bu from"node:path";function jy(s){if(Dn()){let{Database:r}=vt("bun:sqlite");return new r(s,{create:!0})}let e=vt("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var Iy,$y,ea,x,N,se=b(()=>{"use strict";Se();sr();l(jy,"openDatabase");Iy=[{version:1,name:"initial-schema",up:l(s=>{s.run(`
8
+ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Object.getOwnPropertyNames;var Nh=Object.prototype.hasOwnProperty;var l=(n,e)=>Kr(n,"name",{value:e,configurable:!0}),vt=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var b=(n,e)=>()=>(n&&(e=n(n=0)),e);var ls=(n,e)=>{for(var t in e)Kr(n,t,{get:e[t],enumerable:!0})},Fh=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of _h(e))!Nh.call(n,r)&&r!==t&&Kr(n,r,{get:()=>e[r],enumerable:!(s=Oh(e,r))||s.enumerable});return n};var lt=n=>Fh(Kr({},"__esModule",{value:!0}),n);var J={};ls(J,{calculateDuration:()=>zh,formatDate:()=>ln,formatDuration:()=>Kt,formatMonth:()=>Uh,getDateKey:()=>Hh,getDateRange:()=>Wh,getDaysAgo:()=>us,getDaysFromNow:()=>Vh,getEndOfDay:()=>Kh,getStartOfDay:()=>qh,getTimestamp:()=>v,getTodayKey:()=>Tu,getYearMonthDay:()=>Vi,isToday:()=>Bh,isWithinLastDays:()=>Jh,parseDate:()=>Gh,toRelative:()=>Xh});import{formatDistanceToNowStrict as Lh}from"date-fns";function ln(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0"),s=n.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function Uh(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Tu(){return ln(new Date)}function Hh(n){return ln(n)}function Vi(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}function Gh(n){return new Date(n)}function v(){return new Date().toISOString()}function us(n){let e=new Date;return e.setDate(e.getDate()-n),e}function Vh(n){let e=new Date;return e.setDate(e.getDate()+n),e}function Wh(n,e){let t=[],s=new Date(n);for(;s<=e;)t.push(new Date(s)),s=new Date(s.getFullYear(),s.getMonth(),s.getDate()+1);return t}function Bh(n){return ln(n)===Tu()}function Jh(n,e){let t=us(e);return n>=t}function Kt(n){let e=Math.floor(n/1e3),t=Math.floor(e/60),s=Math.floor(t/60),r=Math.floor(s/24);return r>0?`${r}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function zh(n,e=new Date){let t=e.getTime()-n.getTime();return Kt(t)}function qh(n){let e=new Date(n);return e.setHours(0,0,0,0),e}function Kh(n){let e=new Date(n);return e.setHours(23,59,59,999),e}function Xh(n){let e=typeof n=="string"?new Date(n):n;return Lh(e,{addSuffix:!0})}var fe=b(()=>{"use strict";l(ln,"formatDate");l(Uh,"formatMonth");l(Tu,"getTodayKey");l(Hh,"getDateKey");l(Vi,"getYearMonthDay");l(Gh,"parseDate");l(v,"getTimestamp");l(us,"getDaysAgo");l(Vh,"getDaysFromNow");l(Wh,"getDateRange");l(Bh,"isToday");l(Jh,"isWithinLastDays");l(Kt,"formatDuration");l(zh,"calculateDuration");l(qh,"getStartOfDay");l(Kh,"getEndOfDay");l(Xh,"toRelative")});function Yh(n){return n instanceof Error&&"code"in n}function C(n){return Yh(n)&&n.code==="ENOENT"}function y(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var U=b(()=>{"use strict";l(Yh,"isNodeError");l(C,"isNotFoundError");l(y,"getErrorMessage")});import Eu from"node:fs/promises";async function xu(n,e){let t;try{t=await Eu.readFile(n,"utf-8")}catch(o){if(C(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Pu(n,t),Cu(n,"Malformed JSON"),null}let r=e.safeParse(s);return r.success?s:(await Pu(n,t),Cu(n,Qh(r.error)),null)}async function Pu(n,e){let t=`${n}.backup`;try{await Eu.writeFile(t,e,"utf-8")}catch{}}function Cu(n,e){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function Qh(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Au=b(()=>{"use strict";U();l(xu,"safeRead");l(Pu,"createBackup");l(Cu,"logCorruption");l(Qh,"formatZodError")});var Ee={};ls(Ee,{appendLine:()=>Wi,appendToFile:()=>ey,atomicWrite:()=>Zh,copyFile:()=>iy,deleteDir:()=>ny,deleteFile:()=>sy,dirExists:()=>Xr,ensureDir:()=>Dt,fileExists:()=>j,getFileExtension:()=>uy,getFileModifiedTime:()=>oy,getFileNameWithoutExtension:()=>dy,getFileSize:()=>ry,listFiles:()=>Xt,moveFile:()=>ay,prependToFile:()=>ty,readFile:()=>et,readJson:()=>Ut,readLines:()=>cy,writeFile:()=>Ht,writeJson:()=>xs,writeLines:()=>ly});import ke from"node:fs/promises";import un from"node:path";async function Ut(n,e=null,t){if(t)return await xu(n,t)??e;try{let s=await ke.readFile(n,"utf-8");return JSON.parse(s)}catch(s){if(C(s))return e;throw s}}async function xs(n,e,t=2){let s=JSON.stringify(e,null,t);await ke.writeFile(n,s,"utf-8")}async function et(n,e=""){try{return await ke.readFile(n,"utf-8")}catch(t){if(C(t))return e;throw t}}async function Ht(n,e){let t=un.dirname(n);await ke.mkdir(t,{recursive:!0}),await ke.writeFile(n,e,"utf-8")}async function Zh(n,e){let t=un.dirname(n);await ke.mkdir(t,{recursive:!0});let s=`${n}.${Date.now()}.tmp`;await ke.writeFile(s,e,"utf-8"),await ke.rename(s,n)}async function ey(n,e){await ke.appendFile(n,e,"utf-8")}async function Wi(n,e){let t=un.dirname(n);await ke.mkdir(t,{recursive:!0}),await ke.appendFile(n,`${e}
9
+ `,"utf-8")}async function ty(n,e){try{let t=await ke.readFile(n,"utf-8");await ke.writeFile(n,e+t,"utf-8")}catch(t){if(C(t))await ke.writeFile(n,e,"utf-8");else throw t}}async function j(n){try{return await ke.access(n),!0}catch(e){if(C(e))return!1;throw e}}async function Xr(n){try{return(await ke.stat(n)).isDirectory()}catch(e){if(C(e))return!1;throw e}}async function Dt(n){await ke.mkdir(n,{recursive:!0})}async function sy(n){try{return await ke.unlink(n),!0}catch(e){if(C(e))return!1;throw e}}async function ny(n){try{return await ke.rm(n,{recursive:!0,force:!0}),!0}catch(e){if(C(e))return!1;throw e}}async function Xt(n,e={}){try{let s=await ke.readdir(n,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(r=>r.isFile())),e.dirsOnly&&(s=s.filter(r=>r.isDirectory())),e.extension&&(s=s.filter(r=>r.name.endsWith(e.extension))),s.map(r=>r.name)}catch(t){if(C(t))return[];throw t}}async function ry(n){return(await ke.stat(n)).size}async function oy(n){return(await ke.stat(n)).mtime}async function iy(n,e){await ke.copyFile(n,e)}async function ay(n,e){await ke.rename(n,e)}async function cy(n){return(await et(n,"")).split(`
10
+ `)}async function ly(n,e){let t=e.join(`
11
+ `);await Ht(n,t)}function uy(n){return un.extname(n)}function dy(n){return un.basename(n,un.extname(n))}var We=b(()=>{"use strict";Au();U();l(Ut,"readJson");l(xs,"writeJson");l(et,"readFile");l(Ht,"writeFile");l(Zh,"atomicWrite");l(ey,"appendToFile");l(Wi,"appendLine");l(ty,"prependToFile");l(j,"fileExists");l(Xr,"dirExists");l(Dt,"ensureDir");l(sy,"deleteFile");l(ny,"deleteDir");l(Xt,"listFiles");l(ry,"getFileSize");l(oy,"getFileModifiedTime");l(iy,"copyFile");l(ay,"moveFile");l(cy,"readLines");l(ly,"writeLines");l(uy,"getFileExtension");l(dy,"getFileNameWithoutExtension")});import{z as Gt}from"zod";function Ru(n,e){let t=n.split(".").map(Number),s=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=s[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var kE,SE,bE,dn,vE,Yr=b(()=>{"use strict";kE=Gt.enum(["opus","sonnet","haiku"]),SE=Gt.enum(["2.5-pro","2.5-flash","2.0-flash"]),bE=Gt.string().min(1),dn=Gt.object({provider:Gt.string(),model:Gt.string(),cliVersion:Gt.string().optional(),recordedAt:Gt.string()}),vE=Gt.object({preferredModel:Gt.string().optional(),lastAnalysisModel:dn.optional()});l(Ru,"compareSemver")});import Bi from"node:fs/promises";import py from"node:os";import ju from"node:path";async function $u(){try{let n=await Bi.readFile(Iu,"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Date.now()-new Date(e.timestamp).getTime()>my?null:e.detection}catch{return null}}async function Mu(n){let e={timestamp:new Date().toISOString(),detection:n};await Bi.mkdir(Du,{recursive:!0}),await Bi.writeFile(Iu,JSON.stringify(e,null,2))}var Du,Iu,my,Ou=b(()=>{"use strict";Du=ju.join(py.homedir(),".prjct-cli","cache"),Iu=ju.join(Du,"providers.json"),my=600*1e3;l($u,"readProviderCache");l(Mu,"writeProviderCache")});var ct={};ls(ct,{AntigravityProvider:()=>zi,ClaudeProvider:()=>Qr,CodexProvider:()=>qi,CursorProvider:()=>Fu,GeminiProvider:()=>Ji,Providers:()=>at,WindsurfProvider:()=>Lu,detectAllProviders:()=>sr,detectAntigravity:()=>to,detectCodex:()=>As,detectCursorProject:()=>Gu,detectProvider:()=>Zr,detectWindsurfProject:()=>Vu,getActiveProvider:()=>ky,getCapabilities:()=>yy,getCommandsDir:()=>Ey,getGlobalContextPath:()=>Ty,getGlobalSettingsPath:()=>Py,getProjectCommandsPath:()=>xy,getProviderBranding:()=>eo,getSkillsPath:()=>Cy,hasProviderConfig:()=>Sy,needsCursorRouterRegeneration:()=>by,needsWindsurfRouterRegeneration:()=>vy,selectProvider:()=>Ki,validateCliVersion:()=>Hu});import{exec as gy}from"node:child_process";import ds from"node:os";import Ge from"node:path";import{promisify as fy}from"node:util";function yy(n,e){return{...hy[n],...e}}async function Uu(n){try{let{stdout:e}=await _u(`which ${n}`,{timeout:Nu});return e.trim()}catch{return null}}async function wy(n){try{let{stdout:e}=await _u(`${n} --version`,{timeout:Nu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Zr(n){let e=at[n];if(!e.cliCommand)return{installed:!1};let t=await Uu(e.cliCommand);if(!t)return{installed:!1};let s=await wy(e.cliCommand),r=Hu(n,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:r||void 0}}function Hu(n,e){let t=at[n];return!t.minCliVersion||!e?null:Ru(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 sr(n=!1){if(!n){let i=await $u();if(i)return i}let[e,t,s]=await Promise.all([Zr("claude"),Zr("gemini"),As()]),r={installed:s.installed},o={claude:e,gemini:t,codex:r};return await Mu(o).catch(()=>{}),o}async function ky(n){if(n&&at[n])return at[n];let e=await sr();return e.claude.installed&&!e.gemini.installed?Qr:e.gemini.installed&&!e.claude.installed?Ji:Qr}async function Sy(n){let e=at[n];return e.configDir?j(e.configDir):!1}function eo(n){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"}[n]||"\u26A1 prjct"}}async function Gu(n){let e=Ge.join(n,".cursor"),t=Ge.join(e,"rules"),s=Ge.join(t,"prjct.mdc"),[r,o]=await Promise.all([j(e),j(s)]);return{detected:r,routerInstalled:o,projectRoot:r?n:void 0}}async function by(n){let e=await Gu(n);return e.detected&&!e.routerInstalled}async function Vu(n){let e=Ge.join(n,".windsurf"),t=Ge.join(e,"rules"),s=Ge.join(t,"prjct.md"),[r,o]=await Promise.all([j(e),j(s)]);return{detected:r,routerInstalled:o,projectRoot:r?n:void 0}}async function vy(n){let e=await Vu(n);return e.detected&&!e.routerInstalled}async function to(){let n=zi.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=Ge.join(n,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([j(n),j(e)]);return{installed:t,skillInstalled:s,configPath:t?n:void 0}}async function As(){let n=qi.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await Uu("codex"),t=Ge.join(n,"skills","prjct","SKILL.md"),s=await j(t),r=!!e;return{installed:r,skillInstalled:s,configPath:r?n:void 0}}function Ty(n){let e=at[n];return e.configDir?Ge.join(e.configDir,e.contextFile):null}function Py(n){let e=at[n];return!e.configDir||!e.settingsFile?null:Ge.join(e.configDir,e.settingsFile)}function Cy(n){return at[n].skillsDir}function Ey(n){return at[n].commandsDir}function xy(n,e){let t=at[n];return Ge.join(e,t.commandsDir)}async function Ki(){let n=await sr(),e=n.claude.installed,t=n.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var _u,Nu,hy,Qr,Ji,zi,Fu,Lu,qi,at,Be=b(()=>{"use strict";Yr();We();Ou();_u=fy(gy),Nu=2e3,hy={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(yy,"getCapabilities");Qr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ge.join(ds.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ge.join(ds.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",capabilityTier:"full"},Ji={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ge.join(ds.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ge.join(ds.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",capabilityTier:"standard"},zi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ge.join(ds.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ge.join(ds.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,capabilityTier:"basic"},Fu={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,capabilityTier:"basic"},Lu={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,capabilityTier:"basic"},qi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ge.join(ds.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ge.join(ds.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,capabilityTier:"basic"},at={claude:Qr,gemini:Ji,cursor:Fu,antigravity:zi,windsurf:Lu,codex:qi};l(Uu,"whichCommand");l(wy,"getCliVersion");l(Zr,"detectProvider");l(Hu,"validateCliVersion");l(sr,"detectAllProviders");l(ky,"getActiveProvider");l(Sy,"hasProviderConfig");l(eo,"getProviderBranding");l(Gu,"detectCursorProject");l(by,"needsCursorRouterRegeneration");l(Vu,"detectWindsurfProject");l(vy,"needsWindsurfRouterRegeneration");l(to,"detectAntigravity");l(As,"detectCodex");l(Ty,"getGlobalContextPath");l(Py,"getGlobalSettingsPath");l(Cy,"getSkillsPath");l(Ey,"getCommandsDir");l(xy,"getProjectCommandsPath");l(Ki,"selectProvider")});import Ay from"node:crypto";import Vt from"node:fs/promises";import Xi from"node:os";import V from"node:path";import{globSync as Ry}from"glob";var Yi,jy,A,Se=b(()=>{"use strict";fe();We();Yi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?V.resolve(e):V.join(Xi.homedir(),".prjct-cli"),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=V.resolve(e),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}generateProjectId(e){return Ay.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return V.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return V.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return V.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return V.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Xr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await j(t)}async ensureGlobalStructure(){await Dt(this.globalBaseDir),await Dt(this.globalProjectsDir),await Dt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory","agents"];for(let r of s)await Dt(V.join(t,r));return await Dt(V.join(t,"planning","tasks")),await Dt(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:r,day:o}=Vi(t);return V.join(this.getGlobalProjectPath(e),"sessions",s,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await Dt(s),s}async listSessions(e,t=null,s=null){let r=V.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Vt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=V.join(r,a.name),u=await Vt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let m=V.join(c,d.name),p=await Vt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:V.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,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return V.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Vt.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 Xr(t)}getDisplayPath(e){let t=Xi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return V.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return V.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return V.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return V.join(this.globalBaseDir,".running")}getDocsPath(){return V.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),lt(ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),lt(ct)).getActiveProvider();return(Be(),lt(ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(Xi.homedir(),".claude")}getClaudeSettingsPath(){return V.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?V.join(this.getGlobalProjectPath(e),"agents"):V.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return V.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return V.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{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 r of s){let o=V.join(e,r.file);if(await j(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=V.join(e,"package.json");if(await j(r))try{let o=await Vt.readFile(r,"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 s=[],r=[];try{if(t==="pnpm"){let i=(await Vt.readFile(V.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
12
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=V.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let c=V.join(e,"lerna.json");if(await j(c)){let u=await Vt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(r=d.packages)}}}else if(t==="nx")r=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=V.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(r=a.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let o of r){if(o.startsWith("!"))continue;let i=Ry(o,{cwd:e,absolute:!1});for(let a of i){let c=V.join(e,a),u=V.join(c,"package.json");if(await j(u))try{let d=await Vt.readFile(u,"utf-8"),m=JSON.parse(d),p=V.join(c,"PRJCT.md");s.push({name:m.name||V.basename(a),path:c,relativePath:a,hasPrjctMd:await j(p)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=V.resolve(e);for(let r of t.packages){let o=V.resolve(r.path);if(s.startsWith(o))return r}return null}async findMonorepoRoot(e){let t=V.resolve(e),s=V.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=V.dirname(t)}return null}},jy=new Yi,A=jy});function Wu(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Qi(){if(Wu()==="bun")return!0;try{let{execSync:n}=vt("node:child_process");return n("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Rs(){return Wu()==="bun"}var nr=b(()=>{"use strict";l(Wu,"detectRuntime");l(Qi,"isBunAvailable");l(Rs,"isBun")});import Zi from"node:fs";import Bu from"node:path";function Dy(n){if(Rs()){let{Database:r}=vt("bun:sqlite");return new r(n,{create:!0})}let e=vt("better-sqlite3"),t=new e(n),s=t.exec.bind(t);return t.run=r=>s(r),t}var Iy,$y,ea,x,N,ne=b(()=>{"use strict";Se();nr();l(Dy,"openDatabase");Iy=[{version:1,name:"initial-schema",up:l(n=>{n.run(`
13
13
  -- =======================================================================
14
14
  -- Document storage (backward-compatible with JSON file pattern)
15
15
  -- =======================================================================
@@ -223,7 +223,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
223
223
  started_at TEXT,
224
224
  ended_at TEXT
225
225
  );
226
- `)},"up")},{version:2,name:"archives-table",up:l(s=>{s.run(`
226
+ `)},"up")},{version:2,name:"archives-table",up:l(n=>{n.run(`
227
227
  -- =======================================================================
228
228
  -- Archives: Stale data moved out of active storage (PRJ-267)
229
229
  -- =======================================================================
@@ -240,7 +240,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
240
240
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
241
241
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
242
242
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
243
- `)},"up")},{version:3,name:"workflow-rules-table",up:l(s=>{s.run(`
243
+ `)},"up")},{version:3,name:"workflow-rules-table",up:l(n=>{n.run(`
244
244
  -- =======================================================================
245
245
  -- Workflow Rules: hooks, gates, and custom steps (Phase 2)
246
246
  -- =======================================================================
@@ -258,7 +258,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
258
258
  );
259
259
 
260
260
  CREATE INDEX idx_workflow_rules_command ON workflow_rules(command);
261
- `)},"up")},{version:4,name:"custom-workflows-table",up:l(s=>{s.run(`
261
+ `)},"up")},{version:4,name:"custom-workflows-table",up:l(n=>{n.run(`
262
262
  -- =======================================================================
263
263
  -- Custom Workflows: User-defined workflows with agentic auto-config
264
264
  -- =======================================================================
@@ -283,7 +283,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
283
283
  ('done', 'Complete current task/subtask', 1, 1, datetime('now'), datetime('now')),
284
284
  ('ship', 'Ship feature with version bump and PR', 1, 1, datetime('now'), datetime('now')),
285
285
  ('sync', 'Analyze project and regenerate context', 1, 1, datetime('now'), datetime('now'));
286
- `)},"up")},{version:5,name:"llm-analysis-table",up:l(s=>{s.run(`
286
+ `)},"up")},{version:5,name:"llm-analysis-table",up:l(n=>{n.run(`
287
287
  -- =======================================================================
288
288
  -- LLM Analysis: Structured findings from hybrid sync pipeline
289
289
  -- Pipeline: CLI (collect) \u2192 LLM (analyze) \u2192 CLI (store)
@@ -299,7 +299,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=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")},{version:6,name:"context-feedback-table",up:l(s=>{s.run(`
302
+ `)},"up")},{version:6,name:"context-feedback-table",up:l(n=>{n.run(`
303
303
  -- =======================================================================
304
304
  -- Context Feedback: RL loop for file suggestion improvement
305
305
  -- Records suggested vs actual files per task for scoring boosts
@@ -317,7 +317,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
317
317
  );
318
318
 
319
319
  CREATE INDEX idx_cf_task ON context_feedback(task_id);
320
- `)},"up")},{version:7,name:"sessions-table",up:l(s=>{s.run(`
320
+ `)},"up")},{version:7,name:"sessions-table",up:l(n=>{n.run(`
321
321
  -- =======================================================================
322
322
  -- Sessions: Task lifecycle tracking (replaces current.json + archive/)
323
323
  -- =======================================================================
@@ -337,20 +337,20 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
337
337
  CREATE INDEX idx_sessions_project ON sessions(project_id);
338
338
  CREATE INDEX idx_sessions_status ON sessions(status);
339
339
  CREATE INDEX idx_sessions_completed ON sessions(completed_at);
340
- `)},"up")}],$y=3,ea=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Bu.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=$y&&this.evictLru();let n=this.getDbPath(e),r=Bu.dirname(n);Zi.existsSync(r)||Zi.mkdirSync(r,{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 = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(n=>n!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return Zi.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,n){let r=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();r.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,r){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let r=this.getDb(e);return t?r.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):r.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(`
340
+ `)},"up")}],$y=3,ea=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Bu.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=$y&&this.evictLru();let s=this.getDbPath(e),r=Bu.dirname(s);Zi.existsSync(r)||Zi.mkdirSync(r,{recursive:!0});let o=Dy(s);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 = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(s=>s!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return Zi.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,s){let r=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();r.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,s,r){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let r=this.getDb(e);return t?r.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):r.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
341
341
  CREATE TABLE IF NOT EXISTS _migrations (
342
342
  version INTEGER PRIMARY KEY,
343
343
  name TEXT NOT NULL,
344
344
  applied_at TEXT NOT NULL
345
345
  )
346
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Iy)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}},x=new ea,N=x});function no(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var M,zu,rr=b(()=>{"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(no,"calculateConfidence")});function na(s){if(zu.includes(s))return[s];let e=s.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,r]of Object.entries(so))if(n!=="general"){for(let o of r)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var ta,so,jn,or,ir,ar=b(()=>{"use strict";se();rr();fe();ta={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)},so={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(na,"resolveCanonicalDomains");jn=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=N.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();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),r=t(n);return this._data=r,await this.save(e),r}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},or=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()}},ir=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:v(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>JSON.parse(r.data))}}});var cr,sa=b(()=>{"use strict";se();rr();fe();ar();cr=class s extends jn{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>s.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-s.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,r="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[r].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,r&&!c.contexts.includes(r)&&(c.contexts.push(r),c.contexts.length>s.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-s.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=no(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 r=(await this.load(e)).decisions[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let r=(await this.load(e)).decisions[t];return!r||r.confidence==="low"?null:{value:r.value,confidence:r.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let r=await this.load(e),o=v();if(!r.workflows[t])r.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=r.workflows[t];i.count++,i.lastSeen=o,i.confidence=no(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let r=(await this.load(e)).workflows[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let r=(await this.load(e)).workflows[t];return!r||r.count<3?null:r}async setPreference(e,t,n,r={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=r.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:v(),confidence:no(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let r=(await this.load(e)).preferences[t];return r?(r.userConfirmed=!0,r.confidence="high",r.updatedAt=v(),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(),r=s.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>r&&o.push(a)}if(o.length===0)return 0;let i=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import My from"node:crypto";import{homedir as Oy}from"node:os";import{join as _y}from"node:path";function he(){return My.randomUUID()}var fx,Tt=b(()=>{"use strict";l(he,"generateUUID");fx=_y(Oy(),".prjct-cli","projects")});var In,ra=b(()=>{"use strict";Tt();rr();fe();ar();In=class extends jn{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:r=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(r),c=v(),u={id:he(),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 r=await this.load(e),o=r.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=r.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)r.index[u]=r.index[u].filter(d=>d!==t);for(let u of c)r.index[u].push(t);i.tags=c}return i.updatedAt=v(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),r=n.memories.findIndex(i=>i.id===t);if(r===-1)return!1;let o=n.memories[r];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(r,1),await this.save(e),!0}async findByTags(e,t,n=!1){let r=await this.load(e),o=this._coerceTags(t);if(n)return r.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=r.index[a];for(let u of c)i.add(u)}return r.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),r=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(r)||o.content.toLowerCase().includes(r))}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),r=n.memories.length;if(r===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 C=this._getCommandTags(t.commandName),T=(p.tags||[]).filter(O=>C.includes(O));g.tagMatch=Math.min(20,T.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 C=this._extractKeywordsFromText(t.taskDescription),T=0;for(let O of C)p.content.toLowerCase().includes(O)&&(T+=2),p.title.toLowerCase().includes(O)&&(T+=3);g.keywords=Math.min(15,T)}p.userTriggered&&(g.userTriggered=5);let w=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:w,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:r,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:r>0?d.length/r:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let r=new Set;for(let a of n){let c=ta[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of n){let c=so[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(r.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 na(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(r=>r.length>2&&!n.has(r))}_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(r=>r.length>2&&!n.includes(r))}async autoRemember(e,t,n,r=""){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}${r?`
347
- Context: ${r}`:""}`,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[r,o]of Object.entries(t.index))n[r]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(r=>r.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var oa,Ny,tt,lr=b(()=>{"use strict";ar();sa();ra();ar();sa();ra();oa=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new In,this._patternStore=new cr,this._historyStore=new ir,this._sessionStore=new or}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,r){return this._semanticMemories.autoRemember(e,t,n,r)}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,r){return this._patternStore.recordDecision(e,t,n,r)}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,r){return this._patternStore.setPreference(e,t,n,r)}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 r=await this.getDecision(e,t);return r?r.value:null}async learnDecision(e,t,n,r=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,r),await this.appendHistory(e,{type:"decision",key:t,value:n,context:r})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Ny=new oa,tt=Ny});import{exec as Fy}from"node:child_process";import gt from"node:fs/promises";import It from"node:path";import{promisify as Ly}from"node:util";var $n,ia,Uy,ze,Ju=b(()=>{"use strict";U();$n=Ly(Fy),ia=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=It.join(this.projectPath,"package.json"),t=await gt.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=It.join(this.projectPath,"Cargo.toml");return await gt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=It.join(this.projectPath,"requirements.txt");return await gt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=It.join(this.projectPath,"go.mod");return await gt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=It.join(this.projectPath,"Gemfile");return await gt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=It.join(this.projectPath,"mix.exs");return await gt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=It.join(this.projectPath,"pom.xml");return await gt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=It.join(this.projectPath,"composer.json"),t=await gt.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=It.join(this.projectPath,"pyproject.toml");return await gt.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(`
348
- `).filter(Boolean).forEach(n=>{let r=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await gt.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(r=>r.test(n)))}catch(e){if(P(e))return[];throw e}}async listDirectories(){try{return(await gt.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 gt.access(It.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=It.join(this.projectPath,e);return await gt.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(`
349
- `).filter(Boolean)}catch{return[]}}},Uy=new ia,ze=Uy});import{z as be}from"zod";function Hy(s){return s instanceof ps}function Z(s){return Hy(s)||s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var ms,Ux,Hx,Gx,Vx,Wx,Bx,ps,ro,oo,ur,Yt=b(()=>{"use strict";ms={create(s,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(r){let o=e.parse(r);super(`${s}: ${JSON.stringify(o)}`),this.name=s,this.errorName=s,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(r){throw new t(r)}static is(r){return r instanceof t&&r.errorName===s}static create(r){return new t(r)}}return t}},Ux=ms.create("FileError",be.object({path:be.string(),operation:be.enum(["read","write","delete","create","copy"]),reason:be.string().optional()})),Hx=ms.create("ValidationError",be.object({field:be.string(),expected:be.string(),received:be.string().optional(),message:be.string().optional()})),Gx=ms.create("PermissionError",be.object({action:be.string(),resource:be.string(),reason:be.string().optional()})),Vx=ms.create("TaskError",be.object({taskId:be.string().optional(),operation:be.enum(["create","update","complete","pause","resume","delete"]),reason:be.string()})),Wx=ms.create("SessionError",be.object({sessionId:be.string().optional(),reason:be.string()})),Bx=ms.create("SyncError",be.object({projectId:be.string().optional(),operation:be.enum(["push","pull","auth","connect"]),reason:be.string()})),ps=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)}},ro=class s extends ps{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new s("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new s(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new s(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},oo=class s extends ps{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new s(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new s(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},ur=class s extends ps{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new s(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new s(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(Hy,"isPrjctError");l(Z,"getErrorMessage")});import aa from"node:fs";import ao from"node:path";function qu(){if(dr)return dr;let s=__dirname;for(let e=0;e<5;e++){let t=ao.join(s,"package.json");if(aa.existsSync(t))try{if(JSON.parse(aa.readFileSync(t,"utf-8")).name==="prjct-cli")return dr=s,s}catch{}s=ao.dirname(s)}return dr=ao.join(__dirname,"..","..",".."),dr}function ca(){if(io)return io;try{let s=ao.join(qu(),"package.json"),e=JSON.parse(aa.readFileSync(s,"utf-8"));return io=e.version,Gy=e,io}catch(s){return console.error("Failed to read version from package.json:",y(s)),"0.0.0"}}var io,Gy,dr,xe,pe,Pt=b(()=>{"use strict";U();io=null,Gy=null,dr=null;l(qu,"getPackageRoot");l(ca,"getVersion");xe=ca(),pe=qu()});import ua from"node:fs";import Vy from"node:fs/promises";import co from"node:path";function da(){if(Ku)return la;Ku=!0;let s=co.join(pe,"dist","templates.json");try{let e=ua.readFileSync(s,"utf-8");return la=JSON.parse(e),la}catch{return null}}function By(s){let e=Mn.indexOf(s);e>-1&&Mn.splice(e,1),Mn.push(s)}function zy(){for(;gs.size>=Wy&&Mn.length>0;){let s=Mn.shift();s&&gs.delete(s)}}function lo(s){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=s.match(e);if(!t)return{frontmatter:{},content:s.trim()};let[,n,r]=t,o={};return n.split(`
350
- `).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:r.trim()}}async function Xu(s){if(gs.has(s))return By(s),gs.get(s);let e,t=da();if(t){let r=`commands/${s}.md`;e=t[r]}if(!e){let r=co.join(pe,"templates","commands",`${s}.md`);try{e=await Vy.readFile(r,"utf-8")}catch{throw oo.notFound(s)}}let n=lo(e);return zy(),gs.set(s,n),Mn.push(s),n}async function Jy(s){return(await Xu(s)).frontmatter["allowed-tools"]||[]}function qy(){gs.clear(),Mn.length=0}function ye(s){let e=da();if(e?.[s])return e[s];let t=co.join(pe,"templates",s);try{return ua.readFileSync(t,"utf-8")}catch{return null}}function mn(s){let e=da();if(e)return Object.keys(e).filter(n=>n.startsWith(s));let t=co.join(pe,"templates",s);try{return ua.readdirSync(t).map(r=>`${s}${r}`)}catch{return[]}}var Wy,gs,Mn,la,Ku,Ky,pa,Wt=b(()=>{"use strict";Yt();Pt();Wy=50,gs=new Map,Mn=[],la=null,Ku=!1;l(da,"loadBundle");l(By,"updateLruOrder");l(zy,"evictLru");l(lo,"parseFrontmatter");l(Xu,"load");l(Jy,"getAllowedTools");l(qy,"clearCache");l(ye,"getTemplateContent");l(mn,"listTemplates");Ky={load:Xu,parseFrontmatter:lo,getAllowedTools:Jy,clearCache:qy,getTemplateContent:ye,listTemplates:mn},pa=Ky});import ce from"node:fs/promises";import ma from"node:os";import oe from"node:path";async function Xy(){try{let s=ye("global/modules/module-config.json");if(s)return JSON.parse(s);let e=oe.join(pe,"templates/global/modules/module-config.json"),t=await ce.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Yy(s){let e=await Xy();if(!e){let i=ye("global/CLAUDE.md");if(i)return i;let a=oe.join(pe,"templates/global/CLAUDE.md");return ce.readFile(a,"utf-8")}let t=s||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ye("global/CLAUDE.md");if(a)return a;let c=oe.join(pe,"templates/global/CLAUDE.md");return ce.readFile(c,"utf-8")}let r=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of r){let a=ye(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=oe.join(pe,"templates/global/modules",i),u=await ce.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(`
351
- `)}async function Qy(){try{let s=oe.join(ma.homedir(),".prjct-cli","docs");await ce.mkdir(s,{recursive:!0});let e=mn("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=ye(r);if(o){let i=oe.basename(r);await ce.writeFile(oe.join(s,i),o,"utf-8")}}return{success:!0}}let t=oe.join(pe,"templates/global/docs"),n=await ce.readdir(t);for(let r of n)if(r.endsWith(".md")){let o=oe.join(t,r),i=oe.join(s,r),a=await ce.readFile(o,"utf-8");await ce.writeFile(i,a,"utf-8")}return{success:!0}}catch(s){return{success:!1,error:y(s)}}}async function Zy(){let s=(Be(),lt(ct)),e=await s.getActiveProvider(),t=e.name;if(!(await s.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await ce.mkdir(e.configDir,{recursive:!0});let r=oe.join(e.configDir,e.contextFile),o=oe.join(pe,"templates","global",e.contextFile),i="";try{let u=ye(`global/${e.contextFile}`);u?i=u:i=await ce.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Yy()}catch{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(pe,"templates/global/CLAUDE.md");i=await ce.readFile(m,"utf-8")}}else{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(pe,"templates/global/CLAUDE.md");i=await ce.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await ce.readFile(r,"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 ce.writeFile(r,k,"utf-8"),{success:!0,action:"updated",path:r}}else{let p=`${a}
352
-
353
- ${i}`;return await ce.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r}}}else return await ce.writeFile(r,i,"utf-8"),{success:!0,action:"created",path:r}}catch(r){return{success:!1,error:y(r),action:"failed"}}}function Yu(){let s=ma.homedir();return{claude:{commands:oe.join(s,".claude","commands"),config:oe.join(s,".claude"),router:oe.join(s,".claude","commands","p.md")},gemini:{commands:oe.join(s,".gemini","commands"),config:oe.join(s,".gemini"),router:oe.join(s,".gemini","commands","p.toml")}}}var gn,ew,Ae,Qt=b(()=>{"use strict";Wt();U();Pt();l(Xy,"loadModuleConfig");l(Yy,"composeGlobalTemplate");l(Qy,"installDocs");l(Zy,"installGlobalConfig");gn=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=ma.homedir(),this.templatesDir=oe.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),lt(ct)).getActiveProvider();this.commandsPath=oe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await ce.access(this.configPath),!0}catch(e){if(P(e))return!1;throw e}}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=mn("commands/");return t.length>0?t.filter(r=>r.endsWith(".md")).map(r=>r.replace("commands/","")).filter(r=>!e.has(r)):(await ce.readdir(this.templatesDir)).filter(r=>r.endsWith(".md")&&!e.has(r))}async installCommands(){let e=await this.detectActiveProvider(),n=await(Be(),lt(ct)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{return await this.installRouter(),{success:!0,installed:["p (router)"],path:this.commandsPath}}catch(r){return{success:!1,error:y(r)}}}async uninstallCommands(){try{let e=[],r=(await(Be(),lt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,r);try{await ce.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 r=(await(Be(),lt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,r);return await ce.access(o),{installed:!0,providerDetected:!0,commands:["p (router)"],path:this.commandsPath}}catch(t){if(P(t))return{installed:!1,providerDetected:!0,commands:[]};throw t}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async installRouter(){let t=await(Be(),lt(ct)).getActiveProvider();if(t.name==="gemini")return this.installStaticRouter("p.toml");try{let n=oe.join(t.configDir,"commands","p.md");await ce.mkdir(oe.dirname(n),{recursive:!0});let r=await this.generateRouterContent();return await ce.writeFile(n,r,"utf-8"),!0}catch(n){if(P(n))return!1;throw n}}async installStaticRouter(e){let n=await(Be(),lt(ct)).getActiveProvider();try{let r=oe.join(n.configDir,"commands",e);await ce.mkdir(oe.dirname(r),{recursive:!0});let o=ye(`commands/${e}`);if(o)return await ce.writeFile(r,o,"utf-8"),!0;let i=oe.join(this.templatesDir,e),a=await ce.readFile(i,"utf-8");return await ce.writeFile(r,a,"utf-8"),!0}catch(r){if(P(r))return!1;throw r}}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 MCP)",jira:"JIRA integration (via MCP)",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",spec:"Technical specification",update:"Update prjct",verify:"Verify analysis integrity",auth:"Authentication"},n=[];for(let r of e){let o=r.replace(".md",""),i=t[o]||`${o} command`;n.push(`| \`p. ${o}${["task","idea","bug","ship"].includes(o)?" <desc>":""}\` | ${i} |`)}return`---
346
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Iy)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.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}},x=new ea,N=x});function so(n,e=!1){return e||n>=6?"high":n>=3?"medium":"low"}var M,Ju,rr=b(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Ju=["frontend","backend","devops","docs","testing","database","general"];l(so,"calculateConfidence")});function sa(n){if(Ju.includes(n))return[n];let e=n.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[s,r]of Object.entries(no))if(s!=="general"){for(let o of r)if(e.includes(o)||o.includes(e)){t.push(s);break}}return t.length>0?t:["general"]}var ta,no,js,or,ir,ar=b(()=>{"use strict";ne();rr();fe();ta={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)},no={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");js=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(),s=N.getDoc(e,t);return s!==null?(this._data=s,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();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),r=t(s);return this._data=r,await this.save(e),r}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},or=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()}},ir=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:v(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>JSON.parse(r.data))}}});var cr,na=b(()=>{"use strict";ne();rr();fe();ar();cr=class n extends js{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>n.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-n.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,r="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[r].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,r&&!c.contexts.includes(r)&&(c.contexts.push(r),c.contexts.length>n.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-n.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=so(c.count,c.userConfirmed)):(c.value=s,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 r=(await this.load(e)).decisions[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let r=(await this.load(e)).decisions[t];return!r||r.confidence==="low"?null:{value:r.value,confidence:r.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let r=await this.load(e),o=v();if(!r.workflows[t])r.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=r.workflows[t];i.count++,i.lastSeen=o,i.confidence=so(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let r=(await this.load(e)).workflows[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let r=(await this.load(e)).workflows[t];return!r||r.count<3?null:r}async setPreference(e,t,s,r={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=r.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:so(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let r=(await this.load(e)).preferences[t];return r?(r.userConfirmed=!0,r.confidence="high",r.updatedAt=v(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),r=n.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>r&&o.push(a)}if(o.length===0)return 0;let i=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import My from"node:crypto";import{homedir as Oy}from"node:os";import{join as _y}from"node:path";function he(){return My.randomUUID()}var fx,Tt=b(()=>{"use strict";l(he,"generateUUID");fx=_y(Oy(),".prjct-cli","projects")});var Ds,ra=b(()=>{"use strict";Tt();rr();fe();ar();Ds=class extends js{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 s of e)t[s]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let s of t)e.index[s]||(e.index[s]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(s=>t.has(s))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:s,tags:r=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(r),c=v(),u={id:he(),title:t,content:s,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,s){let r=await this.load(e),o=r.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=r.memories[o],a=i.tags||[];if(s.title&&(i.title=s.title),s.content&&(i.content=s.content),s.tags){let c=this._coerceTags(s.tags);for(let u of a)r.index[u]=r.index[u].filter(d=>d!==t);for(let u of c)r.index[u].push(t);i.tags=c}return i.updatedAt=v(),await this.save(e),!0}async deleteMemory(e,t){let s=await this.load(e),r=s.memories.findIndex(i=>i.id===t);if(r===-1)return!1;let o=s.memories[r];for(let i of o.tags||[])s.index[i]&&(s.index[i]=s.index[i].filter(a=>a!==t));return s.memories.splice(r,1),await this.save(e),!0}async findByTags(e,t,s=!1){let r=await this.load(e),o=this._coerceTags(t);if(s)return r.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=r.index[a];for(let u of c)i.add(u)}return r.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let s=await this.load(e),r=t.toLowerCase();return s.memories.filter(o=>o.title.toLowerCase().includes(r)||o.content.toLowerCase().includes(r))}async getRelevantMemories(e,t,s=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,s).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let s=await this.load(e),r=s.memories.length;if(r===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=s.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 E=this._getCommandTags(t.commandName),T=(p.tags||[]).filter(O=>E.includes(O));g.tagMatch=Math.min(20,T.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 E=this._extractKeywordsFromText(t.taskDescription),T=0;for(let O of E)p.content.toLowerCase().includes(O)&&(T+=2),p.title.toLowerCase().includes(O)&&(T+=3);g.keywords=Math.min(15,T)}p.userTriggered&&(g.userTriggered=5);let w=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:w,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:r,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:r>0?d.length/r:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let s=this._resolveCanonicalDomains(e);if(s.length===0)return 0;let r=new Set;for(let a of s){let c=ta[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of s){let c=no[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(r.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+/),s=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(r=>r.length>2&&!s.has(r))}_extractContextTags(e){let t=[],s={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&&s[e.commandName]&&t.push(...s[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 s=["the","a","an","is","are","to","for","and","or","in"];return t.filter(r=>r.length>2&&!s.includes(r))}async autoRemember(e,t,s,r=""){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}: ${s}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${r?`
347
+ Context: ${r}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),s={};for(let[r,o]of Object.entries(t.index))s[r]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(r=>r.userTriggered).length,tagCounts:s,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var oa,Ny,tt,lr=b(()=>{"use strict";ar();na();ra();ar();na();ra();oa=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Ds,this._patternStore=new cr,this._historyStore=new ir,this._sessionStore=new or}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,s){return this._semanticMemories.updateMemory(e,t,s)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,s){return this._semanticMemories.findByTags(e,t,s)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,s){return this._semanticMemories.getRelevantMemories(e,t,s)}autoRemember(e,t,s,r){return this._semanticMemories.autoRemember(e,t,s,r)}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,s,r){return this._patternStore.recordDecision(e,t,s,r)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,s){return this._patternStore.recordWorkflow(e,t,s)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,s,r){return this._patternStore.setPreference(e,t,s,r)}getPreference(e,t,s){return this._patternStore.getPreference(e,t,s)}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 s=this.getSession(`decision:${t}`);if(s!==void 0)return s;let r=await this.getDecision(e,t);return r?r.value:null}async learnDecision(e,t,s,r=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,r),await this.appendHistory(e,{type:"decision",key:t,value:s,context:r})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Ny=new oa,tt=Ny});import{exec as Fy}from"node:child_process";import gt from"node:fs/promises";import It from"node:path";import{promisify as Ly}from"node:util";var Is,ia,Uy,Je,zu=b(()=>{"use strict";U();Is=Ly(Fy),ia=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=It.join(this.projectPath,"package.json"),t=await gt.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=It.join(this.projectPath,"Cargo.toml");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readRequirements(){try{let e=It.join(this.projectPath,"requirements.txt");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGoMod(){try{let e=It.join(this.projectPath,"go.mod");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGemfile(){try{let e=It.join(this.projectPath,"Gemfile");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readMixExs(){try{let e=It.join(this.projectPath,"mix.exs");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readPomXml(){try{let e=It.join(this.projectPath,"pom.xml");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readComposerJson(){try{let e=It.join(this.projectPath,"composer.json"),t=await gt.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=It.join(this.projectPath,"pyproject.toml");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Is('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(`
348
+ `).filter(Boolean).forEach(s=>{let r=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await gt.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(s=>t.some(r=>r.test(s)))}catch(e){if(C(e))return[];throw e}}async listDirectories(){try{return(await gt.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 Is(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Is("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Is('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await Is('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:s.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await Is('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 gt.access(It.join(this.projectPath,e)),!0}catch(t){if(C(t))return!1;throw t}}async readFile(e){try{let t=It.join(this.projectPath,e);return await gt.readFile(t,"utf-8")}catch(t){if(C(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Is(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
349
+ `).filter(Boolean)}catch{return[]}}},Uy=new ia,Je=Uy});import{z as be}from"zod";function Hy(n){return n instanceof pn}function Z(n){return Hy(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var mn,Ux,Hx,Gx,Vx,Wx,Bx,pn,ro,oo,ur,Yt=b(()=>{"use strict";mn={create(n,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(r){let o=e.parse(r);super(`${n}: ${JSON.stringify(o)}`),this.name=n,this.errorName=n,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(r){throw new t(r)}static is(r){return r instanceof t&&r.errorName===n}static create(r){return new t(r)}}return t}},Ux=mn.create("FileError",be.object({path:be.string(),operation:be.enum(["read","write","delete","create","copy"]),reason:be.string().optional()})),Hx=mn.create("ValidationError",be.object({field:be.string(),expected:be.string(),received:be.string().optional(),message:be.string().optional()})),Gx=mn.create("PermissionError",be.object({action:be.string(),resource:be.string(),reason:be.string().optional()})),Vx=mn.create("TaskError",be.object({taskId:be.string().optional(),operation:be.enum(["create","update","complete","pause","resume","delete"]),reason:be.string()})),Wx=mn.create("SessionError",be.object({sessionId:be.string().optional(),reason:be.string()})),Bx=mn.create("SyncError",be.object({projectId:be.string().optional(),operation:be.enum(["push","pull","auth","connect"]),reason:be.string()})),pn=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)}},ro=class n extends pn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},oo=class n extends pn{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new n(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new n(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},ur=class n extends pn{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(Hy,"isPrjctError");l(Z,"getErrorMessage")});import aa from"node:fs";import ao from"node:path";function qu(){if(dr)return dr;let n=__dirname;for(let e=0;e<5;e++){let t=ao.join(n,"package.json");if(aa.existsSync(t))try{if(JSON.parse(aa.readFileSync(t,"utf-8")).name==="prjct-cli")return dr=n,n}catch{}n=ao.dirname(n)}return dr=ao.join(__dirname,"..","..",".."),dr}function ca(){if(io)return io;try{let n=ao.join(qu(),"package.json"),e=JSON.parse(aa.readFileSync(n,"utf-8"));return io=e.version,Gy=e,io}catch(n){return console.error("Failed to read version from package.json:",y(n)),"0.0.0"}}var io,Gy,dr,xe,pe,Pt=b(()=>{"use strict";U();io=null,Gy=null,dr=null;l(qu,"getPackageRoot");l(ca,"getVersion");xe=ca(),pe=qu()});import ua from"node:fs";import Vy from"node:fs/promises";import co from"node:path";function da(){if(Ku)return la;Ku=!0;let n=co.join(pe,"dist","templates.json");try{let e=ua.readFileSync(n,"utf-8");return la=JSON.parse(e),la}catch{return null}}function By(n){let e=$s.indexOf(n);e>-1&&$s.splice(e,1),$s.push(n)}function Jy(){for(;gn.size>=Wy&&$s.length>0;){let n=$s.shift();n&&gn.delete(n)}}function lo(n){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=n.match(e);if(!t)return{frontmatter:{},content:n.trim()};let[,s,r]=t,o={};return s.split(`
350
+ `).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:r.trim()}}async function Xu(n){if(gn.has(n))return By(n),gn.get(n);let e,t=da();if(t){let r=`commands/${n}.md`;e=t[r]}if(!e){let r=co.join(pe,"templates","commands",`${n}.md`);try{e=await Vy.readFile(r,"utf-8")}catch{throw oo.notFound(n)}}let s=lo(e);return Jy(),gn.set(n,s),$s.push(n),s}async function zy(n){return(await Xu(n)).frontmatter["allowed-tools"]||[]}function qy(){gn.clear(),$s.length=0}function ye(n){let e=da();if(e?.[n])return e[n];let t=co.join(pe,"templates",n);try{return ua.readFileSync(t,"utf-8")}catch{return null}}function ps(n){let e=da();if(e)return Object.keys(e).filter(s=>s.startsWith(n));let t=co.join(pe,"templates",n);try{return ua.readdirSync(t).map(r=>`${n}${r}`)}catch{return[]}}var Wy,gn,$s,la,Ku,Ky,pa,Wt=b(()=>{"use strict";Yt();Pt();Wy=50,gn=new Map,$s=[],la=null,Ku=!1;l(da,"loadBundle");l(By,"updateLruOrder");l(Jy,"evictLru");l(lo,"parseFrontmatter");l(Xu,"load");l(zy,"getAllowedTools");l(qy,"clearCache");l(ye,"getTemplateContent");l(ps,"listTemplates");Ky={load:Xu,parseFrontmatter:lo,getAllowedTools:zy,clearCache:qy,getTemplateContent:ye,listTemplates:ps},pa=Ky});import ce from"node:fs/promises";import ma from"node:os";import oe from"node:path";async function Xy(){try{let n=ye("global/modules/module-config.json");if(n)return JSON.parse(n);let e=oe.join(pe,"templates/global/modules/module-config.json"),t=await ce.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Yy(n){let e=await Xy();if(!e){let i=ye("global/CLAUDE.md");if(i)return i;let a=oe.join(pe,"templates/global/CLAUDE.md");return ce.readFile(a,"utf-8")}let t=n||e.default,s=e.profiles[t];if(!s&&!e.profiles[e.default]){let a=ye("global/CLAUDE.md");if(a)return a;let c=oe.join(pe,"templates/global/CLAUDE.md");return ce.readFile(c,"utf-8")}let r=(s||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of r){let a=ye(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=oe.join(pe,"templates/global/modules",i),u=await ce.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(`
351
+ `)}async function Qy(){try{let n=oe.join(ma.homedir(),".prjct-cli","docs");await ce.mkdir(n,{recursive:!0});let e=ps("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=ye(r);if(o){let i=oe.basename(r);await ce.writeFile(oe.join(n,i),o,"utf-8")}}return{success:!0}}let t=oe.join(pe,"templates/global/docs"),s=await ce.readdir(t);for(let r of s)if(r.endsWith(".md")){let o=oe.join(t,r),i=oe.join(n,r),a=await ce.readFile(o,"utf-8");await ce.writeFile(i,a,"utf-8")}return{success:!0}}catch(n){return{success:!1,error:y(n)}}}async function Zy(){let n=(Be(),lt(ct)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await ce.mkdir(e.configDir,{recursive:!0});let r=oe.join(e.configDir,e.contextFile),o=oe.join(pe,"templates","global",e.contextFile),i="";try{let u=ye(`global/${e.contextFile}`);u?i=u:i=await ce.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Yy()}catch{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(pe,"templates/global/CLAUDE.md");i=await ce.readFile(m,"utf-8")}}else{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(pe,"templates/global/CLAUDE.md");i=await ce.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await ce.readFile(r,"utf-8"),c=!0}catch(u){if(C(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await ce.writeFile(r,k,"utf-8"),{success:!0,action:"updated",path:r}}else{let p=`${a}
352
+
353
+ ${i}`;return await ce.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r}}}else return await ce.writeFile(r,i,"utf-8"),{success:!0,action:"created",path:r}}catch(r){return{success:!1,error:y(r),action:"failed"}}}function Yu(){let n=ma.homedir();return{claude:{commands:oe.join(n,".claude","commands"),config:oe.join(n,".claude"),router:oe.join(n,".claude","commands","p.md")},gemini:{commands:oe.join(n,".gemini","commands"),config:oe.join(n,".gemini"),router:oe.join(n,".gemini","commands","p.toml")}}}var ms,ew,Ae,Qt=b(()=>{"use strict";Wt();U();Pt();l(Xy,"loadModuleConfig");l(Yy,"composeGlobalTemplate");l(Qy,"installDocs");l(Zy,"installGlobalConfig");ms=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=ma.homedir(),this.templatesDir=oe.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),lt(ct)).getActiveProvider();this.commandsPath=oe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await ce.access(this.configPath),!0}catch(e){if(C(e))return!1;throw e}}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=ps("commands/");return t.length>0?t.filter(r=>r.endsWith(".md")).map(r=>r.replace("commands/","")).filter(r=>!e.has(r)):(await ce.readdir(this.templatesDir)).filter(r=>r.endsWith(".md")&&!e.has(r))}async installCommands(){let e=await this.detectActiveProvider(),s=await(Be(),lt(ct)).getActiveProvider();if(!e)return{success:!1,error:`${s.displayName} not detected. Please install it first.`};try{return await this.installRouter(),{success:!0,installed:["p (router)"],path:this.commandsPath}}catch(r){return{success:!1,error:y(r)}}}async uninstallCommands(){try{let e=[],r=(await(Be(),lt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,r);try{await ce.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 r=(await(Be(),lt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,r);return await ce.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(Be(),lt(ct)).getActiveProvider();if(t.name==="gemini")return this.installStaticRouter("p.toml");try{let s=oe.join(t.configDir,"commands","p.md");await ce.mkdir(oe.dirname(s),{recursive:!0});let r=await this.generateRouterContent();return await ce.writeFile(s,r,"utf-8"),!0}catch(s){if(C(s))return!1;throw s}}async installStaticRouter(e){let s=await(Be(),lt(ct)).getActiveProvider();try{let r=oe.join(s.configDir,"commands",e);await ce.mkdir(oe.dirname(r),{recursive:!0});let o=ye(`commands/${e}`);if(o)return await ce.writeFile(r,o,"utf-8"),!0;let i=oe.join(this.templatesDir,e),a=await ce.readFile(i,"utf-8");return await ce.writeFile(r,a,"utf-8"),!0}catch(r){if(C(r))return!1;throw r}}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 MCP)",jira:"JIRA integration (via MCP)",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",spec:"Technical specification",update:"Update prjct",verify:"Verify analysis integrity",auth:"Authentication"},s=[];for(let r of e){let o=r.replace(".md",""),i=t[o]||`${o} command`;s.push(`| \`p. ${o}${["task","idea","bug","ship"].includes(o)?" <desc>":""}\` | ${i} |`)}return`---
354
354
  description: 'prjct CLI - Context layer for AI agents'
355
355
  allowed-tools: ["*"]
356
356
  ---
@@ -365,7 +365,7 @@ All commands use the \`p.\` prefix.
365
365
 
366
366
  | Command | Description |
367
367
  |---------|-------------|
368
- ${n.join(`
368
+ ${s.join(`
369
369
  `)}
370
370
 
371
371
  ## Execution
@@ -432,47 +432,47 @@ Templates should use CLI commands for data operations \u2014 never read/write JS
432
432
  2. Handle aliases (undo \u2192 history undo, redo \u2192 history redo)
433
433
  3. If passthrough command \u2192 run CLI directly
434
434
  4. Else \u2192 load and execute command template
435
- `}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 cleanupLegacyCommands(){await this.ensureInit();let e=oe.join(this.commandsPath,"p");try{if((await ce.stat(e).catch(()=>null))?.isDirectory())return await ce.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Zy()}async installDocs(){return Qy()}};l(Yu,"getProviderPaths");ew=new gn,Ae=ew});import{z as Me}from"zod";function td(s,e="default"){let t=Qu[e]||Qu.default;return s/1e3*t}function uo(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var tw,nw,Zu,ed,Qu,po=b(()=>{"use strict";tw=Me.object({date:Me.string(),tokensSaved:Me.number(),syncs:Me.number(),avgCompressionRate:Me.number(),totalDuration:Me.number()}),nw=Me.object({agentName:Me.string(),usageCount:Me.number(),tokensSaved:Me.number()}),Zu=Me.object({totalTokensSaved:Me.number(),avgCompressionRate:Me.number(),syncCount:Me.number(),watchTriggers:Me.number(),avgSyncDuration:Me.number(),totalSyncDuration:Me.number(),agentUsage:Me.array(nw),dailyStats:Me.array(tw),firstSync:Me.string(),lastUpdated:Me.string()}),ed={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Qu={"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(td,"estimateCostSaved");l(uo,"formatCost")});function nd(s,e){let t=[];pr("Languages",s.languages,e.languages,t),pr("Frameworks",s.frameworks,e.frameworks,t),(s.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:s.packageManager??"(none)",after:e.packageManager??"(none)"}),(s.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:s.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(s.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:s.testDir??"(none)",after:e.testDir??"(none)"}),pr("Config files",s.configFiles,e.configFiles,t),s.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(s.fileCount),after:String(e.fileCount)});let n=s.patterns.map(d=>d.name),r=e.patterns.map(d=>d.name);pr("Patterns",n,r,t);let o=s.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:s.commitHash??null,afterCommit:e.commitHash??null}}function ga(s){if(!s.hasChanges)return`## Analysis Diff
435
+ `}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 cleanupLegacyCommands(){await this.ensureInit();let e=oe.join(this.commandsPath,"p");try{if((await ce.stat(e).catch(()=>null))?.isDirectory())return await ce.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Zy()}async installDocs(){return Qy()}};l(Yu,"getProviderPaths");ew=new ms,Ae=ew});import{z as Me}from"zod";function td(n,e="default"){let t=Qu[e]||Qu.default;return n/1e3*t}function uo(n){return n<.01?`$${(n*100).toFixed(2)}\xA2`:`$${n.toFixed(2)}`}var tw,sw,Zu,ed,Qu,po=b(()=>{"use strict";tw=Me.object({date:Me.string(),tokensSaved:Me.number(),syncs:Me.number(),avgCompressionRate:Me.number(),totalDuration:Me.number()}),sw=Me.object({agentName:Me.string(),usageCount:Me.number(),tokensSaved:Me.number()}),Zu=Me.object({totalTokensSaved:Me.number(),avgCompressionRate:Me.number(),syncCount:Me.number(),watchTriggers:Me.number(),avgSyncDuration:Me.number(),totalSyncDuration:Me.number(),agentUsage:Me.array(sw),dailyStats:Me.array(tw),firstSync:Me.string(),lastUpdated:Me.string()}),ed={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Qu={"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(td,"estimateCostSaved");l(uo,"formatCost")});function sd(n,e){let t=[];pr("Languages",n.languages,e.languages,t),pr("Frameworks",n.frameworks,e.frameworks,t),(n.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:n.packageManager??"(none)",after:e.packageManager??"(none)"}),(n.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:n.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(n.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:n.testDir??"(none)",after:e.testDir??"(none)"}),pr("Config files",n.configFiles,e.configFiles,t),n.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(n.fileCount),after:String(e.fileCount)});let s=n.patterns.map(d=>d.name),r=e.patterns.map(d=>d.name);pr("Patterns",s,r,t);let o=n.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:n.commitHash??null,afterCommit:e.commitHash??null}}function ga(n){if(!n.hasChanges)return`## Analysis Diff
436
436
 
437
- No changes between runs.`;let e=[];e.push("## Analysis Diff"),(s.beforeCommit||s.afterCommit)&&e.push(`> \`${s.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${s.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let n of s.items){let r=n.type==="added"?"+":n.type==="removed"?"-":"~",o=n.type==="changed"?`${n.before} \u2192 ${n.after}`:n.after??n.before??"";e.push(`| ${r} | ${n.field} | ${o} |`)}e.push("");let t=[];return s.summary.added>0&&t.push(`${s.summary.added} added`),s.summary.removed>0&&t.push(`${s.summary.removed} removed`),s.summary.changed>0&&t.push(`${s.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
438
- `)}function sd(s){if(!s.hasChanges)return"No changes between analysis runs.";let e=[];(s.beforeCommit||s.afterCommit)&&(e.push(` ${s.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${s.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of s.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(`
439
- `)}function pr(s,e,t,n){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||n.push({field:s,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:s,type:"removed",before:i})}var fa=b(()=>{"use strict";l(nd,"generateAnalysisDiff");l(ga,"formatAnalysisDiffMd");l(sd,"formatAnalysisDiffText");l(pr,"diffStringArray")});import id from"node:fs/promises";import mo from"node:path";function fs(s){return s.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 ow(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...fs(p));let r=[/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 r){let g;for(;(g=p.exec(s))!==null;)g[1]&&t.push(...fs(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(s))!==null;)g[1]&&t.push(...fs(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...fs(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...fs(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(s))!==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(s))!==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&&!ad.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function iw(s){return s.split(/\s+/).flatMap(e=>fs(e)).filter(e=>e.length>1&&!ad.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function cd(s,e){let t=[],n=await id.readdir(s,{withFileTypes:!0});for(let r of n){if(rw.has(r.name))continue;let o=mo.join(s,r.name);if(r.isDirectory())t.push(...await cd(o,e));else if(r.isFile()){let i=mo.extname(r.name).toLowerCase();sw.has(i)&&t.push(mo.relative(e,o))}}return t}async function aw(s){let e=await cd(s,s),t={},n={},r=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 id.readFile(mo.join(s,d),"utf-8"),p=ow(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},r+=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?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function cw(s,e){return Math.log((e-s+.5)/(s+.5)+1)}function lw(s,e){let t=iw(s);if(t.length===0)return[];let n=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=cw(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(rd+1),m=c+rd*(1-od+od*(u.length/e.avgDocLength)),p=i*(d/m);n.set(a,(n.get(a)||0)+p)}}return Array.from(n.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function uw(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};N.setDoc(s,ld,t)}function dw(s){let e=N.getDoc(s,ld);if(!e)return null;let t={};for(let[n,r]of Object.entries(e.docLengths))t[n]={tokens:[],length:r};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function ud(s,e){let t=await aw(s);return uw(e,t),t}function dd(s,e,t=15){let n=dw(s);return n?lw(e,n).slice(0,t):[]}var rd,od,sw,ad,rw,ld,ha=b(()=>{"use strict";se();rd=1.2,od=.75,sw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ad=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"]),rw=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(fs,"splitIdentifier");l(ow,"tokenizeFile");l(iw,"tokenizeQuery");l(cd,"listFiles");l(aw,"buildIndex");l(cw,"idf");l(lw,"score");ld="bm25-index";l(uw,"saveIndex");l(dw,"loadIndex");l(ud,"indexProject");l(dd,"queryFiles")});import mr from"node:fs/promises";import fn from"node:path";import{z as q}from"zod";async function hw(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=fn.join(e,"package.json"),r=await mr.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of s.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 yw(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await bw(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let c=fw[a];if(!c)continue;c.some(d=>r.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 ww(s,e){let t=Date.now(),n=s.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 r=[],o=[];for(let i of n){let a=i.location,c=fn.join(e,a);try{await mr.access(c),o.push(a)}catch{r.push(`${i.name} (${a})`)}}return r.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: ${r.join(", ")}`,durationMs:Date.now()-t}}async function kw(s,e){let t=Date.now();try{let n=await vw(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, 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(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=fn.join(e,o.file);try{await mr.access(i),r.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.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(s,e){let t=Date.now(),n=await Promise.all([hw(s,e),yw(s,e),ww(s,e),kw(s,e),Sw(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function bw(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=fn.join(r,i.name),c=fn.relative(s,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=fn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(s),Array.from(e)}async function vw(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=fn.join(r,i.name),c=fn.relative(s,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(s),e}var pw,mw,gw,ya,RA,fw,md=b(()=>{"use strict";U();Yr();pw=q.enum(["draft","verified","sealed"]),mw=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()}),gw=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()}),ya=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(mw),antiPatterns:q.array(gw),analyzedAt:q.string(),modelMetadata:ds.optional(),status:pw.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),RA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},fw={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(hw,"verifyFrameworks");l(yw,"verifyLanguages");l(ww,"verifyPatternLocations");l(kw,"verifyFileCount");l(Sw,"verifyAntiPatternFiles");l(pd,"semanticVerify");l(bw,"getProjectExtensions");l(vw,"countProjectFiles")});var wa,gd,fd=b(()=>{"use strict";Se();fe();We();wa=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),n=await Ut(t,[])??[];n.push(e),await An(t,n)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ut(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await An(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),n={timestamp:v(),success:!0};await An(t,n)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ut(t,null)}},gd=new wa});var hs,ka=b(()=>{"use strict";hs=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,r)=>n[1].timestamp-r[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 Je,Zt=b(()=>{"use strict";fd();ka();fe();se();Je=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new hs({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=x.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){x.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:v(),projectId:e};await gd.publish(r)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return x.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 Tw}from"node:crypto";var Sa,qe,ys=b(()=>{"use strict";md();fa();fe();Zt();Sa=class extends Je{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"};ya.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:v()})),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),r=v(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return ya.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),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=v();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:nd(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),r=n.sealed??n.draft;return r?await pd(r,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 Tw("sha256").update(JSON.stringify(t)).digest("hex")}},qe=new Sa});var ba,Pw,ws,va=b(()=>{"use strict";fe();se();ba=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let n=x.getDb(e),r=v();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),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=x.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?x.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return x.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},Pw=new ba,ws=Pw});import{z as E}from"zod";var Cw,go,Ew,xw,Aw,Ta,yd,wd,kd,Sd,hd,Rw,Dw,bd,vd,Td,jw,Iw,sR,Pa=b(()=>{"use strict";Yr();Cw=E.enum(["low","medium","high","critical"]),go=E.enum(["feature","bug","improvement","chore"]),Ew=E.enum(["active","backlog","previously_active"]),xw=E.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Aw=E.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ta=E.object({title:E.string(),description:E.string(),filesChanged:E.array(E.object({path:E.string(),action:E.enum(["created","modified","deleted"])})),whatWasDone:E.array(E.string()).min(1),outputForNextAgent:E.string().min(1),notes:E.string().optional()}),yd=E.object({output:E.string().min(1,"Subtask output is required"),summary:Ta}),wd=E.object({id:E.string(),description:E.string(),domain:E.string(),agent:E.string(),status:xw,dependsOn:E.array(E.string()),startedAt:E.string().optional(),completedAt:E.string().optional(),output:E.string().optional(),summary:Ta.optional(),skipReason:E.string().optional(),blockReason:E.string().optional(),estimatedPoints:E.number().optional(),estimatedMinutes:E.number().optional()}),kd=E.object({completed:E.number(),total:E.number(),percentage:E.number()}),Sd=E.object({id:E.string(),description:E.string(),type:go.optional(),startedAt:E.string(),sessionId:E.string(),featureId:E.string().optional(),subtasks:E.array(wd).optional(),currentSubtaskIndex:E.number().optional(),subtaskProgress:kd.optional(),linearId:E.string().optional(),linearUuid:E.string().optional(),estimatedPoints:E.number().optional(),estimatedMinutes:E.number().optional(),modelMetadata:ds.optional()}),hd=E.object({id:E.string(),description:E.string(),status:E.literal("paused"),startedAt:E.string(),pausedAt:E.string(),pauseReason:E.string().optional(),type:go.optional(),sessionId:E.string().optional(),featureId:E.string().optional(),subtasks:E.array(wd).optional(),currentSubtaskIndex:E.number().optional(),subtaskProgress:kd.optional(),linearId:E.string().optional(),linearUuid:E.string().optional(),estimatedPoints:E.number().optional(),estimatedMinutes:E.number().optional(),modelMetadata:ds.optional()}),Rw=E.object({stackConfirmed:E.array(E.string()).optional(),patternsDiscovered:E.array(E.string()).optional(),agentAccuracy:E.array(E.object({agent:E.string(),rating:E.enum(["helpful","neutral","inaccurate"]),note:E.string().optional()})).optional(),issuesEncountered:E.array(E.string()).optional()}),Dw=E.object({taskId:E.string(),title:E.string(),classification:go,startedAt:E.string(),completedAt:E.string(),subtaskCount:E.number(),subtaskSummaries:E.array(Ta),outcome:E.string(),branchName:E.string(),linearId:E.string().optional(),linearUuid:E.string().optional(),prUrl:E.string().optional(),feedback:Rw.optional()}),bd=E.object({currentTask:Sd.nullable(),previousTask:hd.nullable().optional(),pausedTasks:E.array(hd).optional(),taskHistory:E.array(Dw).optional(),lastUpdated:E.string()}),vd=E.object({id:E.string(),description:E.string(),priority:Cw,type:go,featureId:E.string().optional(),originFeature:E.string().optional(),completed:E.boolean(),completedAt:E.string().optional(),createdAt:E.string(),section:Ew,agent:E.string().optional(),groupName:E.string().optional(),groupId:E.string().optional()}),Td=E.object({tasks:E.array(vd),lastUpdated:E.string()}),jw=E.object({tasksToday:E.number(),tasksThisWeek:E.number(),streak:E.number(),velocity:E.string(),avgDuration:E.string()}),Iw=E.object({type:Aw,description:E.string(),timestamp:E.string(),duration:E.string().optional()}),sR=E.object({projectId:E.string(),currentTask:Sd.nullable(),queue:E.array(vd),stats:jw,recentActivity:E.array(Iw),lastSync:E.string()})});var gr,Ca,On,Ea=b(()=>{"use strict";gr={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"}},Ca=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=gr[e];if(n.transitions.includes(t))return{valid:!0};let r=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}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 gr[e]}getPrompt(e){return gr[e].prompt}getValidCommands(e){return gr[e].transitions}formatNextSteps(e){return gr[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}`}})}},On=new Ca});var en,xa,Ct,_n=b(()=>{"use strict";Tt();fe();se();en={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},xa=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=he(),r=v();return x.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,r,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=v();return x.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(he(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?x.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):x.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=x.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 r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=x.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(x.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(),r=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ct=new xa});var Aa,F,Et=b(()=>{"use strict";Tt();Pa();fe();Ea();_n();Zt();Aa=class extends Je{static{l(this,"StateStorage")}constructor(){super("state.json",bd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=On.getCurrentState(e),r=On.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.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 r={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=v(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=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:r.parentDescription||e.description,classification:r.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:r.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:r.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 r={...n.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let n=await this.read(e),r=this.getPausedTasksFromState(n);if(r.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,f)=>f!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:v(),sessionId:i.sessionId??he()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];Ct.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:v()}));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:v()}))}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),r=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&r.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(r)],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 r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=yd.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:
437
+ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(n.beforeCommit||n.afterCommit)&&e.push(`> \`${n.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${n.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of n.items){let r=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${r} | ${s.field} | ${o} |`)}e.push("");let t=[];return n.summary.added>0&&t.push(`${n.summary.added} added`),n.summary.removed>0&&t.push(`${n.summary.removed} removed`),n.summary.changed>0&&t.push(`${n.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
438
+ `)}function nd(n){if(!n.hasChanges)return"No changes between analysis runs.";let e=[];(n.beforeCommit||n.afterCommit)&&(e.push(` ${n.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${n.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of n.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(`
439
+ `)}function pr(n,e,t,s){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||s.push({field:n,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:n,type:"removed",before:i})}var fa=b(()=>{"use strict";l(sd,"generateAnalysisDiff");l(ga,"formatAnalysisDiffMd");l(nd,"formatAnalysisDiffText");l(pr,"diffStringArray")});import id from"node:fs/promises";import mo from"node:path";function fn(n){return n.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 ow(n,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...fn(p));let r=[/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 r){let g;for(;(g=p.exec(n))!==null;)g[1]&&t.push(...fn(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(n))!==null;)g[1]&&t.push(...fn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(n))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...fn(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...fn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(n))!==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(n))!==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&&!ad.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function iw(n){return n.split(/\s+/).flatMap(e=>fn(e)).filter(e=>e.length>1&&!ad.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function cd(n,e){let t=[],s=await id.readdir(n,{withFileTypes:!0});for(let r of s){if(rw.has(r.name))continue;let o=mo.join(n,r.name);if(r.isDirectory())t.push(...await cd(o,e));else if(r.isFile()){let i=mo.extname(r.name).toLowerCase();nw.has(i)&&t.push(mo.relative(e,o))}}return t}async function aw(n){let e=await cd(n,n),t={},s={},r=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 id.readFile(mo.join(n,d),"utf-8"),p=ow(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},r+=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)s[g]||(s[g]=[]),s[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function cw(n,e){return Math.log((e-n+.5)/(n+.5)+1)}function lw(n,e){let t=iw(n);if(t.length===0)return[];let s=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=cw(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(rd+1),m=c+rd*(1-od+od*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function uw(n,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,r])=>[s,r.length]))};N.setDoc(n,ld,t)}function dw(n){let e=N.getDoc(n,ld);if(!e)return null;let t={};for(let[s,r]of Object.entries(e.docLengths))t[s]={tokens:[],length:r};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function ud(n,e){let t=await aw(n);return uw(e,t),t}function dd(n,e,t=15){let s=dw(n);return s?lw(e,s).slice(0,t):[]}var rd,od,nw,ad,rw,ld,ha=b(()=>{"use strict";ne();rd=1.2,od=.75,nw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ad=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"]),rw=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(fn,"splitIdentifier");l(ow,"tokenizeFile");l(iw,"tokenizeQuery");l(cd,"listFiles");l(aw,"buildIndex");l(cw,"idf");l(lw,"score");ld="bm25-index";l(uw,"saveIndex");l(dw,"loadIndex");l(ud,"indexProject");l(dd,"queryFiles")});import mr from"node:fs/promises";import gs from"node:path";import{z as q}from"zod";async function hw(n,e){let t=Date.now();if(n.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=gs.join(e,"package.json"),r=await mr.readFile(s,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of n.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(s){return C(s)?{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: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function yw(n,e){let t=Date.now();if(n.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await bw(e),r=new Set(s),o=[],i=[];for(let a of n.languages){let c=fw[a];if(!c)continue;c.some(d=>r.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(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ww(n,e){let t=Date.now(),s=n.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of s){let a=i.location,c=gs.join(e,a);try{await mr.access(c),o.push(a)}catch{r.push(`${i.name} (${a})`)}}return r.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: ${r.join(", ")}`,durationMs:Date.now()-t}}async function kw(n,e){let t=Date.now();try{let s=await vw(e),r=n.fileCount,o=.1,i=Math.abs(s-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Sw(n,e){let t=Date.now();if(n.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],r=[];for(let o of n.antiPatterns){let i=gs.join(e,o.file);try{await mr.access(i),r.push(o.file)}catch{s.push(`${o.issue} (${o.file})`)}}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function pd(n,e){let t=Date.now(),s=await Promise.all([hw(n,e),yw(n,e),ww(n,e),kw(n,e),Sw(n,e)]),r=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:r===0,checks:s,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function bw(n){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=gs.join(r,i.name),c=gs.relative(n,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=gs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(n),Array.from(e)}async function vw(n){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=gs.join(r,i.name),c=gs.relative(n,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(n),e}var pw,mw,gw,ya,RA,fw,md=b(()=>{"use strict";U();Yr();pw=q.enum(["draft","verified","sealed"]),mw=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()}),gw=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()}),ya=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(mw),antiPatterns:q.array(gw),analyzedAt:q.string(),modelMetadata:dn.optional(),status:pw.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),RA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},fw={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(hw,"verifyFrameworks");l(yw,"verifyLanguages");l(ww,"verifyPatternLocations");l(kw,"verifyFileCount");l(Sw,"verifyAntiPatternFiles");l(pd,"semanticVerify");l(bw,"getProjectExtensions");l(vw,"countProjectFiles")});var wa,gd,fd=b(()=>{"use strict";Se();fe();We();wa=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ut(t,[])??[];s.push(e),await xs(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ut(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await xs(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await xs(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ut(t,null)}},gd=new wa});var hn,ka=b(()=>{"use strict";hn=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((s,r)=>s[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}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 ze,Zt=b(()=>{"use strict";fd();ka();fe();ne();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new hn({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 s=x.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){x.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),r=t(s);return await this.write(e,r),r}async publishEvent(e,t,s){let r={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await gd.publish(r)}async publishEntityEvent(e,t,s,r){let o=`${t}.${s}`,i={...r,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return x.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 Tw}from"node:crypto";var Sa,qe,yn=b(()=>{"use strict";md();fa();fe();Zt();Sa=class extends ze{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 s={...t,status:"draft"};ya.parse(s),await this.update(e,r=>({...r,draft:s,lastUpdated:v()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.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 s=this.computeSignature(t.draft),r=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:r};return ya.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}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 s=v();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),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:sd(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 s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),r=s.sealed??s.draft;return r?await pd(r,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 Tw("sha256").update(JSON.stringify(t)).digest("hex")}},qe=new Sa});var ba,Pw,wn,va=b(()=>{"use strict";fe();ne();ba=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=x.getDb(e),r=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),s.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=x.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?x.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return x.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},Pw=new ba,wn=Pw});import{z as P}from"zod";var Cw,go,Ew,xw,Aw,Ta,yd,wd,kd,Sd,hd,Rw,jw,bd,vd,Td,Dw,Iw,nR,Pa=b(()=>{"use strict";Yr();Cw=P.enum(["low","medium","high","critical"]),go=P.enum(["feature","bug","improvement","chore"]),Ew=P.enum(["active","backlog","previously_active"]),xw=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Aw=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ta=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()}),yd=P.object({output:P.string().min(1,"Subtask output is required"),summary:Ta}),wd=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:xw,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:Ta.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),kd=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),Sd=P.object({id:P.string(),description:P.string(),type:go.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(wd).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:kd.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:dn.optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),hd=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:go.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(wd).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:kd.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:dn.optional()}),Rw=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()}),jw=P.object({taskId:P.string(),title:P.string(),classification:go,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(Ta),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:Rw.optional()}),bd=P.object({currentTask:Sd.nullable(),previousTask:hd.nullable().optional(),pausedTasks:P.array(hd).optional(),taskHistory:P.array(jw).optional(),lastUpdated:P.string()}),vd=P.object({id:P.string(),description:P.string(),priority:Cw,type:go,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:Ew,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Td=P.object({tasks:P.array(vd),lastUpdated:P.string()}),Dw=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Iw=P.object({type:Aw,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),nR=P.object({projectId:P.string(),currentTask:Sd.nullable(),queue:P.array(vd),stats:Dw,recentActivity:P.array(Iw),lastSync:P.string()})});var gr,Ca,Ms,Ea=b(()=>{"use strict";gr={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"}},Ca=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 s=gr[e];if(s.transitions.includes(t))return{valid:!0};let r=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}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 gr[e]}getPrompt(e){return gr[e].prompt}getValidCommands(e){return gr[e].transitions}formatNextSteps(e){return gr[e].transitions.map(s=>{switch(s){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. ${s}`}})}},Ms=new Ca});var es,xa,Ct,Os=b(()=>{"use strict";Tt();fe();ne();es={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},xa=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=he(),r=v();return x.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return x.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(he(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?x.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):x.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=x.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in s&&(s[o]=r.count),s.total+=r.count}return s}restore(e,t){let s=x.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(x.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ct=new xa});var Aa,F,Et=b(()=>{"use strict";Tt();Pa();fe();Ea();Os();Zt();Aa=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",bd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Ms.getCurrentState(e),r=Ms.canTransition(s,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let r={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let r={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),r}async completeTask(e,t){let s=await this.read(e),r=s.currentTask;if(!r)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,s){let r=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=r.length>0?r.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:r,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let r={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let s=await this.read(e),r=this.getPausedTasksFromState(s);if(r.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,f)=>f!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:v(),sessionId:i.sessionId??he()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<r),i=s.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];Ct.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:v()}));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:v()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.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 s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of s){let g=p.feedback;g.stackConfirmed&&r.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(r)],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 s=await this.read(e);if(!s.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=yd.safeParse(t);if(!s.success){let f=s.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
440
440
  ${f.join(`
441
- `)}`)}let{output:r,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:v(),output:r,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:v()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:r,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 r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});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:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),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 r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});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:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),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 r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r},lastUpdated:v()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},F=new Aa});function Mw(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if($w.has(s)||s.includes("prjct"))return{level:ks.debug,name:"debug"};let e=ks[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function fo(s,e,t){return Pd>=s?(...n)=>console[t](e,...n):_w}var ks,$w,Pd,Ow,_w,Nw,H,hn=b(()=>{"use strict";ks={error:0,warn:1,info:2,debug:3},$w=new Set(["1","true","*"]);l(Mw,"getLogLevel");({level:Pd,name:Ow}=Mw()),_w=l(()=>{},"noop");l(fo,"createLogMethod");Nw={error:fo(ks.error,"[prjct:error]","error"),warn:fo(ks.warn,"[prjct:warn]","warn"),info:fo(ks.info,"[prjct:info]","log"),debug:fo(ks.debug,"[prjct:debug]","log"),isEnabled:l(()=>Pd>=0,"isEnabled"),level:l(()=>Ow,"level")},H=Nw});import Cd from"node:fs/promises";import Ed from"node:path";async function xd(s,e,t,n){let[r,o,i,a]=await Promise.all([Uw(s,e,n),Hw(s),Gw(s),Vw(s)]);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,Fw).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:r,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Uw(s,e,t){let n=[],r=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=dd(s,r,Ra*2);for(let a of o){if(n.length>=Ra)break;try{let c=Ed.join(e,a.path),u=await Cd.readFile(c,"utf-8");u.length>ho*3?n.push({path:a.path,content:`${u.slice(0,ho)}
442
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,ho),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>=Ra)break;if(!n.some(c=>c.path===a))try{let c=Ed.join(e,a),u=await Cd.readFile(c,"utf-8");n.push({path:a,content:u.slice(0,ho),reason:"entry point"})}catch{}}return n}async function Hw(s){try{let e=await qe.getActive(s);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 Gw(s){try{return(await F.getTaskHistory(s)).slice(0,Lw).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Vw(s){try{let e=ws.getActiveSummary(s);return Promise.resolve(e)}catch(e){return H.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var ho,Ra,Fw,Lw,Ad=b(()=>{"use strict";ha();ys();va();Et();hn();ho=3e3,Ra=15,Fw=15,Lw=10;l(xd,"buildAnalysisPayload");l(Uw,"selectCodeSamples");l(Hw,"getExistingPatterns");l(Gw,"getTaskHistory");l(Vw,"getPreviousAnalysisSummary")});import tn from"chalk";function Rd(s){return Math.ceil(s.length/Ww)}function Dd(s){let e=s.split(`
443
- `),t=[],n=null;for(let r=0;r<e.length;r++){let o=e[r],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=r-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:r,endLine:r}):n&&(n.content+=`
444
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Da(s){return s.includes("<!-- prjct:preserve")}function jd(s,e){let t=Dd(s),n=Dd(e),r={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Rd(s),tokensAfter:Rd(e),tokenDelta:0};r.tokenDelta=r.tokensAfter-r.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)Da(a.content)&&r.preserved.push({name:a.name,lineCount:a.content.split(`
445
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Da(u.content)||(r.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
441
+ `)}`)}let{output:r,summary:o}=s.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:v(),output:r,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:v()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:r,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 s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||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(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});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:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});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:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r},lastUpdated:v()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},F=new Aa});function Mw(){let n=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!n)return{level:-1,name:"disabled"};if($w.has(n)||n.includes("prjct"))return{level:kn.debug,name:"debug"};let e=kn[n]??-1,t=e>=0?n:"disabled";return{level:e,name:t}}function fo(n,e,t){return Pd>=n?(...s)=>console[t](e,...s):_w}var kn,$w,Pd,Ow,_w,Nw,H,fs=b(()=>{"use strict";kn={error:0,warn:1,info:2,debug:3},$w=new Set(["1","true","*"]);l(Mw,"getLogLevel");({level:Pd,name:Ow}=Mw()),_w=l(()=>{},"noop");l(fo,"createLogMethod");Nw={error:fo(kn.error,"[prjct:error]","error"),warn:fo(kn.warn,"[prjct:warn]","warn"),info:fo(kn.info,"[prjct:info]","log"),debug:fo(kn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Pd>=0,"isEnabled"),level:l(()=>Ow,"level")},H=Nw});import Cd from"node:fs/promises";import Ed from"node:path";async function xd(n,e,t,s){let[r,o,i,a]=await Promise.all([Uw(n,e,s),Hw(n),Gw(n),Vw(n)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,Fw).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:r,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Uw(n,e,t){let s=[],r=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=dd(n,r,Ra*2);for(let a of o){if(s.length>=Ra)break;try{let c=Ed.join(e,a.path),u=await Cd.readFile(c,"utf-8");u.length>ho*3?s.push({path:a.path,content:`${u.slice(0,ho)}
442
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,ho),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(s.length>=Ra)break;if(!s.some(c=>c.path===a))try{let c=Ed.join(e,a),u=await Cd.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,ho),reason:"entry point"})}catch{}}return s}async function Hw(n){try{let e=await qe.getActive(n);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 Gw(n){try{return(await F.getTaskHistory(n)).slice(0,Lw).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Vw(n){try{let e=wn.getActiveSummary(n);return Promise.resolve(e)}catch(e){return H.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var ho,Ra,Fw,Lw,Ad=b(()=>{"use strict";ha();yn();va();Et();fs();ho=3e3,Ra=15,Fw=15,Lw=10;l(xd,"buildAnalysisPayload");l(Uw,"selectCodeSamples");l(Hw,"getExistingPatterns");l(Gw,"getTaskHistory");l(Vw,"getPreviousAnalysisSummary")});import ts from"chalk";function Rd(n){return Math.ceil(n.length/Ww)}function jd(n){let e=n.split(`
443
+ `),t=[],s=null;for(let r=0;r<e.length;r++){let o=e[r],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=r-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:r,endLine:r}):s&&(s.content+=`
444
+ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function ja(n){return n.includes("<!-- prjct:preserve")}function Dd(n,e){let t=jd(n),s=jd(e),r={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Rd(n),tokensAfter:Rd(e),tokenDelta:0};r.tokenDelta=r.tokensAfter-r.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(s.map(a=>[a.name.toLowerCase(),a]));for(let a of t)ja(a.content)&&r.preserved.push({name:a.name,lineCount:a.content.split(`
445
+ `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(ja(u.content)||(r.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
446
446
  `).length}),r.hasChanges=!0)):(r.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
447
- `).length}),r.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Da(a.content)&&(r.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
448
- `).length}),r.hasChanges=!0)}return r}function Id(s,e={}){let{colorize:t=!0}=e,n=[],r=t?tn.green:p=>p,o=t?tn.red:p=>p,i=t?tn.yellow:p=>p,a=t?tn.dim:p=>p,c=t?tn.bold:p=>p;if(!s.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
449
- `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),s.added.length>0)for(let p of s.added)n.push(r(`+ \u2502 + ${p.name} (new)`));if(s.modified.length>0)for(let p of s.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(s.removed.length>0)for(let p of s.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(s.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of s.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=[];s.added.length>0&&u.push(r(`+${s.added.length} added`)),s.modified.length>0&&u.push(i(`~${s.modified.length} modified`)),s.removed.length>0&&u.push(o(`-${s.removed.length} removed`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=s.tokenDelta>=0?"+":"",m=s.tokenDelta>=0?r:o;return n.push(`Tokens: ${s.tokensBefore.toLocaleString()} \u2192 ${s.tokensAfter.toLocaleString()} (${m(d+s.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
450
- `)}function $d(s,e={}){let{colorize:t=!0}=e,n=[],r=t?tn.green:c=>c,o=t?tn.red:c=>c,i=t?tn.cyan:c=>c,a=t?tn.dim:c=>c;for(let c of s.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
451
- `))n.push(r(`+ ${u}`));n.push("")}for(let c of s.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
452
- `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
453
- `).length>5&&n.push(a(` ... ${c.before.split(`
447
+ `).length}),r.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!ja(a.content)&&(r.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
448
+ `).length}),r.hasChanges=!0)}return r}function Id(n,e={}){let{colorize:t=!0}=e,s=[],r=t?ts.green:p=>p,o=t?ts.red:p=>p,i=t?ts.yellow:p=>p,a=t?ts.dim:p=>p,c=t?ts.bold:p=>p;if(!n.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
449
+ `);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),n.added.length>0)for(let p of n.added)s.push(r(`+ \u2502 + ${p.name} (new)`));if(n.modified.length>0)for(let p of n.modified)s.push(i(`~ \u2502 ${p.name} (modified)`));if(n.removed.length>0)for(let p of n.removed)s.push(o(`- \u2502 - ${p.name} (removed)`));if(n.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let p of n.preserved)s.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}s.push(""),s.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=[];n.added.length>0&&u.push(r(`+${n.added.length} added`)),n.modified.length>0&&u.push(i(`~${n.modified.length} modified`)),n.removed.length>0&&u.push(o(`-${n.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=n.tokenDelta>=0?"+":"",m=n.tokenDelta>=0?r:o;return s.push(`Tokens: ${n.tokensBefore.toLocaleString()} \u2192 ${n.tokensAfter.toLocaleString()} (${m(d+n.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
450
+ `)}function $d(n,e={}){let{colorize:t=!0}=e,s=[],r=t?ts.green:c=>c,o=t?ts.red:c=>c,i=t?ts.cyan:c=>c,a=t?ts.dim:c=>c;for(let c of n.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
451
+ `))s.push(r(`+ ${u}`));s.push("")}for(let c of n.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
452
+ `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
453
+ `).length>5&&s.push(a(` ... ${c.before.split(`
454
454
  `).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
455
- `).slice(0,5))n.push(r(`+ ${u}`));c.after.split(`
456
- `).length>5&&n.push(a(` ... ${c.after.split(`
457
- `).length-5} more lines`))}n.push("")}for(let c of s.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
458
- `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
459
- `).length>5&&n.push(a(` ... ${c.before.split(`
460
- `).length-5} more lines`))}n.push("")}return n.join(`
461
- `)}var Ww,Md=b(()=>{"use strict";Ww=4;l(Rd,"estimateTokens");l(Dd,"parseMarkdownSections");l(Da,"isPreservedSection");l(jd,"generateSyncDiff");l(Id,"formatDiffPreview");l($d,"formatFullDiff")});var Bw,Od,_d,ja,Nd,Fd=b(()=>{"use strict";se();fe();Bw=1800*1e3,Od=50,_d=200,ja=class{static{l(this,"SessionTracker")}async read(e){try{return x.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){x.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Bw}}}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=v();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,n){let r=await this.read(e);if(!r.current)return;let o=v();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:n}),r.current.commands.length>Od&&(r.current.commands=r.current.commands.slice(-Od)),await this.write(e,r)}async trackFile(e,t,n){let r=await this.read(e);if(!r.current)return;let o=v();r.current.lastActivity=o,r.current.files.push({path:t,operation:n,timestamp:o}),r.current.files.length>_d&&(r.current.files=r.current.files.slice(-_d)),await this.write(e,r)}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,r=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=r-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:Kt(r-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Kt(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}},Nd=new ja});import{exec as zw}from"node:child_process";import{promisify as Jw}from"node:util";var Ia,qw,$a,yo,Ma=b(()=>{"use strict";se();U();Fd();Ia=Jw(zw),qw={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},$a=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...qw,...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=x.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 r=n.lastSync;try{let{stdout:c}=await Ia("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([Ia(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ia(`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(`
462
- `).filter(Boolean):[],r){let c=new Date(r),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 r=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let r of e.significantChanges.slice(0,5))t.push(` \u2022 ${r}`);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(`
455
+ `).slice(0,5))s.push(r(`+ ${u}`));c.after.split(`
456
+ `).length>5&&s.push(a(` ... ${c.after.split(`
457
+ `).length-5} more lines`))}s.push("")}for(let c of n.removed){if(s.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
458
+ `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
459
+ `).length>5&&s.push(a(` ... ${c.before.split(`
460
+ `).length-5} more lines`))}s.push("")}return s.join(`
461
+ `)}var Ww,Md=b(()=>{"use strict";Ww=4;l(Rd,"estimateTokens");l(jd,"parseMarkdownSections");l(ja,"isPreservedSection");l(Dd,"generateSyncDiff");l(Id,"formatDiffPreview");l($d,"formatFullDiff")});var Bw,Od,_d,Da,Nd,Fd=b(()=>{"use strict";ne();fe();Bw=1800*1e3,Od=50,_d=200,Da=class{static{l(this,"SessionTracker")}async read(e){try{return x.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){x.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Bw}}}isExpired(e,t){let s=new Date(e.lastActivity).getTime();return Date.now()-s>t}async touch(e){let t=await this.read(e),s=v();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,s){let r=await this.read(e);if(!r.current)return;let o=v();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:s}),r.current.commands.length>Od&&(r.current.commands=r.current.commands.slice(-Od)),await this.write(e,r)}async trackFile(e,t,s){let r=await this.read(e);if(!r.current)return;let o=v();r.current.lastActivity=o,r.current.files.push({path:t,operation:s,timestamp:o}),r.current.files.length>_d&&(r.current.files=r.current.files.slice(-_d)),await this.write(e,r)}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 s=t.current,r=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=r-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),m=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:Kt(r-o),idleSince:s.lastActivity,idleMs:a,expiresIn:Kt(u),commandCount:s.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}},Nd=new Da});import{exec as Jw}from"node:child_process";import{promisify as zw}from"node:util";var Ia,qw,$a,yo,Ma=b(()=>{"use strict";ne();U();Fd();Ia=zw(Jw),qw={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},$a=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...qw,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let s={};try{let c=x.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;s=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let r=s.lastSync;try{let{stdout:c}=await Ia("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([Ia(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ia(`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(`
462
+ `).filter(Boolean):[],r){let c=new Date(r),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(s){return t.reason=`Error checking staleness: ${y(s)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let s=[];if(e.lastSyncCommit&&s.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&s.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&s.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&s.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&s.push(`Files changed: ${e.changedFiles.length}`),s.length>0){let r=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let r of e.significantChanges.slice(0,5))t.push(` \u2022 ${r}`);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(`
463
463
  `)}async getSessionInfo(e){return Nd.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
464
- `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let r=new Set,o=[];for(let i of e.commands)r.has(i)||(r.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 r=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
465
- `)}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}},yo=l((s,e)=>new $a(s,e),"createStalenessChecker")});import Oa from"node:fs/promises";import nn from"node:path";function Zw(s){let e=[],t,n=new RegExp(Qw.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function ek(s,e,t){let n;if(s.startsWith("@/"))n=nn.join(t,"src",s.slice(2));else{let r=nn.dirname(nn.join(t,e));n=nn.resolve(r,s)}for(let r of Yw){let o=n+r;try{if((await Oa.stat(o)).isFile())return nn.relative(t,o)}catch{}}return null}async function Ld(s,e){let t=[],n=await Oa.readdir(s,{withFileTypes:!0});for(let r of n){if(Xw.has(r.name))continue;let o=nn.join(s,r.name);if(r.isDirectory())t.push(...await Ld(o,e));else if(r.isFile()){let i=nn.extname(r.name).toLowerCase();Kw.has(i)&&t.push(nn.relative(e,o))}}return t}async function tk(s){let e=await Ld(s,s),t={},n={},r=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 Oa.readFile(nn.join(s,u),"utf-8"),m=Zw(d),p=[];for(let g of m){let f=await ek(g,u,s);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,r+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function nk(s,e){N.setDoc(s,Ud,e)}function Hd(s){return N.getDoc(s,Ud)}async function Gd(s,e){let t=await tk(s);return nk(e,t),t}var Kw,Xw,Yw,Qw,Ud,_a=b(()=>{"use strict";se();Kw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Xw=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Yw=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Qw=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Zw,"extractImportSources");l(ek,"resolveImport");l(Ld,"listFiles");l(tk,"buildGraph");Ud="import-graph";l(nk,"saveGraph");l(Hd,"loadGraph");l(Gd,"indexImports")});function Vd(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=Hd(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:s.deleted,allAffected:a}}function Wd(s){let e=new Set;for(let t of s){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 Bd=b(()=>{"use strict";_a();l(Vd,"propagateChanges");l(Wd,"affectedDomains")});import Na from"node:fs/promises";import wo from"node:path";async function zd(s,e){let t=[],n=await Na.readdir(s,{withFileTypes:!0}).catch(()=>[]);for(let r of n){let o=String(r.name);if(rk.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=wo.join(s,o);if(r.isDirectory())t.push(...await zd(i,e));else if(r.isFile()){let a=wo.extname(o).toLowerCase();sk.has(a)&&t.push(wo.relative(e,i))}}return t}function ok(s){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(s).toString(36)}`;let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function ik(s){let e=await zd(s,s),t=new Map,n=100;for(let r=0;r<e.length;r+=n){let o=e.slice(r,r+n),i=await Promise.all(o.map(async a=>{try{let c=wo.join(s,a),[u,d]=await Promise.all([Na.readFile(c,"utf-8"),Na.stat(c)]);return{path:a,hash:ok(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 ak(s,e){let t=[],n=[],r=[];for(let[i,a]of s){let c=e.get(i);c?c.hash!==a.hash?n.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())s.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:r}}function Fa(s,e){let t=N.getDb(s);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)n.run(r.path,r.hash,r.size,r.mtime)})(),N.setDoc(s,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function ck(s){let e=new Map;try{let t=N.query(s,"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 La(s,e){let[t,n]=await Promise.all([ik(s),Promise.resolve(ck(e))]);return{diff:ak(t,n),currentHashes:t}}function Jd(s){return N.hasDoc(s,"file-hashes-meta")}var sk,rk,qd=b(()=>{"use strict";se();sk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),rk=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(zd,"listProjectFiles");l(ok,"hashContent");l(ik,"computeHashes");l(ak,"diffHashes");l(Fa,"saveHashes");l(ck,"loadHashes");l(La,"detectChanges");l(Jd,"hasHashRegistry")});import{exec as lk}from"node:child_process";import{promisify as uk}from"node:util";async function mk(s,e=100){try{let{stdout:t}=await dk(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:s,maxBuffer:10485760}),n=[],r=null;for(let o of t.split(`
466
- `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=Xd&&n.push(r),r=new Set):i&&r&&gk(i)&&r.add(i)}return r&&r.size>0&&r.size<=Xd&&n.push(r),n}catch{return[]}}function gk(s){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(s)&&!s.includes("node_modules/")}async function fk(s,e=100){let t=await mk(s,e),n=new Map,r=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=hk(a[c],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<Kd||m<Kd)continue;let p=d+m-a,g=p>0?a/p:0;g<pk||(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 hk(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function wk(s,e){N.setDoc(s,yk,e)}async function Yd(s,e,t=100){let n=await fk(s,t);return wk(e,n),n}var dk,pk,Kd,Xd,yk,Qd=b(()=>{"use strict";se();dk=uk(lk),pk=.1,Kd=2,Xd=30;l(mk,"parseGitLog");l(gk,"isSourceFile");l(fk,"buildMatrix");l(hk,"pairKey");yk="cochange-index";l(wk,"saveMatrix");l(Yd,"indexCoChanges")});import{exec as kk}from"node:child_process";import{promisify as Sk}from"node:util";async function ko(s){try{let{stdout:e}=await bk(s,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function vk(){let s=await ko("gh api user --jq .login");return s.success&&s.output||(s=await ko("git config --global github.user"),s.success&&s.output)?s.output:null}async function Tk(){let s=await ko("git config user.name");return s.success&&s.output?s.output:null}async function Pk(){let s=await ko("git config user.email");return s.success&&s.output?s.output:null}async function Ss(){let[s,e,t]=await Promise.all([vk(),Tk(),Pk()]);return{github:s,email:t,name:e||s||"Unknown"}}var bk,So=b(()=>{"use strict";bk=Sk(kk);l(ko,"execCommand");l(vk,"detectGitHubUsername");l(Tk,"detectGitName");l(Pk,"detectGitEmail");l(Ss,"detect")});import Nn from"node:fs/promises";import Ck from"node:path";import*as bo from"jsonc-parser";function Zd(s){let e=[],t=bo.parse(s,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${bo.printParseErrorCode(n.error)}`)}return t}var Ha,Ek,$,ft=b(()=>{"use strict";Yt();U();fe();Pt();So();Se();l(Zd,"parseJsonc");Ha=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),n=await Nn.readFile(t,"utf-8");return Zd(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${Z(t)}`),null}}async writeConfig(e,t){let n=A.getLocalConfigPath(e),r=A.getLegacyPrjctPath(e);await Nn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
467
- `,"utf-8")}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),n=await Nn.readFile(t,"utf-8");return Zd(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${Z(t)}`),null}}async writeGlobalConfig(e,t){let n=A.getGlobalProjectConfigPath(e),r=A.getGlobalProjectPath(e);await Nn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
468
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=v();t={projectId:e,authors:[],version:xe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=A.generateProjectId(e),r=A.getGlobalProjectPath(n),o=A.getDisplayPath(r),i=v(),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:xe,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=v(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=A.getGlobalProjectPath(r.projectId);try{return(await Nn.readdir(Ck.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:A.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(r=>r.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=v();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 r=n.authors.find(o=>o.github===t);r&&(r.lastActivity=v(),n.lastSync=r.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await Ss(),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=A.generateProjectId(e);return{projectId:n,dataPath:A.getDisplayPath(A.getGlobalProjectPath(n))}}},Ek=new Ha,$=Ek});import{execFile as xk}from"node:child_process";import Ga from"node:fs/promises";import ep from"node:os";import Va from"node:path";import{promisify as Ak}from"node:util";function jk(){let s=ye("mcp-config.json");if(!s)return{mcpServers:{context7:Wa}};try{return JSON.parse(s)}catch{return{mcpServers:{context7:Wa}}}}function sp(){return jk().mcpServers?.context7||Wa}function tp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Va.join(ep.tmpdir(),"prjct-context7-test","mcp.json"):Va.join(ep.homedir(),".claude","mcp.json")}async function np(s){try{let e=await Ga.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(P(e))return{};throw e}}async function Ik(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let s=sp(),e=[...s.args||[],"--help"];await Rk(s.command||"npx",e,{timeout:15e3})}var Rk,Wa,Dk,bs,Ba,$k,sn,fr=b(()=>{"use strict";Wt();U();Rk=Ak(xk),Wa={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Dk=300*1e3,bs=null;l(jk,"parseTemplateConfig");l(sp,"getContext7Config");l(tp,"getConfigPath");l(np,"readConfig");l(Ik,"runSmokeCheck");Ba=class{static{l(this,"Context7Service")}async install(){let e=tp(),t=Va.dirname(e);await Ga.mkdir(t,{recursive:!0});let n=await np(e),r=n.mcpServers||{};return r.context7=sp(),n.mcpServers=r,await Ga.writeFile(e,JSON.stringify(n,null,2),"utf-8"),bs=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(bs&&Date.now()-bs.at<Dk)return bs.status;let e=tp(),r=((await np(e)).mcpServers||{}).context7;if(!r?.command||!Array.isArray(r.args)||r.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Ik();let o={installed:!0,verified:!0,configPath:e};return bs={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return bs={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}},$k=new Ba,sn=$k});var vo,za=b(()=>{"use strict";vo={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 'prjct linear setup' to configure Linear MCP"},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 Ja(s,e){return{...vo[s],...e}}function To(s,e,t){return{message:s,hint:e,...t}}var Po=b(()=>{"use strict";za();za();l(Ja,"getError");l(To,"createError")});import{execSync as qa}from"node:child_process";var Co,Ka,Eo,hr,Xa=b(()=>{"use strict";Po();Co={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Ka=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Co[e];if(!n)return this.checkUnknownTool(e);let r=this.executeCheck(n);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Co[e],r=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Eo(r)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(r=>{let o=Co[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
464
+ `);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let r=new Set,o=[];for(let i of e.commands)r.has(i)||(r.add(i),o.push(i));s.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&s.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),s.push(`Idle: ${e.expiresIn} until timeout`),s.length>0){let r=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
465
+ `)}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}},yo=l((n,e)=>new $a(n,e),"createStalenessChecker")});import Oa from"node:fs/promises";import ss from"node:path";function Zw(n){let e=[],t,s=new RegExp(Qw.source,"g");for(;(t=s.exec(n))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function ek(n,e,t){let s;if(n.startsWith("@/"))s=ss.join(t,"src",n.slice(2));else{let r=ss.dirname(ss.join(t,e));s=ss.resolve(r,n)}for(let r of Yw){let o=s+r;try{if((await Oa.stat(o)).isFile())return ss.relative(t,o)}catch{}}return null}async function Ld(n,e){let t=[],s=await Oa.readdir(n,{withFileTypes:!0});for(let r of s){if(Xw.has(r.name))continue;let o=ss.join(n,r.name);if(r.isDirectory())t.push(...await Ld(o,e));else if(r.isFile()){let i=ss.extname(r.name).toLowerCase();Kw.has(i)&&t.push(ss.relative(e,o))}}return t}async function tk(n){let e=await Ld(n,n),t={},s={},r=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 Oa.readFile(ss.join(n,u),"utf-8"),m=Zw(d),p=[];for(let g of m){let f=await ek(g,u,n);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,r+=d.length;for(let m of d)s[m]||(s[m]=[]),s[m].push(u)}}return{forward:t,reverse:s,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function sk(n,e){N.setDoc(n,Ud,e)}function Hd(n){return N.getDoc(n,Ud)}async function Gd(n,e){let t=await tk(n);return sk(e,t),t}var Kw,Xw,Yw,Qw,Ud,_a=b(()=>{"use strict";ne();Kw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Xw=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Yw=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Qw=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Zw,"extractImportSources");l(ek,"resolveImport");l(Ld,"listFiles");l(tk,"buildGraph");Ud="import-graph";l(sk,"saveGraph");l(Hd,"loadGraph");l(Gd,"indexImports")});function Vd(n,e){let t=[...n.added,...n.modified],s=new Set(t),r=new Set,o=Hd(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:n.deleted,allAffected:a}}function Wd(n){let e=new Set;for(let t of n){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var Bd=b(()=>{"use strict";_a();l(Vd,"propagateChanges");l(Wd,"affectedDomains")});import Na from"node:fs/promises";import wo from"node:path";async function Jd(n,e){let t=[],s=await Na.readdir(n,{withFileTypes:!0}).catch(()=>[]);for(let r of s){let o=String(r.name);if(rk.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=wo.join(n,o);if(r.isDirectory())t.push(...await Jd(i,e));else if(r.isFile()){let a=wo.extname(o).toLowerCase();nk.has(a)&&t.push(wo.relative(e,i))}}return t}function ok(n){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(n).toString(36)}`;let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function ik(n){let e=await Jd(n,n),t=new Map,s=100;for(let r=0;r<e.length;r+=s){let o=e.slice(r,r+s),i=await Promise.all(o.map(async a=>{try{let c=wo.join(n,a),[u,d]=await Promise.all([Na.readFile(c,"utf-8"),Na.stat(c)]);return{path:a,hash:ok(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 ak(n,e){let t=[],s=[],r=[];for(let[i,a]of n){let c=e.get(i);c?c.hash!==a.hash?s.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())n.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:r}}function Fa(n,e){let t=N.getDb(n);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)s.run(r.path,r.hash,r.size,r.mtime)})(),N.setDoc(n,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function ck(n){let e=new Map;try{let t=N.query(n,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function La(n,e){let[t,s]=await Promise.all([ik(n),Promise.resolve(ck(e))]);return{diff:ak(t,s),currentHashes:t}}function zd(n){return N.hasDoc(n,"file-hashes-meta")}var nk,rk,qd=b(()=>{"use strict";ne();nk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),rk=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Jd,"listProjectFiles");l(ok,"hashContent");l(ik,"computeHashes");l(ak,"diffHashes");l(Fa,"saveHashes");l(ck,"loadHashes");l(La,"detectChanges");l(zd,"hasHashRegistry")});import{exec as lk}from"node:child_process";import{promisify as uk}from"node:util";async function mk(n,e=100){try{let{stdout:t}=await dk(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),s=[],r=null;for(let o of t.split(`
466
+ `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=Xd&&s.push(r),r=new Set):i&&r&&gk(i)&&r.add(i)}return r&&r.size>0&&r.size<=Xd&&s.push(r),s}catch{return[]}}function gk(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}async function fk(n,e=100){let t=await mk(n,e),s=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=hk(a[c],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[c,u]=i.split("\0"),d=s.get(c)||0,m=s.get(u)||0;if(d<Kd||m<Kd)continue;let p=d+m-a,g=p>0?a/p:0;g<pk||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function hk(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function wk(n,e){N.setDoc(n,yk,e)}async function Yd(n,e,t=100){let s=await fk(n,t);return wk(e,s),s}var dk,pk,Kd,Xd,yk,Qd=b(()=>{"use strict";ne();dk=uk(lk),pk=.1,Kd=2,Xd=30;l(mk,"parseGitLog");l(gk,"isSourceFile");l(fk,"buildMatrix");l(hk,"pairKey");yk="cochange-index";l(wk,"saveMatrix");l(Yd,"indexCoChanges")});import{exec as kk}from"node:child_process";import{promisify as Sk}from"node:util";async function ko(n){try{let{stdout:e}=await bk(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function vk(){let n=await ko("gh api user --jq .login");return n.success&&n.output||(n=await ko("git config --global github.user"),n.success&&n.output)?n.output:null}async function Tk(){let n=await ko("git config user.name");return n.success&&n.output?n.output:null}async function Pk(){let n=await ko("git config user.email");return n.success&&n.output?n.output:null}async function Sn(){let[n,e,t]=await Promise.all([vk(),Tk(),Pk()]);return{github:n,email:t,name:e||n||"Unknown"}}var bk,So=b(()=>{"use strict";bk=Sk(kk);l(ko,"execCommand");l(vk,"detectGitHubUsername");l(Tk,"detectGitName");l(Pk,"detectGitEmail");l(Sn,"detect")});import _s from"node:fs/promises";import Ck from"node:path";import*as bo from"jsonc-parser";function Zd(n){let e=[],t=bo.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${bo.printParseErrorCode(s.error)}`)}return t}var Ha,Ek,$,ft=b(()=>{"use strict";Yt();U();fe();Pt();So();Se();l(Zd,"parseJsonc");Ha=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await _s.readFile(t,"utf-8");return Zd(s)}catch(t){return C(t)||console.warn(`Warning: Could not read config at ${e}: ${Z(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e),r=A.getLegacyPrjctPath(e);await _s.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await _s.writeFile(s,`${o}
467
+ `,"utf-8")}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await _s.readFile(t,"utf-8");return Zd(s)}catch(t){return C(t)||console.warn(`Warning: Could not read global config for ${e}: ${Z(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e),r=A.getGlobalProjectPath(e);await _s.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await _s.writeFile(s,`${o}
468
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=v();t={projectId:e,authors:[],version:xe,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=A.generateProjectId(e),r=A.getGlobalProjectPath(s),o=A.getDisplayPath(r),i=v(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:xe,created:i,lastSync:i};return await this.writeGlobalConfig(s,c),a}async updateLastSync(e){let t=await this.getProjectId(e),s=await this.readGlobalConfig(t);s&&(s.lastSync=v(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=A.getGlobalProjectPath(r.projectId);try{return(await _s.readdir(Ck.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:A.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(r=>r.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=v();s.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),s.lastSync=o,await this.writeGlobalConfig(e,s)}async updateAuthorActivity(e,t){let s=await this.readGlobalConfig(e);if(!s||!s.authors)return;let r=s.authors.find(o=>o.github===t);r&&(r.lastActivity=v(),s.lastSync=r.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Sn(),s=await this.getProjectId(e);return await this.addAuthor(s,{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 s=await this.readConfig(e);s&&(s.showMetrics=t,await this.writeConfig(e,s))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let s=A.generateProjectId(e);return{projectId:s,dataPath:A.getDisplayPath(A.getGlobalProjectPath(s))}}},Ek=new Ha,$=Ek});import{execFile as xk}from"node:child_process";import Ga from"node:fs/promises";import ep from"node:os";import Va from"node:path";import{promisify as Ak}from"node:util";function Dk(){let n=ye("mcp-config.json");if(!n)return{mcpServers:{context7:Wa}};try{return JSON.parse(n)}catch{return{mcpServers:{context7:Wa}}}}function np(){return Dk().mcpServers?.context7||Wa}function tp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Va.join(ep.tmpdir(),"prjct-context7-test","mcp.json"):Va.join(ep.homedir(),".claude","mcp.json")}async function sp(n){try{let e=await Ga.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(C(e))return{};throw e}}async function Ik(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let n=np(),e=[...n.args||[],"--help"];await Rk(n.command||"npx",e,{timeout:15e3})}var Rk,Wa,jk,bn,Ba,$k,ns,fr=b(()=>{"use strict";Wt();U();Rk=Ak(xk),Wa={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},jk=300*1e3,bn=null;l(Dk,"parseTemplateConfig");l(np,"getContext7Config");l(tp,"getConfigPath");l(sp,"readConfig");l(Ik,"runSmokeCheck");Ba=class{static{l(this,"Context7Service")}async install(){let e=tp(),t=Va.dirname(e);await Ga.mkdir(t,{recursive:!0});let s=await sp(e),r=s.mcpServers||{};return r.context7=np(),s.mcpServers=r,await Ga.writeFile(e,JSON.stringify(s,null,2),"utf-8"),bn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(bn&&Date.now()-bn.at<jk)return bn.status;let e=tp(),r=((await sp(e)).mcpServers||{}).context7;if(!r?.command||!Array.isArray(r.args)||r.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Ik();let o={installed:!0,verified:!0,configPath:e};return bn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return bn={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}},$k=new Ba,ns=$k});var vo,Ja=b(()=>{"use strict";vo={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 'prjct linear setup' to configure Linear MCP"},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 za(n,e){return{...vo[n],...e}}function To(n,e,t){return{message:n,hint:e,...t}}var Po=b(()=>{"use strict";Ja();Ja();l(za,"getError");l(To,"createError")});import{execSync as qa}from"node:child_process";var Co,Ka,Eo,hr,Xa=b(()=>{"use strict";Po();Co={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Ka=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=Co[e];if(!s)return this.checkUnknownTool(e);let r=this.executeCheck(s);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Co[e],r=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Eo(r)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(r=>{let o=Co[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
469
469
  `);throw new Eo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
470
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Co),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=qa(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:To(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qa(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qa(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:To(`${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())}},Eo=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}},hr=new Ka});import{execSync as Mk}from"node:child_process";import Ok from"node:fs/promises";import xo from"node:path";function _k(s){return s.trim().toLowerCase()}async function Nk(s){try{return await Ok.access(s),!0}catch{return!1}}function Fk(){let s=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(s)return s;try{let e=vt.resolve("prjct-cli/package.json");return xo.dirname(e)}catch{return null}}function Lk(){let s=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(s)return s;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return Mk("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).trim().replace(/\r?\n/g,"")}catch{return null}}function Uk(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||pe}function Hk(){let s=[],e=Fk();e&&s.push({source:"package-resolve",root:e});let t=Lk();return t&&s.push({source:"npm-root-g",root:xo.join(t,"prjct-cli")}),s.push({source:"local-dev",root:Uk()}),s}function Gk(){let e=mn("commands/").filter(t=>t.endsWith(".md")).map(t=>xo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function rp(s){return s instanceof Error&&typeof s.code=="string"&&typeof s.message=="string"}var yr,Ya,op,ip=b(()=>{"use strict";Wt();Pt();yr=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(_k,"normalizeCommand");l(Nk,"fileExists");l(Fk,"getPackageResolveRoot");l(Lk,"getNpmGlobalRoot");l(Uk,"getLocalDevRoot");l(Hk,"getCandidateRoots");l(Gk,"getCatalogFromTemplates");Ya=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return Gk()}validatePCommand(e){let t=_k(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 yr("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 yr(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(ye(n))return{command:t.command,templatePath:n,source:"bundle"}}for(let n of Hk()){let r=xo.join(n.root,"templates","commands",`${t.command}.md`);if(await Nk(r))return{command:t.command,templatePath:r,source:n.source}}throw new yr("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(rp,"isPCommandResolveError");op=new Ya});function wr(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return Vk[s]}var re,Qa,Za,Ao,Vk,$t,ap,Fn=b(()=>{"use strict";re={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Qa=["feature","spec","design","refactor","migrate"],Za=["ship","cleanup","git","migrate"],Ao=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Vk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(wr,"getTimeout");$t={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},ap={HISTORY_MAX:100}});import vs from"node:fs/promises";import Wk from"node:os";import cp from"node:path";var ec,Bk,Ro,tc=b(()=>{"use strict";U();ec=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Wk.homedir(),this.configDir=cp.join(this.homeDir,".prjct-cli","config"),this.configFile=cp.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await vs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await vs.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 r={version:e,provider:n,lastInstall:new Date().toISOString(),path:t};return await vs.writeFile(this.configFile,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return console.error("[editors-config] Error saving config:",y(r)),!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 vs.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 vs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await vs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Bk=new ec,Ro=Bk});var sc={};un(sc,{installAntigravitySkill:()=>mp,installCodexSkill:()=>nc,needsAntigravityInstallation:()=>Yk,run:()=>pp,verifyCodexPRouterReady:()=>jo});import{execSync as zk}from"node:child_process";import{createHash as Jk}from"node:crypto";import J from"node:fs/promises";import Ln from"node:os";import ee from"node:path";import me from"chalk";async function qk(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!hr.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${s.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${s.displayName} not found. Installing...`)),console.log(""),zk(`npm install -g ${e}`,{stdio:"inherit",timeout:wr("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${s.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${s.displayName}: ${n.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function pp(){let s=await nr(),e=await Ki(),t=at[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let c=at[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await qk(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ae.detectActiveProvider()){let p=await Ae.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ae.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ae.installDocs(),await tS(),await sn.ensureReady()}}else if(a==="gemini"){await Kk()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await Xk();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await to()).installed&&(await mp()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await Rn()).installed){if(!(await nc()).success)throw new Error("Codex skill installation failed");let c=await jo({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${me.green("\u2713")} Codex skill installed`),console.log(` ${me.green("\u2713")} Codex p. router ready`)}await Ro.saveConfig(xe,await Ae.getInstallPath(),e.provider),await eS();for(let a of n.providers)nS(a,at[a.provider]);return n}async function Kk(){try{let s=ee.join(Ln.homedir(),".gemini","commands"),e=ee.join(s,"p.toml");await J.mkdir(s,{recursive:!0});let t=ye("commands/p.toml");if(t)return await J.writeFile(e,t,"utf-8"),!0;let n=ee.join(pe,"templates","commands","p.toml");return await D(n)?(await J.copyFile(n,e),!0):!1}catch(s){return H.warn(`Gemini router warning: ${y(s)}`),!1}}async function Xk(){try{let s=ee.join(Ln.homedir(),".gemini"),e=ee.join(s,"GEMINI.md");await J.mkdir(s,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=ee.join(pe,"templates","global","GEMINI.md");t=await J.readFile(p,"utf-8")}let n="",r=!1;try{n=await J.readFile(e,"utf-8"),r=!0}catch(p){if(P(p))r=!1;else throw p}if(!r)return await J.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}
470
+ ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Co),s=new Map;for(let r of t)s.set(r,this.checkTool(r));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=qa(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let r=t.match(e.versionRegex);s=r?r[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:To(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qa(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qa(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:To(`${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())}},Eo=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}},hr=new Ka});import{execSync as Mk}from"node:child_process";import Ok from"node:fs/promises";import xo from"node:path";function _k(n){return n.trim().toLowerCase()}async function Nk(n){try{return await Ok.access(n),!0}catch{return!1}}function Fk(){let n=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(n)return n;try{let e=vt.resolve("prjct-cli/package.json");return xo.dirname(e)}catch{return null}}function Lk(){let n=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(n)return n;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return Mk("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).trim().replace(/\r?\n/g,"")}catch{return null}}function Uk(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||pe}function Hk(){let n=[],e=Fk();e&&n.push({source:"package-resolve",root:e});let t=Lk();return t&&n.push({source:"npm-root-g",root:xo.join(t,"prjct-cli")}),n.push({source:"local-dev",root:Uk()}),n}function Gk(){let e=ps("commands/").filter(t=>t.endsWith(".md")).map(t=>xo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function rp(n){return n instanceof Error&&typeof n.code=="string"&&typeof n.message=="string"}var yr,Ya,op,ip=b(()=>{"use strict";Wt();Pt();yr=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,s){super(t),this.name="PCommandResolverError",this.code=e,this.fix=s}};l(_k,"normalizeCommand");l(Nk,"fileExists");l(Fk,"getPackageResolveRoot");l(Lk,"getNpmGlobalRoot");l(Uk,"getLocalDevRoot");l(Hk,"getCandidateRoots");l(Gk,"getCatalogFromTemplates");Ya=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return Gk()}validatePCommand(e){let t=_k(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 yr("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 yr(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 s=`commands/${t.command}.md`;if(ye(s))return{command:t.command,templatePath:s,source:"bundle"}}for(let s of Hk()){let r=xo.join(s.root,"templates","commands",`${t.command}.md`);if(await Nk(r))return{command:t.command,templatePath:r,source:s.source}}throw new yr("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(rp,"isPCommandResolveError");op=new Ya});function wr(n){let e=`PRJCT_TIMEOUT_${n}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return Vk[n]}var re,Qa,Za,Ao,Vk,$t,ap,Ns=b(()=>{"use strict";re={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Qa=["feature","spec","design","refactor","migrate"],Za=["ship","cleanup","git","migrate"],Ao=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Vk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(wr,"getTimeout");$t={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},ap={HISTORY_MAX:100}});import vn from"node:fs/promises";import Wk from"node:os";import cp from"node:path";var ec,Bk,Ro,tc=b(()=>{"use strict";U();ec=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Wk.homedir(),this.configDir=cp.join(this.homeDir,".prjct-cli","config"),this.configFile=cp.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await vn.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await vn.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,s="claude"){try{await this.ensureConfigDir();let r={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await vn.writeFile(this.configFile,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return console.error("[editors-config] Error saving config:",y(r)),!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 vn.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 vn.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await vn.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Bk=new ec,Ro=Bk});var nc={};ls(nc,{installAntigravitySkill:()=>mp,installCodexSkill:()=>sc,needsAntigravityInstallation:()=>Yk,run:()=>pp,verifyCodexPRouterReady:()=>Do});import{execSync as Jk}from"node:child_process";import{createHash as zk}from"node:crypto";import z from"node:fs/promises";import Fs from"node:os";import ee from"node:path";import me from"chalk";async function qk(n){let e=n.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!hr.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${n.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${n.displayName} not found. Installing...`)),console.log(""),Jk(`npm install -g ${e}`,{stdio:"inherit",timeout:wr("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${n.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${n.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${n.displayName}: ${s.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function pp(){let n=await sr(),e=await Ki(),t=at[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let c=at[a],u=n[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await qk(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ae.detectActiveProvider()){let p=await Ae.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let g=await Ae.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Ae.installDocs(),await tS(),await ns.ensureReady()}}else if(a==="gemini"){await Kk()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await Xk();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await to()).installed&&(await mp()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await As()).installed){if(!(await sc()).success)throw new Error("Codex skill installation failed");let c=await Do({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${me.green("\u2713")} Codex skill installed`),console.log(` ${me.green("\u2713")} Codex p. router ready`)}await Ro.saveConfig(xe,await Ae.getInstallPath(),e.provider),await eS();for(let a of s.providers)sS(a,at[a.provider]);return s}async function Kk(){try{let n=ee.join(Fs.homedir(),".gemini","commands"),e=ee.join(n,"p.toml");await z.mkdir(n,{recursive:!0});let t=ye("commands/p.toml");if(t)return await z.writeFile(e,t,"utf-8"),!0;let s=ee.join(pe,"templates","commands","p.toml");return await j(s)?(await z.copyFile(s,e),!0):!1}catch(n){return H.warn(`Gemini router warning: ${y(n)}`),!1}}async function Xk(){try{let n=ee.join(Fs.homedir(),".gemini"),e=ee.join(n,"GEMINI.md");await z.mkdir(n,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=ee.join(pe,"templates","global","GEMINI.md");t=await z.readFile(p,"utf-8")}let s="",r=!1;try{s=await z.readFile(e,"utf-8"),r=!0}catch(p){if(C(p))r=!1;else throw p}if(!r)return await z.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(!(s.includes(o)&&s.includes(i))){let p=`${s}
471
471
 
472
- ${t}`;return await J.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 J.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(s){return H.warn(`Gemini config warning: ${y(s)}`),{success:!1,action:null}}}async function mp(){try{let s=ee.join(Ln.homedir(),".gemini","antigravity","skills"),e=ee.join(s,"prjct"),t=ee.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await D(t),r=ye("antigravity/SKILL.md");if(!r){let o=ee.join(pe,"templates","antigravity","SKILL.md");if(!await D(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await J.readFile(o,"utf-8")}return await J.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return H.warn(`Antigravity skill warning: ${y(s)}`),{success:!1,action:null}}}async function Yk(){let s=await to();return s.installed&&!s.skillInstalled}function fp(){return ee.join(Ln.homedir(),".codex","skills","prjct","SKILL.md")}function Qk(s){return`<!-- ${gp}: ${JSON.stringify({version:xe,templateHash:s})} -->`}function lp(s){let e=s.match(new RegExp(`<!--\\s*${gp}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Zk(s){return Jk("sha256").update(s).digest("hex")}async function hp(){let s=ye("codex/SKILL.md");if(s)return s;let e=ee.join(pe,"templates","codex","SKILL.md");return await D(e)?J.readFile(e,"utf-8"):null}function yp(s){let e=s.trimEnd(),t=Zk(e),n=Qk(t);return{content:`${e}
472
+ ${t}`;return await z.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=s.substring(0,s.indexOf(o)),u=s.substring(s.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await z.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(n){return H.warn(`Gemini config warning: ${y(n)}`),{success:!1,action:null}}}async function mp(){try{let n=ee.join(Fs.homedir(),".gemini","antigravity","skills"),e=ee.join(n,"prjct"),t=ee.join(e,"SKILL.md");await z.mkdir(e,{recursive:!0});let s=await j(t),r=ye("antigravity/SKILL.md");if(!r){let o=ee.join(pe,"templates","antigravity","SKILL.md");if(!await j(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await z.readFile(o,"utf-8")}return await z.writeFile(t,r,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(n){return H.warn(`Antigravity skill warning: ${y(n)}`),{success:!1,action:null}}}async function Yk(){let n=await to();return n.installed&&!n.skillInstalled}function fp(){return ee.join(Fs.homedir(),".codex","skills","prjct","SKILL.md")}function Qk(n){return`<!-- ${gp}: ${JSON.stringify({version:xe,templateHash:n})} -->`}function lp(n){let e=n.match(new RegExp(`<!--\\s*${gp}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Zk(n){return zk("sha256").update(n).digest("hex")}async function hp(){let n=ye("codex/SKILL.md");if(n)return n;let e=ee.join(pe,"templates","codex","SKILL.md");return await j(e)?z.readFile(e,"utf-8"):null}function yp(n){let e=n.trimEnd(),t=Zk(e),s=Qk(t);return{content:`${e}
473
473
 
474
- ${n}
475
- `,templateHash:t}}async function nc(){try{let s=fp(),e=ee.dirname(s);await J.mkdir(e,{recursive:!0});let t=await D(s),n=await hp();if(!n)return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=yp(n);return t&&await J.readFile(s,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await J.writeFile(s,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(s){return H.warn(`Codex skill warning: ${y(s)}`),{success:!1,action:null}}}async function jo(s={}){let e=fp();if(!(await Rn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await hp();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 r=yp(n),o=l(async()=>s.autoRepair?(await nc()).success:!1,"maybeRepair"),i="";if(!await D(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await J.readFile(e,"utf-8").catch(()=>"");let a=lp(i);if(!(a?.version===xe&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await J.readFile(e,"utf-8").catch(()=>""),a=lp(i),!(a?.version===xe&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await op.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=rp(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function eS(){try{let s=ee.join(Ln.homedir(),".prjct-cli","projects");if(!await D(s))return;let e=(await J.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let r=x.getDoc(n,"project");if(!r)continue;r.cliVersion!==xe&&(r.cliVersion=xe,x.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${xe}`)}catch(s){P(s)||H.warn(`Migration warning: ${y(s)}`)}}async function up(s,e){let t={};if(await D(s))try{t=JSON.parse(await J.readFile(s,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await J.writeFile(s,JSON.stringify(t,null,2))}async function tS(){try{let s=ee.join(Ln.homedir(),".claude"),e=ee.join(s,"settings.json"),t=ee.join(s,"prjct-statusline.sh"),n=ee.join(Ln.homedir(),".prjct-cli","statusline"),r=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(pe,"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 D(s)||await J.mkdir(s,{recursive:!0}),await D(n)||await J.mkdir(n,{recursive:!0}),await D(o)||await J.mkdir(o,{recursive:!0}),await D(i)||await J.mkdir(i,{recursive:!0}),await D(a)||await J.mkdir(a,{recursive:!0}),await D(r)){let k=await J.readFile(r,"utf8");if(k.includes("CLI_VERSION=")){let w=k.match(/CLI_VERSION="([^"]*)"/);if(w&&w[1]!==xe){let C=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`);await J.writeFile(r,C,{mode:493})}await Do(p,i),await Do(g,a),await dp(t,r),await up(e,t);return}}if(await D(d)){let k=await J.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`),await J.writeFile(r,k,{mode:493}),await Do(p,i),await Do(g,a),await D(m)){let w=await J.readdir(m);for(let C of w){let T=ee.join(m,C),O=ee.join(o,C);await J.copyFile(T,O)}}!await D(c)&&await D(f)&&await J.copyFile(f,c)}else{let k=`#!/bin/bash
474
+ ${s}
475
+ `,templateHash:t}}async function sc(){try{let n=fp(),e=ee.dirname(n);await z.mkdir(e,{recursive:!0});let t=await j(n),s=await hp();if(!s)return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=yp(s);return t&&await z.readFile(n,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await z.writeFile(n,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return H.warn(`Codex skill warning: ${y(n)}`),{success:!1,action:null}}}async function Do(n={}){let e=fp();if(!(await As()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await hp();if(!s)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 r=yp(s),o=l(async()=>n.autoRepair?(await sc()).success:!1,"maybeRepair"),i="";if(!await j(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await z.readFile(e,"utf-8").catch(()=>"");let a=lp(i);if(!(a?.version===xe&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await z.readFile(e,"utf-8").catch(()=>""),a=lp(i),!(a?.version===xe&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await op.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=rp(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function eS(){try{let n=ee.join(Fs.homedir(),".prjct-cli","projects");if(!await j(n))return;let e=(await z.readdir(n,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let r=x.getDoc(s,"project");if(!r)continue;r.cliVersion!==xe&&(r.cliVersion=xe,x.setDoc(s,"project",r),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${xe}`)}catch(n){C(n)||H.warn(`Migration warning: ${y(n)}`)}}async function up(n,e){let t={};if(await j(n))try{t=JSON.parse(await z.readFile(n,"utf8"))}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await z.writeFile(n,JSON.stringify(t,null,2))}async function tS(){try{let n=ee.join(Fs.homedir(),".claude"),e=ee.join(n,"settings.json"),t=ee.join(n,"prjct-statusline.sh"),s=ee.join(Fs.homedir(),".prjct-cli","statusline"),r=ee.join(s,"statusline.sh"),o=ee.join(s,"themes"),i=ee.join(s,"lib"),a=ee.join(s,"components"),c=ee.join(s,"config.json"),u=ee.join(pe,"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 j(n)||await z.mkdir(n,{recursive:!0}),await j(s)||await z.mkdir(s,{recursive:!0}),await j(o)||await z.mkdir(o,{recursive:!0}),await j(i)||await z.mkdir(i,{recursive:!0}),await j(a)||await z.mkdir(a,{recursive:!0}),await j(r)){let k=await z.readFile(r,"utf8");if(k.includes("CLI_VERSION=")){let w=k.match(/CLI_VERSION="([^"]*)"/);if(w&&w[1]!==xe){let E=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`);await z.writeFile(r,E,{mode:493})}await jo(p,i),await jo(g,a),await dp(t,r),await up(e,t);return}}if(await j(d)){let k=await z.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`),await z.writeFile(r,k,{mode:493}),await jo(p,i),await jo(g,a),await j(m)){let w=await z.readdir(m);for(let E of w){let T=ee.join(m,E),O=ee.join(o,E);await z.copyFile(T,O)}}!await j(c)&&await j(f)&&await z.copyFile(f,c)}else{let k=`#!/bin/bash
476
476
  # prjct Status Line for Claude Code
477
477
  CLI_VERSION="${xe}"
478
478
  input=$(cat)
@@ -503,7 +503,7 @@ if [ -f "$CONFIG" ]; then
503
503
  fi
504
504
  fi
505
505
  echo "prjct"
506
- `;await J.writeFile(r,k,{mode:493})}await dp(t,r),await up(e,t)}catch(s){P(s)||H.warn(`Status line warning: ${y(s)}`)}}async function Do(s,e){if(!await D(s))return;let t=await J.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=ee.join(s,n),o=ee.join(e,n);await J.copyFile(r,o),await J.chmod(o,493)}}async function dp(s,e){try{if(await D(s)){if((await J.lstat(s)).isSymbolicLink()&&await J.readlink(s)===e)return;await J.unlink(s)}await J.symlink(e,s)}catch{try{await D(e)&&(await J.copyFile(e,s),await J.chmod(s,493))}catch(n){P(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function nS(s,e){if(console.log(""),s.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var gp,sS,Io=b(()=>{"use strict";Wt();fr();Xa();ip();se();U();Fn();We();hn();Pt();Be();Qt();tc();l(qk,"installAICLI");l(pp,"run");l(Kk,"installGeminiRouter");l(Xk,"installGeminiGlobalConfig");l(mp,"installAntigravitySkill");l(Yk,"needsAntigravityInstallation");gp="prjct-codex-router";l(fp,"getCodexSkillPath");l(Qk,"getCodexSkillMetadata");l(lp,"parseCodexSkillMetadata");l(Zk,"hashContent");l(hp,"loadCodexSkillTemplate");l(yp,"buildCodexSkillContent");l(nc,"installCodexSkill");l(jo,"verifyCodexPRouterReady");l(eS,"migrateProjectsCliVersion");l(up,"ensureStatusLineSettings");l(tS,"installStatusLine");l(Do,"installStatusLineModules");l(dp,"ensureStatusLineSymlink");l(nS,"showResults");sS=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");sS&&pp().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});import{z as W}from"zod";var rS,oS,wp,iS,aS,cS,lS,uS,kp,vj,Sp=b(()=>{"use strict";rS=W.enum(["low","medium","high"]),oS=W.enum(["pending","converted","completed","archived","dormant"]),wp=W.enum(["high","medium","low"]),iS=W.object({impact:wp,effort:wp}),aS=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),cS=W.object({name:W.string(),description:W.string()}),lS=W.object({name:W.string(),description:W.string().optional()}),uS=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:rS,status:oS,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:iS.optional(),implementationNotes:W.string().optional(),stack:aS.optional(),modules:W.array(cS).optional(),roles:W.array(lS).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),kp=W.object({ideas:W.array(uS),lastUpdated:W.string()}),vj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var rc,nt,Un=b(()=>{"use strict";Sp();Tt();fe();_n();Zt();rc=class extends Je{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",kp)}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 r={id:he(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:v()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:v()}))}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 r=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.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:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=dn(en.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;Ct.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},nt=new rc});var oc,Ts,ic=b(()=>{"use strict";po();fe();Zt();oc=class extends Je{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Zu)}getDefault(){return{...ed}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=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?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(C=>C.date===o);if(p>=0){let C=m[p];m[p]={...C,tokensSaved:C.tokensSaved+n,syncs:C.syncs+1,avgCompressionRate:(C.avgCompressionRate*C.syncs+r)/(C.syncs+1),totalDuration:C.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(C=>C.date>=f),w=[...i.agentUsage];if(t.agents)for(let C of t.agents){let T=w.findIndex(O=>O.agentName===C);T>=0?w[T]={...w[T],usageCount:w[T].usageCount+1,tokensSaved:w[T].tokensSaved+Math.floor(n/t.agents.length)}:w.push({agentName:C,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:w,dailyStats:k,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=r.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:td(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),r=new Date;r.setDate(r.getDate()-t);let o=r.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(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},Ts=new oc});import X from"node:fs/promises";import K from"node:path";async function $o(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(x.exists(s)&&x.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=A.getGlobalProjectPath(s),r=K.join(n,"storage"),o=K.join(n,"index"),i=K.join(n,"memory");t.backupDir=await dS(r,o,i),x.getDb(s);for(let{filename:c,key:u}of lc){let d=K.join(r,c),m=await Mt(d);if(m===null){t.skippedFiles.push(c);continue}try{x.setDoc(s,u,m),bp(s,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of cc){let d=K.join(o,c),m=await Mt(d);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{x.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),vp(s,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await kS(s,o,t),await SS(s,o,t),await bS(s,i,t),await vS(s,i,t);let a=K.join(n,"sessions");return await TS(s,a,t),t.errors.length===0&&await PS(r,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 dS(s,e,t){let n=K.join(s,"backup");return await X.mkdir(n,{recursive:!0}),await X.mkdir(K.join(n,"index"),{recursive:!0}),await X.mkdir(K.join(n,"memory"),{recursive:!0}),await ac(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await ac(e,K.join(n,"index")),await ac(t,K.join(n,"memory")),n}async function ac(s,e,t){try{let n=await X.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=K.join(s,r.name),i=K.join(e,r.name);await X.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function bp(s,e,t){switch(e){case"state":pS(s,t);break;case"queue":mS(s,t);break;case"ideas":gS(s,t);break;case"shipped":fS(s,t);break;case"metrics":hS(s,t);break;case"analysis":yS(s,t);break}}function pS(s,e){let t=x.getDb(s),n=t.prepare(`
506
+ `;await z.writeFile(r,k,{mode:493})}await dp(t,r),await up(e,t)}catch(n){C(n)||H.warn(`Status line warning: ${y(n)}`)}}async function jo(n,e){if(!await j(n))return;let t=await z.readdir(n);for(let s of t)if(s.endsWith(".sh")){let r=ee.join(n,s),o=ee.join(e,s);await z.copyFile(r,o),await z.chmod(o,493)}}async function dp(n,e){try{if(await j(n)){if((await z.lstat(n)).isSymbolicLink()&&await z.readlink(n)===e)return;await z.unlink(n)}await z.symlink(e,n)}catch{try{await j(e)&&(await z.copyFile(e,n),await z.chmod(n,493))}catch(s){C(s)||H.warn(`Symlink fallback warning: ${s.message}`)}}}function sS(n,e){if(console.log(""),n.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),n.commandsAdded+n.commandsUpdated>0){let s=[];n.commandsAdded>0&&s.push(`${n.commandsAdded} new`),n.commandsUpdated>0&&s.push(`${n.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);n.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):n.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):n.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var gp,nS,Io=b(()=>{"use strict";Wt();fr();Xa();ip();ne();U();Ns();We();fs();Pt();Be();Qt();tc();l(qk,"installAICLI");l(pp,"run");l(Kk,"installGeminiRouter");l(Xk,"installGeminiGlobalConfig");l(mp,"installAntigravitySkill");l(Yk,"needsAntigravityInstallation");gp="prjct-codex-router";l(fp,"getCodexSkillPath");l(Qk,"getCodexSkillMetadata");l(lp,"parseCodexSkillMetadata");l(Zk,"hashContent");l(hp,"loadCodexSkillTemplate");l(yp,"buildCodexSkillContent");l(sc,"installCodexSkill");l(Do,"verifyCodexPRouterReady");l(eS,"migrateProjectsCliVersion");l(up,"ensureStatusLineSettings");l(tS,"installStatusLine");l(jo,"installStatusLineModules");l(dp,"ensureStatusLineSymlink");l(sS,"showResults");nS=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");nS&&pp().catch(n=>{console.error("Setup error:",n.message),process.exit(1)})});import{z as W}from"zod";var rS,oS,wp,iS,aS,cS,lS,uS,kp,vD,Sp=b(()=>{"use strict";rS=W.enum(["low","medium","high"]),oS=W.enum(["pending","converted","completed","archived","dormant"]),wp=W.enum(["high","medium","low"]),iS=W.object({impact:wp,effort:wp}),aS=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),cS=W.object({name:W.string(),description:W.string()}),lS=W.object({name:W.string(),description:W.string().optional()}),uS=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:rS,status:oS,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:iS.optional(),implementationNotes:W.string().optional(),stack:aS.optional(),modules:W.array(cS).optional(),roles:W.array(lS).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),kp=W.object({ideas:W.array(uS),lastUpdated:W.string()}),vD={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var rc,st,Ls=b(()=>{"use strict";Sp();Tt();fe();Os();Zt();rc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",kp)}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(s=>s.status==="pending")}async addIdea(e,t,s={}){let r={id:he(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(r=>r.id!==t),lastUpdated:v()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let r=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.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:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=us(es.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(r.length===0)return 0;Ct.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},st=new rc});var oc,Tn,ic=b(()=>{"use strict";po();fe();Zt();oc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Zu)}getDefault(){return{...ed}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(E=>E.date===o);if(p>=0){let E=m[p];m[p]={...E,tokensSaved:E.tokensSaved+s,syncs:E.syncs+1,avgCompressionRate:(E.avgCompressionRate*E.syncs+r)/(E.syncs+1),totalDuration:E.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(E=>E.date>=f),w=[...i.agentUsage];if(t.agents)for(let E of t.agents){let T=w.findIndex(O=>O.agentName===E);T>=0?w[T]={...w[T],usageCount:w[T].usageCount+1,tokensSaved:w[T].tokensSaved+Math.floor(s/t.agents.length)}:w.push({agentName:E,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:w,dailyStats:k,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=r.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:td(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 s=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return s.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 s=t.toISOString().split("T")[0];return e.filter(r=>r.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let r=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},Tn=new oc});import X from"node:fs/promises";import K from"node:path";async function $o(n){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(x.exists(n)&&x.hasDoc(n,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(n),r=K.join(s,"storage"),o=K.join(s,"index"),i=K.join(s,"memory");t.backupDir=await dS(r,o,i),x.getDb(n);for(let{filename:c,key:u}of lc){let d=K.join(r,c),m=await Mt(d);if(m===null){t.skippedFiles.push(c);continue}try{x.setDoc(n,u,m),bp(n,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of cc){let d=K.join(o,c),m=await Mt(d);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{x.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),vp(n,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await kS(n,o,t),await SS(n,o,t),await bS(n,i,t),await vS(n,i,t);let a=K.join(s,"sessions");return await TS(n,a,t),t.errors.length===0&&await PS(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function dS(n,e,t){let s=K.join(n,"backup");return await X.mkdir(s,{recursive:!0}),await X.mkdir(K.join(s,"index"),{recursive:!0}),await X.mkdir(K.join(s,"memory"),{recursive:!0}),await ac(n,s,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await ac(e,K.join(s,"index")),await ac(t,K.join(s,"memory")),s}async function ac(n,e,t){try{let s=await X.readdir(n,{withFileTypes:!0});for(let r of s){if(!r.isFile()||t&&!t(r.name))continue;let o=K.join(n,r.name),i=K.join(e,r.name);await X.copyFile(o,i)}}catch(s){if(!C(s))throw s}}function bp(n,e,t){switch(e){case"state":pS(n,t);break;case"queue":mS(n,t);break;case"ideas":gS(n,t);break;case"shipped":fS(n,t);break;case"metrics":hS(n,t);break;case"analysis":yS(n,t);break}}function pS(n,e){let t=x.getDb(n),s=t.prepare(`
507
507
  INSERT OR REPLACE INTO tasks
508
508
  (id, description, type, status, parent_description, branch, linear_id,
509
509
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -514,115 +514,115 @@ echo "prjct"
514
514
  (id, task_id, description, status, domain, agent, sort_order,
515
515
  depends_on, started_at, completed_at, output, summary)
516
516
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
517
- `),o=l((a,c)=>{if(!a||!a.id)return;n.run(I(a.id)??`task-${Date.now()}`,I(a.description??a.parentDescription)??"",I(a.type),I(c??a.status)??"unknown",I(a.parentDescription),I(a.branch),I(a.linearId),I(a.linearUuid),I(a.sessionId),I(a.featureId),I(a.startedAt)??new Date().toISOString(),I(a.completedAt),I(a.shippedAt),I(a.pausedAt),I(a.pauseReason),I(a.prUrl),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];r.run(I(m.id)??`subtask-${d}`,I(a.id),I(m.description)??"",I(m.status)??"pending",I(m.domain),I(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,I(m.startedAt),I(m.completedAt),I(m.output),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 mS(s,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let r=x.getDb(s).prepare(`
517
+ `),o=l((a,c)=>{if(!a||!a.id)return;s.run(I(a.id)??`task-${Date.now()}`,I(a.description??a.parentDescription)??"",I(a.type),I(c??a.status)??"unknown",I(a.parentDescription),I(a.branch),I(a.linearId),I(a.linearUuid),I(a.sessionId),I(a.featureId),I(a.startedAt)??new Date().toISOString(),I(a.completedAt),I(a.shippedAt),I(a.pausedAt),I(a.pauseReason),I(a.prUrl),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];r.run(I(m.id)??`subtask-${d}`,I(a.id),I(m.description)??"",I(m.status)??"pending",I(m.domain),I(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,I(m.startedAt),I(m.completedAt),I(m.output),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 mS(n,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
518
518
  INSERT OR REPLACE INTO queue_tasks
519
519
  (id, description, type, priority, section, created_at, completed, completed_at,
520
520
  feature_id, feature_name)
521
521
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
522
- `);for(let o of t)r.run(I(o.id)??`queue-${Date.now()}`,I(o.description)??"",I(o.type),I(o.priority),I(o.section),I(o.createdAt)??new Date().toISOString(),o.completed?1:0,I(o.completedAt),I(o.featureId),I(o.featureName))}function gS(s,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let r=x.getDb(s).prepare(`
522
+ `);for(let o of t)r.run(I(o.id)??`queue-${Date.now()}`,I(o.description)??"",I(o.type),I(o.priority),I(o.section),I(o.createdAt)??new Date().toISOString(),o.completed?1:0,I(o.completedAt),I(o.featureId),I(o.featureName))}function gS(n,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
523
523
  INSERT OR REPLACE INTO ideas
524
524
  (id, text, status, priority, tags, added_at, converted_to, details, data)
525
525
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
526
- `);for(let o of t)r.run(I(o.id)??`idea-${Date.now()}`,I(o.text)??"",I(o.status)??"pending",I(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,I(o.addedAt)??new Date().toISOString(),I(o.convertedTo),I(o.details),JSON.stringify(o))}function fS(s,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let r=x.getDb(s).prepare(`
526
+ `);for(let o of t)r.run(I(o.id)??`idea-${Date.now()}`,I(o.text)??"",I(o.status)??"pending",I(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,I(o.addedAt)??new Date().toISOString(),I(o.convertedTo),I(o.details),JSON.stringify(o))}function fS(n,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
527
527
  INSERT OR REPLACE INTO shipped_features
528
528
  (id, name, shipped_at, version, description, type, duration, data)
529
529
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
530
- `);for(let o of t)r.run(I(o.id)??`ship-${Date.now()}`,I(o.name)??"",I(o.shippedAt)??new Date().toISOString(),I(o.version)??"0.0.0",I(o.description),I(o.type),I(o.duration),JSON.stringify(o))}function hS(s,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let r=x.getDb(s).prepare(`
530
+ `);for(let o of t)r.run(I(o.id)??`ship-${Date.now()}`,I(o.name)??"",I(o.shippedAt)??new Date().toISOString(),I(o.version)??"0.0.0",I(o.description),I(o.type),I(o.duration),JSON.stringify(o))}function hS(n,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
531
531
  INSERT OR REPLACE INTO metrics_daily
532
532
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
533
533
  VALUES (?, ?, ?, ?, ?)
534
- `);for(let o of t)r.run(I(o.date)??new Date().toISOString().slice(0,10),yn(o.tokensSaved)??0,yn(o.syncs)??0,yn(o.avgCompressionRate)??0,yn(o.totalDuration)??0)}function yS(s,e){let n=x.getDb(s).prepare(`
534
+ `);for(let o of t)r.run(I(o.date)??new Date().toISOString().slice(0,10),hs(o.tokensSaved)??0,hs(o.syncs)??0,hs(o.avgCompressionRate)??0,hs(o.totalDuration)??0)}function yS(n,e){let s=x.getDb(n).prepare(`
535
535
  INSERT OR REPLACE INTO analysis
536
536
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
537
537
  VALUES (?, ?, ?, ?, ?, ?, ?)
538
- `),r=l((o,i)=>{o&&n.run(i,I(o.status)??"unknown",I(o.commitHash),I(o.signature),I(o.sealedAt),I(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function vp(s,e,t){e==="categories-cache"&&wS(s,t)}function wS(s,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=x.getDb(s).prepare(`
538
+ `),r=l((o,i)=>{o&&s.run(i,I(o.status)??"unknown",I(o.commitHash),I(o.signature),I(o.sealedAt),I(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function vp(n,e,t){e==="categories-cache"&&wS(n,t)}function wS(n,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
539
539
  INSERT OR REPLACE INTO index_files
540
540
  (path, categories, domain, score, size, mtime, language)
541
541
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
542
- `);for(let o of t){let i=I(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,I(o.primaryDomain),i)}}async function kS(s,e,t){let n=K.join(e,"checksums.json"),r=await Mt(n);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=x.getDb(s),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 SS(s,e,t){let n=K.join(e,"file-scores.json"),r=await Mt(n);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=x.getDb(s),a=i.prepare(`
542
+ `);for(let o of t){let i=I(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,I(o.primaryDomain),i)}}async function kS(n,e,t){let s=K.join(e,"checksums.json"),r=await Mt(s);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=x.getDb(n),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 SS(n,e,t){let s=K.join(e,"file-scores.json"),r=await Mt(s);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=x.getDb(n),a=i.prepare(`
543
543
  INSERT OR REPLACE INTO index_files
544
544
  (path, score, size, mtime, language, categories, domain)
545
545
  VALUES (?, ?, ?, ?, NULL,
546
546
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
547
547
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
548
- `);i.transaction(()=>{for(let c of o){let u=I(c.path);u&&a.run(u,yn(c.score)??0,yn(c.size),I(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function bS(s,e,t){let n=K.join(e,"events.jsonl");try{let o=(await X.readFile(n,"utf-8")).split(`
549
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.getDb(s),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=I(u.type??u.action)??"unknown",m=I(u.taskId??u.task_id),p=I(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(r){P(r)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(r)})}}async function vS(s,e,t){let n=K.join(e,"learnings.jsonl");try{let o=(await X.readFile(n,"utf-8")).split(`
550
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.getDb(s),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:${I(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,p=m&&m.length>0?I(m[0]):null;a.run(d,p,c,1,I(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(r){P(r)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(r)})}}async function TS(s,e,t){let r=x.getDb(s).prepare(`
548
+ `);i.transaction(()=>{for(let c of o){let u=I(c.path);u&&a.run(u,hs(c.score)??0,hs(c.size),I(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function bS(n,e,t){let s=K.join(e,"events.jsonl");try{let o=(await X.readFile(s,"utf-8")).split(`
549
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.getDb(n),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=I(u.type??u.action)??"unknown",m=I(u.taskId??u.task_id),p=I(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(r){C(r)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(r)})}}async function vS(n,e,t){let s=K.join(e,"learnings.jsonl");try{let o=(await X.readFile(s,"utf-8")).split(`
550
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.getDb(n),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:${I(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,p=m&&m.length>0?I(m[0]):null;a.run(d,p,c,1,I(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(r){C(r)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(r)})}}async function TS(n,e,t){let r=x.getDb(n).prepare(`
551
551
  INSERT OR IGNORE INTO sessions
552
552
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
553
553
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
554
- `),o=l(u=>{!u||!u.id||r.run(I(u.id),I(u.projectId)??s,I(u.task)??"",I(u.status)??"completed",I(u.startedAt)??new Date().toISOString(),I(u.pausedAt),I(u.completedAt),yn(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=K.join(e,"current.json"),a=await Mt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await X.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=K.join(e,"archive");try{let u=await X.readdir(c);for(let m of u){let p=K.join(c,m);try{if(!(await X.stat(p)).isDirectory())continue;let f=await X.readdir(p);for(let w of f){if(!w.endsWith(".json"))continue;let C=K.join(p,w),T=await Mt(C);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${m}/${w}`),await X.unlink(C).catch(()=>{})}catch(O){t.errors.push({file:`sessions/archive/${m}/${w}`,error:String(O)})}}(await X.readdir(p)).length===0&&await X.rmdir(p).catch(()=>{})}catch{}}(await X.readdir(c).catch(()=>[])).length===0&&await X.rmdir(c).catch(()=>{})}catch{}try{(await X.readdir(e)).length===0&&await X.rmdir(e).catch(()=>{})}catch{}}async function PS(s,e,t,n){let r=l(async(i,a)=>{try{await X.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of lc)await r(K.join(s,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(K.join(e,i),`cleanup:index/${i}`);await r(K.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(K.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function I(s){return s==null?null:typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"||typeof s=="bigint"?String(s):JSON.stringify(s)}function yn(s){if(s==null)return null;if(typeof s=="number")return s;if(typeof s=="string"){let e=Number(s);return Number.isNaN(e)?null:e}return null}async function Mt(s){try{let e=await X.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Mo(s){let e=A.getGlobalProjectPath(s),t=K.join(e,"storage"),n=0;x.getDb(s);for(let{filename:f,key:k}of lc){let w=K.join(t,f),C=await Mt(w);if(C!==null){x.setDoc(s,k,C),bp(s,k,C);try{await X.unlink(w)}catch{}n++}}let r=K.join(e,"project.json"),o=await Mt(r);if(o!==null){x.setDoc(s,"project",o);try{await X.unlink(r)}catch{}n++}let i=K.join(e,"memory");for(let f of["events.jsonl","learnings.jsonl"]){let k=K.join(i,f);try{let C=(await X.readFile(k,"utf-8")).split(`
555
- `).filter(O=>O.trim());if(C.length===0){await X.unlink(k),n++;continue}let T=x.getDb(s);if(f==="events.jsonl"){let O=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let G of C)try{let Q=JSON.parse(G);O.run(I(Q.type??Q.action)??"unknown",I(Q.taskId??Q.task_id),G,I(Q.timestamp??Q.ts)??new Date().toISOString())}catch{}})()}else{let O=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let G of C)try{let Q=JSON.parse(G),ne=`learning:${I(Q.taskId??Q.timestamp)??Date.now()}`,S=Q.tags;O.run(ne,I(S?.[0]),G,1,I(Q.timestamp)??new Date().toISOString())}catch{}})()}await X.unlink(k),n++}catch{}}let a=K.join(e,"sessions"),c=l(f=>{if(!f||!f.id)return;x.getDb(s).prepare(`
554
+ `),o=l(u=>{!u||!u.id||r.run(I(u.id),I(u.projectId)??n,I(u.task)??"",I(u.status)??"completed",I(u.startedAt)??new Date().toISOString(),I(u.pausedAt),I(u.completedAt),hs(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=K.join(e,"current.json"),a=await Mt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await X.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=K.join(e,"archive");try{let u=await X.readdir(c);for(let m of u){let p=K.join(c,m);try{if(!(await X.stat(p)).isDirectory())continue;let f=await X.readdir(p);for(let w of f){if(!w.endsWith(".json"))continue;let E=K.join(p,w),T=await Mt(E);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${m}/${w}`),await X.unlink(E).catch(()=>{})}catch(O){t.errors.push({file:`sessions/archive/${m}/${w}`,error:String(O)})}}(await X.readdir(p)).length===0&&await X.rmdir(p).catch(()=>{})}catch{}}(await X.readdir(c).catch(()=>[])).length===0&&await X.rmdir(c).catch(()=>{})}catch{}try{(await X.readdir(e)).length===0&&await X.rmdir(e).catch(()=>{})}catch{}}async function PS(n,e,t,s){let r=l(async(i,a)=>{try{await X.unlink(i)}catch(c){C(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of lc)await r(K.join(n,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(K.join(e,i),`cleanup:index/${i}`);await r(K.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(K.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function I(n){return n==null?null:typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):JSON.stringify(n)}function hs(n){if(n==null)return null;if(typeof n=="number")return n;if(typeof n=="string"){let e=Number(n);return Number.isNaN(e)?null:e}return null}async function Mt(n){try{let e=await X.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function Mo(n){let e=A.getGlobalProjectPath(n),t=K.join(e,"storage"),s=0;x.getDb(n);for(let{filename:f,key:k}of lc){let w=K.join(t,f),E=await Mt(w);if(E!==null){x.setDoc(n,k,E),bp(n,k,E);try{await X.unlink(w)}catch{}s++}}let r=K.join(e,"project.json"),o=await Mt(r);if(o!==null){x.setDoc(n,"project",o);try{await X.unlink(r)}catch{}s++}let i=K.join(e,"memory");for(let f of["events.jsonl","learnings.jsonl"]){let k=K.join(i,f);try{let E=(await X.readFile(k,"utf-8")).split(`
555
+ `).filter(O=>O.trim());if(E.length===0){await X.unlink(k),s++;continue}let T=x.getDb(n);if(f==="events.jsonl"){let O=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let G of E)try{let Q=JSON.parse(G);O.run(I(Q.type??Q.action)??"unknown",I(Q.taskId??Q.task_id),G,I(Q.timestamp??Q.ts)??new Date().toISOString())}catch{}})()}else{let O=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let G of E)try{let Q=JSON.parse(G),se=`learning:${I(Q.taskId??Q.timestamp)??Date.now()}`,S=Q.tags;O.run(se,I(S?.[0]),G,1,I(Q.timestamp)??new Date().toISOString())}catch{}})()}await X.unlink(k),s++}catch{}}let a=K.join(e,"sessions"),c=l(f=>{if(!f||!f.id)return;x.getDb(n).prepare(`
556
556
  INSERT OR IGNORE INTO sessions
557
557
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
558
558
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
559
- `).run(I(f.id),I(f.projectId)??s,I(f.task)??"",I(f.status)??"completed",I(f.startedAt)??new Date().toISOString(),I(f.pausedAt),I(f.completedAt),yn(f.duration)??0,f.metrics?JSON.stringify(f.metrics):"{}",f.timeline?JSON.stringify(f.timeline):"[]")},"sessionInsert"),u=K.join(a,"current.json"),d=await Mt(u);d!==null&&(c(d),await X.unlink(u).catch(()=>{}),n++);let m=K.join(a,"archive");try{let f=await X.readdir(m);for(let w of f){let C=K.join(m,w);try{if(!(await X.stat(C)).isDirectory())continue;let O=await X.readdir(C);for(let Q of O){if(!Q.endsWith(".json"))continue;let ne=await Mt(K.join(C,Q));ne!==null&&(c(ne),await X.unlink(K.join(C,Q)).catch(()=>{}),n++)}(await X.readdir(C)).length===0&&await X.rmdir(C).catch(()=>{})}catch{}}(await X.readdir(m).catch(()=>[])).length===0&&await X.rmdir(m).catch(()=>{})}catch{}try{(await X.readdir(a)).length===0&&await X.rmdir(a).catch(()=>{})}catch{}let p=K.join(e,"index"),g=[...cc.map(f=>f.filename),"checksums.json","file-scores.json"];for(let f of g){let k=K.join(p,f),w=await Mt(k);if(w===null)continue;let C=cc.find(T=>T.filename===f);C&&(x.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",C.key,JSON.stringify(w),new Date().toISOString()),vp(s,C.key,w));try{await X.unlink(k)}catch{}n++}return n}var lc,cc,uc=b(()=>{"use strict";Se();U();se();lc=[{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"}],cc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l($o,"migrateJsonToSqlite");l(dS,"createBackup");l(ac,"copyFiles");l(bp,"populateNormalized");l(pS,"populateTasksFromState");l(mS,"populateQueueTasks");l(gS,"populateIdeas");l(fS,"populateShippedFeatures");l(hS,"populateMetricsDaily");l(yS,"populateAnalysis");l(vp,"populateIndexTables");l(wS,"populateCategoriesIndex");l(kS,"migrateChecksums");l(SS,"migrateFileScores");l(bS,"migrateEventsJsonl");l(vS,"migrateLearningsJsonl");l(TS,"migrateSessionFiles");l(PS,"cleanupJsonFiles");l(I,"toStr");l(yn,"toNum");l(Mt,"readJsonSafe");l(Mo,"sweepLegacyJson")});function Cp(s){return[...s].sort((e,t)=>{let n=Pp[e.section]-Pp[t.section];return n!==0?n:Tp[e.priority]-Tp[t.priority]})}var Tp,Pp,Ep=b(()=>{"use strict";Tp={critical:0,high:1,medium:2,low:3},Pp={active:0,previously_active:1,backlog:2};l(Cp,"sortBySectionAndPriority")});var dc,Oe,rn=b(()=>{"use strict";Tt();Pa();Ep();fe();_n();Zt();dc=class extends Je{static{l(this,"QueueStorage")}constructor(){super("queue.json",Td)}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 Cp(t)[0]||null}async addTask(e,t){let n={...t,id:he(),createdAt:v(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:v()})),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=v(),r=t.map(o=>({...o,id:he(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:v()},n):i),lastUpdated:v()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:v()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:v()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:v()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=dn(en.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;Ct.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},Oe=new dc});import{z as Y}from"zod";var CS,xp,ES,xS,AS,RS,DS,jS,IS,Ap,Rp=b(()=>{"use strict";CS=Y.enum(["feature","fix","improvement","refactor"]),xp=Y.enum(["pass","warning","fail","skipped"]),ES=Y.enum(["added","changed","fixed","removed"]),xS=Y.object({hours:Y.number(),minutes:Y.number(),totalMinutes:Y.number()}),AS=Y.object({filesChanged:Y.number().nullable().optional(),linesAdded:Y.number().nullable().optional(),linesRemoved:Y.number().nullable().optional(),commits:Y.number().nullable().optional()}),RS=Y.object({description:Y.string(),type:ES.optional()}),DS=Y.object({lintStatus:xp.nullable().optional(),lintDetails:Y.string().optional(),testStatus:xp.nullable().optional(),testDetails:Y.string().optional()}),jS=Y.object({hash:Y.string().optional(),message:Y.string().optional(),branch:Y.string().optional()}),IS=Y.object({id:Y.string(),name:Y.string(),version:Y.string().nullable().optional(),type:CS,agent:Y.string().optional(),description:Y.string().optional(),changes:Y.array(RS).optional(),codeSnippets:Y.array(Y.string()).optional(),commit:jS.optional(),codeMetrics:AS.optional(),qualityMetrics:DS.optional(),quantitativeImpact:Y.string().optional(),duration:xS.optional(),tasksCompleted:Y.number().nullable().optional(),shippedAt:Y.string(),featureId:Y.string().optional()}),Ap=Y.object({shipped:Y.array(IS),lastUpdated:Y.string()})});var pc,ht,Ps=b(()=>{"use strict";Tt();Rp();fe();_n();Zt();pc=class extends Je{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Ap)}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((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:he(),shippedAt:v()};return await this.update(e,r=>({shipped:[n,...r.shipped],lastUpdated:v()})),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(r=>r.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,r;switch(t){case"week":r=new Date(n.getTime()-10080*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=dn(en.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;Ct.archiveMany(e,r.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:v()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},ht=new pc});function $S(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function MS(s){let e=[],t=$S(),n,r=0;for(;(n=t.exec(s))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${r++}`,c=s.indexOf(mc,o+i.length);if(c===-1)continue;let u=c+mc.length,d=s.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Dp(s,e){let t=MS(e);if(t.length===0)return s;let n=s.trimEnd();n+=`
559
+ `).run(I(f.id),I(f.projectId)??n,I(f.task)??"",I(f.status)??"completed",I(f.startedAt)??new Date().toISOString(),I(f.pausedAt),I(f.completedAt),hs(f.duration)??0,f.metrics?JSON.stringify(f.metrics):"{}",f.timeline?JSON.stringify(f.timeline):"[]")},"sessionInsert"),u=K.join(a,"current.json"),d=await Mt(u);d!==null&&(c(d),await X.unlink(u).catch(()=>{}),s++);let m=K.join(a,"archive");try{let f=await X.readdir(m);for(let w of f){let E=K.join(m,w);try{if(!(await X.stat(E)).isDirectory())continue;let O=await X.readdir(E);for(let Q of O){if(!Q.endsWith(".json"))continue;let se=await Mt(K.join(E,Q));se!==null&&(c(se),await X.unlink(K.join(E,Q)).catch(()=>{}),s++)}(await X.readdir(E)).length===0&&await X.rmdir(E).catch(()=>{})}catch{}}(await X.readdir(m).catch(()=>[])).length===0&&await X.rmdir(m).catch(()=>{})}catch{}try{(await X.readdir(a)).length===0&&await X.rmdir(a).catch(()=>{})}catch{}let p=K.join(e,"index"),g=[...cc.map(f=>f.filename),"checksums.json","file-scores.json"];for(let f of g){let k=K.join(p,f),w=await Mt(k);if(w===null)continue;let E=cc.find(T=>T.filename===f);E&&(x.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(w),new Date().toISOString()),vp(n,E.key,w));try{await X.unlink(k)}catch{}s++}return s}var lc,cc,uc=b(()=>{"use strict";Se();U();ne();lc=[{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"}],cc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l($o,"migrateJsonToSqlite");l(dS,"createBackup");l(ac,"copyFiles");l(bp,"populateNormalized");l(pS,"populateTasksFromState");l(mS,"populateQueueTasks");l(gS,"populateIdeas");l(fS,"populateShippedFeatures");l(hS,"populateMetricsDaily");l(yS,"populateAnalysis");l(vp,"populateIndexTables");l(wS,"populateCategoriesIndex");l(kS,"migrateChecksums");l(SS,"migrateFileScores");l(bS,"migrateEventsJsonl");l(vS,"migrateLearningsJsonl");l(TS,"migrateSessionFiles");l(PS,"cleanupJsonFiles");l(I,"toStr");l(hs,"toNum");l(Mt,"readJsonSafe");l(Mo,"sweepLegacyJson")});function Cp(n){return[...n].sort((e,t)=>{let s=Pp[e.section]-Pp[t.section];return s!==0?s:Tp[e.priority]-Tp[t.priority]})}var Tp,Pp,Ep=b(()=>{"use strict";Tp={critical:0,high:1,medium:2,low:3},Pp={active:0,previously_active:1,backlog:2};l(Cp,"sortBySectionAndPriority")});var dc,Oe,rs=b(()=>{"use strict";Tt();Pa();Ep();fe();Os();Zt();dc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",Td)}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(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return Cp(t)[0]||null}async addTask(e,t){let s={...t,id:he(),createdAt:v(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,s],lastUpdated:v()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=v(),r=t.map(o=>({...o,id:he(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(r=>r.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let r=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=us(es.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(r.length===0)return 0;Ct.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},Oe=new dc});import{z as Y}from"zod";var CS,xp,ES,xS,AS,RS,jS,DS,IS,Ap,Rp=b(()=>{"use strict";CS=Y.enum(["feature","fix","improvement","refactor"]),xp=Y.enum(["pass","warning","fail","skipped"]),ES=Y.enum(["added","changed","fixed","removed"]),xS=Y.object({hours:Y.number(),minutes:Y.number(),totalMinutes:Y.number()}),AS=Y.object({filesChanged:Y.number().nullable().optional(),linesAdded:Y.number().nullable().optional(),linesRemoved:Y.number().nullable().optional(),commits:Y.number().nullable().optional()}),RS=Y.object({description:Y.string(),type:ES.optional()}),jS=Y.object({lintStatus:xp.nullable().optional(),lintDetails:Y.string().optional(),testStatus:xp.nullable().optional(),testDetails:Y.string().optional()}),DS=Y.object({hash:Y.string().optional(),message:Y.string().optional(),branch:Y.string().optional()}),IS=Y.object({id:Y.string(),name:Y.string(),version:Y.string().nullable().optional(),type:CS,agent:Y.string().optional(),description:Y.string().optional(),changes:Y.array(RS).optional(),codeSnippets:Y.array(Y.string()).optional(),commit:DS.optional(),codeMetrics:AS.optional(),qualityMetrics:jS.optional(),quantitativeImpact:Y.string().optional(),duration:xS.optional(),tasksCompleted:Y.number().nullable().optional(),shippedAt:Y.string(),featureId:Y.string().optional()}),Ap=Y.object({shipped:Y.array(IS),lastUpdated:Y.string()})});var pc,ht,Pn=b(()=>{"use strict";Tt();Rp();fe();Os();Zt();pc=class extends ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Ap)}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((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:he(),shippedAt:v()};return await this.update(e,r=>({shipped:[s,...r.shipped],lastUpdated:v()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,r;switch(t){case"week":r=new Date(s.getTime()-10080*60*1e3);break;case"month":r=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":r=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=us(es.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(r.length===0)return 0;Ct.archiveMany(e,r.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)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},ht=new pc});function $S(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function MS(n){let e=[],t=$S(),s,r=0;for(;(s=t.exec(n))!==null;){let o=s.index,i=s[0],a=s[1]||`section-${r++}`,c=n.indexOf(mc,o+i.length);if(c===-1)continue;let u=c+mc.length,d=n.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function jp(n,e){let t=MS(e);if(t.length===0)return n;let s=n.trimEnd();s+=`
560
560
 
561
561
  ---
562
562
 
563
- `,n+=`## Your Customizations
563
+ `,s+=`## Your Customizations
564
564
 
565
- `,n+=`_The sections below are preserved during sync. Edit freely._
565
+ `,s+=`_The sections below are preserved during sync. Edit freely._
566
566
 
567
- `;for(let r of t)n+=r.content,n+=`
567
+ `;for(let r of t)s+=r.content,s+=`
568
568
 
569
- `;return`${n.trimEnd()}
570
- `}function jp(s){let e=[],t=s.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=s.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let r=0,o=0,i=s.split(`
571
- `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(r++,o=Math.max(o,r)),c.includes(mc)&&r--,r>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),r<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var mc,Ip=b(()=>{"use strict";mc="<!-- /prjct:preserve -->";l($S,"createPreserveStartRegex");l(MS,"extractPreservedSections");l(Dp,"mergePreservedSections");l(jp,"validatePreserveBlocks")});function xt(s){return`<!-- source: ${s.file}, ${s.type} -->`}function Hn(){let s={file:"unknown",type:"detected"};return{name:{...s},version:{...s},ecosystem:{...s},languages:{...s},frameworks:{...s},commands:{...s},projectType:{...s},git:{file:"git",type:"detected"}}}var gc=b(()=>{"use strict";l(xt,"cite");l(Hn,"defaultSources")});function Oo(s,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/${s.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/${s.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 | ${s.name} |`),t.push(`| Version | ${s.version} |`),t.push(`| Ecosystem | ${s.ecosystem} |`),t.push(`| Branch | ${s.branch} |`),t.push(`| Files | ~${s.fileCount} |`),t.push(`| Commits | ${s.commits} |`),t.push(""),(s.agents.workflow.length>0||s.agents.domain.length>0)&&(t.push("## Agents"),t.push(""),t.push(`Load from \`~/.prjct-cli/projects/${s.projectId}/agents/\`:`),t.push(""),t.push(`**Workflow**: ${s.agents.workflow.join(", ")}`),t.push(`**Domain**: ${s.agents.domain.join(", ")||"none"}`),t.push("")),s.learnings&&(s.learnings.completedTasks.length>0||s.learnings.resolvedBugs.length>0||s.learnings.shippedFeatures.length>0)&&(t.push("## Recent Learnings"),t.push(""),s.learnings.completedTasks.length>0&&(t.push("### Completed Tasks"),t.push(s.learnings.completedTasks.map(n=>`- ${n.description}${n.branch?` (${n.branch})`:""}`).join(`
572
- `)),t.push("")),s.learnings.resolvedBugs.length>0&&(t.push("### Resolved Bugs"),t.push(s.learnings.resolvedBugs.map(n=>`- ${n.description}`).join(`
573
- `)),t.push("")),s.learnings.shippedFeatures.length>0&&(t.push("### Shipped Features"),t.push(s.learnings.shippedFeatures.map(n=>`- **${n.name}** (v${n.version})${n.description?`: ${n.description}`:""}`).join(`
569
+ `;return`${s.trimEnd()}
570
+ `}function Dp(n){let e=[],t=n.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],s=n.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==s.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${s.length} closing`);let r=0,o=0,i=n.split(`
571
+ `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(r++,o=Math.max(o,r)),c.includes(mc)&&r--,r>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),r<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var mc,Ip=b(()=>{"use strict";mc="<!-- /prjct:preserve -->";l($S,"createPreserveStartRegex");l(MS,"extractPreservedSections");l(jp,"mergePreservedSections");l(Dp,"validatePreserveBlocks")});function xt(n){return`<!-- source: ${n.file}, ${n.type} -->`}function Us(){let n={file:"unknown",type:"detected"};return{name:{...n},version:{...n},ecosystem:{...n},languages:{...n},frameworks:{...n},commands:{...n},projectType:{...n},git:{file:"git",type:"detected"}}}var gc=b(()=>{"use strict";l(xt,"cite");l(Us,"defaultSources")});function Oo(n,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/${n.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/${n.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 | ${n.name} |`),t.push(`| Version | ${n.version} |`),t.push(`| Ecosystem | ${n.ecosystem} |`),t.push(`| Branch | ${n.branch} |`),t.push(`| Files | ~${n.fileCount} |`),t.push(`| Commits | ${n.commits} |`),t.push(""),(n.agents.workflow.length>0||n.agents.domain.length>0)&&(t.push("## Agents"),t.push(""),t.push(`Load from \`~/.prjct-cli/projects/${n.projectId}/agents/\`:`),t.push(""),t.push(`**Workflow**: ${n.agents.workflow.join(", ")}`),t.push(`**Domain**: ${n.agents.domain.join(", ")||"none"}`),t.push("")),n.learnings&&(n.learnings.completedTasks.length>0||n.learnings.resolvedBugs.length>0||n.learnings.shippedFeatures.length>0)&&(t.push("## Recent Learnings"),t.push(""),n.learnings.completedTasks.length>0&&(t.push("### Completed Tasks"),t.push(n.learnings.completedTasks.map(s=>`- ${s.description}${s.branch?` (${s.branch})`:""}`).join(`
572
+ `)),t.push("")),n.learnings.resolvedBugs.length>0&&(t.push("### Resolved Bugs"),t.push(n.learnings.resolvedBugs.map(s=>`- ${s.description}`).join(`
573
+ `)),t.push("")),n.learnings.shippedFeatures.length>0&&(t.push("### Shipped Features"),t.push(n.learnings.shippedFeatures.map(s=>`- **${s.name}** (v${s.version})${s.description?`: ${s.description}`:""}`).join(`
574
574
  `)),t.push(""))),t.join(`
575
- `)}function kr(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
576
- `)}function Sr(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
577
- `)}function fc(s){let e=[];return s.packageManager&&e.push(`- Package Manager: \`${s.packageManager}\``),s.sourceDir&&e.push(`- Source: \`${s.sourceDir}/\``),s.testDir&&e.push(`- Tests: \`${s.testDir}/\``),e.length>0?`
575
+ `)}function kr(n,e){return(e?n.slice(0,e):n).map(s=>`- **${s.name}**: ${s.description}${s.location?` (${s.location})`:""}`).join(`
576
+ `)}function Sr(n,e){return(e?n.slice(0,e):n).map(s=>`- **${s.issue}** in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
577
+ `)}function fc(n){let e=[];return n.packageManager&&e.push(`- Package Manager: \`${n.packageManager}\``),n.sourceDir&&e.push(`- Source: \`${n.sourceDir}/\``),n.testDir&&e.push(`- Tests: \`${n.testDir}/\``),e.length>0?`
578
578
  ### Project Structure
579
579
 
580
580
  ${e.join(`
581
581
  `)}
582
- `:""}function OS(s){let e=[];return s.patterns?.length>0&&e.push(`
582
+ `:""}function OS(n){let e=[];return n.patterns?.length>0&&e.push(`
583
583
  ### Code Patterns (Follow These)
584
584
 
585
- ${kr(s.patterns)}`),s.antiPatterns?.length>0&&e.push(`
585
+ ${kr(n.patterns)}`),n.antiPatterns?.length>0&&e.push(`
586
586
  ### Anti-Patterns (Avoid These)
587
587
 
588
- ${Sr(s.antiPatterns)}`),e.push(fc(s)),e.join(`
589
- `)}function _S(s,e){let t=s.sources||Hn();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
590
- # ${s.name} - Project Rules
591
- <!-- projectId: ${s.projectId} -->
588
+ ${Sr(n.antiPatterns)}`),e.push(fc(n)),e.join(`
589
+ `)}function _S(n,e){let t=n.sources||Us();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
590
+ # ${n.name} - Project Rules
591
+ <!-- projectId: ${n.projectId} -->
592
592
  <!-- Generated: ${new Date().toISOString()} -->
593
- <!-- Ecosystem: ${s.ecosystem} | Type: ${s.projectType} -->
593
+ <!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->
594
594
 
595
- ## THIS PROJECT (${s.ecosystem})
595
+ ## THIS PROJECT (${n.ecosystem})
596
596
 
597
597
  ${xt(t.ecosystem)}
598
- **Type:** ${s.projectType}
599
- **Path:** ${s.repoPath}
598
+ **Type:** ${n.projectType}
599
+ **Path:** ${n.repoPath}
600
600
 
601
601
  ### Commands (USE THESE, NOT OTHERS)
602
602
 
603
603
  ${xt(t.commands)}
604
604
  | Action | Command |
605
605
  |--------|---------|
606
- | Install dependencies | \`${s.commands.install}\` |
607
- | Run dev server | \`${s.commands.dev}\` |
608
- | Run tests | \`${s.commands.test}\` |
609
- | Build | \`${s.commands.build}\` |
610
- | Lint | \`${s.commands.lint}\` |
611
- | Format | \`${s.commands.format}\` |
606
+ | Install dependencies | \`${n.commands.install}\` |
607
+ | Run dev server | \`${n.commands.dev}\` |
608
+ | Run tests | \`${n.commands.test}\` |
609
+ | Build | \`${n.commands.build}\` |
610
+ | Lint | \`${n.commands.lint}\` |
611
+ | Format | \`${n.commands.format}\` |
612
612
 
613
613
  ### Code Conventions
614
614
 
615
615
  ${xt(t.languages)}
616
- - **Languages**: ${s.languages.join(", ")||"Not detected"}
616
+ - **Languages**: ${n.languages.join(", ")||"Not detected"}
617
617
  ${xt(t.frameworks)}
618
- - **Frameworks**: ${s.frameworks.join(", ")||"Not detected"}
619
- ${s.analysis?OS(s.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
618
+ - **Frameworks**: ${n.frameworks.join(", ")||"Not detected"}
619
+ ${n.analysis?OS(n.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
620
620
  ---
621
621
 
622
622
  ## PRJCT RULES
623
623
 
624
624
  ### Path Resolution
625
- **ALL prjct writes go to**: \`~/.prjct-cli/projects/${s.projectId}/\`
625
+ **ALL prjct writes go to**: \`~/.prjct-cli/projects/${n.projectId}/\`
626
626
  - NEVER write to \`.prjct/\`
627
627
  - NEVER write to \`./\` for prjct data
628
628
 
@@ -645,54 +645,54 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
645
645
  ${xt(t.name)}
646
646
  | Field | Value |
647
647
  |-------|-------|
648
- | Name | ${s.name} |
649
- | Version | ${s.version} |
650
- | Ecosystem | ${s.ecosystem} |
651
- | Branch | ${s.branch} |
652
- | Files | ~${s.fileCount} |
653
- | Commits | ${s.commits} |
648
+ | Name | ${n.name} |
649
+ | Version | ${n.version} |
650
+ | Ecosystem | ${n.ecosystem} |
651
+ | Branch | ${n.branch} |
652
+ | Files | ~${n.fileCount} |
653
+ | Commits | ${n.commits} |
654
654
 
655
655
  ---
656
656
 
657
657
  ## AGENTS
658
658
 
659
- Load from \`~/.prjct-cli/projects/${s.projectId}/agents/\`:
659
+ Load from \`~/.prjct-cli/projects/${n.projectId}/agents/\`:
660
660
 
661
- **Workflow**: ${s.agents.workflow.join(", ")}
662
- **Domain**: ${s.agents.domain.join(", ")||"none"}
661
+ **Workflow**: ${n.agents.workflow.join(", ")}
662
+ **Domain**: ${n.agents.domain.join(", ")||"none"}
663
663
 
664
664
  ---
665
665
 
666
666
  ## RECENT LEARNINGS
667
667
 
668
- ${s.learnings&&(s.learnings.completedTasks.length>0||s.learnings.resolvedBugs.length>0||s.learnings.shippedFeatures.length>0)?`
668
+ ${n.learnings&&(n.learnings.completedTasks.length>0||n.learnings.resolvedBugs.length>0||n.learnings.shippedFeatures.length>0)?`
669
669
  ### Completed Tasks
670
- ${s.learnings.completedTasks.length>0?s.learnings.completedTasks.map(n=>`- ${n.description}${n.branch?` (${n.branch})`:""}`).join(`
670
+ ${n.learnings.completedTasks.length>0?n.learnings.completedTasks.map(s=>`- ${s.description}${s.branch?` (${s.branch})`:""}`).join(`
671
671
  `):"_(No completed tasks yet)_"}
672
672
 
673
673
  ### Resolved Bugs
674
- ${s.learnings.resolvedBugs.length>0?s.learnings.resolvedBugs.map(n=>`- ${n.description}`).join(`
674
+ ${n.learnings.resolvedBugs.length>0?n.learnings.resolvedBugs.map(s=>`- ${s.description}`).join(`
675
675
  `):"_(No resolved bugs yet)_"}
676
676
 
677
677
  ### Shipped Features
678
- ${s.learnings.shippedFeatures.length>0?s.learnings.shippedFeatures.map(n=>`- **${n.name}** (v${n.version})${n.description?`: ${n.description}`:""}`).join(`
678
+ ${n.learnings.shippedFeatures.length>0?n.learnings.shippedFeatures.map(s=>`- **${s.name}** (v${s.version})${s.description?`: ${s.description}`:""}`).join(`
679
679
  `):"_(No shipped features yet)_"}
680
680
  `:"> Run `p. sync` to populate learnings from task history"}
681
681
  <!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->
682
- `}function NS(s,e){let t=s.sources||Hn(),n=[];if(n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`),n.push(""),n.push(xt(t.languages)),n.push("## Tech Stack"),s.languages.length>0&&n.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- Frameworks: ${s.frameworks.join(", ")}`),n.push(""),n.push(xt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${s.commands.install}\``),n.push(`- Dev: \`${s.commands.dev}\``),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.push(""),s.analysis){s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(kr(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Sr(s.analysis.antiPatterns)),n.push(""));let r=fc(s.analysis);r&&(n.push(r.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.push(""),n.push(Oo(s,"concise")),n.join(`
683
- `)}function FS(s,e){let t=s.sources||Hn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${s.name}, a ${s.ecosystem} project.`),n.push(""),n.push(xt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${s.projectType}`),n.push(`- Stack: ${s.frameworks.join(", ")||s.ecosystem}`),n.push(""),s.analysis?(s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(kr(s.analysis.patterns,5)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(Sr(s.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(xt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.push(""),n.push(Oo(s,"concise")),n.join(`
684
- `)}function LS(s,e){let t=s.sources||Hn(),n=[];return n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${s.name}`),n.push(""),n.push(`${s.projectType} project using ${s.ecosystem}.`),n.push(""),n.push(xt(t.languages)),n.push("## Stack"),n.push(`- ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- ${s.frameworks.join(", ")}`),n.push(""),n.push(xt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(s.commands.install),n.push("# Dev"),n.push(s.commands.dev),n.push("# Test"),n.push(s.commands.test),n.push("# Build"),n.push(s.commands.build),n.push("```"),n.push(""),s.analysis?(s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(kr(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Sr(s.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.push(""),n.push(Oo(s,"concise")),n.join(`
685
- `)}function US(s,e){let t=[`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`,"",`Stack: ${s.languages.join(", ")}${s.frameworks.length>0?` with ${s.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${s.commands.install}`,`- Dev: ${s.commands.dev}`,`- Test: ${s.commands.test}`,`- Build: ${s.commands.build}`];if(s.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of s.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(s.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of s.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}s.analysis||t.push("","Run `p. sync` to populate project intelligence."),t.push(""),t.push("prjct Rules:"),t.push(`- All prjct data: ~/.prjct-cli/projects/${s.projectId}/`),t.push('- Workflow: p. sync \u2192 p. task "desc" \u2192 work \u2192 p. done \u2192 p. ship'),t.push(""),t.push(`Project: ${s.name} v${s.version} | ${s.ecosystem} | Branch: ${s.branch} | Files: ~${s.fileCount}`),s.agents.workflow.length>0&&t.push(`Agents: ${[...s.agents.workflow,...s.agents.domain].join(", ")}`);let r={systemMessage:t.join(`
686
- `),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: ${s.commands.test}`}]};return JSON.stringify(r,null,2)}function HS(s,e){let t=[];return t.push("<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->"),t.push(`# ${s.name} - Project Rules`),t.push(`<!-- projectId: ${s.projectId} -->`),t.push(`<!-- Generated: ${new Date().toISOString()} -->`),t.push(`<!-- Ecosystem: ${s.ecosystem} | Type: ${s.projectType} -->`),t.push(""),t.push(`## THIS PROJECT (${s.ecosystem})`),t.push(""),t.push(`**Type:** ${s.projectType}`),t.push(`**Path:** ${s.repoPath}`),t.push(""),t.push("### Commands (USE THESE, NOT OTHERS)"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install dependencies | \`${s.commands.install}\` |`),t.push(`| Run dev server | \`${s.commands.dev}\` |`),t.push(`| Run tests | \`${s.commands.test}\` |`),t.push(`| Build | \`${s.commands.build}\` |`),t.push(`| Lint | \`${s.commands.lint}\` |`),t.push(`| Format | \`${s.commands.format}\` |`),t.push(""),t.push("### Code Conventions"),t.push(""),t.push(`- **Languages**: ${s.languages.join(", ")||"Not detected"}`),t.push(`- **Frameworks**: ${s.frameworks.join(", ")||"Not detected"}`),s.analysis?(s.analysis.patterns?.length>0&&(t.push(""),t.push("### Code Patterns (Follow These)"),t.push(""),t.push(kr(s.analysis.patterns))),s.analysis.antiPatterns?.length>0&&(t.push(""),t.push("### Anti-Patterns (Avoid These)"),t.push(""),t.push(Sr(s.analysis.antiPatterns))),t.push(fc(s.analysis))):(t.push(""),t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("---"),t.push(""),t.push(Oo(s,"full")),t.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
687
- `)}function $p(s){return{claude:_S,cursor:NS,copilot:FS,windsurf:LS,continue:US,codex:HS}[s]||null}var Mp=b(()=>{"use strict";gc();l(Oo,"formatOperationalContext");l(kr,"formatPatterns");l(Sr,"formatAntiPatterns");l(fc,"formatStructure");l(OS,"formatAnalysisForClaude");l(_S,"formatForClaude");l(NS,"formatForCursor");l(FS,"formatForCopilot");l(LS,"formatForWindsurf");l(US,"formatForContinue");l(HS,"formatForCodex");l($p,"getFormatter")});import{exec as GS}from"node:child_process";import Op from"node:os";import Bt from"node:path";import{promisify as VS}from"node:util";function _p(s){return No[s]||null}function Np(s){let e=Op.homedir();switch(s){case"claude":return Bt.join(e,".claude","CLAUDE.md");case"gemini":return Bt.join(e,".gemini","GEMINI.md");case"codex":return Bt.join(e,".codex","CODEX.md");case"aider":return Bt.join(e,".aider","AIDER.md");default:return""}}async function _o(s){try{return await WS(`which ${s}`),!0}catch{return!1}}async function Fo(s=process.cwd()){let e=[];return await _o("claude")&&e.push("claude"),(await _o("cursor")||await D(Bt.join(s,".cursor")))&&e.push("cursor"),await D(Bt.join(s,".github"))&&e.push("copilot"),(await _o("windsurf")||await D(Bt.join(s,".windsurf")))&&e.push("windsurf"),(await D(Bt.join(s,".continue"))||await D(Bt.join(Op.homedir(),".continue")))&&e.push("continue"),(await _o("codex")||await D(Bt.join(s,".agents")))&&e.push("codex"),e}async function Fp(s,e=process.cwd()){if(s==="auto"){let t=await Fo(e);return t.length>0?t:["claude"]}return s==="all"?BS:s.filter(t=>No[t])}var WS,No,Cs,BS,hc=b(()=>{"use strict";We();WS=VS(GS),No={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"}},Cs=["claude"],BS=Object.keys(No);l(_p,"getAIToolConfig");l(Np,"getGlobalConfigPath");l(_o,"commandExists");l(Fo,"detectInstalledTools");l(Fp,"resolveToolIds")});import br from"node:fs/promises";import zS from"node:path";function JS(s){let e=s.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function qS(s){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n=s.indexOf(e),r=s.indexOf(t);return n!==-1&&r!==-1&&r>n?s.substring(n,r+t.length):null}async function Up(s,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let n=JS(t);if(n!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${n||"none"}`);await br.mkdir(zS.dirname(s),{recursive:!0});let r="";try{r=await br.readFile(s,"utf-8")}catch(a){if(a.code!=="ENOENT")throw a}if(!r.trim()){await Lp(s,t);return}let o=qS(r),i="";o&&(i+=`${o}
688
-
689
- `),i+=t,await Lp(s,i)}async function Lp(s,e){let t=`${s}.tmp.${Date.now()}`;try{await br.writeFile(t,e,"utf-8"),await br.rename(t,s)}catch(n){try{await br.unlink(t)}catch{}throw n}}var Hp=b(()=>{"use strict";l(JS,"extractProjectId");l(qS,"extractGlobalSection");l(Up,"updateProjectSection");l(Lp,"writeFileAtomic")});import yc from"node:fs/promises";import wc from"node:path";async function Gp(s,e,t,n=Cs){let r=[];for(let o of n){let i=_p(o);if(!i){r.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await KS(s,i,e,t);r.push(a)}return r}async function KS(s,e,t,n){let r=$p(e.id);if(!r)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=r(s,e),i;if(e.outputPath==="repo")i=wc.join(n,e.outputFile);else{let a=Np(e.id);a?i=a:i=wc.join(t,"context",e.outputFile)}if(await yc.mkdir(wc.dirname(i),{recursive:!0}),e.outputPath==="global")await Up(i,s.projectId,o);else{try{let a=await yc.readFile(i,"utf-8"),c=jp(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Dp(o,a)}catch{}await yc.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 Vp=b(()=>{"use strict";U();Ip();Mp();hc();Hp();l(Gp,"generateAIToolContexts");l(KS,"generateForTool")});async function Wp(s){try{let e=x.getDb(s),t=e.prepare(`
682
+ `}function NS(n,e){let t=n.sources||Us(),s=[];if(s.push("---"),s.push(`description: prjct context for ${n.name}`),s.push("globs:"),s.push("alwaysApply: true"),s.push("---"),s.push(""),s.push(`You are working on ${n.name}, a ${n.projectType} ${n.ecosystem} project.`),s.push(""),s.push(xt(t.languages)),s.push("## Tech Stack"),n.languages.length>0&&s.push(`- Languages: ${n.languages.join(", ")}`),n.frameworks.length>0&&s.push(`- Frameworks: ${n.frameworks.join(", ")}`),s.push(""),s.push(xt(t.commands)),s.push("## Commands"),s.push(`- Install: \`${n.commands.install}\``),s.push(`- Dev: \`${n.commands.dev}\``),s.push(`- Test: \`${n.commands.test}\``),s.push(`- Build: \`${n.commands.build}\``),s.push(""),n.analysis){n.analysis.patterns?.length>0&&(s.push("## Code Patterns"),s.push(kr(n.analysis.patterns)),s.push("")),n.analysis.antiPatterns?.length>0&&(s.push("## Anti-Patterns (Avoid)"),s.push(Sr(n.analysis.antiPatterns)),s.push(""));let r=fc(n.analysis);r&&(s.push(r.trim()),s.push(""))}else s.push("> Run `p. sync` to populate project intelligence");return s.push(""),s.push(Oo(n,"concise")),s.join(`
683
+ `)}function FS(n,e){let t=n.sources||Us(),s=[];return s.push("# Copilot Instructions"),s.push(""),s.push(`This is ${n.name}, a ${n.ecosystem} project.`),s.push(""),s.push(xt(t.ecosystem)),s.push("## Project Info"),s.push(`- Type: ${n.projectType}`),s.push(`- Stack: ${n.frameworks.join(", ")||n.ecosystem}`),s.push(""),n.analysis?(n.analysis.patterns?.length>0&&(s.push("## Code Patterns"),s.push(kr(n.analysis.patterns,5)),s.push("")),n.analysis.antiPatterns?.length>0&&(s.push("## Anti-Patterns"),s.push(Sr(n.analysis.antiPatterns,3)),s.push(""))):(s.push("> Run `p. sync` to populate project intelligence"),s.push("")),s.push(xt(t.commands)),s.push("## Commands"),s.push(`- Test: \`${n.commands.test}\``),s.push(`- Build: \`${n.commands.build}\``),s.push(""),s.push(Oo(n,"concise")),s.join(`
684
+ `)}function LS(n,e){let t=n.sources||Us(),s=[];return s.push("---"),s.push(`description: prjct context for ${n.name}`),s.push("trigger: always_on"),s.push("---"),s.push(""),s.push(`# ${n.name}`),s.push(""),s.push(`${n.projectType} project using ${n.ecosystem}.`),s.push(""),s.push(xt(t.languages)),s.push("## Stack"),s.push(`- ${n.languages.join(", ")}`),n.frameworks.length>0&&s.push(`- ${n.frameworks.join(", ")}`),s.push(""),s.push(xt(t.commands)),s.push("## Commands"),s.push("```bash"),s.push("# Install"),s.push(n.commands.install),s.push("# Dev"),s.push(n.commands.dev),s.push("# Test"),s.push(n.commands.test),s.push("# Build"),s.push(n.commands.build),s.push("```"),s.push(""),n.analysis?(n.analysis.patterns?.length>0&&(s.push("## Code Patterns"),s.push(kr(n.analysis.patterns)),s.push("")),n.analysis.antiPatterns?.length>0&&(s.push("## Anti-Patterns (Avoid)"),s.push(Sr(n.analysis.antiPatterns)))):s.push("> Run `p. sync` to populate project intelligence"),s.push(""),s.push(Oo(n,"concise")),s.join(`
685
+ `)}function US(n,e){let t=[`You are working on ${n.name}, a ${n.projectType} ${n.ecosystem} project.`,"",`Stack: ${n.languages.join(", ")}${n.frameworks.length>0?` with ${n.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${n.commands.install}`,`- Dev: ${n.commands.dev}`,`- Test: ${n.commands.test}`,`- Build: ${n.commands.build}`];if(n.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of n.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(n.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of n.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}n.analysis||t.push("","Run `p. sync` to populate project intelligence."),t.push(""),t.push("prjct Rules:"),t.push(`- All prjct data: ~/.prjct-cli/projects/${n.projectId}/`),t.push('- Workflow: p. sync \u2192 p. task "desc" \u2192 work \u2192 p. done \u2192 p. ship'),t.push(""),t.push(`Project: ${n.name} v${n.version} | ${n.ecosystem} | Branch: ${n.branch} | Files: ~${n.fileCount}`),n.agents.workflow.length>0&&t.push(`Agents: ${[...n.agents.workflow,...n.agents.domain].join(", ")}`);let r={systemMessage:t.join(`
686
+ `),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: ${n.commands.test}`}]};return JSON.stringify(r,null,2)}function HS(n,e){let t=[];return t.push("<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->"),t.push(`# ${n.name} - Project Rules`),t.push(`<!-- projectId: ${n.projectId} -->`),t.push(`<!-- Generated: ${new Date().toISOString()} -->`),t.push(`<!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->`),t.push(""),t.push(`## THIS PROJECT (${n.ecosystem})`),t.push(""),t.push(`**Type:** ${n.projectType}`),t.push(`**Path:** ${n.repoPath}`),t.push(""),t.push("### Commands (USE THESE, NOT OTHERS)"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install dependencies | \`${n.commands.install}\` |`),t.push(`| Run dev server | \`${n.commands.dev}\` |`),t.push(`| Run tests | \`${n.commands.test}\` |`),t.push(`| Build | \`${n.commands.build}\` |`),t.push(`| Lint | \`${n.commands.lint}\` |`),t.push(`| Format | \`${n.commands.format}\` |`),t.push(""),t.push("### Code Conventions"),t.push(""),t.push(`- **Languages**: ${n.languages.join(", ")||"Not detected"}`),t.push(`- **Frameworks**: ${n.frameworks.join(", ")||"Not detected"}`),n.analysis?(n.analysis.patterns?.length>0&&(t.push(""),t.push("### Code Patterns (Follow These)"),t.push(""),t.push(kr(n.analysis.patterns))),n.analysis.antiPatterns?.length>0&&(t.push(""),t.push("### Anti-Patterns (Avoid These)"),t.push(""),t.push(Sr(n.analysis.antiPatterns))),t.push(fc(n.analysis))):(t.push(""),t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("---"),t.push(""),t.push(Oo(n,"full")),t.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
687
+ `)}function $p(n){return{claude:_S,cursor:NS,copilot:FS,windsurf:LS,continue:US,codex:HS}[n]||null}var Mp=b(()=>{"use strict";gc();l(Oo,"formatOperationalContext");l(kr,"formatPatterns");l(Sr,"formatAntiPatterns");l(fc,"formatStructure");l(OS,"formatAnalysisForClaude");l(_S,"formatForClaude");l(NS,"formatForCursor");l(FS,"formatForCopilot");l(LS,"formatForWindsurf");l(US,"formatForContinue");l(HS,"formatForCodex");l($p,"getFormatter")});import{exec as GS}from"node:child_process";import Op from"node:os";import Bt from"node:path";import{promisify as VS}from"node:util";function _p(n){return No[n]||null}function Np(n){let e=Op.homedir();switch(n){case"claude":return Bt.join(e,".claude","CLAUDE.md");case"gemini":return Bt.join(e,".gemini","GEMINI.md");case"codex":return Bt.join(e,".codex","CODEX.md");case"aider":return Bt.join(e,".aider","AIDER.md");default:return""}}async function _o(n){try{return await WS(`which ${n}`),!0}catch{return!1}}async function Fo(n=process.cwd()){let e=[];return await _o("claude")&&e.push("claude"),(await _o("cursor")||await j(Bt.join(n,".cursor")))&&e.push("cursor"),await j(Bt.join(n,".github"))&&e.push("copilot"),(await _o("windsurf")||await j(Bt.join(n,".windsurf")))&&e.push("windsurf"),(await j(Bt.join(n,".continue"))||await j(Bt.join(Op.homedir(),".continue")))&&e.push("continue"),(await _o("codex")||await j(Bt.join(n,".agents")))&&e.push("codex"),e}async function Fp(n,e=process.cwd()){if(n==="auto"){let t=await Fo(e);return t.length>0?t:["claude"]}return n==="all"?BS:n.filter(t=>No[t])}var WS,No,Cn,BS,hc=b(()=>{"use strict";We();WS=VS(GS),No={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"}},Cn=["claude"],BS=Object.keys(No);l(_p,"getAIToolConfig");l(Np,"getGlobalConfigPath");l(_o,"commandExists");l(Fo,"detectInstalledTools");l(Fp,"resolveToolIds")});import br from"node:fs/promises";import JS from"node:path";function zS(n){let e=n.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function qS(n){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",s=n.indexOf(e),r=n.indexOf(t);return s!==-1&&r!==-1&&r>s?n.substring(s,r+t.length):null}async function Up(n,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let s=zS(t);if(s!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${s||"none"}`);await br.mkdir(JS.dirname(n),{recursive:!0});let r="";try{r=await br.readFile(n,"utf-8")}catch(a){if(a.code!=="ENOENT")throw a}if(!r.trim()){await Lp(n,t);return}let o=qS(r),i="";o&&(i+=`${o}
688
+
689
+ `),i+=t,await Lp(n,i)}async function Lp(n,e){let t=`${n}.tmp.${Date.now()}`;try{await br.writeFile(t,e,"utf-8"),await br.rename(t,n)}catch(s){try{await br.unlink(t)}catch{}throw s}}var Hp=b(()=>{"use strict";l(zS,"extractProjectId");l(qS,"extractGlobalSection");l(Up,"updateProjectSection");l(Lp,"writeFileAtomic")});import yc from"node:fs/promises";import wc from"node:path";async function Gp(n,e,t,s=Cn){let r=[];for(let o of s){let i=_p(o);if(!i){r.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await KS(n,i,e,t);r.push(a)}return r}async function KS(n,e,t,s){let r=$p(e.id);if(!r)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=r(n,e),i;if(e.outputPath==="repo")i=wc.join(s,e.outputFile);else{let a=Np(e.id);a?i=a:i=wc.join(t,"context",e.outputFile)}if(await yc.mkdir(wc.dirname(i),{recursive:!0}),e.outputPath==="global")await Up(i,n.projectId,o);else{try{let a=await yc.readFile(i,"utf-8"),c=Dp(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=jp(o,a)}catch{}await yc.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 Vp=b(()=>{"use strict";U();Ip();Mp();hc();Hp();l(Gp,"generateAIToolContexts");l(KS,"generateForTool")});async function Wp(n){try{let e=x.getDb(n),t=e.prepare(`
690
690
  SELECT description, completed_at, branch
691
691
  FROM tasks
692
692
  WHERE status = 'done' OR status = 'shipped'
693
693
  ORDER BY completed_at DESC
694
694
  LIMIT 10
695
- `).all(),n=e.prepare(`
695
+ `).all(),s=e.prepare(`
696
696
  SELECT description, completed_at as resolution
697
697
  FROM tasks
698
698
  WHERE (type = 'bug' OR description LIKE '%fix%' OR description LIKE '%bug%')
@@ -704,27 +704,27 @@ ${s.learnings.shippedFeatures.length>0?s.learnings.shippedFeatures.map(n=>`- **$
704
704
  FROM shipped_features
705
705
  ORDER BY shipped_at DESC
706
706
  LIMIT 5
707
- `).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:r.map(o=>({name:o.name,description:o.description||"",version:o.version})),patterns:[]}}catch{return{completedTasks:[],resolvedBugs:[],shippedFeatures:[],patterns:[]}}}var Bp=b(()=>{"use strict";se();l(Wp,"extractLearningsFromDB")});var vr,kc,Sc,zp=b(()=>{"use strict";rr();fe();vr=3,kc=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=vr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${vr} occurrences needed`});return r}async learnFromOutcomes(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=this.extractOutcomePatterns(t);r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=vr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${vr} occurrences needed`});return r}extractFileCochangePatterns(e){let t=new Map;for(let r of e){if(!r.subtaskSummaries)continue;let o=new Set;for(let a of r.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(r.taskId),t.set(u,d)}}let n=[];for(let[r,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=r.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((r,o)=>o.occurrences-r.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let r of n.feedback.stackConfirmed){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let r of n.feedback.patternsDiscovered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:n,occurrences:r,confidence:this.calculateConfidence(r),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let r of n.feedback.issuesEncountered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).filter(([n,{count:r}])=>r>=2).map(([n,{count:r,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,r=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=r.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),r.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 r)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>=vr&&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,r)=>r.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let r=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:r}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:r,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: ${v()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
708
- `)}},Sc=new kc});import{z as R}from"zod";var Jp,XS,YS,qp,QS,ZS,eb,tb,nb,sb,rb,Kp,ob,ib,B0,Xp,Yp,Qp,Zp,ab,Lo,em=b(()=>{"use strict";Jp=R.number().min(1).max(5),XS=R.enum(["exceeded","met","partial","failed"]),YS=R.enum(["definitely","probably","maybe","no"]),qp=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),QS=R.object({estimated:R.object({hours:R.number(),confidence:R.enum(["low","medium","high"]).optional(),source:R.enum(["prd","manual","historical"]).optional()}),actual:R.object({hours:R.number(),commits:R.number().optional(),linesAdded:R.number().optional(),linesRemoved:R.number().optional(),sessions:R.number().optional()}),variance:R.object({hours:R.number(),percentage:R.number(),reason:qp.optional(),explanation:R.string().optional()})}),ZS=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),eb=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),tb=R.object({metrics:R.array(ZS),acceptanceCriteria:R.array(eb),overallSuccess:XS,successScore:R.number().min(0).max(100)}),nb=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),sb=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(nb)}),rb=R.object({valueDelivered:R.number().min(1).max(10),userImpact:R.enum(["none","low","medium","high","critical"]),businessImpact:R.enum(["none","low","medium","high","critical"]),roiScore:R.number(),worthIt:YS,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),Kp=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:Jp,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),ob=R.object({id:R.string(),featureId:R.string(),featureName:R.string(),prdId:R.string().nullable(),version:R.string().optional(),branch:R.string().optional(),prUrl:R.string().optional(),effort:QS,success:tb.optional(),learnings:sb,roi:rb,rating:Jp,taskOutcomes:R.array(Kp).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),ib=R.object({totalFeatures:R.number(),averageEstimationAccuracy:R.number(),averageSuccessRate:R.number(),averageROI:R.number(),bySuccessLevel:R.object({exceeded:R.number(),met:R.number(),partial:R.number(),failed:R.number()}),variancePatterns:R.array(R.object({reason:qp,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),B0=R.object({outcomes:R.array(ob),taskOutcomes:R.array(Kp).optional(),aggregates:ib.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),Xp={outcomes:[],taskOutcomes:[],lastUpdated:""},Yp=l((s,e)=>{let t=e-s,n=s>0?(e-s)/s*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),Qp=l((s,e)=>e<=0?s*10:Math.round(s*10/e*100)/100,"calculateROIScore"),Zp=l(s=>s>=100?"exceeded":s>=80?"met":s>=50?"partial":"failed","determineSuccessLevel"),ab=l(s=>Math.max(0,100-Math.abs(s)),"calculateEstimationAccuracy"),Lo=l(s=>{if(s.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=s.map(d=>ab(d.effort.variance.percentage)),t=s.filter(d=>d.success).map(d=>d.success.successScore),n=s.map(d=>d.roi.roiScore),r={exceeded:s.filter(d=>d.success?.overallSuccess==="exceeded").length,met:s.filter(d=>d.success?.overallSuccess==="met").length,partial:s.filter(d=>d.success?.overallSuccess==="partial").length,failed:s.filter(d=>d.success?.overallSuccess==="failed").length},o=s.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=s.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:s.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:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var bc,tm,nm=b(()=>{"use strict";em();Zt();fe();bc=class extends Je{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Xp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Lo([t,...n.outcomes]),lastUpdated:v()})),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:v()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),r=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:r}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Lo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Lo(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,r=t/60,o=Yp(n,r),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Qp(5,r);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:r,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Zp(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 r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t||60}},tm=new bc});import Uo from"node:fs/promises";import Ho from"node:path";var vc,Tc,sm,rm=b(()=>{"use strict";U();vc=".prjct/.prjct-state.md",Tc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=Ho.join(e,vc);await Uo.mkdir(Ho.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await Uo.writeFile(n,r,"utf-8")}async remove(e){try{await Uo.unlink(Ho.join(e,vc))}catch(t){if(!P(t))throw t}}async exists(e){let t=Ho.join(e,vc);try{return await Uo.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 r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${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(`
709
- `)}},sm=new Tc});var Pc,yt,Gn=b(()=>{"use strict";ft();_n();se();Pc=class{static{l(this,"MemoryService")}async log(e,t,n,r){try{let o=await $.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...n,author:r})}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?N.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 r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.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 r=await $.getProjectId(e);return r?N.query(r,"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(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;N.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 N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.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=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=en.MEMORY_MAX_ENTRIES)return 0;let r=n-en.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);Ct.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&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},yt=new Pc});import{createHash as cb}from"node:crypto";import im from"node:fs/promises";import Ec from"node:path";function Vn(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"")}function ub(s){let e=Ec.resolve(s);return cb("sha256").update(e).digest("hex").slice(0,16)}function Go(s){let e=ye(s);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function db(s){let e=[],t=[s];for(;t.length>0&&e.length<om;){let n=t.pop();if(!n)break;let r=await im.readdir(n,{withFileTypes:!0});for(let o of r){if(e.length>=om)break;let i=Ec.join(n,o.name);if(o.isDirectory()){lb.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 pb(s,e){let t=[],n=[],r=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=Ec.relative(s,d),p=await im.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(r=!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 r&&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 mb(s){let e=new Set,t=[];for(let n of s){let r=`${Vn(n.name)}::${Vn(n.source)}`;e.has(r)||(e.add(r),t.push(n))}return t}function gb(s){let e=new Set,t=[];for(let n of s){let r=`${Vn(n.issue)}::${Vn(n.file)}::${Vn(n.source)}`;e.has(r)||(e.add(r),t.push(n))}return t}var lb,om,Cc,fb,am,cm=b(()=>{"use strict";Wt();se();lb=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),om=400;l(Vn,"normalizeKey");l(ub,"repoHash");l(Go,"parseBaselineFile");l(db,"listSourceFiles");l(pb,"detectRepoRules");l(mb,"dedupePatterns");l(gb,"dedupeAntiPatterns");Cc=class{static{l(this,"PatternExtractor")}async extract(e){let t=ub(e.projectPath),n=await db(e.projectPath),r=[],o=[];for(let p of e.languages){let g=Vn(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,language:p,source:"baseline",confidence:w.confidence??.8}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",language:p,source:"baseline",confidence:w.confidence??.8})))}for(let p of e.frameworks){let g=Vn(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,framework:p,source:"baseline",confidence:w.confidence??.82}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",framework:p,source:"baseline",confidence:w.confidence??.82}))),e.context7Verified&&r.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 pb(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=mb([...r,...i.patterns,...a]),d=gb([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return x.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}}},fb=new Cc,am=fb});import xc from"node:fs/promises";import hb from"node:os";import lm from"node:path";function Ac(){return lm.join(hb.homedir(),".prjct-cli","skills",yb)}function wb(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Tr(){try{let s=await xc.readFile(Ac(),"utf-8");return JSON.parse(s)}catch{return wb()}}async function Rc(s){let e=Ac();await xc.mkdir(lm.dirname(e),{recursive:!0}),s.generatedAt=new Date().toISOString(),await xc.writeFile(e,JSON.stringify(s,null,2),"utf-8")}async function kb(s){let e=await Tr();e.skills[s.name]=s,await Rc(e)}async function Sb(s){let e=await Tr();return s in e.skills?(delete e.skills[s],await Rc(e),!0):!1}async function bb(s){return(await Tr()).skills[s]||null}async function vb(){return(await Tr()).skills}function Tb(){return Ac()}var yb,Pr,um=b(()=>{"use strict";yb=".skill-lock.json";l(Ac,"getLockFilePath");l(wb,"createEmptyLockFile");l(Tr,"read");l(Rc,"write");l(kb,"addEntry");l(Sb,"removeEntry");l(bb,"getEntry");l(vb,"getAll");l(Tb,"getPath");Pr={read:Tr,write:Rc,addEntry:kb,removeEntry:Sb,getEntry:bb,getAll:vb,getPath:Tb}});import{exec as Pb}from"node:child_process";import on from"node:fs/promises";import jc from"node:os";import st from"node:path";import{promisify as Cb}from"node:util";import{glob as dm}from"glob";function mm(s){if(s.startsWith("./")||s.startsWith("/")||s.startsWith("~")){let n=s.startsWith("~")?st.join(jc.homedir(),s.slice(1)):st.resolve(s);return{type:"local",localPath:n,url:n}}let e=s.indexOf("@");if(e>0){let n=s.slice(0,e),r=s.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:r,url:`https://github.com/${o}/${i}`}}let t=s.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: "${s}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function gm(s){let e=[];try{let r=st.join(s,"SKILL.md");await on.access(r);let o=st.basename(s);e.push({name:o,filePath:r})}catch{}let t=await dm("*/SKILL.md",{cwd:s,absolute:!0});for(let r of t){let o=st.basename(st.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let n=await dm("skills/*/SKILL.md",{cwd:s,absolute:!0});for(let r of n){let o=st.basename(st.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function Eb(s,e,t){let n=new Date().toISOString(),r=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&r.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=s.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()}
707
+ `).all();return{completedTasks:t.map(o=>({description:o.description,completedAt:o.completed_at||"unknown",branch:o.branch})),resolvedBugs:s.map(o=>({description:o.description,resolution:o.resolution||"completed"})),shippedFeatures:r.map(o=>({name:o.name,description:o.description||"",version:o.version})),patterns:[]}}catch{return{completedTasks:[],resolvedBugs:[],shippedFeatures:[],patterns:[]}}}var Bp=b(()=>{"use strict";ne();l(Wp,"extractLearningsFromDB")});var vr,kc,Sc,Jp=b(()=>{"use strict";rr();fe();vr=3,kc=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=vr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${vr} occurrences needed`});return r}async learnFromOutcomes(e,t,s){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=this.extractOutcomePatterns(t);r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=vr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${vr} occurrences needed`});return r}extractFileCochangePatterns(e){let t=new Map;for(let r of e){if(!r.subtaskSummaries)continue;let o=new Set;for(let a of r.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(r.taskId),t.set(u,d)}}let s=[];for(let[r,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=r.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((r,o)=>o.occurrences-r.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let r of s.feedback.stackConfirmed){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(r,o)}return Array.from(t.entries()).map(([s,{count:r,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:r,confidence:this.calculateConfidence(r),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let r of s.feedback.patternsDiscovered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(r,o)}return Array.from(t.entries()).map(([s,{count:r,tasks:o}])=>({pattern:s,occurrences:r,confidence:this.calculateConfidence(r),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let r of s.feedback.issuesEncountered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(r,o)}return Array.from(t.entries()).filter(([s,{count:r}])=>r>=2).map(([s,{count:r,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:r,confidence:this.calculateConfidence(r),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,r=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=r.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),r.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of r)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>=vr&&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((s,r)=>r.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let r=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:r}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:r,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: ${v()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
708
+ `)}},Sc=new kc});import{z as R}from"zod";var zp,XS,YS,qp,QS,ZS,eb,tb,sb,nb,rb,Kp,ob,ib,B0,Xp,Yp,Qp,Zp,ab,Lo,em=b(()=>{"use strict";zp=R.number().min(1).max(5),XS=R.enum(["exceeded","met","partial","failed"]),YS=R.enum(["definitely","probably","maybe","no"]),qp=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),QS=R.object({estimated:R.object({hours:R.number(),confidence:R.enum(["low","medium","high"]).optional(),source:R.enum(["prd","manual","historical"]).optional()}),actual:R.object({hours:R.number(),commits:R.number().optional(),linesAdded:R.number().optional(),linesRemoved:R.number().optional(),sessions:R.number().optional()}),variance:R.object({hours:R.number(),percentage:R.number(),reason:qp.optional(),explanation:R.string().optional()})}),ZS=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),eb=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),tb=R.object({metrics:R.array(ZS),acceptanceCriteria:R.array(eb),overallSuccess:XS,successScore:R.number().min(0).max(100)}),sb=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),nb=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(sb)}),rb=R.object({valueDelivered:R.number().min(1).max(10),userImpact:R.enum(["none","low","medium","high","critical"]),businessImpact:R.enum(["none","low","medium","high","critical"]),roiScore:R.number(),worthIt:YS,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),Kp=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:zp,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),ob=R.object({id:R.string(),featureId:R.string(),featureName:R.string(),prdId:R.string().nullable(),version:R.string().optional(),branch:R.string().optional(),prUrl:R.string().optional(),effort:QS,success:tb.optional(),learnings:nb,roi:rb,rating:zp,taskOutcomes:R.array(Kp).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),ib=R.object({totalFeatures:R.number(),averageEstimationAccuracy:R.number(),averageSuccessRate:R.number(),averageROI:R.number(),bySuccessLevel:R.object({exceeded:R.number(),met:R.number(),partial:R.number(),failed:R.number()}),variancePatterns:R.array(R.object({reason:qp,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),B0=R.object({outcomes:R.array(ob),taskOutcomes:R.array(Kp).optional(),aggregates:ib.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),Xp={outcomes:[],taskOutcomes:[],lastUpdated:""},Yp=l((n,e)=>{let t=e-n,s=n>0?(e-n)/n*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),Qp=l((n,e)=>e<=0?n*10:Math.round(n*10/e*100)/100,"calculateROIScore"),Zp=l(n=>n>=100?"exceeded":n>=80?"met":n>=50?"partial":"failed","determineSuccessLevel"),ab=l(n=>Math.max(0,100-Math.abs(n)),"calculateEstimationAccuracy"),Lo=l(n=>{if(n.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=n.map(d=>ab(d.effort.variance.percentage)),t=n.filter(d=>d.success).map(d=>d.success.successScore),s=n.map(d=>d.roi.roiScore),r={exceeded:n.filter(d=>d.success?.overallSuccess==="exceeded").length,met:n.filter(d=>d.success?.overallSuccess==="met").length,partial:n.filter(d=>d.success?.overallSuccess==="partial").length,failed:n.filter(d=>d.success?.overallSuccess==="failed").length},o=n.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=n.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:n.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(s.reduce((d,m)=>d+m,0)/s.length*100)/100,bySuccessLevel:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var bc,tm,sm=b(()=>{"use strict";em();Zt();fe();bc=class extends ze{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Xp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Lo([t,...s.outcomes]),lastUpdated:v()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,s=>({...s,taskOutcomes:[t,...s.taskOutcomes||[]],lastUpdated:v()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),r=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:r}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Lo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Lo(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,s=t/60,r=t/60,o=Yp(s,r),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Qp(5,r);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:s,confidence:"low",source:"manual"},actual:{hours:r,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Zp(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,s=e.match(/(\d+)h/);s&&(t+=parseInt(s[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t||60}},tm=new bc});import Uo from"node:fs/promises";import Ho from"node:path";var vc,Tc,nm,rm=b(()=>{"use strict";U();vc=".prjct/.prjct-state.md",Tc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Ho.join(e,vc);await Uo.mkdir(Ho.dirname(s),{recursive:!0});let r=this.toMarkdown(t);await Uo.writeFile(s,r,"utf-8")}async remove(e){try{await Uo.unlink(Ho.join(e,vc))}catch(t){if(!C(t))throw t}}async exists(e){let t=Ho.join(e,vc);try{return await Uo.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 s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let r=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${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 s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
709
+ `)}},nm=new Tc});var Pc,yt,Hs=b(()=>{"use strict";ft();Os();ne();Pc=class{static{l(this,"MemoryService")}async log(e,t,s,r){try{let o=await $.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await $.getProjectId(e);return s?N.query(s,"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(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async search(e,t,s=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-s)}async getByAction(e,t,s=50){try{let r=await $.getProjectId(e);return r?N.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).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(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;N.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 N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=es.MEMORY_MAX_ENTRIES)return 0;let r=s-es.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);Ct.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&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},yt=new Pc});import{createHash as cb}from"node:crypto";import im from"node:fs/promises";import Ec from"node:path";function Gs(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"")}function ub(n){let e=Ec.resolve(n);return cb("sha256").update(e).digest("hex").slice(0,16)}function Go(n){let e=ye(n);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function db(n){let e=[],t=[n];for(;t.length>0&&e.length<om;){let s=t.pop();if(!s)break;let r=await im.readdir(s,{withFileTypes:!0});for(let o of r){if(e.length>=om)break;let i=Ec.join(s,o.name);if(o.isDirectory()){lb.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 pb(n,e){let t=[],s=[],r=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=Ec.relative(n,d),p=await im.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(r=!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,s.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,s.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,s.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 r&&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:s}}function mb(n){let e=new Set,t=[];for(let s of n){let r=`${Gs(s.name)}::${Gs(s.source)}`;e.has(r)||(e.add(r),t.push(s))}return t}function gb(n){let e=new Set,t=[];for(let s of n){let r=`${Gs(s.issue)}::${Gs(s.file)}::${Gs(s.source)}`;e.has(r)||(e.add(r),t.push(s))}return t}var lb,om,Cc,fb,am,cm=b(()=>{"use strict";Wt();ne();lb=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),om=400;l(Gs,"normalizeKey");l(ub,"repoHash");l(Go,"parseBaselineFile");l(db,"listSourceFiles");l(pb,"detectRepoRules");l(mb,"dedupePatterns");l(gb,"dedupeAntiPatterns");Cc=class{static{l(this,"PatternExtractor")}async extract(e){let t=ub(e.projectPath),s=await db(e.projectPath),r=[],o=[];for(let p of e.languages){let g=Gs(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,language:p,source:"baseline",confidence:w.confidence??.8}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",language:p,source:"baseline",confidence:w.confidence??.8})))}for(let p of e.frameworks){let g=Gs(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,framework:p,source:"baseline",confidence:w.confidence??.82}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",framework:p,source:"baseline",confidence:w.confidence??.82}))),e.context7Verified&&r.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 pb(e.projectPath,s),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=mb([...r,...i.patterns,...a]),d=gb([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return x.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}}},fb=new Cc,am=fb});import xc from"node:fs/promises";import hb from"node:os";import lm from"node:path";function Ac(){return lm.join(hb.homedir(),".prjct-cli","skills",yb)}function wb(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Tr(){try{let n=await xc.readFile(Ac(),"utf-8");return JSON.parse(n)}catch{return wb()}}async function Rc(n){let e=Ac();await xc.mkdir(lm.dirname(e),{recursive:!0}),n.generatedAt=new Date().toISOString(),await xc.writeFile(e,JSON.stringify(n,null,2),"utf-8")}async function kb(n){let e=await Tr();e.skills[n.name]=n,await Rc(e)}async function Sb(n){let e=await Tr();return n in e.skills?(delete e.skills[n],await Rc(e),!0):!1}async function bb(n){return(await Tr()).skills[n]||null}async function vb(){return(await Tr()).skills}function Tb(){return Ac()}var yb,Pr,um=b(()=>{"use strict";yb=".skill-lock.json";l(Ac,"getLockFilePath");l(wb,"createEmptyLockFile");l(Tr,"read");l(Rc,"write");l(kb,"addEntry");l(Sb,"removeEntry");l(bb,"getEntry");l(vb,"getAll");l(Tb,"getPath");Pr={read:Tr,write:Rc,addEntry:kb,removeEntry:Sb,getEntry:bb,getAll:vb,getPath:Tb}});import{exec as Pb}from"node:child_process";import os from"node:fs/promises";import Dc from"node:os";import nt from"node:path";import{promisify as Cb}from"node:util";import{glob as dm}from"glob";function mm(n){if(n.startsWith("./")||n.startsWith("/")||n.startsWith("~")){let s=n.startsWith("~")?nt.join(Dc.homedir(),n.slice(1)):nt.resolve(n);return{type:"local",localPath:s,url:s}}let e=n.indexOf("@");if(e>0){let s=n.slice(0,e),r=n.slice(e+1),[o,i]=s.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:r,url:`https://github.com/${o}/${i}`}}let t=n.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: "${n}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function gm(n){let e=[];try{let r=nt.join(n,"SKILL.md");await os.access(r);let o=nt.basename(n);e.push({name:o,filePath:r})}catch{}let t=await dm("*/SKILL.md",{cwd:n,absolute:!0});for(let r of t){let o=nt.basename(nt.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let s=await dm("skills/*/SKILL.md",{cwd:n,absolute:!0});for(let r of s){let o=nt.basename(nt.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function Eb(n,e,t){let s=new Date().toISOString(),r=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${s}`];t&&r.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=n.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()}
710
710
  ${r.join(`
711
- `)}`;return s.replace(o,`---
711
+ `)}`;return n.replace(o,`---
712
712
  ${c}
713
713
  ---`)}return`---
714
714
  ${r.join(`
715
715
  `)}
716
716
  ---
717
717
 
718
- ${s}`}function Ic(){return st.join(jc.homedir(),".claude","skills")}async function Dc(s,e,t,n){let r=Ic(),o=st.join(r,e),i=st.join(o,"SKILL.md"),a=await on.readFile(s,"utf-8"),c=Eb(a,t,n);return await on.mkdir(o,{recursive:!0}),await on.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function xb(s){let e={installed:[],skipped:[],errors:[]};if(!hr.isAvailable("git")){let n=hr.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(jc.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${s.owner}/${s.repo}.git`;await pm(`git clone --depth 1 ${n} ${t}`,{timeout:wr("GIT_CLONE")});let r;try{let{stdout:a}=await pm("git rev-parse HEAD",{cwd:t,timeout:wr("TOOL_CHECK")});r=a.trim()}catch{}let o=await gm(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${s.owner}/${s.repo}`),e;let i=s.skillName?o.filter(a=>a.name===s.skillName):o;if(s.skillName&&i.length===0)return e.errors.push(`Skill "${s.skillName}" not found in ${s.owner}/${s.repo}`),e;for(let a of i)try{let c=await Dc(a.filePath,a.name,s,r),u={name:a.name,source:{type:"github",url:`${s.owner}/${s.repo}`,sha:r},installedAt:new Date().toISOString(),filePath:c.filePath};await Pr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await on.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function Ab(s){let e={installed:[],skipped:[],errors:[]},t=s.localPath;try{await on.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await on.stat(t)).isFile()){let r=st.basename(st.dirname(t));try{let o=await Dc(t,r,s),i={name:r,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await Pr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let r=await gm(t);if(r.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of r)try{let i=await Dc(o.filePath,o.name,s),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await Pr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function Rb(s){let e=Ic(),t=st.join(e,s);try{await on.rm(t,{recursive:!0,force:!0})}catch{}let n=st.join(e,`${s}.md`);try{await on.rm(n,{force:!0})}catch{}return Pr.removeEntry(s)}async function Db(s){let e=mm(s);switch(e.type){case"github":return xb(e);case"local":return Ab(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var pm,fm,hm=b(()=>{"use strict";U();Fn();Xa();um();pm=Cb(Pb);l(mm,"parseSource");l(gm,"discoverSkills");l(Eb,"injectSourceMetadata");l(Ic,"getInstallDir");l(Dc,"installSkillFile");l(xb,"installFromGitHub");l(Ab,"installFromLocal");l(Rb,"remove");l(Db,"install");fm={install:Db,remove:Rb,parseSource:mm,getInstallDir:Ic}});import At from"node:fs/promises";import jb from"node:os";import wt from"node:path";async function ym(s,e,t,n){let r=[],o=wt.join(s,"agents");try{let c=await At.readdir(o);for(let u of c)u.endsWith(".md")&&await At.unlink(wt.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:Z(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>Ib(c,o)));for(let c of i)r.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=>$b(c.name,o,t,e,n)));for(let c of a)r.push({name:c.name,type:"domain",skill:c.skill});return r}async function wm(s){let e=wt.join(s,"agents"),t=[];try{let n=await At.readdir(e),r=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=r.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function km(s){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...s.matchAll(e)];if(t.length===0)return s;let n=s;for(let r of t){let o=r[1],i=ye(`subagents/${o}.md`);if(!i){let a=wt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await At.readFile(a,"utf-8")}catch{n=n.replace(r[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(r[0],i.trim())}return n}async function Ib(s,e){let t="";try{let n=wt.join(__dirname,"..","..","templates","subagents","workflow",`${s}.md`);t=await At.readFile(n,"utf-8"),t=await km(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:s,error:Z(n)}),t=Ob(s)}await At.writeFile(wt.join(e,`${s}.md`),t,"utf-8")}async function $b(s,e,t,n,r){let o="";try{let i=wt.join(__dirname,"..","..","templates","subagents","domain",`${s}.md`);o=await At.readFile(i,"utf-8"),o=await km(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:s,error:Z(i)}),o=_b(s,t,n)}o=Mb(o,s,r),await At.writeFile(wt.join(e,`${s}.md`),o,"utf-8")}function Mb(s,e,t){if(!t)return s;let{patternsDiscovered:n,knownGotchas:r,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||r.length>0||i.length>0))return s;let c=[`
718
+ ${n}`}function Ic(){return nt.join(Dc.homedir(),".claude","skills")}async function jc(n,e,t,s){let r=Ic(),o=nt.join(r,e),i=nt.join(o,"SKILL.md"),a=await os.readFile(n,"utf-8"),c=Eb(a,t,s);return await os.mkdir(o,{recursive:!0}),await os.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:s}}async function xb(n){let e={installed:[],skipped:[],errors:[]};if(!hr.isAvailable("git")){let s=hr.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${s.error?.hint||"Install git and try again."}`),e}let t=nt.join(Dc.tmpdir(),`prjct-skill-${Date.now()}`);try{let s=`https://github.com/${n.owner}/${n.repo}.git`;await pm(`git clone --depth 1 ${s} ${t}`,{timeout:wr("GIT_CLONE")});let r;try{let{stdout:a}=await pm("git rev-parse HEAD",{cwd:t,timeout:wr("TOOL_CHECK")});r=a.trim()}catch{}let o=await gm(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${n.owner}/${n.repo}`),e;let i=n.skillName?o.filter(a=>a.name===n.skillName):o;if(n.skillName&&i.length===0)return e.errors.push(`Skill "${n.skillName}" not found in ${n.owner}/${n.repo}`),e;for(let a of i)try{let c=await jc(a.filePath,a.name,n,r),u={name:a.name,source:{type:"github",url:`${n.owner}/${n.repo}`,sha:r},installedAt:new Date().toISOString(),filePath:c.filePath};await Pr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await os.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function Ab(n){let e={installed:[],skipped:[],errors:[]},t=n.localPath;try{await os.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await os.stat(t)).isFile()){let r=nt.basename(nt.dirname(t));try{let o=await jc(t,r,n),i={name:r,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await Pr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let r=await gm(t);if(r.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of r)try{let i=await jc(o.filePath,o.name,n),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await Pr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function Rb(n){let e=Ic(),t=nt.join(e,n);try{await os.rm(t,{recursive:!0,force:!0})}catch{}let s=nt.join(e,`${n}.md`);try{await os.rm(s,{force:!0})}catch{}return Pr.removeEntry(n)}async function jb(n){let e=mm(n);switch(e.type){case"github":return xb(e);case"local":return Ab(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var pm,fm,hm=b(()=>{"use strict";U();Ns();Xa();um();pm=Cb(Pb);l(mm,"parseSource");l(gm,"discoverSkills");l(Eb,"injectSourceMetadata");l(Ic,"getInstallDir");l(jc,"installSkillFile");l(xb,"installFromGitHub");l(Ab,"installFromLocal");l(Rb,"remove");l(jb,"install");fm={install:jb,remove:Rb,parseSource:mm,getInstallDir:Ic}});import At from"node:fs/promises";import Db from"node:os";import wt from"node:path";async function ym(n,e,t,s){let r=[],o=wt.join(n,"agents");try{let c=await At.readdir(o);for(let u of c)u.endsWith(".md")&&await At.unlink(wt.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:Z(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>Ib(c,o)));for(let c of i)r.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=>$b(c.name,o,t,e,s)));for(let c of a)r.push({name:c.name,type:"domain",skill:c.skill});return r}async function wm(n){let e=wt.join(n,"agents"),t=[];try{let s=await At.readdir(e),r=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of s){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=r.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function km(n){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...n.matchAll(e)];if(t.length===0)return n;let s=n;for(let r of t){let o=r[1],i=ye(`subagents/${o}.md`);if(!i){let a=wt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await At.readFile(a,"utf-8")}catch{s=s.replace(r[0],`<!-- partial "${o}" not found -->`);continue}}s=s.replace(r[0],i.trim())}return s}async function Ib(n,e){let t="";try{let s=wt.join(__dirname,"..","..","templates","subagents","workflow",`${n}.md`);t=await At.readFile(s,"utf-8"),t=await km(t)}catch(s){H.debug("Workflow agent template not found, generating minimal",{name:n,error:Z(s)}),t=Ob(n)}await At.writeFile(wt.join(e,`${n}.md`),t,"utf-8")}async function $b(n,e,t,s,r){let o="";try{let i=wt.join(__dirname,"..","..","templates","subagents","domain",`${n}.md`);o=await At.readFile(i,"utf-8"),o=await km(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",s.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:n,error:Z(i)}),o=_b(n,t,s)}o=Mb(o,n,r),await At.writeFile(wt.join(e,`${n}.md`),o,"utf-8")}function Mb(n,e,t){if(!t)return n;let{patternsDiscovered:s,knownGotchas:r,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(s.length>0||r.length>0||i.length>0))return n;let c=[`
719
719
  ## Recent Learnings (from completed tasks)
720
- `];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(r.length>0){c.push("### Known Gotchas");for(let u of r)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 s+c.join(`
721
- `)}function Ob(s){return`---
722
- name: ${s}
723
- description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[s]||"Workflow agent"}
720
+ `];if(s.length>0){c.push("### Discovered Patterns");for(let u of s)c.push(`- ${u}`);c.push("")}if(r.length>0){c.push("### Known Gotchas");for(let u of r)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 n+c.join(`
721
+ `)}function Ob(n){return`---
722
+ name: ${n}
723
+ description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[n]||"Workflow agent"}
724
724
  tools: Read, Write, Glob
725
725
  ---
726
726
 
727
- # ${s.toUpperCase()}
727
+ # ${n.toUpperCase()}
728
728
 
729
729
  Workflow agent for prjct operations.
730
730
 
@@ -734,16 +734,16 @@ When invoked:
734
734
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
735
735
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
736
736
  3. Execute requested operation
737
- `}function _b(s,e,t){return`---
738
- name: ${s}
739
- description: ${s.charAt(0).toUpperCase()+s.slice(1)} specialist for ${e.name}
737
+ `}function _b(n,e,t){return`---
738
+ name: ${n}
739
+ description: ${n.charAt(0).toUpperCase()+n.slice(1)} specialist for ${e.name}
740
740
  tools: Read, Write, Glob, Grep
741
741
  skills: []
742
742
  ---
743
743
 
744
- # ${s.toUpperCase()} AGENT
744
+ # ${n.toUpperCase()} AGENT
745
745
 
746
- Domain specialist for ${s} tasks.
746
+ Domain specialist for ${n} tasks.
747
747
 
748
748
  ## Project Context
749
749
 
@@ -753,49 +753,49 @@ Domain specialist for ${s} tasks.
753
753
 
754
754
  ## Your Role
755
755
 
756
- You are the ${s} expert for this project. Apply best practices for the detected stack.
757
- `}function Sm(s,e,t){let n=[];for(let o of s)o.skill&&n.push({agent:o.name,skill:o.skill});let r={projectId:e,syncedAt:v(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return At.writeFile(wt.join(t,"config","skills.json"),JSON.stringify(r,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:Z(o)})}),n}async function bm(s){let e=[];try{let t=wt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await At.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of s){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=wt.join(jb.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=wt.join(a,d,"SKILL.md"),p=wt.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("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let w=await fm.install(k);w.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):w.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:w.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:Z(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:Z(t)})}return e}var vm=b(()=>{"use strict";Wt();Yt();fe();hn();hm();l(ym,"generateAgents");l(wm,"loadExistingAgents");l(km,"resolveTemplateIncludes");l(Ib,"generateWorkflowAgent");l($b,"generateDomainAgent");l(Mb,"injectFeedbackSection");l(Ob,"generateMinimalWorkflowAgent");l(_b,"generateMinimalDomainAgent");l(Sm,"configureSkills");l(bm,"autoInstallSkills")});import Tm from"node:fs/promises";import Pm from"node:path";var Vo,Cm=b(()=>{"use strict";Vo=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(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(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=Pm.join(this.projectPath,"package.json"),t=await Tm.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Tm.access(Pm.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as Nb}from"node:child_process";import Em from"node:fs/promises";import $c from"node:path";import{promisify as Fb}from"node:util";async function xm(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Wn("git branch --show-current",{cwd:s});e.branch=t.trim()||"main";let{stdout:n}=await Wn("git rev-list --count HEAD",{cwd:s});e.commits=parseInt(n.trim(),10)||0;let{stdout:r}=await Wn("git shortlog -sn --all | wc -l",{cwd:s});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await Wn("git status --porcelain",{cwd:s}),i=o.trim().split(`
758
- `).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 Wn('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:s});e.recentCommits=a.split(`
759
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Wn('git log --oneline --since="1 week ago" | wc -l',{cwd:s});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:Z(t)})}return e}async function zt(s,e){try{return await Em.access($c.join(s,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:Z(t)}),!1}}async function Am(s){let e={fileCount:0,version:"0.0.0",name:$c.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Wn('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:s});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:s,error:Z(t)}),e.fileCount=0}try{let t=$c.join(s,"package.json"),n=JSON.parse(await Em.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let r={...n.dependencies,...n.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await zt(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:s,error:Z(t)})}return await zt(s,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await zt(s,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await zt(s,"requirements.txt")||await zt(s,"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 Rm(s){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 zt(s,"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 zt(s,"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 zt(s,"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 zt(s,"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 zt(s,"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 Dm(s,e){let t=Hn(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[s.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function jm(s){return new Vo(s).detect()}var Wn,Im=b(()=>{"use strict";Yt();gc();hn();Cm();Wn=Fb(Nb);l(xm,"analyzeGit");l(zt,"fileExists");l(Am,"gatherStats");l(Rm,"detectCommands");l(Dm,"buildSources");l(jm,"detectStack")});import{exec as Lb}from"node:child_process";import Mc from"node:fs/promises";import Wo from"node:path";import{promisify as Ub}from"node:util";var Hb,Oc,_c,$m,Mm=b(()=>{"use strict";Et();U();Hb=Ub(Lb),Oc={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=Wo.join(s,r);try{await Mc.access(o)}catch{n.push(r)}}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(s){let e=Date.now(),t=[],n=Wo.basename(s);try{await F.read(n)}catch(r){P(r)||t.push(`state: ${y(r)}`)}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(s){let e=Date.now(),t=Wo.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await Mc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Mc.readFile(Wo.join(t,i),"utf-8");for(let c of n)if(c.test(a)){r.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:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},_c=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Oc.contextFilesExist(t),Oc.jsonFilesValid(t),Oc.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()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Hb(r,{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}}}},$m=new _c});import Bo from"node:fs/promises";import zo from"node:path";var Nc,Bn,Fc=b(()=>{"use strict";lr();ha();Bd();qd();Qd();_a();Yt();Be();Qt();ft();Se();Io();ys();_n();se();Un();ic();uc();rn();Ps();Et();Vp();Bp();hc();fe();hn();zp();nm();fr();rm();Gn();cm();vm();Im();Mm();Nc=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(),r;if(!t.aiTools||t.aiTools.length===0){let i=await Fo(e),a=i.filter(u=>Cs.includes(u)||u==="codex"),c=i.filter(u=>!Cs.includes(u)&&u!=="codex");r=[...a.length>0?a:Cs,...c],r=Array.from(new Set(r))}else t.aiTools[0]==="auto"?(r=await Fo(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Fp("all",e):r=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=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),(await Rn()).installed){let _=await jo({autoRepair:!0});_.verified||H.warn(`Codex p. router not ready: ${_.message||"verification failed"}`)}try{o=await sn.ensureReady()}catch(_){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:Z(_)},error:`Context7 MCP is required but not ready: ${Z(_)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await $o(this.projectId);try{let _=await Mo(this.projectId);_>0&&H.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){H.debug("Legacy JSON sweep failed (non-critical)",{error:Z(_)})}let[c,u,d,m]=await Promise.all([xm(this.projectPath),Am(this.projectPath),Rm(this.projectPath),jm(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,w=new Set;if(!p&&Jd(this.projectId))try{let{diff:_,currentHashes:Gi}=await La(this.projectPath,this.projectId),Jr=_.added.length+_.modified.length+_.deleted.length;if(Jr===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let tr=Vd(_,this.projectId);w=Wd(tr.allAffected);let Le=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=tr.allAffected.some(xn=>{let Mh=xn.substring(xn.lastIndexOf("."));return Le.has(Mh)}),k=tr.directlyChanged.some(xn=>xn==="package.json"||xn==="tsconfig.json"||xn.includes("Dockerfile")||xn.includes("docker-compose")),g={isIncremental:!0,filesChanged:Jr,filesUnchanged:_.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(w)}}Fa(this.projectId,Gi)}catch(_){H.debug("Incremental detection failed, falling back to full sync",{error:Z(_)})}else try{let{currentHashes:_}=await La(this.projectPath,this.projectId);Fa(this.projectId,_)}catch(_){H.debug("Hash computation failed (non-critical)",{error:Z(_)})}if(f)try{await Promise.all([ud(this.projectPath,this.projectId),Gd(this.projectPath,this.projectId),Yd(this.projectPath,this.projectId)])}catch(_){H.debug("File ranking index build failed (non-critical)",{error:Z(_)})}let C;if(k)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(C=_)}catch{}let T=k?await ym(this.globalPath,m,u,C):await wm(this.globalPath),O=Sm(T,this.projectId,this.globalPath),G=k?await bm(T):[],Q=Dm(u,d),ne=[],S;try{let _=await qe.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(S={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let j;try{j=await Wp(this.projectId)}catch{}let Ce={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:T.filter(_=>_.type==="workflow").map(_=>_.name),domain:T.filter(_=>_.type==="domain").map(_=>_.name)},sources:Q,analysis:S,learnings:j},En=await Gp(Ce,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let cs=await qe.getActive(this.projectId),Br={patterns:cs?.patterns?.length||0,antiPatterns:cs?.antiPatterns?.length||0,criticalAntiPatterns:cs?.antiPatterns?.filter(_=>_.severity==="high").length||0},Ui=Date.now()-n,Hi=await this.recordSyncMetrics(u,ne,T,Ui);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ae.installGlobalConfig(),await Ae.syncCommands();let zr;try{let _=await $.readConfig(this.projectPath);zr=await $m.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){H.debug("Verification failed (non-critical)",{error:Z(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:T,skills:O,skillsInstalled:G,contextFiles:ne,aiTools:En.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Br,syncMetrics:Hi,verification:zr,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:Z(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Bo.mkdir(zo.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=x.getDoc(this.projectId,"project")||{},r={...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||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};x.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await F.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=v(),r.lastUpdated=v(),r.context={...r.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,r);try{await sm.generate(this.projectPath,r)}catch(o){H.debug("Local state generation failed (optional)",{error:Z(o)})}}async logToMemory(e,t){x.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,r){let i=0;for(let m of t)try{let p=zo.join(this.globalPath,m),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:Z(p)})}for(let m of n)try{let p=zo.join(this.globalPath,"agents",`${m.name}.md`),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:Z(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Ts.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:Z(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n,r){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await F.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 am.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...n.frameworks])),feedback:c,context7Verified:r});i=u.patterns,a=u.antiPatterns,await qe.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:v(),status:"draft",commitHash:o??void 0})}catch(o){H.debug("Failed to save draft analysis (non-critical)",{error:Z(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,r,o]=await Promise.all([ht.archiveOldShipped(this.projectId).catch(()=>0),nt.markDormantIdeas(this.projectId).catch(()=>0),Oe.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),yt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=Ct.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:Z(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new In,n=await Sc.learnFromTaskHistory(this.projectId,e,t);try{let r=await tm.getFeatureOutcomes(this.projectId);r.length>0&&await Sc.learnFromOutcomes(this.projectId,r,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:Z(e)})}}async getCliVersion(){try{let e=zo.join(__dirname,"..","..","package.json");return JSON.parse(await Bo.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:Z(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:[]}}},Bn=new Nc});function Gb(){return`\u26A1 prjct
756
+ You are the ${n} expert for this project. Apply best practices for the detected stack.
757
+ `}function Sm(n,e,t){let s=[];for(let o of n)o.skill&&s.push({agent:o.name,skill:o.skill});let r={projectId:e,syncedAt:v(),skills:s.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(s.map(o=>[o.agent,o.skill]))};return At.writeFile(wt.join(t,"config","skills.json"),JSON.stringify(r,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:Z(o)})}),s}async function bm(n){let e=[];try{let t=wt.join(__dirname,"..","..","templates","config","skill-mappings.json"),s=await At.readFile(t,"utf-8"),o=JSON.parse(s).agentToSkillMap||{},i=[];for(let c of n){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=wt.join(Db.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=wt.join(a,d,"SKILL.md"),p=wt.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("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let w=await fm.install(k);w.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):w.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:w.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:Z(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:Z(t)})}return e}var vm=b(()=>{"use strict";Wt();Yt();fe();fs();hm();l(ym,"generateAgents");l(wm,"loadExistingAgents");l(km,"resolveTemplateIncludes");l(Ib,"generateWorkflowAgent");l($b,"generateDomainAgent");l(Mb,"injectFeedbackSection");l(Ob,"generateMinimalWorkflowAgent");l(_b,"generateMinimalDomainAgent");l(Sm,"configureSkills");l(bm,"autoInstallSkills")});import Tm from"node:fs/promises";import Pm from"node:path";var Vo,Cm=b(()=>{"use strict";Vo=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 s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,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(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.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=Pm.join(this.projectPath,"package.json"),t=await Tm.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Tm.access(Pm.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as Nb}from"node:child_process";import Em from"node:fs/promises";import $c from"node:path";import{promisify as Fb}from"node:util";async function xm(n){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Vs("git branch --show-current",{cwd:n});e.branch=t.trim()||"main";let{stdout:s}=await Vs("git rev-list --count HEAD",{cwd:n});e.commits=parseInt(s.trim(),10)||0;let{stdout:r}=await Vs("git shortlog -sn --all | wc -l",{cwd:n});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await Vs("git status --porcelain",{cwd:n}),i=o.trim().split(`
758
+ `).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 Vs('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:n});e.recentCommits=a.split(`
759
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Vs('git log --oneline --since="1 week ago" | wc -l',{cwd:n});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:Z(t)})}return e}async function Jt(n,e){try{return await Em.access($c.join(n,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:Z(t)}),!1}}async function Am(n){let e={fileCount:0,version:"0.0.0",name:$c.basename(n),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Vs('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:n});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:n,error:Z(t)}),e.fileCount=0}try{let t=$c.join(n,"package.json"),s=JSON.parse(await Em.readFile(t,"utf-8"));e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript";let r={...s.dependencies,...s.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),s.devDependencies?.typescript||await Jt(n,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:n,error:Z(t)})}return await Jt(n,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Jt(n,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Jt(n,"requirements.txt")||await Jt(n,"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 Rm(n){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 Jt(n,"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 Jt(n,"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 Jt(n,"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 Jt(n,"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 Jt(n,"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 jm(n,e){let t=Us(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[n.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),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 Dm(n){return new Vo(n).detect()}var Vs,Im=b(()=>{"use strict";Yt();gc();fs();Cm();Vs=Fb(Nb);l(xm,"analyzeGit");l(Jt,"fileExists");l(Am,"gatherStats");l(Rm,"detectCommands");l(jm,"buildSources");l(Dm,"detectStack")});import{exec as Lb}from"node:child_process";import Mc from"node:fs/promises";import Wo from"node:path";import{promisify as Ub}from"node:util";var Hb,Oc,_c,$m,Mm=b(()=>{"use strict";Et();U();Hb=Ub(Lb),Oc={async contextFilesExist(n){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let r of t){let o=Wo.join(n,r);try{await Mc.access(o)}catch{s.push(r)}}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(n){let e=Date.now(),t=[],s=Wo.basename(n);try{await F.read(s)}catch(r){C(r)||t.push(`state: ${y(r)}`)}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(n){let e=Date.now(),t=Wo.join(n,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await Mc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Mc.readFile(Wo.join(t,i),"utf-8");for(let c of s)if(c.test(a)){r.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:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},_c=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let r=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Oc.contextFilesExist(t),Oc.jsonFilesValid(t),Oc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&s?.checks)for(let p of s.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=s.checks.slice(s.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()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await Hb(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},$m=new _c});import Bo from"node:fs/promises";import Jo from"node:path";var Nc,Ws,Fc=b(()=>{"use strict";lr();ha();Bd();qd();Qd();_a();Yt();Be();Qt();ft();Se();Io();yn();Os();ne();Ls();ic();uc();rs();Pn();Et();Vp();Bp();hc();fe();fs();Jp();sm();fr();rm();Hs();cm();vm();Im();Mm();Nc=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 s=Date.now(),r;if(!t.aiTools||t.aiTools.length===0){let i=await Fo(e),a=i.filter(u=>Cn.includes(u)||u==="codex"),c=i.filter(u=>!Cn.includes(u)&&u!=="codex");r=[...a.length>0?a:Cn,...c],r=Array.from(new Set(r))}else t.aiTools[0]==="auto"?(r=await Fo(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Fp("all",e):r=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=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),(await As()).installed){let _=await Do({autoRepair:!0});_.verified||H.warn(`Codex p. router not ready: ${_.message||"verification failed"}`)}try{o=await ns.ensureReady()}catch(_){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:Z(_)},error:`Context7 MCP is required but not ready: ${Z(_)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await $o(this.projectId);try{let _=await Mo(this.projectId);_>0&&H.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){H.debug("Legacy JSON sweep failed (non-critical)",{error:Z(_)})}let[c,u,d,m]=await Promise.all([xm(this.projectPath),Am(this.projectPath),Rm(this.projectPath),Dm(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,w=new Set;if(!p&&zd(this.projectId))try{let{diff:_,currentHashes:Gi}=await La(this.projectPath,this.projectId),zr=_.added.length+_.modified.length+_.deleted.length;if(zr===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let tr=Vd(_,this.projectId);w=Wd(tr.allAffected);let Le=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=tr.allAffected.some(Es=>{let Mh=Es.substring(Es.lastIndexOf("."));return Le.has(Mh)}),k=tr.directlyChanged.some(Es=>Es==="package.json"||Es==="tsconfig.json"||Es.includes("Dockerfile")||Es.includes("docker-compose")),g={isIncremental:!0,filesChanged:zr,filesUnchanged:_.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(w)}}Fa(this.projectId,Gi)}catch(_){H.debug("Incremental detection failed, falling back to full sync",{error:Z(_)})}else try{let{currentHashes:_}=await La(this.projectPath,this.projectId);Fa(this.projectId,_)}catch(_){H.debug("Hash computation failed (non-critical)",{error:Z(_)})}if(f)try{await Promise.all([ud(this.projectPath,this.projectId),Gd(this.projectPath,this.projectId),Yd(this.projectPath,this.projectId)])}catch(_){H.debug("File ranking index build failed (non-critical)",{error:Z(_)})}let E;if(k)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(E=_)}catch{}let T=k?await ym(this.globalPath,m,u,E):await wm(this.globalPath),O=Sm(T,this.projectId,this.globalPath),G=k?await bm(T):[],Q=jm(u,d),se=[],S;try{let _=await qe.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(S={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let D;try{D=await Wp(this.projectId)}catch{}let Ce={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:T.filter(_=>_.type==="workflow").map(_=>_.name),domain:T.filter(_=>_.type==="domain").map(_=>_.name)},sources:Q,analysis:S,learnings:D},Cs=await Gp(Ce,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let cn=await qe.getActive(this.projectId),Br={patterns:cn?.patterns?.length||0,antiPatterns:cn?.antiPatterns?.length||0,criticalAntiPatterns:cn?.antiPatterns?.filter(_=>_.severity==="high").length||0},Ui=Date.now()-s,Hi=await this.recordSyncMetrics(u,se,T,Ui);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ae.installGlobalConfig(),await Ae.syncCommands();let Jr;try{let _=await $.readConfig(this.projectPath);Jr=await $m.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){H.debug("Verification failed (non-critical)",{error:Z(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:T,skills:O,skillsInstalled:G,contextFiles:se,aiTools:Cs.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Br,syncMetrics:Hi,verification:Jr,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:Z(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Bo.mkdir(Jo.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=x.getDoc(this.projectId,"project")||{},r={...s,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:s.createdAt||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};x.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await F.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=v(),r.lastUpdated=v(),r.context={...r.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,r);try{await nm.generate(this.projectPath,r)}catch(o){H.debug("Local state generation failed (optional)",{error:Z(o)})}}async logToMemory(e,t){x.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,s,r){let i=0;for(let m of t)try{let p=Jo.join(this.globalPath,m),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:Z(p)})}for(let m of s)try{let p=Jo.join(this.globalPath,"agents",`${m.name}.md`),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:Z(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Tn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:s.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:Z(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,s,r){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await F.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 am.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:r});i=u.patterns,a=u.antiPatterns,await qe.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:v(),status:"draft",commitHash:o??void 0})}catch(o){H.debug("Failed to save draft analysis (non-critical)",{error:Z(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,r,o]=await Promise.all([ht.archiveOldShipped(this.projectId).catch(()=>0),st.markDormantIdeas(this.projectId).catch(()=>0),Oe.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),yt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+r.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:r.length,memoryCapped:o,total:i});let a=Ct.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:Z(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Ds,s=await Sc.learnFromTaskHistory(this.projectId,e,t);try{let r=await tm.getFeatureOutcomes(this.projectId);r.length>0&&await Sc.learnFromOutcomes(this.projectId,r,t)}catch{}s.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:Z(e)})}}async getCliVersion(){try{let e=Jo.join(__dirname,"..","..","package.json");return JSON.parse(await Bo.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:Z(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:[]}}},Ws=new Nc});function Gb(){return`\u26A1 prjct
760
760
 
761
761
  ---`}function Vb(){return`---
762
- \u26A1 prjct \xB7 v${ca()}`}function L(...s){return Wb(Gb(),...s.filter(Boolean),Vb())}function Lc(s,e){let t=`| ${s.join(" | ")} |`,n=`|${s.map(()=>"---").join("|")}|`,r=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...r].join(`
763
- `)}function Om(s,e=""){return`\`\`\`${e}
764
- ${s}
765
- \`\`\``}function Uc(s,e){return`> ${{success:"\u2705",warn:"\u26A0\uFE0F",error:"\u274C",info:"\u2139\uFE0F"}[s]} **${e}**`}function te(s,e,t=3){return`### ${s}
766
- ${e}`}function Re(s,e=!1){return s.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
767
- `)}function Hc(s){let e=[];s.branch&&e.push(`Branch: \`${s.branch}\``),s.linearId&&e.push(`Linear: \`${s.linearId}\``),s.type&&e.push(`Type: ${s.type}`),s.estimatedPoints&&e.push(`~${s.estimatedPoints}pts`),s.estimatedMinutes&&e.push(`~${s.estimatedMinutes}min`),s.domains&&s.domains.length>0&&e.push(`Domains: ${s.domains.join(", ")}`),s.duration&&e.push(`Duration: ${s.duration}`),s.status&&e.push(`Status: ${s.status}`);let t=e.length>0?`
768
- > ${e.join(" | ")}`:"";return`## \u26A1 ${s.description}${t}`}function _m(s,e){let t=["#","Status","Description"],n=s.map((r,o)=>{let i=String(o+1),a;r.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${r.description}${c}`]});return`### Subtasks
769
- ${Lc(t,n)}`}function Nm(s){return s.length===0?"":`### Relevant Files
770
- ${s.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",r=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${r}`}).join(`
771
- `)}`}function le(s){let e=["Command","Action"],t=s.map(n=>[`\`${n.command}\``,n.label]);return`### Next
772
- ${Lc(e,t)}`}function ut(s){let e=Object.entries(s).filter(([,r])=>r!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([r,o])=>[r,String(o)]);return Lc(t,n)}function we(s,e){return e?`## \u2705 ${s}
773
- > ${e}`:`## \u2705 ${s}`}function Fm(s){return`> \u26A0\uFE0F **${s}**`}function Wb(...s){return s.filter(Boolean).join(`
774
-
775
- `)}function Rt(s,e,t,n){console.log(JSON.stringify({status:s,reason:e,...n,options:t}))}var Es=b(()=>{"use strict";Pt();l(Gb,"mdHeader");l(Vb,"mdFooter");l(L,"mdOutput");l(Lc,"mdTable");l(Om,"mdCodeBlock");l(Uc,"mdCallout");l(te,"mdSection");l(Re,"mdList");l(Hc,"mdTaskHeader");l(_m,"mdSubtasks");l(Nm,"mdRelevantFiles");l(le,"mdNextSteps");l(ut,"mdStats");l(we,"mdDone");l(Fm,"mdWarn");l(Wb,"mdJoin");l(Rt,"mdActionRequired")});import Cr from"chalk";function kt(s,e={}){if(e.quiet)return;let t=Um[s]||"idle",n=On.getValidCommands(t);if(n.length===0)return;let r=n.map(o=>({cmd:`p. ${o}`,desc:Lm[o]||o}));console.log(Cr.dim(`
776
- Next:`));for(let o of r){let i=Cr.cyan(o.cmd.padEnd(12));console.log(Cr.dim(` ${i} \u2192 ${o.desc}`))}}function Jo(s){let e=Um[s]||"idle";return On.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Lm[n]||n}))}function Er(s){let e=On.getStateInfo(s);console.log(Cr.dim(`\u{1F4CD} State: ${Cr.white(s.toUpperCase())} - ${e.description}`))}var Lm,Um,xs=b(()=>{"use strict";Ea();Lm={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"},Um={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(kt,"showNextSteps");l(Jo,"getNextSteps");l(Er,"showStateInfo")});import zn from"chalk";var Hm,Bb,zb,Ot,Gm=b(()=>{"use strict";Be();Hm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Bb=80,zb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Hm,speed:Bb},cli:{header:l(()=>`${zn.cyan.bold("\u26A1")} ${zn.cyan("prjct")}`,"header"),footer:l(()=>zn.dim("\u26A1 prjct"),"footer"),spin:l((s,e)=>`${zn.cyan("\u26A1")} ${zn.cyan("prjct")} ${zn.cyan(Hm[s%10])} ${zn.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((s="claude")=>eo(s).commitFooter,"getCommitFooter"),getSignature:l((s="claude")=>eo(s).signature,"getSignature")},Ot=zb});import ie from"chalk";function Kb(){return Jb[qb]}var lM,Gc,Jb,qb,Jn,As,Vc,St,wn,Xb,Yb,h,qn=b(()=>{"use strict";Gm();Fn();Po();Po();lM=Ot.spinner.frames,Gc=Ot.spinner.speed,Jb={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}},qb="compact";l(Kb,"getTierConfig");Jn={success:ie.green("\u2713"),fail:ie.red("\u2717"),warn:ie.yellow("\u26A0"),info:ie.blue("\u2139"),debug:ie.dim("\u{1F527}"),bullet:ie.dim("\u2022"),arrow:ie.dim("\u2192"),check:ie.green("\u2713"),cross:ie.red("\u2717"),spinner:ie.cyan("\u25D0")},As=null,Vc=0,St=!1,wn=l((s,e)=>{let t=e??(Kb().maxCharsPerLine||$t.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate"),Xb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat($t.CLEAR_WIDTH)}\r`):!0,"clear"),Yb={start(){return St||console.log(Ot.cli.header()),this},end(){return St||console.log(Ot.cli.footer()),this},spin(s){return St?this:(this.stop(),process.stdout.isTTY?(As=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,wn(s,$t.SPINNER_MSG))}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,wn(s,$t.SPINNER_MSG))}
777
- `),this))},done(s,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=ie.dim(` [${n.join(" | ")}]`))}console.log(`${Jn.success} ${wn(s,$t.DONE_MSG)}${t}`)}return this},fail(s){return this.stop(),console.error(`${Jn.fail} ${wn(s,$t.FAIL_MSG)}`),this},failWithHint(s){this.stop();let e=typeof s=="string"?Ja(s):s;return console.error(),console.error(`${Jn.fail} ${e.message}`),e.file&&console.error(ie.dim(` File: ${e.file}`)),e.hint&&console.error(ie.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ie.dim(` Docs: ${e.docs}`)),console.error(),this},warn(s){return this.stop(),St||console.log(`${Jn.warn} ${wn(s,$t.WARN_MSG)}`),this},info(s){return this.stop(),St||console.log(`${Jn.info} ${s}`),this},debug(s){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!St&&e&&console.log(`${Jn.debug} ${ie.dim(s)}`),this},success(s,e){return this.done(s,e)},list(s,e={}){if(this.stop(),St)return this;let t=e.bullet||Jn.bullet,n=" ".repeat(e.indent||0);for(let r of s)console.log(`${n}${t} ${r}`);return this},table(s,e={}){if(this.stop(),St||s.length===0)return this;let t=Object.keys(s[0]),n={};for(let r of t){n[r]=r.length;for(let o of s){let i=String(o[r]??"");i.length>n[r]&&(n[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(n[o])).join(" ");console.log(ie.dim(r)),console.log(ie.dim("\u2500".repeat(r.length)))}for(let r of s){let o=t.map(i=>String(r[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(s,e){if(this.stop(),St)return this;let t=e.split(`
778
- `),n=Math.max(s.length,...t.map(o=>o.length)),r="\u2500".repeat(n+2);console.log(ie.dim(`\u250C${r}\u2510`)),console.log(`${ie.dim("\u2502")} ${ie.bold(s.padEnd(n))} ${ie.dim("\u2502")}`),console.log(ie.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${ie.dim("\u2502")} ${o.padEnd(n)} ${ie.dim("\u2502")}`);return console.log(ie.dim(`\u2514${r}\u2518`)),this},section(s){return this.stop(),St?this:(console.log(`
779
- ${ie.bold(s)}`),console.log(ie.dim("\u2500".repeat(s.length))),this)},stop(){return As&&(clearInterval(As),As=null,Xb()),this},step(s,e,t){if(St)return this;this.stop();let n=ie.dim(`[${s}/${e}]`);return process.stdout.isTTY?(As=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,`${n} ${wn(t,$t.STEP_MSG)}`)}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,`${n} ${wn(t,$t.STEP_MSG)}`)}
780
- `),this)},progress(s,e,t){if(St)return this;this.stop();let n=Math.round(s/e*100),r=Math.round(n/10),o=10-r,i=ie.cyan("\u2588".repeat(r))+ie.dim("\u2591".repeat(o)),a=t?` ${wn(t,$t.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(As=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,`[${i}] ${n}%${a}`)}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,`[${i}] ${n}%${a}`)}
781
- `),this)}},h=Yb});import Jt from"chalk";function Qb(s){return Vm[s.toLowerCase()]||Vm.default}var Vm,Wc,qo,Wm=b(()=>{"use strict";Vm={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(Qb,"getIcon");Wc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Jt.cyan(`
762
+ \u26A1 prjct \xB7 v${ca()}`}function L(...n){return Wb(Gb(),...n.filter(Boolean),Vb())}function Lc(n,e){let t=`| ${n.join(" | ")} |`,s=`|${n.map(()=>"---").join("|")}|`,r=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...r].join(`
763
+ `)}function Om(n,e=""){return`\`\`\`${e}
764
+ ${n}
765
+ \`\`\``}function Uc(n,e){return`> ${{success:"\u2705",warn:"\u26A0\uFE0F",error:"\u274C",info:"\u2139\uFE0F"}[n]} **${e}**`}function te(n,e,t=3){return`### ${n}
766
+ ${e}`}function Re(n,e=!1){return n.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
767
+ `)}function Hc(n){let e=[];n.branch&&e.push(`Branch: \`${n.branch}\``),n.linearId&&e.push(`Linear: \`${n.linearId}\``),n.type&&e.push(`Type: ${n.type}`),n.estimatedPoints&&e.push(`~${n.estimatedPoints}pts`),n.estimatedMinutes&&e.push(`~${n.estimatedMinutes}min`),n.domains&&n.domains.length>0&&e.push(`Domains: ${n.domains.join(", ")}`),n.duration&&e.push(`Duration: ${n.duration}`),n.status&&e.push(`Status: ${n.status}`);let t=e.length>0?`
768
+ > ${e.join(" | ")}`:"";return`## \u26A1 ${n.description}${t}`}function _m(n,e){let t=["#","Status","Description"],s=n.map((r,o)=>{let i=String(o+1),a;r.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${r.description}${c}`]});return`### Subtasks
769
+ ${Lc(t,s)}`}function Nm(n){return n.length===0?"":`### Relevant Files
770
+ ${n.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",r=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${r}`}).join(`
771
+ `)}`}function le(n){let e=["Command","Action"],t=n.map(s=>[`\`${s.command}\``,s.label]);return`### Next
772
+ ${Lc(e,t)}`}function ut(n){let e=Object.entries(n).filter(([,r])=>r!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([r,o])=>[r,String(o)]);return Lc(t,s)}function we(n,e){return e?`## \u2705 ${n}
773
+ > ${e}`:`## \u2705 ${n}`}function Fm(n){return`> \u26A0\uFE0F **${n}**`}function Wb(...n){return n.filter(Boolean).join(`
774
+
775
+ `)}function Rt(n,e,t,s){console.log(JSON.stringify({status:n,reason:e,...s,options:t}))}var En=b(()=>{"use strict";Pt();l(Gb,"mdHeader");l(Vb,"mdFooter");l(L,"mdOutput");l(Lc,"mdTable");l(Om,"mdCodeBlock");l(Uc,"mdCallout");l(te,"mdSection");l(Re,"mdList");l(Hc,"mdTaskHeader");l(_m,"mdSubtasks");l(Nm,"mdRelevantFiles");l(le,"mdNextSteps");l(ut,"mdStats");l(we,"mdDone");l(Fm,"mdWarn");l(Wb,"mdJoin");l(Rt,"mdActionRequired")});import Cr from"chalk";function kt(n,e={}){if(e.quiet)return;let t=Um[n]||"idle",s=Ms.getValidCommands(t);if(s.length===0)return;let r=s.map(o=>({cmd:`p. ${o}`,desc:Lm[o]||o}));console.log(Cr.dim(`
776
+ Next:`));for(let o of r){let i=Cr.cyan(o.cmd.padEnd(12));console.log(Cr.dim(` ${i} \u2192 ${o.desc}`))}}function zo(n){let e=Um[n]||"idle";return Ms.getValidCommands(e).map(s=>({cmd:`p. ${s}`,desc:Lm[s]||s}))}function Er(n){let e=Ms.getStateInfo(n);console.log(Cr.dim(`\u{1F4CD} State: ${Cr.white(n.toUpperCase())} - ${e.description}`))}var Lm,Um,xn=b(()=>{"use strict";Ea();Lm={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"},Um={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(kt,"showNextSteps");l(zo,"getNextSteps");l(Er,"showStateInfo")});import Bs from"chalk";var Hm,Bb,Jb,Ot,Gm=b(()=>{"use strict";Be();Hm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Bb=80,Jb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Hm,speed:Bb},cli:{header:l(()=>`${Bs.cyan.bold("\u26A1")} ${Bs.cyan("prjct")}`,"header"),footer:l(()=>Bs.dim("\u26A1 prjct"),"footer"),spin:l((n,e)=>`${Bs.cyan("\u26A1")} ${Bs.cyan("prjct")} ${Bs.cyan(Hm[n%10])} ${Bs.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((n="claude")=>eo(n).commitFooter,"getCommitFooter"),getSignature:l((n="claude")=>eo(n).signature,"getSignature")},Ot=Jb});import ie from"chalk";function Kb(){return zb[qb]}var lM,Gc,zb,qb,Js,An,Vc,St,ys,Xb,Yb,h,zs=b(()=>{"use strict";Gm();Ns();Po();Po();lM=Ot.spinner.frames,Gc=Ot.spinner.speed,zb={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}},qb="compact";l(Kb,"getTierConfig");Js={success:ie.green("\u2713"),fail:ie.red("\u2717"),warn:ie.yellow("\u26A0"),info:ie.blue("\u2139"),debug:ie.dim("\u{1F527}"),bullet:ie.dim("\u2022"),arrow:ie.dim("\u2192"),check:ie.green("\u2713"),cross:ie.red("\u2717"),spinner:ie.cyan("\u25D0")},An=null,Vc=0,St=!1,ys=l((n,e)=>{let t=e??(Kb().maxCharsPerLine||$t.FALLBACK_TRUNCATE);return n&&n.length>t?`${n.slice(0,t-1)}\u2026`:n||""},"truncate"),Xb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat($t.CLEAR_WIDTH)}\r`):!0,"clear"),Yb={start(){return St||console.log(Ot.cli.header()),this},end(){return St||console.log(Ot.cli.footer()),this},spin(n){return St?this:(this.stop(),process.stdout.isTTY?(An=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,ys(n,$t.SPINNER_MSG))}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,ys(n,$t.SPINNER_MSG))}
777
+ `),this))},done(n,e){if(this.stop(),!St){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=ie.dim(` [${s.join(" | ")}]`))}console.log(`${Js.success} ${ys(n,$t.DONE_MSG)}${t}`)}return this},fail(n){return this.stop(),console.error(`${Js.fail} ${ys(n,$t.FAIL_MSG)}`),this},failWithHint(n){this.stop();let e=typeof n=="string"?za(n):n;return console.error(),console.error(`${Js.fail} ${e.message}`),e.file&&console.error(ie.dim(` File: ${e.file}`)),e.hint&&console.error(ie.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ie.dim(` Docs: ${e.docs}`)),console.error(),this},warn(n){return this.stop(),St||console.log(`${Js.warn} ${ys(n,$t.WARN_MSG)}`),this},info(n){return this.stop(),St||console.log(`${Js.info} ${n}`),this},debug(n){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!St&&e&&console.log(`${Js.debug} ${ie.dim(n)}`),this},success(n,e){return this.done(n,e)},list(n,e={}){if(this.stop(),St)return this;let t=e.bullet||Js.bullet,s=" ".repeat(e.indent||0);for(let r of n)console.log(`${s}${t} ${r}`);return this},table(n,e={}){if(this.stop(),St||n.length===0)return this;let t=Object.keys(n[0]),s={};for(let r of t){s[r]=r.length;for(let o of n){let i=String(o[r]??"");i.length>s[r]&&(s[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(s[o])).join(" ");console.log(ie.dim(r)),console.log(ie.dim("\u2500".repeat(r.length)))}for(let r of n){let o=t.map(i=>String(r[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(n,e){if(this.stop(),St)return this;let t=e.split(`
778
+ `),s=Math.max(n.length,...t.map(o=>o.length)),r="\u2500".repeat(s+2);console.log(ie.dim(`\u250C${r}\u2510`)),console.log(`${ie.dim("\u2502")} ${ie.bold(n.padEnd(s))} ${ie.dim("\u2502")}`),console.log(ie.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${ie.dim("\u2502")} ${o.padEnd(s)} ${ie.dim("\u2502")}`);return console.log(ie.dim(`\u2514${r}\u2518`)),this},section(n){return this.stop(),St?this:(console.log(`
779
+ ${ie.bold(n)}`),console.log(ie.dim("\u2500".repeat(n.length))),this)},stop(){return An&&(clearInterval(An),An=null,Xb()),this},step(n,e,t){if(St)return this;this.stop();let s=ie.dim(`[${n}/${e}]`);return process.stdout.isTTY?(An=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,`${s} ${ys(t,$t.STEP_MSG)}`)}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,`${s} ${ys(t,$t.STEP_MSG)}`)}
780
+ `),this)},progress(n,e,t){if(St)return this;this.stop();let s=Math.round(n/e*100),r=Math.round(s/10),o=10-r,i=ie.cyan("\u2588".repeat(r))+ie.dim("\u2591".repeat(o)),a=t?` ${ys(t,$t.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(An=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,`[${i}] ${s}%${a}`)}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,`[${i}] ${s}%${a}`)}
781
+ `),this)}},h=Yb});import zt from"chalk";function Qb(n){return Vm[n.toLowerCase()]||Vm.default}var Vm,Wc,qo,Wm=b(()=>{"use strict";Vm={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(Qb,"getIcon");Wc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(zt.cyan(`
782
782
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
783
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let r=Qb(t);console.log(Jt.cyan(`\u250C\u2500 ${r} ${e} (${t})`)),n&&console.log(Jt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Jt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Jt.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),r=e?Jt.green("\u2713"):Jt.red("\u2717");console.log(`\u2514\u2500 ${r} ${e?"Complete":"Failed"} ${Jt.dim(`(${n})`)}
784
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Jt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Jt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},qo=new Wc});import Ye from"chalk";function Zb(s){let e=0;for(let n of s)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Bm.length;return Bm[t]}function ev(s,e,t="\u25B6"){let n=Ye.dim(String(s+1).padStart(2)),o=Zb(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=Ye.green("\u2713 Complete");break;case"in_progress":a=Ye.yellow(`${t} Working...`);break;case"pending":a=Ye.gray("\u25CB Pending");break;case"failed":a=Ye.red("\u2717 Failed");break;case"blocked":a=Ye.gray("\u2298 Blocked");break;default:a=Ye.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function tv(s){if(s.length===0)return"";let e=[];e.push(""),e.push(` ${Ye.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ye.dim("\u2500".repeat(58))}`);for(let t=0;t<s.length;t++)e.push(ev(t,s[t]));return e.push(""),e.join(`
785
- `)}function zm(s){console.log(tv(s))}var Bm,Jm=b(()=>{"use strict";Bm=[Ye.cyan,Ye.magenta,Ye.yellow,Ye.blue,Ye.green,Ye.redBright,Ye.magentaBright,Ye.cyanBright];l(Zb,"getDomainColor");l(ev,"formatSubtaskLine");l(tv,"renderSubtaskProgress");l(zm,"printSubtaskProgress")});function nv(s){return qm.includes(s)}async function sv(s,e,t){let n=[],r=[],o=[];switch(s){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"}),r.push("Read current task from now.md"),r.push("Calculate duration"),r.push("Append to shipped.md"),r.push("Clear now.md"),r.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"}),r.push("Parse feature description"),r.push("Generate tasks breakdown"),r.push("Add to roadmap.md"),r.push("Add tasks to next.md"),r.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")),r.push("Generate spec template"),r.push("Analyze requirements"),r.push("Create spec file"),r.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"}),r.push("Scan for unused code"),r.push("Identify dead imports"),r.push("List files to clean"),r.push("Show preview"),r.push("Wait for approval"),r.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),r.push("Analyze current state"),r.push("Generate migration plan"),r.push("Show affected files"),r.push("Request approval"),r.push("Execute migration"),r.push("Verify results");break;default:r.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:s,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:r,confidence:c}}function rv(s){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${s.commandName}`),e.push(""),s.reasoning&&(e.push("Steps:"),s.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),s.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),s.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),s.plan.length>0&&(e.push("Plan:"),s.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(s.confidence*100)}%`),e.join(`
786
- `)}var qm,ov,Ko,Km=b(()=>{"use strict";qm=["ship","feature","spec","cleanup","migrate"];l(nv,"requiresReasoning");l(sv,"reason");l(rv,"formatPlan");ov={requiresReasoning:nv,reason:sv,formatPlan:rv,REASONING_REQUIRED_COMMANDS:qm},Ko=ov});import xr from"node:fs/promises";var Bc,iv,dt,zc=b(()=>{"use strict";ft();Se();U();ka();Bc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new hs({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),r=A.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:r,paths:{now:A.getFilePath(n,"core","now.md"),next:A.getFilePath(n,"core","next.md"),context:A.getFilePath(n,"core","context.md"),shipped:A.getFilePath(n,"progress","shipped.md"),metrics:A.getFilePath(n,"progress","metrics.md"),ideas:A.getFilePath(n,"planning","ideas.md"),roadmap:A.getFilePath(n,"planning","roadmap.md"),specs:A.getFilePath(n,"planning","specs"),memory:A.getFilePath(n,"memory","context.jsonl"),patterns:A.getFilePath(n,"memory","patterns.json"),analysis:A.getFilePath(n,"analysis","repo-summary.md"),codePatterns:A.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={},r=Object.entries(e.paths),o=t?r.filter(([a])=>t.includes(a)):r;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await xr.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([xr.readFile(d,"utf-8"),xr.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"]},r=n[t]||n.default;return this.loadState(e,r)}async batchRead(e){let t=new Map,n=[];for(let r of e){let o=this._cache.get(r);o!==null?t.set(r,o.content):n.push(r)}if(n.length>0){let r=n.map(async i=>{try{let a=await xr.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(r);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 xr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},iv=new Bc,dt=iv});import{exec as av}from"node:child_process";import De from"node:fs/promises";import Xm from"node:os";import kn from"node:path";import{promisify as cv}from"node:util";function Ym(s){let e=Math.floor(s/36e5),t=Math.floor(s%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function Jc(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function uv(s){if(s.verified||s.warnings.length===0)return null;let e=` Ground Truth Warnings:
787
- `;return s.warnings.forEach(t=>{e+=` - ${t}
788
- `}),s.recommendations.length>0&&(e+=`
783
+ `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let r=Qb(t);console.log(zt.cyan(`\u250C\u2500 ${r} ${e} (${t})`)),s&&console.log(zt.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(zt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(zt.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),r=e?zt.green("\u2713"):zt.red("\u2717");console.log(`\u2514\u2500 ${r} ${e?"Complete":"Failed"} ${zt.dim(`(${s})`)}
784
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${zt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(zt.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},qo=new Wc});import Ye from"chalk";function Zb(n){let e=0;for(let s of n)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Bm.length;return Bm[t]}function ev(n,e,t="\u25B6"){let s=Ye.dim(String(n+1).padStart(2)),o=Zb(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=Ye.green("\u2713 Complete");break;case"in_progress":a=Ye.yellow(`${t} Working...`);break;case"pending":a=Ye.gray("\u25CB Pending");break;case"failed":a=Ye.red("\u2717 Failed");break;case"blocked":a=Ye.gray("\u2298 Blocked");break;default:a=Ye.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function tv(n){if(n.length===0)return"";let e=[];e.push(""),e.push(` ${Ye.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ye.dim("\u2500".repeat(58))}`);for(let t=0;t<n.length;t++)e.push(ev(t,n[t]));return e.push(""),e.join(`
785
+ `)}function Jm(n){console.log(tv(n))}var Bm,zm=b(()=>{"use strict";Bm=[Ye.cyan,Ye.magenta,Ye.yellow,Ye.blue,Ye.green,Ye.redBright,Ye.magentaBright,Ye.cyanBright];l(Zb,"getDomainColor");l(ev,"formatSubtaskLine");l(tv,"renderSubtaskProgress");l(Jm,"printSubtaskProgress")});function sv(n){return qm.includes(n)}async function nv(n,e,t){let s=[],r=[],o=[];switch(n){case"ship":t.now&&!t.now.includes("No current task")?s.push({step:"Has active task",passed:!0}):(s.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?s.push({step:"Shipped log accessible",passed:!0}):s.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),r.push("Read current task from now.md"),r.push("Calculate duration"),r.push("Append to shipped.md"),r.push("Clear now.md"),r.push("Update metrics");break;case"feature":e.params.description||e.params.feature?s.push({step:"Has feature description",passed:!0}):(s.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?s.push({step:"Project analyzed",passed:!0}):s.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),r.push("Parse feature description"),r.push("Generate tasks breakdown"),r.push("Add to roadmap.md"),r.push("Add tasks to next.md"),r.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?s.push({step:"Has spec name",passed:!0}):(s.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),r.push("Generate spec template"),r.push("Analyze requirements"),r.push("Create spec file"),r.push("Link to roadmap");break;case"cleanup":t.analysis?s.push({step:"Has code analysis",passed:!0}):s.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),r.push("Scan for unused code"),r.push("Identify dead imports"),r.push("List files to clean"),r.push("Show preview"),r.push("Wait for approval"),r.push("Execute cleanup");break;case"migrate":s.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),r.push("Analyze current state"),r.push("Generate migration plan"),r.push("Show affected files"),r.push("Request approval"),r.push("Execute migration"),r.push("Verify results");break;default:r.push("Execute command");break}let i=s.filter(u=>u.passed).length,a=s.length,c=a>0?i/a:1;return{commandName:n,reasoning:s.length>0?{steps:s,allPassed:o.length===0,criticalIssues:o}:null,plan:r,confidence:c}}function rv(n){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${n.commandName}`),e.push(""),n.reasoning&&(e.push("Steps:"),n.reasoning.steps.forEach(t=>{let s=t.passed?"\u2705":"\u274C";e.push(` ${s} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),n.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),n.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),n.plan.length>0&&(e.push("Plan:"),n.plan.forEach((t,s)=>{e.push(` ${s+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(n.confidence*100)}%`),e.join(`
786
+ `)}var qm,ov,Ko,Km=b(()=>{"use strict";qm=["ship","feature","spec","cleanup","migrate"];l(sv,"requiresReasoning");l(nv,"reason");l(rv,"formatPlan");ov={requiresReasoning:sv,reason:nv,formatPlan:rv,REASONING_REQUIRED_COMMANDS:qm},Ko=ov});import xr from"node:fs/promises";var Bc,iv,dt,Jc=b(()=>{"use strict";ft();Se();U();ka();Bc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new hn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await $.getProjectId(e),r=A.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:r,paths:{now:A.getFilePath(s,"core","now.md"),next:A.getFilePath(s,"core","next.md"),context:A.getFilePath(s,"core","context.md"),shipped:A.getFilePath(s,"progress","shipped.md"),metrics:A.getFilePath(s,"progress","metrics.md"),ideas:A.getFilePath(s,"planning","ideas.md"),roadmap:A.getFilePath(s,"planning","roadmap.md"),specs:A.getFilePath(s,"planning","specs"),memory:A.getFilePath(s,"memory","context.jsonl"),patterns:A.getFilePath(s,"memory","patterns.json"),analysis:A.getFilePath(s,"analysis","repo-summary.md"),codePatterns:A.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},r=Object.entries(e.paths),o=t?r.filter(([a])=>t.includes(a)):r;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await xr.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?s[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([xr.readFile(d,"utf-8"),xr.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)s[u]=m,this._cache.set(d,{content:m,mtime:p})}return s}async loadStateForCommand(e,t){let s={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"]},r=s[t]||s.default;return this.loadState(e,r)}async batchRead(e){let t=new Map,s=[];for(let r of e){let o=this._cache.get(r);o!==null?t.set(r,o.content):s.push(r)}if(s.length>0){let r=s.map(async i=>{try{let a=await xr.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(r);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 xr.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},iv=new Bc,dt=iv});import{exec as av}from"node:child_process";import je from"node:fs/promises";import Xm from"node:os";import ws from"node:path";import{promisify as cv}from"node:util";function Ym(n){let e=Math.floor(n/36e5),t=Math.floor(n%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function zc(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function uv(n){if(n.verified||n.warnings.length===0)return null;let e=` Ground Truth Warnings:
787
+ `;return n.warnings.forEach(t=>{e+=` - ${t}
788
+ `}),n.recommendations.length>0&&(e+=`
789
789
  Recommendations:
790
- `,s.recommendations.forEach(t=>{e+=` -> ${t}
791
- `})),e}async function Qm(s){let e=[],t=[],n={},r=s.paths.now;try{let a=await De.readFile(r,"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=Ym(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=s.paths.next;try{let a=await De.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=s.paths.metrics;try{await De.access(kn.dirname(i),De.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 Zm(s){let e=[],t=[],n={};try{let{stdout:i}=await lv("git status --porcelain",{cwd:s.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
792
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let r=kn.join(s.projectPath,"package.json");try{let i=await De.readFile(r,"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=s.paths.shipped;try{let i=await De.readFile(o,"utf-8");n.shippedExists=!0;let a=s.params.feature||s.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${Jc(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 De.readFile(r,"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 eg(s){let e=[],t=[],n={},r=s.paths.next;try{let a=await De.readFile(r,"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=s.paths.roadmap;try{let a=await De.readFile(o,"utf-8");n.roadmapExists=!0;let c=s.params.description||s.params.feature;c&&new RegExp(Jc(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=s.paths.now;try{let a=await De.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 tg(s){let e=[],t=[],n={},r=s.paths.now;try{let i=await De.readFile(r,"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&&s.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=s.paths.next;try{let a=((await De.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!s.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 ng(s){let e=[],t=[],n={},r=kn.join(s.projectPath,".prjct/prjct.config.json");try{let i=await De.readFile(r,"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=kn.join(Xm.homedir(),".prjct-cli");try{await De.access(o,De.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await De.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 sg(s){let e=[],t=[],n={},r=kn.join(s.projectPath,".prjct/prjct.config.json");try{let a=await De.readFile(r,"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=kn.join(Xm.homedir(),".prjct-cli/projects",o||"");try{await De.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 rg(s){let e=[],t=[],n={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of r)try{await De.access(kn.join(s.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 De.stat(kn.join(s.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 og(s){let e=[],t=[],n={},r=s.paths.specs;try{await De.access(r),n.specsExists=!0;let i=await De.readdir(r);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=s.params.feature||s.params.name||s.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 ag(s,e,t){let n=ig[s];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${y(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function dv(s,e,t){let n=await ag(s,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:s}}}function pv(s){return["done","ship","feature","spec","now","init","sync","analyze"].includes(s)}var lv,ig,mv,Xo,cg=b(()=>{"use strict";U();lv=cv(av);l(Ym,"formatDuration");l(Jc,"escapeRegex");l(uv,"formatWarnings");l(Qm,"verifyDone");l(Zm,"verifyShip");l(eg,"verifyFeature");l(tg,"verifyNow");l(ng,"verifyInit");l(sg,"verifySync");l(rg,"verifyAnalyze");l(og,"verifySpec");ig={done:Qm,ship:Zm,feature:eg,now:tg,init:ng,sync:sg,analyze:rg,spec:og};l(ag,"verify");l(dv,"prepareCommand");l(pv,"requiresVerification");mv={verify:ag,prepareCommand:dv,requiresVerification:pv,verifiers:ig,formatWarnings:uv,formatDuration:Ym,escapeRegex:Jc,verifyDone:Qm,verifyShip:Zm,verifyFeature:eg,verifyNow:tg,verifyInit:ng,verifySync:sg,verifyAnalyze:rg,verifySpec:og},Xo=mv});function fv(s){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."}[s]||"Verify actual state before proceeding."}function hv(s){if(!s||typeof s!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of gv)if(e.test(s))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:fv(t)};return{detected:!1}}function yv(s,e){if(!s||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(s)===t(e)}function wv(s){if(!s||s.length===0)return{type:"unknown",description:"No error information"};let e=s[s.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 kv(s,e,t){let n={permission:`I've tried ${s} ${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 ${s}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${s} from completing.`,validation:`Validation keeps failing for ${s}.`,config:`There seems to be a configuration issue affecting ${s}.`,unknown:`I've tried ${s} ${t} times without success.`};return n[e.type]||n.unknown}function Sv(s){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[s.type]||e.unknown}var gv,qc,bv,Rs,lg=b(()=>{"use strict";gv=[{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(fv,"getHallucinationSuggestion");l(hv,"detectHallucination");l(yv,"isSimilarError");l(wv,"analyzeErrorPattern");l(kv,"generateEscalationMessage");l(Sv,"generateSuggestion");qc=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 r=this._getKey(e,t),o=Date.now(),i=this._attempts.get(r);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(r,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return!1;if(r.attempts>=2&&!r.success){let o=r.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>yv(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);return r?r.attempts>=this.maxAttempts&&!r.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return null;let o=wv(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:kv(e,o,this.maxAttempts),suggestion:Sv(o),lastError:r.errors[r.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);r&&(r.success=!0,r.attempts=0,r.errors=[],this._attempts.set(n,r))}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 hv(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}}},bv=new qc,Rs=bv});import{z as ue}from"zod";var vv,Tv,ug,LM,UM,HM,Sn,dg,Ar=b(()=>{"use strict";vv=ue.enum(["improving","stable","declining"]),Tv=ue.object({sprintNumber:ue.number(),startDate:ue.string(),endDate:ue.string(),pointsCompleted:ue.number(),tasksCompleted:ue.number(),avgVariance:ue.number(),estimationAccuracy:ue.number()}),ug=ue.object({category:ue.string(),avgVariance:ue.number(),taskCount:ue.number()}),LM=ue.object({totalPoints:ue.number(),sprints:ue.number(),estimatedDate:ue.string()}),UM=ue.object({sprints:ue.array(Tv),averageVelocity:ue.number(),velocityTrend:vv,estimationAccuracy:ue.number(),overEstimated:ue.array(ug),underEstimated:ue.array(ug),lastUpdated:ue.string()}),HM=ue.object({sprintLengthDays:ue.number().min(1).max(90).default(7),startDay:ue.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ue.number().min(1).max(52).default(6),accuracyTolerance:ue.number().min(0).max(100).default(20)}),Sn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},dg={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});function Kc(s,e){let t=Rr(e),n=Pv[t.startDay],r=new Date(s);r.setHours(0,0,0,0);let i=(r.getDay()-n+7)%7;return r.setDate(r.getDate()-i),r}function Cv(s,e){let t=Rr(e),n=new Date(s);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function Ev(s,e,t){let n=Rr(t),r=Kc(s,t),o=Kc(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Yo(s,e=Sn){let t=Rr(e);if(s.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=xv(s,e),r=Av(n,t.accuracyTolerance),o=r.slice(-t.windowSize),i=jv(o),a=Rv(o),c=Dv(s,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Iv(s);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function mg(s,e,t=Sn){let n=Rr(t);if(e<=0)return{totalPoints:s,sprints:0,estimatedDate:""};let r=Math.ceil(s/e),o=r*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:s,sprints:r,estimatedDate:i.toISOString()}}function xv(s,e){let t=new Map,n=s.map(o=>new Date(o.completedAt)),r=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of s){let i=new Date(o.completedAt),a=Ev(i,r,e);if(!t.has(a)){let c=Kc(i,e),u=Cv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Av(s,e){let t=[];for(let[,n]of s){let r=n.outcomes.reduce((u,d)=>u+$v(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Yc(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:r,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,r)=>n.sprintNumber-r.sprintNumber)}function Rv(s){if(s.length<3)return"stable";let e=s.map(d=>d.pointsCompleted),t=e.length,n=0,r=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,r+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*r)/(t*i-n*n),c=r/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function Dv(s,e){let t=s.filter(r=>r.variance);if(t.length===0)return 0;let n=t.filter(r=>{let o=Yc(r);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function jv(s){if(s.length===0)return 0;let e=s.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/s.length*10)/10}function Iv(s){let e=new Map;for(let r of s){if(!r.variance)continue;let o=Yc(r),i=r.tags&&r.tags.length>0?r.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[r,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:r,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:r,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((r,o)=>o.avgVariance-r.avgVariance),n.sort((r,o)=>o.avgVariance-r.avgVariance),{overEstimated:t,underEstimated:n}}function Yc(s){if(!s.variance)return 0;let e=Xc(s.estimatedDuration),t=Xc(s.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Xc(s){let e=0,t=s.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=s.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),s.match(/(\d+)s/)&&e===0&&(e=1),e}function gg(s){if(s.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${s.averageVelocity} pts/sprint (trend: ${s.velocityTrend})`),e.push(`Estimation accuracy: ${s.estimationAccuracy}%`);for(let t of s.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of s.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
793
- `)}function $v(s){if(!s.estimatedDuration)return 0;let e=Xc(s.estimatedDuration);if(e<=0)return 0;let t=pg[0],n=Number.POSITIVE_INFINITY;for(let r of pg){let o=Math.abs(r.typical-e);o<n&&(n=o,t=r)}return t.points}function Rr(s){return{sprintLengthDays:s.sprintLengthDays??7,startDay:s.startDay??"monday",windowSize:s.windowSize??6,accuracyTolerance:s.accuracyTolerance??20}}var Pv,pg,Qc=b(()=>{"use strict";Ar();Pv={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Kc,"getSprintStart");l(Cv,"getSprintEnd");l(Ev,"getSprintNumber");l(Yo,"calculateVelocity");l(mg,"projectCompletion");l(xv,"bucketBySprint");l(Av,"buildSprintVelocities");l(Rv,"detectTrend");l(Dv,"calculateOverallAccuracy");l(jv,"calculateAverageVelocity");l(Iv,"detectEstimationPatterns");l(Yc,"parseVariancePercent");l(Xc,"parseDurationMinutes");l(gg,"formatVelocityContext");pg=[{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($v,"derivePoints");l(Rr,"resolveConfig")});import{exec as Mv}from"node:child_process";import Ov from"node:fs/promises";import Qo from"node:path";import{promisify as _v}from"node:util";async function Ds(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Zc(s),c=await Hv(e),u=await Gv(e),d=[];for(let p of c){if(!i&&Wv(p))continue;let g=Vv(p,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,r);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function Zc(s){let e=s.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 Hv(s){let e=[];async function t(n,r=""){try{let o=await Ov.readdir(n,{withFileTypes:!0});for(let i of o){let a=Qo.join(n,i.name),c=Qo.join(r,i.name);if(i.isDirectory()){if(Uv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Qo.extname(i.name).toLowerCase();Lv.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(s),e}async function Gv(s){let e=new Map;try{let{stdout:t}=await Nv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
790
+ `,n.recommendations.forEach(t=>{e+=` -> ${t}
791
+ `})),e}async function Qm(n){let e=[],t=[],s={},r=n.paths.now;try{let a=await je.readFile(r,"utf-8");s.nowExists=!0,s.nowContent=a.trim(),s.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){s.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(s.durationMs=Date.now()-u.getTime(),s.durationFormatted=Ym(s.durationMs))}}catch(a){if(C(a))s.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=n.paths.next;try{let a=await je.readFile(o,"utf-8");s.nextExists=!0;let c=a.match(/- \[ \]/g)||[];s.pendingTasks=c.length}catch(a){if(C(a))s.nextExists=!1,s.pendingTasks=0;else throw a}let i=n.paths.metrics;try{await je.access(ws.dirname(i),je.constants.W_OK),s.metricsWritable=!0}catch(a){if(C(a))s.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function Zm(n){let e=[],t=[],s={};try{let{stdout:i}=await lv("git status --porcelain",{cwd:n.projectPath});s.hasUncommittedChanges=i.trim().length>0,s.uncommittedFiles=i.trim().split(`
792
+ `).filter(Boolean).length,s.hasUncommittedChanges&&(e.push(`${s.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{s.gitAvailable=!1}let r=ws.join(n.projectPath,"package.json");try{let i=await je.readFile(r,"utf-8"),a=JSON.parse(i);s.currentVersion=a.version,s.hasPackageJson=!0}catch(i){if(C(i))s.hasPackageJson=!1;else if(i instanceof SyntaxError)s.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=n.paths.shipped;try{let i=await je.readFile(o,"utf-8");s.shippedExists=!0;let a=n.params.feature||n.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${zc(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))s.shippedExists=!1;else throw i}if(s.hasPackageJson)try{let i=await je.readFile(r,"utf-8"),a=JSON.parse(i);s.hasTestScript=!!a.scripts?.test}catch(i){if(C(i)||i instanceof SyntaxError)s.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function eg(n){let e=[],t=[],s={},r=n.paths.next;try{let a=await je.readFile(r,"utf-8");s.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];s.taskCount=c.length,s.pendingTasks=(a.match(/- \[ \]/g)||[]).length,s.taskCount>=90&&(e.push(`Queue nearly full (${s.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(C(a))s.nextExists=!1,s.taskCount=0;else throw a}let o=n.paths.roadmap;try{let a=await je.readFile(o,"utf-8");s.roadmapExists=!0;let c=n.params.description||n.params.feature;c&&new RegExp(zc(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))s.roadmapExists=!1;else throw a}let i=n.paths.now;try{let a=await je.readFile(i,"utf-8");s.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),s.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(C(a))s.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function tg(n){let e=[],t=[],s={},r=n.paths.now;try{let i=await je.readFile(r,"utf-8");s.nowExists=!0,s.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(s.hasActiveTask=a,a&&n.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))s.nowExists=!1,s.hasActiveTask=!1;else throw i}let o=n.paths.next;try{let a=((await je.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;s.pendingTasks=a,!n.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(C(i))s.pendingTasks=0;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function sg(n){let e=[],t=[],s={},r=ws.join(n.projectPath,".prjct/prjct.config.json");try{let i=await je.readFile(r,"utf-8");s.alreadyInitialized=!0,s.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))s.alreadyInitialized=!1;else if(i instanceof SyntaxError)s.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=ws.join(Xm.homedir(),".prjct-cli");try{await je.access(o,je.constants.W_OK),s.globalPathWritable=!0}catch(i){if(C(i))try{await je.mkdir(o,{recursive:!0}),s.globalPathWritable=!0,s.globalPathCreated=!0}catch{s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function ng(n){let e=[],t=[],s={},r=ws.join(n.projectPath,".prjct/prjct.config.json");try{let a=await je.readFile(r,"utf-8");s.hasConfig=!0,s.config=JSON.parse(a)}catch(a){if(C(a))return s.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:s,warnings:e,recommendations:t};if(a instanceof SyntaxError)return s.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:s,warnings:e,recommendations:t};throw a}let o=s.config?.projectId,i=ws.join(Xm.homedir(),".prjct-cli/projects",o||"");try{await je.access(i),s.globalStorageExists=!0}catch(a){if(C(a))s.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function rg(n){let e=[],t=[],s={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];s.detectedFiles=[];for(let i of r)try{await je.access(ws.join(n.projectPath,i)),s.detectedFiles.push(i)}catch(a){if(!C(a))throw a}s.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"];s.detectedSrcDirs=[];for(let i of o)try{(await je.stat(ws.join(n.projectPath,i))).isDirectory()&&s.detectedSrcDirs.push(i)}catch(a){if(!C(a))throw a}return{verified:!0,actual:s,warnings:e,recommendations:t}}async function og(n){let e=[],t=[],s={},r=n.paths.specs;try{await je.access(r),s.specsExists=!0;let i=await je.readdir(r);s.existingSpecs=i.filter(a=>a.endsWith(".md")),s.specCount=s.existingSpecs.length}catch(i){if(C(i))s.specsExists=!1,s.specCount=0;else throw i}let o=n.params.feature||n.params.name||n.params.description;if(o&&s.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");s.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:s,warnings:e,recommendations:t}}async function ag(n,e,t){let s=ig[n];if(!s)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await s(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${y(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function dv(n,e,t){let s=await ag(n,e,t);return{...e,groundTruth:{...s,verifiedAt:new Date().toISOString(),command:n}}}function pv(n){return["done","ship","feature","spec","now","init","sync","analyze"].includes(n)}var lv,ig,mv,Xo,cg=b(()=>{"use strict";U();lv=cv(av);l(Ym,"formatDuration");l(zc,"escapeRegex");l(uv,"formatWarnings");l(Qm,"verifyDone");l(Zm,"verifyShip");l(eg,"verifyFeature");l(tg,"verifyNow");l(sg,"verifyInit");l(ng,"verifySync");l(rg,"verifyAnalyze");l(og,"verifySpec");ig={done:Qm,ship:Zm,feature:eg,now:tg,init:sg,sync:ng,analyze:rg,spec:og};l(ag,"verify");l(dv,"prepareCommand");l(pv,"requiresVerification");mv={verify:ag,prepareCommand:dv,requiresVerification:pv,verifiers:ig,formatWarnings:uv,formatDuration:Ym,escapeRegex:zc,verifyDone:Qm,verifyShip:Zm,verifyFeature:eg,verifyNow:tg,verifyInit:sg,verifySync:ng,verifyAnalyze:rg,verifySpec:og},Xo=mv});function fv(n){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."}[n]||"Verify actual state before proceeding."}function hv(n){if(!n||typeof n!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of gv)if(e.test(n))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:fv(t)};return{detected:!1}}function yv(n,e){if(!n||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(n)===t(e)}function wv(n){if(!n||n.length===0)return{type:"unknown",description:"No error information"};let e=n[n.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 kv(n,e,t){let s={permission:`I've tried ${n} ${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 ${n}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${n} from completing.`,validation:`Validation keeps failing for ${n}.`,config:`There seems to be a configuration issue affecting ${n}.`,unknown:`I've tried ${n} ${t} times without success.`};return s[e.type]||s.unknown}function Sv(n){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[n.type]||e.unknown}var gv,qc,bv,Rn,lg=b(()=>{"use strict";gv=[{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(fv,"getHallucinationSuggestion");l(hv,"detectHallucination");l(yv,"isSimilarError");l(wv,"analyzeErrorPattern");l(kv,"generateEscalationMessage");l(Sv,"generateSuggestion");qc=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="",s={}){let r=this._getKey(e,t),o=Date.now(),i=this._attempts.get(r);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=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(r,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);if(!r)return!1;if(r.attempts>=2&&!r.success){let o=r.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>yv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);return r?r.attempts>=this.maxAttempts&&!r.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);if(!r)return null;let o=wv(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:kv(e,o,this.maxAttempts),suggestion:Sv(o),lastError:r.errors[r.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);r&&(r.success=!0,r.attempts=0,r.errors=[],this._attempts.set(s,r))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return hv(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},bv=new qc,Rn=bv});import{z as ue}from"zod";var vv,Tv,ug,LM,UM,HM,ks,dg,Ar=b(()=>{"use strict";vv=ue.enum(["improving","stable","declining"]),Tv=ue.object({sprintNumber:ue.number(),startDate:ue.string(),endDate:ue.string(),pointsCompleted:ue.number(),tasksCompleted:ue.number(),avgVariance:ue.number(),estimationAccuracy:ue.number()}),ug=ue.object({category:ue.string(),avgVariance:ue.number(),taskCount:ue.number()}),LM=ue.object({totalPoints:ue.number(),sprints:ue.number(),estimatedDate:ue.string()}),UM=ue.object({sprints:ue.array(Tv),averageVelocity:ue.number(),velocityTrend:vv,estimationAccuracy:ue.number(),overEstimated:ue.array(ug),underEstimated:ue.array(ug),lastUpdated:ue.string()}),HM=ue.object({sprintLengthDays:ue.number().min(1).max(90).default(7),startDay:ue.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ue.number().min(1).max(52).default(6),accuracyTolerance:ue.number().min(0).max(100).default(20)}),ks={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},dg={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});function Kc(n,e){let t=Rr(e),s=Pv[t.startDay],r=new Date(n);r.setHours(0,0,0,0);let i=(r.getDay()-s+7)%7;return r.setDate(r.getDate()-i),r}function Cv(n,e){let t=Rr(e),s=new Date(n);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Ev(n,e,t){let s=Rr(t),r=Kc(n,t),o=Kc(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Yo(n,e=ks){let t=Rr(e);if(n.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=xv(n,e),r=Av(s,t.accuracyTolerance),o=r.slice(-t.windowSize),i=Dv(o),a=Rv(o),c=jv(n,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Iv(n);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function mg(n,e,t=ks){let s=Rr(t);if(e<=0)return{totalPoints:n,sprints:0,estimatedDate:""};let r=Math.ceil(n/e),o=r*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:n,sprints:r,estimatedDate:i.toISOString()}}function xv(n,e){let t=new Map,s=n.map(o=>new Date(o.completedAt)),r=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of n){let i=new Date(o.completedAt),a=Ev(i,r,e);if(!t.has(a)){let c=Kc(i,e),u=Cv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Av(n,e){let t=[];for(let[,s]of n){let r=s.outcomes.reduce((u,d)=>u+$v(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Yc(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:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:r,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,r)=>s.sprintNumber-r.sprintNumber)}function Rv(n){if(n.length<3)return"stable";let e=n.map(d=>d.pointsCompleted),t=e.length,s=0,r=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,r+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*r)/(t*i-s*s),c=r/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function jv(n,e){let t=n.filter(r=>r.variance);if(t.length===0)return 0;let s=t.filter(r=>{let o=Yc(r);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function Dv(n){if(n.length===0)return 0;let e=n.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/n.length*10)/10}function Iv(n){let e=new Map;for(let r of n){if(!r.variance)continue;let o=Yc(r),i=r.tags&&r.tags.length>0?r.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=[],s=[];for(let[r,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?s.push({category:r,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:r,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((r,o)=>o.avgVariance-r.avgVariance),s.sort((r,o)=>o.avgVariance-r.avgVariance),{overEstimated:t,underEstimated:s}}function Yc(n){if(!n.variance)return 0;let e=Xc(n.estimatedDuration),t=Xc(n.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Xc(n){let e=0,t=n.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=n.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),n.match(/(\d+)s/)&&e===0&&(e=1),e}function gg(n){if(n.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${n.averageVelocity} pts/sprint (trend: ${n.velocityTrend})`),e.push(`Estimation accuracy: ${n.estimationAccuracy}%`);for(let t of n.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of n.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
793
+ `)}function $v(n){if(!n.estimatedDuration)return 0;let e=Xc(n.estimatedDuration);if(e<=0)return 0;let t=pg[0],s=Number.POSITIVE_INFINITY;for(let r of pg){let o=Math.abs(r.typical-e);o<s&&(s=o,t=r)}return t.points}function Rr(n){return{sprintLengthDays:n.sprintLengthDays??7,startDay:n.startDay??"monday",windowSize:n.windowSize??6,accuracyTolerance:n.accuracyTolerance??20}}var Pv,pg,Qc=b(()=>{"use strict";Ar();Pv={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Kc,"getSprintStart");l(Cv,"getSprintEnd");l(Ev,"getSprintNumber");l(Yo,"calculateVelocity");l(mg,"projectCompletion");l(xv,"bucketBySprint");l(Av,"buildSprintVelocities");l(Rv,"detectTrend");l(jv,"calculateOverallAccuracy");l(Dv,"calculateAverageVelocity");l(Iv,"detectEstimationPatterns");l(Yc,"parseVariancePercent");l(Xc,"parseDurationMinutes");l(gg,"formatVelocityContext");pg=[{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($v,"derivePoints");l(Rr,"resolveConfig")});import{exec as Mv}from"node:child_process";import Ov from"node:fs/promises";import Qo from"node:path";import{promisify as _v}from"node:util";async function jn(n,e,t={}){let s=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Zc(n),c=await Hv(e),u=await Gv(e),d=[];for(let p of c){if(!i&&Wv(p))continue;let g=Vv(p,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,r);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-s}}}function Zc(n){let e=n.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(s=>!t.has(s)&&s.length>2)}async function Hv(n){let e=[];async function t(s,r=""){try{let o=await Ov.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qo.join(s,i.name),c=Qo.join(r,i.name);if(i.isDirectory()){if(Uv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Qo.extname(i.name).toLowerCase();Lv.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(n),e}async function Gv(n){let e=new Map;try{let{stdout:t}=await Nv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
794
794
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
795
795
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
796
796
  END { for (f in files) print files[f], lastmod[f], f }
797
- '`,{cwd:s,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),r=t.trim().split(`
798
- `).filter(Boolean);for(let o of r){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(s,e,t,n){let r=[],o=0,i=0,a=0,c=0,u=0,d=s.toLowerCase(),m=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let w of e){d.includes(w)&&(o+=.3,r.push(`keyword:${w}`));for(let C of m)if(C.includes(w)||w.includes(C)){o+=.15;break}}o=Math.min(1,o);for(let[w,C]of Object.entries(Fv))for(let T of C)if(d.includes(T)&&e.some(G=>C.includes(G)||G.includes(w)||w.includes(G))){i+=.4,r.push(`domain:${w}`);break}i=Math.min(1,i);let p=t.get(s);p&&(p.daysAgo<=1?(a=1,r.push("recent:1d")):p.daysAgo<=3?(a=.8,r.push("recent:3d")):p.daysAgo<=7?(a=.6,r.push("recent:1w")):p.daysAgo<=30&&(a=.3,r.push("recent:1m")),p.commits>=5&&(a=Math.min(1,a+.2)));let g=Qo.basename(s).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,r.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),r.some(w=>w.startsWith("import:"))||r.push("import:1")),n){let w=n.get(s);w!==void 0&&(u=(w+1)/2,w>0?r.push("history:boosted"):w<0&&r.push("history:penalized"))}let k=n&&n.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:s,score:Math.min(1,k),reasons:[...new Set(r)]}}function Wv(s){let e=s.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 Nv,Fv,Lv,Uv,Zo=b(()=>{"use strict";U();Nv=_v(Mv),Fv={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},Lv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Uv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Ds,"findRelevantFiles");l(Zc,"extractKeywords");l(Hv,"getAllCodeFiles");l(Gv,"getGitRecency");l(Vv,"scoreFile");l(Wv,"isTestFile")});import{exec as Bv}from"node:child_process";import{promisify as zv}from"node:util";async function fg(s=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,r=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(r){let c=await Kv(s);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await qv(s,t);return o=o.filter(c=>!Xv(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 qv(s,e){let{stdout:t}=await Dr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
797
+ '`,{cwd:n,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),r=t.trim().split(`
798
+ `).filter(Boolean);for(let o of r){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((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function Vv(n,e,t,s){let r=[],o=0,i=0,a=0,c=0,u=0,d=n.toLowerCase(),m=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let w of e){d.includes(w)&&(o+=.3,r.push(`keyword:${w}`));for(let E of m)if(E.includes(w)||w.includes(E)){o+=.15;break}}o=Math.min(1,o);for(let[w,E]of Object.entries(Fv))for(let T of E)if(d.includes(T)&&e.some(G=>E.includes(G)||G.includes(w)||w.includes(G))){i+=.4,r.push(`domain:${w}`);break}i=Math.min(1,i);let p=t.get(n);p&&(p.daysAgo<=1?(a=1,r.push("recent:1d")):p.daysAgo<=3?(a=.8,r.push("recent:3d")):p.daysAgo<=7?(a=.6,r.push("recent:1w")):p.daysAgo<=30&&(a=.3,r.push("recent:1m")),p.commits>=5&&(a=Math.min(1,a+.2)));let g=Qo.basename(n).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,r.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),r.some(w=>w.startsWith("import:"))||r.push("import:1")),s){let w=s.get(n);w!==void 0&&(u=(w+1)/2,w>0?r.push("history:boosted"):w<0&&r.push("history:penalized"))}let k=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:n,score:Math.min(1,k),reasons:[...new Set(r)]}}function Wv(n){let e=n.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 Nv,Fv,Lv,Uv,Zo=b(()=>{"use strict";U();Nv=_v(Mv),Fv={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},Lv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Uv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(jn,"findRelevantFiles");l(Zc,"extractKeywords");l(Hv,"getAllCodeFiles");l(Gv,"getGitRecency");l(Vv,"scoreFile");l(Wv,"isTestFile")});import{exec as Bv}from"node:child_process";import{promisify as Jv}from"node:util";async function fg(n=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,r=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(r){let c=await Kv(n);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await qv(n,t);return o=o.filter(c=>!Xv(c.path)).slice(0,s),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,s),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function qv(n,e){let{stdout:t}=await jr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
799
799
  /^[0-9]+$/ { timestamp=$1; next }
800
800
  NF {
801
801
  count[$0]++
@@ -804,9 +804,9 @@ Recommendations:
804
804
  END {
805
805
  for (f in count) print count[f], lastmod[f], f
806
806
  }
807
- ' | sort -rn`,{cwd:s,maxBuffer:10485760}),n=[],r=t.trim().split(`
808
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of r){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),w=u/i,C=k*.6+w*.4,T;f<1?T="just now":f<24?T=`${f}h ago`:g<7?T=`${g}d ago`:g<30?T=`${Math.floor(g/7)}w ago`:T=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(C*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function Kv(s){let{stdout:e}=await Dr("git branch --show-current",{cwd:s}),t=e.trim(),n="main";try{await Dr("git rev-parse --verify main",{cwd:s})}catch{n="master"}let{stdout:r}=await Dr(`git diff --name-only ${n}...HEAD`,{cwd:s}),o=r.trim().split(`
809
- `).filter(Boolean),{stdout:i}=await Dr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
807
+ ' | sort -rn`,{cwd:n,maxBuffer:10485760}),s=[],r=t.trim().split(`
808
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of r){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),w=u/i,E=k*.6+w*.4,T;f<1?T="just now":f<24?T=`${f}h ago`:g<7?T=`${g}d ago`:g<30?T=`${Math.floor(g/7)}w ago`:T=`${Math.floor(g/30)}mo ago`,s.push({path:m,changes:u,heatScore:Math.round(E*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function Kv(n){let{stdout:e}=await jr("git branch --show-current",{cwd:n}),t=e.trim(),s="main";try{await jr("git rev-parse --verify main",{cwd:n})}catch{s="master"}let{stdout:r}=await jr(`git diff --name-only ${s}...HEAD`,{cwd:n}),o=r.trim().split(`
809
+ `).filter(Boolean),{stdout:i}=await jr(`git log ${s}..HEAD --pretty=format:"%ct" --name-only | awk '
810
810
  /^[0-9]+$/ { timestamp=$1; next }
811
811
  NF {
812
812
  count[$0]++
@@ -815,12 +815,12 @@ Recommendations:
815
815
  END {
816
816
  for (f in count) print count[f], lastmod[f], f
817
817
  }
818
- '`,{cwd:s,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
819
- `).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],w=u-f,C=Math.floor(w/86400),T=Math.floor(w/3600),O=Math.max(0,1-C/14),G=g/d,Q=O*.5+G*.5,ne;T<1?ne="just now":T<24?ne=`${T}h ago`:ne=`${C}d ago`,a.push({path:k,changes:g,heatScore:Math.round(Q*100)/100,lastChanged:ne,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function Xv(s){let e=s.split("/").pop()||"";for(let t of Jv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Dr,Jv,hg=b(()=>{"use strict";Dr=zv(Bv),Jv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(fg,"getRecentFiles");l(qv,"getHotFilesFromCommits");l(Kv,"getBranchOnlyFiles");l(Xv,"shouldIgnore")});function el(s){return!s||s.length===0?0:Math.ceil(s.length/4)}function yg(s,e){let t=Yv[e],n=s/1e3*t.input,r=s/1e3*t.output*.3;return{inputSaved:n,outputPotential:r,total:n+r}}function Zv(s){return s<.001?"<$0.01":s<.01?`$${s.toFixed(3)}`:`$${s.toFixed(2)}`}function kg(s,e){let t=el(s),n=el(e),r=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=yg(r,Qv),a=wg.map(c=>({model:c,...yg(r,c)}));return{tokens:{original:t,filtered:n,saved:r},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Zv(i.total),byModel:a}}}function tl(s){let e=el(s);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:wg.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Yv,Qv,wg,Sg=b(()=>{"use strict";Yv={"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}},Qv="claude-sonnet-4.5";l(el,"countTokens");wg=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(yg,"calculateModelCost");l(Zv,"formatCostSaved");l(kg,"measureCompression");l(tl,"noCompression")});import eT from"node:fs/promises";import nl from"node:path";async function Tg(s,e=process.cwd()){let t=nl.isAbsolute(s)?s:nl.join(e,s),n;try{n=await eT.readFile(t,"utf-8")}catch(u){if(P(u))return{file:s,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:tl("")};throw u}let r=nl.extname(s).toLowerCase(),o=tT[r]||"unknown",i=oT[o];if(!i||i.length===0)return{file:s,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:tl(n)};let a=iT(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
820
- `);return{file:s,language:o,signatures:a,fallback:!1,metrics:kg(n,c)}}function iT(s,e){let t=[],n=s.split(`
821
- `),r=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(s))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(r.has(c))continue;r.add(c);let u=i.index,d=s.substring(0,u).split(`
822
- `).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:aT(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function aT(s){return s.replace(/\{$/,"").replace(/\s+/g," ").trim()}var tT,bg,nT,sT,rT,vg,oT,Pg=b(()=>{"use strict";U();Sg();tT={".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"},bg=[{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}],nT=[{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}],sT=[{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}],rT=[{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}],vg=[{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}],oT={typescript:bg,javascript:bg,python:nT,go:sT,rust:rT,java:vg,csharp:vg,php:[],ruby:[],unknown:[]};l(Tg,"extractSignatures");l(iT,"extractFromContent");l(aT,"cleanSignature")});import sl from"node:path";var cT,lT,rl,uT,pt,js=b(()=>{"use strict";Se();Tt();We();cT="outcomes",lT="outcomes.jsonl",rl=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return sl.join(t,cT)}getOutcomesPath(e){return sl.join(this.getOutcomesDir(e),lT)}async record(e,t){let n={...t,id:he()},r=this.getOutcomesPath(e);return await jt(sl.dirname(r)),await Wi(r,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await D(t))return[];let n=await et(t);return n.trim()?n.trim().split(`
823
- `).filter(r=>r.trim()).map(r=>JSON.parse(r)):[]}async filter(e,t){return(await this.getAll(e)).filter(r=>{if(t.sessionId&&r.sessionId!==t.sessionId||t.command&&r.command!==t.command||t.agent&&r.agentUsed!==t.agent||t.fromDate&&r.startedAt<t.fromDate||t.toDate&&r.completedAt>t.toDate||t.minQuality&&r.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=r.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(r=>{if(!r.variance)return!1;let o=this.parseVariance(r.variance),i=this.parseDuration(r.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,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},uT=new rl,pt=uT});import{z as _e}from"zod";var ei,bn,dT,wO,ol,Cg,ti=b(()=>{"use strict";ei=_e.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),bn=_e.object({primaryDomain:ei,secondaryDomains:_e.array(ei),confidence:_e.number().min(0).max(1),filePatterns:_e.array(_e.string()),relevantAgents:_e.array(_e.string())}),dT=_e.object({classification:bn,classifiedAt:_e.string(),source:_e.enum(["cache","history","llm","heuristic"]),descriptionHash:_e.string(),projectId:_e.string()}),wO=_e.object({entries:_e.record(_e.string(),dT),confirmedPatterns:_e.array(_e.object({descriptionHash:_e.string(),classification:bn,confirmedAt:_e.string(),taskDescription:_e.string()}))}),ol={entries:{},confirmedPatterns:[]},Cg={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});var Dg={};un(Dg,{AgentAssignmentSchema:()=>Eg,OUTPUT_SCHEMAS:()=>Ag,SubtaskBreakdownSchema:()=>xg,TaskClassificationSchema:()=>bn,renderSchemaForPrompt:()=>il});import{z as Ke}from"zod";function il(s){let e=Ag[s];return e?`## OUTPUT FORMAT
818
+ '`,{cwd:n,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
819
+ `).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],w=u-f,E=Math.floor(w/86400),T=Math.floor(w/3600),O=Math.max(0,1-E/14),G=g/d,Q=O*.5+G*.5,se;T<1?se="just now":T<24?se=`${T}h ago`:se=`${E}d ago`,a.push({path:k,changes:g,heatScore:Math.round(Q*100)/100,lastChanged:se,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${s}..HEAD`}}function Xv(n){let e=n.split("/").pop()||"";for(let t of zv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var jr,zv,hg=b(()=>{"use strict";jr=Jv(Bv),zv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(fg,"getRecentFiles");l(qv,"getHotFilesFromCommits");l(Kv,"getBranchOnlyFiles");l(Xv,"shouldIgnore")});function el(n){return!n||n.length===0?0:Math.ceil(n.length/4)}function yg(n,e){let t=Yv[e],s=n/1e3*t.input,r=n/1e3*t.output*.3;return{inputSaved:s,outputPotential:r,total:s+r}}function Zv(n){return n<.001?"<$0.01":n<.01?`$${n.toFixed(3)}`:`$${n.toFixed(2)}`}function kg(n,e){let t=el(n),s=el(e),r=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=yg(r,Qv),a=wg.map(c=>({model:c,...yg(r,c)}));return{tokens:{original:t,filtered:s,saved:r},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Zv(i.total),byModel:a}}}function tl(n){let e=el(n);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:wg.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Yv,Qv,wg,Sg=b(()=>{"use strict";Yv={"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}},Qv="claude-sonnet-4.5";l(el,"countTokens");wg=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(yg,"calculateModelCost");l(Zv,"formatCostSaved");l(kg,"measureCompression");l(tl,"noCompression")});import eT from"node:fs/promises";import sl from"node:path";async function Tg(n,e=process.cwd()){let t=sl.isAbsolute(n)?n:sl.join(e,n),s;try{s=await eT.readFile(t,"utf-8")}catch(u){if(C(u))return{file:n,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:tl("")};throw u}let r=sl.extname(n).toLowerCase(),o=tT[r]||"unknown",i=oT[o];if(!i||i.length===0)return{file:n,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:tl(s)};let a=iT(s,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
820
+ `);return{file:n,language:o,signatures:a,fallback:!1,metrics:kg(s,c)}}function iT(n,e){let t=[],s=n.split(`
821
+ `),r=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(n))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(r.has(c))continue;r.add(c);let u=i.index,d=n.substring(0,u).split(`
822
+ `).length,m=i[0].trim(),p;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:aT(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function aT(n){return n.replace(/\{$/,"").replace(/\s+/g," ").trim()}var tT,bg,sT,nT,rT,vg,oT,Pg=b(()=>{"use strict";U();Sg();tT={".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"},bg=[{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}],sT=[{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}],nT=[{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}],rT=[{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}],vg=[{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}],oT={typescript:bg,javascript:bg,python:sT,go:nT,rust:rT,java:vg,csharp:vg,php:[],ruby:[],unknown:[]};l(Tg,"extractSignatures");l(iT,"extractFromContent");l(aT,"cleanSignature")});import nl from"node:path";var cT,lT,rl,uT,pt,Dn=b(()=>{"use strict";Se();Tt();We();cT="outcomes",lT="outcomes.jsonl",rl=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return nl.join(t,cT)}getOutcomesPath(e){return nl.join(this.getOutcomesDir(e),lT)}async record(e,t){let s={...t,id:he()},r=this.getOutcomesPath(e);return await Dt(nl.dirname(r)),await Wi(r,JSON.stringify(s)),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await j(t))return[];let s=await et(t);return s.trim()?s.trim().split(`
823
+ `).filter(r=>r.trim()).map(r=>JSON.parse(r)):[]}async filter(e,t){return(await this.getAll(e)).filter(r=>{if(t.sessionId&&r.sessionId!==t.sessionId||t.command&&r.command!==t.command||t.agent&&r.agentUsed!==t.agent||t.fromDate&&r.startedAt<t.fromDate||t.toDate&&r.completedAt>t.toDate||t.minQuality&&r.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=r.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 s=t.filter(r=>{if(!r.variance)return!1;let o=this.parseVariance(r.variance),i=this.parseDuration(r.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let s=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return s*(o==="h"?r*60:r)}parseDuration(e){let t=0,s=e.match(/(\d+)h/);s&&(t+=parseInt(s[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},uT=new rl,pt=uT});import{z as _e}from"zod";var ei,Ss,dT,wO,ol,Cg,ti=b(()=>{"use strict";ei=_e.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Ss=_e.object({primaryDomain:ei,secondaryDomains:_e.array(ei),confidence:_e.number().min(0).max(1),filePatterns:_e.array(_e.string()),relevantAgents:_e.array(_e.string())}),dT=_e.object({classification:Ss,classifiedAt:_e.string(),source:_e.enum(["cache","history","llm","heuristic"]),descriptionHash:_e.string(),projectId:_e.string()}),wO=_e.object({entries:_e.record(_e.string(),dT),confirmedPatterns:_e.array(_e.object({descriptionHash:_e.string(),classification:Ss,confirmedAt:_e.string(),taskDescription:_e.string()}))}),ol={entries:{},confirmedPatterns:[]},Cg={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});var jg={};ls(jg,{AgentAssignmentSchema:()=>Eg,OUTPUT_SCHEMAS:()=>Ag,SubtaskBreakdownSchema:()=>xg,TaskClassificationSchema:()=>Ss,renderSchemaForPrompt:()=>il});import{z as Ke}from"zod";function il(n){let e=Ag[n];return e?`## OUTPUT FORMAT
824
824
 
825
825
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
826
826
 
@@ -829,28 +829,28 @@ ${e.example}
829
829
  \`\`\`
830
830
 
831
831
  Fields:
832
- ${pT(e.schema)}`:null}function pT(s){if(s instanceof Ke.ZodObject){let e=s.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Rg(n)}`).join(`
833
- `)}return"(see example above)"}function Rg(s){return s instanceof Ke.ZodString?"string":s instanceof Ke.ZodNumber?"number":s instanceof Ke.ZodEnum?`one of: ${s.options.join(", ")}`:s instanceof Ke.ZodArray?`array of ${Rg(s.element)}`:s instanceof Ke.ZodObject?"object":"any"}var Eg,xg,Ag,al=b(()=>{"use strict";ti();ti();Eg=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),xg=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:ei,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),Ag={classification:{schema:bn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Eg,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:xg,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(il,"renderSchemaForPrompt");l(pT,"describeSchema");l(Rg,"describeField")});import{createHash as mT}from"node:crypto";import $g from"node:fs/promises";import Mg from"node:path";function jg(s){return mT("sha256").update(s.toLowerCase().trim()).digest("hex").slice(0,16)}async function Ig(s){try{let e=Mg.join(s,"storage","classification-cache.json"),t=await $g.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?ol:(console.warn("[classifier] Failed to load cache:",y(e)),ol)}}async function cl(s,e){try{let t=Mg.join(s,"storage","classification-cache.json");await $g.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function fT(s,e,t){let n=s.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>gT?null:n.classification}function hT(s,e){return s.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function yT(s,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Og(e),r=il("classification")||"",o=`Classify this software engineering task into a domain.
832
+ ${pT(e.schema)}`:null}function pT(n){if(n instanceof Ke.ZodObject){let e=n.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${Rg(s)}`).join(`
833
+ `)}return"(see example above)"}function Rg(n){return n instanceof Ke.ZodString?"string":n instanceof Ke.ZodNumber?"number":n instanceof Ke.ZodEnum?`one of: ${n.options.join(", ")}`:n instanceof Ke.ZodArray?`array of ${Rg(n.element)}`:n instanceof Ke.ZodObject?"object":"any"}var Eg,xg,Ag,al=b(()=>{"use strict";ti();ti();Eg=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),xg=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:ei,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),Ag={classification:{schema:Ss,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Eg,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:xg,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(il,"renderSchemaForPrompt");l(pT,"describeSchema");l(Rg,"describeField")});import{createHash as mT}from"node:crypto";import $g from"node:fs/promises";import Mg from"node:path";function Dg(n){return mT("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}async function Ig(n){try{let e=Mg.join(n,"storage","classification-cache.json"),t=await $g.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e)?ol:(console.warn("[classifier] Failed to load cache:",y(e)),ol)}}async function cl(n,e){try{let t=Mg.join(n,"storage","classification-cache.json");await $g.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function fT(n,e,t){let s=n.entries[e];return!s||s.projectId!==t||Date.now()-new Date(s.classifiedAt).getTime()>gT?null:s.classification}function hT(n,e){return n.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}async function yT(n,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let s=Og(e),r=il("classification")||"",o=`Classify this software engineering task into a domain.
834
834
 
835
- Task: "${s}"
835
+ Task: "${n}"
836
836
 
837
- Available domains in this project: ${n.join(", ")}
837
+ Available domains in this project: ${s.join(", ")}
838
838
  Available agents: ${e.agents.join(", ")||"none"}
839
839
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
840
840
 
841
- ${r}`;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=bn.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 kT(s,e){let t=Og(e),n=new Map;for(let[p,g]of Object.entries(wT)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)s.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Cg;let r=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=r[0][0],i=r[0][1],a=r.slice(1,3).map(([p])=>p),c=r.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=ST(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 Og(s){let e=[];return s.domains.hasFrontend&&e.push("frontend"),s.domains.hasBackend&&e.push("backend"),s.domains.hasDatabase&&e.push("database"),s.domains.hasTesting&&e.push("testing"),s.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function ST(s){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[s]||e.general}var gT,wT,ll,bT,_g,Ng=b(()=>{"use strict";ti();al();U();gT=3600*1e3;l(jg,"hashDescription");l(Ig,"loadCache");l(cl,"saveCache");l(fT,"lookupCache");l(hT,"lookupPatterns");l(yT,"classifyWithLLM");wT={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(kT,"classifyWithHeuristic");l(Og,"buildAvailableDomains");l(ST,"getFilePatterns");ll=class{static{l(this,"DomainClassifier")}async classify(e,t,n,r){let o=jg(e),i=await Ig(n),a=fT(i,o,t);if(a)return{classification:a,source:"cache"};let c=hT(i,o);if(c)return{classification:c,source:"history"};let u=await yT(e,r);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await cl(n,i),{classification:u,source:"llm"};let d=kT(e,r);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await cl(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let r=jg(e),o=await Ig(n);o.confirmedPatterns.some(i=>i.descriptionHash===r)||(o.confirmedPatterns.push({descriptionHash:r,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await cl(n,o))}},bT=new ll,_g=bT});import{exec as vT}from"node:child_process";import jr from"node:fs/promises";import TT from"node:os";import Kn from"node:path";import{promisify as PT}from"node:util";var Fg,Lg,ul,CT,ni,dl=b(()=>{"use strict";Qc();ft();Se();Ar();ys();Et();Zo();hg();Pg();U();js();Ng();Wt();Fg=PT(vT),Lg=["database","backend","frontend","testing","devops"],ul=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let r=await $.getProjectId(n),o=A.getGlobalProjectPath(r),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,r,i),u=await this.loadAgents(a,r),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(r),this.loadVelocityContext(r)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((Q,ne)=>{if(Q.status==="fulfilled")return Q.value;g.push(p[ne]),console.warn(`Context tool "${p[ne]}" failed: ${y(Q.reason)}`)}),[k,w,C]=f,T={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},O=this.shouldFragment(a,t),G=null;return O&&e==="task"&&(G=await this.createSubtasks(t,a,u,r)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:O,subtasks:G,project:{id:r,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:w??null,velocityContext:C??null,contextDegradation:T}}async gatherRealContext(e,t){try{let[n,r,o]=await Promise.all([this.getGitState(t),Ds(e,t,{maxFiles:10,minScore:.15}),fg(t,{commits:10,maxFiles:10})]),i=r.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Tg(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(`
842
- `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:r.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([Fg("git branch --show-current",{cwd:e}),Fg("git status --porcelain",{cwd:e})]),r=t.stdout.trim()||"main",o=n.stdout.trim().split(`
843
- `).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:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await qe.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=Yo(t,Sn);return n.sprints.length===0?null:gg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Kn.join(e,"analysis","repo-analysis.json"),n=await jr.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 r=A.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(r),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await F.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await _g.classify(e,t,r,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 jr.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=A.getGlobalProjectPath(t),r=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(r,u);try{let m=await jr.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=lo(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(r=>r.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=Kn.join(TT.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 r=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 jr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await jr.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(r)).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"],r=t.toLowerCase();for(let i of n)if(r.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,r){let o=[...t].sort((a,c)=>{let u=Lg.indexOf(a),d=Lg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await F.createSubtasks(r,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let r={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()}] ${r} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},CT=new ul,ni=CT});function ET(s,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"}]}}[s]||{title:"Confirmation Required",message:`Execute ${s}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var pl,xT,Ue,Ug=b(()=>{"use strict";Tt();fe();Fn();Fn();l(ET,"generateApprovalPrompt");pl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Qa.includes(e)}isDestructive(e){return Za.includes(e)}isToolAllowedInPlanning(e){return Ao.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Ao.includes(n)):t}startPlanning(e,t,n){let r={id:he(),projectId:e,command:t,params:n,status:re.GATHERING,startedAt:v(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,r),r}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[re.GATHERING,re.ANALYZING,re.PROPOSING,re.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:v()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===re.APPROVED?n.approvedAt=v():t===re.EXECUTING?n.executionStartedAt=v():(t===re.COMPLETED||t===re.ABORTED)&&(n.completedAt=v()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=re.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=re.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!==re.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=re.APPROVED,n.approvedAt=v(),n.steps=(n.proposedPlan?.steps||[]).map((r,o)=>({index:o,description:typeof r=="string"?r:r.description||"",status:"pending",tool:typeof r=="string"?void 0:r.tool,args:typeof r=="string"?void 0:r.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=re.REJECTED,n.userFeedback=t,n.completedAt=v(),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!==re.APPROVED?null:(t.status=re.EXECUTING,t.executionStartedAt=v(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==re.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!==re.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=v(),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=re.COMPLETED,t.completedAt=v();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(r=>r.status==="completed").length,failedSteps:t.steps.filter(r=>r.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=re.ABORTED,n.completedAt=v(),n.abortReason=t;let r={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),r}generateApprovalPrompt(e,t){return ET(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let r=[`${{[re.GATHERING]:"\u{1F50D}",[re.ANALYZING]:"\u{1F9E0}",[re.PROPOSING]:"\u{1F4DD}",[re.PENDING_APPROVAL]:"\u23F3",[re.APPROVED]:"\u2705",[re.EXECUTING]:"\u26A1",[re.COMPLETED]:"\u{1F389}",[re.REJECTED]:"\u274C",[re.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===re.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);r.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return r.join(`
844
- `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),r=Math.floor(n/1e3),o=Math.floor(r/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${r%60}s`:`${r}s`}},xT=new pl,Ue=xT});var ml,AT,Hg,Gg=b(()=>{"use strict";js();ml=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,r=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:r,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 r=[];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,w)=>k+w.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let w=this.parseVariance(k.variance),C=this.parseDuration(k.estimatedDuration);return C===0?!1:Math.abs(w)/C<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(w=>w.completedAsPlanned))for(let w of k.tags||[])g.set(w,(g.get(w)||0)+1);let f=[...g.entries()].sort((k,w)=>w[1]-k[1]).slice(0,3).map(([k])=>k);r.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return r}async detectPatterns(e){let t=await pt.getAll(e),n=[];if(t.length<3)return n;let r=t.filter(c=>this.parseVariance(c.variance)>0);r.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:r.length/t.length,occurrences:r.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 r=(await pt.getAll(e)).filter(a=>a.tags?.includes(t));if(r.length<2)return null;let o=r.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/r.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 r=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return r.length===0?null:r.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,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},AT=new ml,Hg=AT});function RT(s){let e=s.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return si[t]?si[t]:si[e]?si[e]:e}function ri(s){let e=new Set,t=[];for(let n of s){let r=RT(n);e.has(r)||(e.add(r),t.push(n))}return t}var si,gl=b(()=>{"use strict";si={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(RT,"normalizeFrameworkName");l(ri,"deduplicateTechStack")});import{z as He}from"zod";function Vg(s){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
845
- `);let t=[];s.language&&t.push(s.language),s.framework&&t.push(s.framework);let n=s.techStack??[];t.push(...n);let r=s.analysisLanguages??[],o=s.analysisFrameworks??[];t.push(...r,...o);let i=ri(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),s.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${s.analysisPackageManager}`),s.domains){let c=Object.entries(s.domains).filter(([,u])=>!u).map(([u])=>DT[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=s.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${s.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."),s.fileCount&&e.push(`
846
- Context: ${s.fileCount} files in project.`),e.join(`
847
- `)}var d_,DT,Wg=b(()=>{"use strict";gl();d_=He.object({projectPath:He.string(),language:He.string().optional(),framework:He.string().optional(),techStack:He.array(He.string()).default([]),domains:He.object({hasFrontend:He.boolean().default(!1),hasBackend:He.boolean().default(!1),hasDatabase:He.boolean().default(!1),hasTesting:He.boolean().default(!1),hasDocker:He.boolean().default(!1)}).optional(),fileCount:He.number().optional(),availableAgents:He.array(He.string()).default([]),analysisLanguages:He.array(He.string()).default([]),analysisFrameworks:He.array(He.string()).default([]),analysisPackageManager:He.string().optional()}),DT={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Vg,"buildAntiHallucinationBlock")});import{z as _t}from"zod";var jT,Bg,zg=b(()=>{"use strict";jT=_t.object({agents:_t.boolean(),patterns:_t.boolean(),checklist:_t.boolean(),modules:_t.array(_t.string())}),Bg=_t.object({version:_t.string(),description:_t.string().optional(),commands:_t.record(_t.string(),jT).refine(s=>"*"in s,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function fl(s,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(s)).length}function Jg(s,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),r=e.frontmatter?.["allowed-tools"]||[],o=`${s} ${t} ${n}`,i=fl(o,IT),a=fl(o,$T),c=fl(o,MT);return r.some(d=>OT.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 IT,$T,MT,OT,qg=b(()=>{"use strict";IT=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],$T=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],MT=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],OT=["Write","Edit","Bash"];l(fl,"countMatches");l(Jg,"classifyCommand")});import hl from"node:fs/promises";import _T from"node:path";async function Xg(){if(Ir)return Ir;let s=await hl.readFile(yl,"utf-8"),e=JSON.parse(s);return Ir=Bg.parse(e),Ir}function NT(s){return Yg.get(s)}function FT(s,e){Yg.set(s,e)}function UT(s,e){let t=s,n=Kg.get(t);return n&&GT(n.entry,e)?(n.count++,n.count>=LT):(Kg.set(t,{entry:e,count:1}),!1)}async function HT(s,e){let t=await hl.readFile(yl,"utf-8"),n=JSON.parse(t);n.commands[s]=e,await hl.writeFile(yl,`${JSON.stringify(n,null,2)}
848
- `,"utf-8"),Ir=null}function GT(s,e){return s.agents===e.agents&&s.patterns===e.patterns&&s.checklist===e.checklist&&s.modules.length===e.modules.length&&s.modules.every((t,n)=>t===e.modules[n])}function Qg(s,e,t){if(e in s.commands&&e!=="*")return{entry:s.commands[e],source:"config"};let n=NT(e);if(n)return{entry:n,source:"cache"};if(t){let r=Jg(e,t);return FT(e,r),UT(e,r)&&HT(e,r).catch(()=>{}),{entry:r,source:"classified"}}return{entry:s.commands["*"],source:"wildcard"}}var yl,Ir,Yg,Kg,LT,Zg=b(()=>{"use strict";zg();Pt();qg();yl=_T.join(pe,"core/config/command-context.config.json"),Ir=null;l(Xg,"loadCommandContextConfig");Yg=new Map;l(NT,"getCachedClassification");l(FT,"cacheClassification");Kg=new Map,LT=3;l(UT,"trackClassification");l(HT,"persistClassification");l(GT,"isSameEntry");l(Qg,"resolveCommandContextFull")});import VT from"node:os";import{z as qt}from"zod";function WT(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function BT(s){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[s]??s}function ef(s){let e=s.platform??VT.platform(),t=s.runtime??WT(),n=s.date??new Date().toISOString().split("T")[0];return`<env>
849
- ${[["project",s.projectName],["path",s.projectPath],["git",s.isGitRepo?"true":"false"],["branch",s.gitBranch],["platform",BT(e)],["runtime",t],["date",n],["model",s.model],["provider",s.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
841
+ ${r}`;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=Ss.safeParse(u);return d.success?d.data:{primaryDomain:s.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>s.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 kT(n,e){let t=Og(e),s=new Map;for(let[p,g]of Object.entries(wT)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)n.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&s.set(p,f)}if(s.size===0)return Cg;let r=Array.from(s.entries()).sort((p,g)=>g[1]-p[1]),o=r[0][0],i=r[0][1],a=r.slice(1,3).map(([p])=>p),c=r.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=ST(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 Og(n){let e=[];return n.domains.hasFrontend&&e.push("frontend"),n.domains.hasBackend&&e.push("backend"),n.domains.hasDatabase&&e.push("database"),n.domains.hasTesting&&e.push("testing"),n.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function ST(n){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[n]||e.general}var gT,wT,ll,bT,_g,Ng=b(()=>{"use strict";ti();al();U();gT=3600*1e3;l(Dg,"hashDescription");l(Ig,"loadCache");l(cl,"saveCache");l(fT,"lookupCache");l(hT,"lookupPatterns");l(yT,"classifyWithLLM");wT={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(kT,"classifyWithHeuristic");l(Og,"buildAvailableDomains");l(ST,"getFilePatterns");ll=class{static{l(this,"DomainClassifier")}async classify(e,t,s,r){let o=Dg(e),i=await Ig(s),a=fT(i,o,t);if(a)return{classification:a,source:"cache"};let c=hT(i,o);if(c)return{classification:c,source:"history"};let u=await yT(e,r);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await cl(s,i),{classification:u,source:"llm"};let d=kT(e,r);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await cl(s,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,s){let r=Dg(e),o=await Ig(s);o.confirmedPatterns.some(i=>i.descriptionHash===r)||(o.confirmedPatterns.push({descriptionHash:r,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await cl(s,o))}},bT=new ll,_g=bT});import{exec as vT}from"node:child_process";import Dr from"node:fs/promises";import TT from"node:os";import qs from"node:path";import{promisify as PT}from"node:util";var Fg,Lg,ul,CT,si,dl=b(()=>{"use strict";Qc();ft();Se();Ar();yn();Et();Zo();hg();Pg();U();Dn();Ng();Wt();Fg=PT(vT),Lg=["database","backend","frontend","testing","devops"],ul=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let r=await $.getProjectId(s),o=A.getGlobalProjectPath(r),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,r,i),u=await this.loadAgents(a,r),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(r),this.loadVelocityContext(r)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((Q,se)=>{if(Q.status==="fulfilled")return Q.value;g.push(p[se]),console.warn(`Context tool "${p[se]}" failed: ${y(Q.reason)}`)}),[k,w,E]=f,T={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},O=this.shouldFragment(a,t),G=null;return O&&e==="task"&&(G=await this.createSubtasks(t,a,u,r)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:O,subtasks:G,project:{id:r,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:w??null,velocityContext:E??null,contextDegradation:T}}async gatherRealContext(e,t){try{let[s,r,o]=await Promise.all([this.getGitState(t),jn(e,t,{maxFiles:10,minScore:.15}),fg(t,{commits:10,maxFiles:10})]),i=r.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Tg(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(`
842
+ `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:r.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,s]=await Promise.all([Fg("git branch --show-current",{cwd:e}),Fg("git status --porcelain",{cwd:e})]),r=t.stdout.trim()||"main",o=s.stdout.trim().split(`
843
+ `).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:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await qe.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 s=Yo(t,ks);return s.sprints.length===0?null:gg(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=qs.join(e,"analysis","repo-analysis.json"),s=await Dr.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return C(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,s){let r=A.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(r),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await F.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:s?{language:s.ecosystem}:void 0},{classification:c}=await _g.classify(e,t,r,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=qs.join(e,"agents");return(await Dr.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let s=A.getGlobalProjectPath(t),r=qs.join(s,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=qs.join(r,u);try{let m=await Dr.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=lo(e),s={...t.frontmatter};return typeof s.skills=="string"&&(s.skills=s.skills.split(",").map(r=>r.trim())),{frontmatter:s,body:t.content}}async loadSkills(e){let t=qs.join(TT.homedir(),".claude","skills"),s=new Map;for(let i of e)for(let a of i.skills){let c=s.get(a)||[];c.push(i.name),s.set(a,c)}let r=Array.from(s.keys()).map(async i=>{let a=qs.join(t,`${i}.md`),c=qs.join(t,i,"SKILL.md");try{let u=await Dr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await Dr.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=s.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(r)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],r=t.toLowerCase();for(let i of s)if(r.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,r){let o=[...t].sort((a,c)=>{let u=Lg.indexOf(a),d=Lg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=s.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await F.createSubtasks(r,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let r={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()}] ${r} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},CT=new ul,si=CT});function ET(n,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"}]}}[n]||{title:"Confirmation Required",message:`Execute ${n}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var pl,xT,Ue,Ug=b(()=>{"use strict";Tt();fe();Ns();Ns();l(ET,"generateApprovalPrompt");pl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Qa.includes(e)}isDestructive(e){return Za.includes(e)}isToolAllowedInPlanning(e){return Ao.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>Ao.includes(s)):t}startPlanning(e,t,s){let r={id:he(),projectId:e,command:t,params:s,status:re.GATHERING,startedAt:v(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,r),r}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[re.GATHERING,re.ANALYZING,re.PROPOSING,re.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:v()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===re.APPROVED?s.approvedAt=v():t===re.EXECUTING?s.executionStartedAt=v():(t===re.COMPLETED||t===re.ABORTED)&&(s.completedAt=v()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=re.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=re.PENDING_APPROVAL,this.formatPlanForApproval(s)):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 s=this.getActivePlan(e);return!s||s.status!==re.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=re.APPROVED,s.approvedAt=v(),s.steps=(s.proposedPlan?.steps||[]).map((r,o)=>({index:o,description:typeof r=="string"?r:r.description||"",status:"pending",tool:typeof r=="string"?void 0:r.tool,args:typeof r=="string"?void 0:r.args})),{approved:!0,planId:s.id,steps:s.steps,message:`Plan approved. ${s.steps.length} steps to execute.`})}rejectPlan(e,t=null){let s=this.getActivePlan(e);return s?(s.status=re.REJECTED,s.userFeedback=t,s.completedAt=v(),this.activePlans.delete(e),{rejected:!0,planId:s.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==re.APPROVED?null:(t.status=re.EXECUTING,t.executionStartedAt=v(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==re.EXECUTING)return null;let s=t.steps[t.currentStep];return s?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:s,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let s=this.getActivePlan(e);return!s||s.status!==re.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=v(),s.currentStep++,this.getNextStep(e))}failStep(e,t){let s=this.getActivePlan(e);return s?(s.steps[s.currentStep].status="failed",s.steps[s.currentStep].error=t,{failed:!0,step:s.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=re.COMPLETED,t.completedAt=v();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(r=>r.status==="completed").length,failedSteps:t.steps.filter(r=>r.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),s}abortPlan(e,t="User requested"){let s=this.getActivePlan(e);if(!s)return null;s.status=re.ABORTED,s.completedAt=v(),s.abortReason=t;let r={aborted:!0,planId:s.id,reason:t,completedSteps:s.steps.filter(o=>o.status==="completed").length,totalSteps:s.steps.length};return this.activePlans.delete(e),r}generateApprovalPrompt(e,t){return ET(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let r=[`${{[re.GATHERING]:"\u{1F50D}",[re.ANALYZING]:"\u{1F9E0}",[re.PROPOSING]:"\u{1F4DD}",[re.PENDING_APPROVAL]:"\u23F3",[re.APPROVED]:"\u2705",[re.EXECUTING]:"\u26A1",[re.COMPLETED]:"\u{1F389}",[re.REJECTED]:"\u274C",[re.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===re.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);r.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return r.join(`
844
+ `)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),r=Math.floor(s/1e3),o=Math.floor(r/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${r%60}s`:`${r}s`}},xT=new pl,Ue=xT});var ml,AT,Hg,Gg=b(()=>{"use strict";Dn();ml=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 s=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,r=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(s*10)/10,estimateAccuracy:r,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await pt.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let r=[];for(let[o,i]of s){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,w)=>k+w.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let w=this.parseVariance(k.variance),E=this.parseDuration(k.estimatedDuration);return E===0?!1:Math.abs(w)/E<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(w=>w.completedAsPlanned))for(let w of k.tags||[])g.set(w,(g.get(w)||0)+1);let f=[...g.entries()].sort((k,w)=>w[1]-k[1]).slice(0,3).map(([k])=>k);r.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return r}async detectPatterns(e){let t=await pt.getAll(e),s=[];if(t.length<3)return s;let r=t.filter(c=>this.parseVariance(c.variance)>0);r.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:r.length/t.length,occurrences:r.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&s.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&&s.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&&s.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return s.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let r=(await pt.getAll(e)).filter(a=>a.tags?.includes(t));if(r.length<2)return null;let o=r.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/r.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 r=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return r.length===0?null:r.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let s=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return s*(o==="h"?r*60:r)}parseDuration(e){let t=0,s=e.match(/(\d+)h/);s&&(t+=parseInt(s[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},AT=new ml,Hg=AT});function RT(n){let e=n.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return ni[t]?ni[t]:ni[e]?ni[e]:e}function ri(n){let e=new Set,t=[];for(let s of n){let r=RT(s);e.has(r)||(e.add(r),t.push(s))}return t}var ni,gl=b(()=>{"use strict";ni={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(RT,"normalizeFrameworkName");l(ri,"deduplicateTechStack")});import{z as He}from"zod";function Vg(n){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
845
+ `);let t=[];n.language&&t.push(n.language),n.framework&&t.push(n.framework);let s=n.techStack??[];t.push(...s);let r=n.analysisLanguages??[],o=n.analysisFrameworks??[];t.push(...r,...o);let i=ri(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),n.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${n.analysisPackageManager}`),n.domains){let c=Object.entries(n.domains).filter(([,u])=>!u).map(([u])=>jT[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=n.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${n.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."),n.fileCount&&e.push(`
846
+ Context: ${n.fileCount} files in project.`),e.join(`
847
+ `)}var d_,jT,Wg=b(()=>{"use strict";gl();d_=He.object({projectPath:He.string(),language:He.string().optional(),framework:He.string().optional(),techStack:He.array(He.string()).default([]),domains:He.object({hasFrontend:He.boolean().default(!1),hasBackend:He.boolean().default(!1),hasDatabase:He.boolean().default(!1),hasTesting:He.boolean().default(!1),hasDocker:He.boolean().default(!1)}).optional(),fileCount:He.number().optional(),availableAgents:He.array(He.string()).default([]),analysisLanguages:He.array(He.string()).default([]),analysisFrameworks:He.array(He.string()).default([]),analysisPackageManager:He.string().optional()}),jT={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Vg,"buildAntiHallucinationBlock")});import{z as _t}from"zod";var DT,Bg,Jg=b(()=>{"use strict";DT=_t.object({agents:_t.boolean(),patterns:_t.boolean(),checklist:_t.boolean(),modules:_t.array(_t.string())}),Bg=_t.object({version:_t.string(),description:_t.string().optional(),commands:_t.record(_t.string(),DT).refine(n=>"*"in n,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function fl(n,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(n)).length}function zg(n,e){let t=(e.frontmatter?.description||"").toLowerCase(),s=e.content.toLowerCase(),r=e.frontmatter?.["allowed-tools"]||[],o=`${n} ${t} ${s}`,i=fl(o,IT),a=fl(o,$T),c=fl(o,MT);return r.some(d=>OT.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 IT,$T,MT,OT,qg=b(()=>{"use strict";IT=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],$T=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],MT=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],OT=["Write","Edit","Bash"];l(fl,"countMatches");l(zg,"classifyCommand")});import hl from"node:fs/promises";import _T from"node:path";async function Xg(){if(Ir)return Ir;let n=await hl.readFile(yl,"utf-8"),e=JSON.parse(n);return Ir=Bg.parse(e),Ir}function NT(n){return Yg.get(n)}function FT(n,e){Yg.set(n,e)}function UT(n,e){let t=n,s=Kg.get(t);return s&&GT(s.entry,e)?(s.count++,s.count>=LT):(Kg.set(t,{entry:e,count:1}),!1)}async function HT(n,e){let t=await hl.readFile(yl,"utf-8"),s=JSON.parse(t);s.commands[n]=e,await hl.writeFile(yl,`${JSON.stringify(s,null,2)}
848
+ `,"utf-8"),Ir=null}function GT(n,e){return n.agents===e.agents&&n.patterns===e.patterns&&n.checklist===e.checklist&&n.modules.length===e.modules.length&&n.modules.every((t,s)=>t===e.modules[s])}function Qg(n,e,t){if(e in n.commands&&e!=="*")return{entry:n.commands[e],source:"config"};let s=NT(e);if(s)return{entry:s,source:"cache"};if(t){let r=zg(e,t);return FT(e,r),UT(e,r)&&HT(e,r).catch(()=>{}),{entry:r,source:"classified"}}return{entry:n.commands["*"],source:"wildcard"}}var yl,Ir,Yg,Kg,LT,Zg=b(()=>{"use strict";Jg();Pt();qg();yl=_T.join(pe,"core/config/command-context.config.json"),Ir=null;l(Xg,"loadCommandContextConfig");Yg=new Map;l(NT,"getCachedClassification");l(FT,"cacheClassification");Kg=new Map,LT=3;l(UT,"trackClassification");l(HT,"persistClassification");l(GT,"isSameEntry");l(Qg,"resolveCommandContextFull")});import VT from"node:os";import{z as qt}from"zod";function WT(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function BT(n){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[n]??n}function ef(n){let e=n.platform??VT.platform(),t=n.runtime??WT(),s=n.date??new Date().toISOString().split("T")[0];return`<env>
849
+ ${[["project",n.projectName],["path",n.projectPath],["git",n.isGitRepo?"true":"false"],["branch",n.gitBranch],["platform",BT(e)],["runtime",t],["date",s],["model",n.model],["provider",n.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
850
850
  `)}
851
- </env>`}var x_,tf=b(()=>{"use strict";x_=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(WT,"detectRuntime");l(BT,"normalizePlatform");l(ef,"buildEnvironmentBlock")});function sf(s){let e=s.getAllocationFor("injection");return{...ii,totalPrompt:e}}function Xn(s,e){let t=e*rf;return s.length<=t?s:`${s.substring(0,t)}
852
- ... (truncated to ~${e} tokens)`}function nf(s){return Math.ceil(s.length/rf)}function of(s,e){if(e.length===0||s.length===0)return s;let t=new Set;for(let n of e){let r=zT[n.toLowerCase()];if(r)for(let o of r)t.add(o);t.add(n.toLowerCase())}return s.filter(n=>{let r=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(r.includes(o))return!0;return!1})}var ii,rf,zT,oi,af=b(()=>{"use strict";ii={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(sf,"budgetsFromCoordinator");rf=4;l(Xn,"truncateToTokenBudget");l(nf,"estimateTokens");zT={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(of,"filterSkillsByDomains");oi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...ii,...e}}addSection(e,t){let n=Xn(e,t),r=nf(n);if(this.used+r>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Xn(n,o);return this.used+=nf(i),i}return this.used+=r,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import cf from"node:fs/promises";import Yn from"node:path";var wl,JT,lf,uf=b(()=>{"use strict";rn();Et();U();We();Pt();Gg();Wg();Zg();tf();af();gl();Wt();wl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await D(e)){let r=await cf.readFile(e,"utf-8");return this._templateCache.set(e,{content:r,loadedAt:n}),r}}catch(r){P(r)||console.error(`Template loading warning: ${y(r)}`)}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?sf(this._coordinator):ii}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ye(`global/modules/${e}`);if(t)return t;let n=Yn.join(pe,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=mn("checklists/");if(n.length>0){for(let r of n)if(r.endsWith(".md")){let o=ye(r);if(o){let i=Yn.basename(r,".md");t[i]=o}}}else{let r=Yn.join(pe,"templates","checklists");if(await D(r)){let o=(await cf.readdir(r)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Yn.join(r,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,r]=await Promise.all([F.read(e),Oe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:r.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 Hg.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 r=n.join(`
853
- `);return Xn(r,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),r=Date.now()-t,o=Math.floor(r/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,r=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,r,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,r=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 S=await Xg();p=Qg(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;r&&g&&(d.push(`# AGENT: ${r.name}
851
+ </env>`}var x_,tf=b(()=>{"use strict";x_=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(WT,"detectRuntime");l(BT,"normalizePlatform");l(ef,"buildEnvironmentBlock")});function nf(n){let e=n.getAllocationFor("injection");return{...ii,totalPrompt:e}}function Ks(n,e){let t=e*rf;return n.length<=t?n:`${n.substring(0,t)}
852
+ ... (truncated to ~${e} tokens)`}function sf(n){return Math.ceil(n.length/rf)}function of(n,e){if(e.length===0||n.length===0)return n;let t=new Set;for(let s of e){let r=JT[s.toLowerCase()];if(r)for(let o of r)t.add(o);t.add(s.toLowerCase())}return n.filter(s=>{let r=`${s.name} ${s.content}`.toLowerCase();for(let o of t)if(r.includes(o))return!0;return!1})}var ii,rf,JT,oi,af=b(()=>{"use strict";ii={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(nf,"budgetsFromCoordinator");rf=4;l(Ks,"truncateToTokenBudget");l(sf,"estimateTokens");JT={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(of,"filterSkillsByDomains");oi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...ii,...e}}addSection(e,t){let s=Ks(e,t),r=sf(s);if(this.used+r>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Ks(s,o);return this.used+=sf(i),i}return this.used+=r,s}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import cf from"node:fs/promises";import Xs from"node:path";var wl,zT,lf,uf=b(()=>{"use strict";rs();Et();U();We();Pt();Gg();Wg();Zg();tf();af();gl();Wt();wl=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),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await j(e)){let r=await cf.readFile(e,"utf-8");return this._templateCache.set(e,{content:r,loadedAt:s}),r}}catch(r){C(r)||console.error(`Template loading warning: ${y(r)}`)}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?nf(this._coordinator):ii}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ye(`global/modules/${e}`);if(t)return t;let s=Xs.join(pe,"templates/global/modules",e);return this.getTemplate(s)}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 s=ps("checklists/");if(s.length>0){for(let r of s)if(r.endsWith(".md")){let o=ye(r);if(o){let i=Xs.basename(r,".md");t[i]=o}}}else{let r=Xs.join(pe,"templates","checklists");if(await j(r)){let o=(await cf.readdir(r)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Xs.join(r,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){C(s)||console.error(`Checklist loading warning: ${y(s)}`)}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[s,r]=await Promise.all([F.read(e),Oe.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:r.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(C(s)||s instanceof SyntaxError)return null;throw s}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let s=[];if(s.push("## AUTO-INJECTED CONTEXT"),s.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);s.push(`**Current Task**: ${t.currentTask.description}`),s.push(`- Started: ${o} ago`)}else s.push("**Current Task**: None");if(s.push(""),t.queue.length>0){s.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)s.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&s.push(`- ... and ${t.queue.length-3} more`)}s.push("");try{let o=await Hg.detectPatterns(e);if(o.length>0){s.push("**Project Conventions**");for(let i of o.slice(0,3))s.push(`- ${i.description}`),i.suggestedAction&&s.push(` \u2192 ${i.suggestedAction}`);s.push("")}}catch(o){!C(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}s.push("---"),s.push("");let r=s.join(`
853
+ `);return Ks(r,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),r=Date.now()-t,o=Math.floor(r/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=Xs.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,r=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,s,r,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,r=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 S=await Xg();p=Qg(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;r&&g&&(d.push(`# AGENT: ${r.name}
854
854
  `),r.role&&d.push(`Role: ${r.role}
855
855
  `),r.skills?.length&&d.push(`Skills: ${r.skills.join(", ")}
856
856
  `),d.push(`
@@ -859,8 +859,8 @@ Apply specialized expertise. Read agent file for details if needed.
859
859
  `)),d.push(`TASK: ${e.frontmatter.description}
860
860
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
861
861
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
862
- `);let k=t.projectPath;if(k){let S=u?.project?.id?Yn.basename(k):Yn.basename(k),j=ef({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
863
- ${j}
862
+ `);let k=t.projectPath;if(k){let S=u?.project?.id?Xs.basename(k):Xs.basename(k),D=ef({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
863
+ ${D}
864
864
  `)}if(u){let S=u.sealedAnalysis;if(d.push(`
865
865
  ## PROJECT ANALYSIS (Sealed)
866
866
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
@@ -875,45 +875,45 @@ ${j}
875
875
  `),d.push(`**Analysis Status**: ${S.status}${S.commitHash?` (commit: ${S.commitHash.slice(0,8)})`:""}
876
876
  `),S.patterns?.length>0){d.push(`
877
877
  ### Code Patterns (Follow These)
878
- `);for(let j of S.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
878
+ `);for(let D of S.patterns)d.push(`- **${D.name}**: ${D.description}${D.location?` (${D.location})`:""}
879
879
  `)}if(S.antiPatterns?.length>0){d.push(`
880
880
  ### Anti-Patterns (Avoid These)
881
- `);for(let j of S.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
881
+ `);for(let D of S.antiPatterns)d.push(`- **${D.issue}** in \`${D.file}\` \u2014 ${D.suggestion}
882
882
  `)}}d.push(`
883
- `)}let w=p.patterns,C=n?.codePatterns||"";if(w&&C&&C.trim()){let S=this.extractPatternSummary(C);S&&(d.push(`## CODE PATTERNS
883
+ `)}let w=p.patterns,E=s?.codePatterns||"";if(w&&E&&E.trim()){let S=this.extractPatternSummary(E);S&&(d.push(`## CODE PATTERNS
884
884
  `),d.push(S),d.push(`
885
885
  Full patterns: Read analysis/patterns.md
886
- `))}let T=n?.analysis||"";if(w&&T&&T.trim()){let S=T.match(/Stack[:\s]+([^\n]+)/i)||T.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
886
+ `))}let T=s?.analysis||"";if(w&&T&&T.trim()){let S=T.match(/Stack[:\s]+([^\n]+)/i)||T.match(/Technology[:\s]+([^\n]+)/i),D=S?S[1].trim():"detected";d.push(`
887
887
  ## STACK
888
- Stack: ${j}
889
- `),C||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
888
+ Stack: ${D}
889
+ `),E||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
890
890
  `)}if(u){if(u.agents.length>0){d.push(`
891
891
  ### LOADED AGENTS (Project-Specific Specialists)
892
892
 
893
- `);for(let j of u.agents){d.push(`#### Agent: ${j.name} (${j.domain})
894
- `),j.effort&&d.push(`Effort: ${j.effort}
895
- `),j.model&&d.push(`Model: ${j.model}
896
- `),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
897
- `);let Ce=Xn(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
893
+ `);for(let D of u.agents){d.push(`#### Agent: ${D.name} (${D.domain})
894
+ `),D.effort&&d.push(`Effort: ${D.effort}
895
+ `),D.model&&d.push(`Model: ${D.model}
896
+ `),D.skills.length>0&&d.push(`Skills: ${D.skills.join(", ")}
897
+ `);let Ce=Ks(D.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
898
898
  ${Ce}
899
899
  \`\`\`
900
900
 
901
901
  `)}}let S=of(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
902
902
 
903
- `);for(let j of S){d.push(`#### Skill: ${j.name}
904
- `);let Ce=Xn(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
903
+ `);for(let D of S){d.push(`#### Skill: ${D.name}
904
+ `);let Ce=Ks(D.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
905
905
  ${Ce}
906
906
  \`\`\`
907
907
 
908
- `)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let S of O){let j=await this.loadModule(S);j&&(d.push(`
909
- `),d.push(j))}if(c?.isPlanning&&(d.push(`
908
+ `)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let S of O){let D=await this.loadModule(S);D&&(d.push(`
909
+ `),d.push(D))}if(c?.isPlanning&&(d.push(`
910
910
  ## PLAN MODE
911
911
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
912
912
  `),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
913
913
  `)),c?.requiresApproval&&d.push(`
914
914
  ## APPROVAL REQUIRED
915
915
  Show changes, list affected files, ask for confirmation.
916
- `),k){let S=u?.sealedAnalysis,j=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Ce={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:ri(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(En=>En.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
916
+ `),k){let S=u?.sealedAnalysis,D=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Ce={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:ri(D),domains:this.extractDomains(s),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Cs=>Cs.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
917
917
  ${Vg(Ce)}
918
918
  `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let S=u.contextDegradation;d.push(`
919
919
  ### CONTEXT DEGRADATION NOTICE
@@ -930,15 +930,15 @@ ${Vg(Ce)}
930
930
  `),S.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
931
931
  `),d.push(`| Score | File | Why |
932
932
  `),d.push(`|-------|------|-----|
933
- `);for(let j of S.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
933
+ `);for(let D of S.relevantFiles.slice(0,8))d.push(`| ${D.score} | ${D.path} | ${D.reason} |
934
934
  `);d.push(`
935
935
  `)}if(S.signatures.length>0){d.push(`**Code Signatures** (top files):
936
- `);for(let j of S.signatures)d.push(`\`\`\`typescript
937
- // ${j.path}
938
- ${j.content}
936
+ `);for(let D of S.signatures)d.push(`\`\`\`typescript
937
+ // ${D.path}
938
+ ${D.content}
939
939
  \`\`\`
940
940
  `);d.push(`
941
- `)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let j=S.recentFiles.slice(0,5).map(Ce=>`${Ce.path} (${Ce.lastChanged})`).join(", ");d.push(`${j}
941
+ `)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let D=S.recentFiles.slice(0,5).map(Ce=>`${Ce.path} (${Ce.lastChanged})`).join(", ");d.push(`${D}
942
942
 
943
943
  `)}}let G=t.files||[];if(G.length>0){let S=G.slice(0,5).join(", ");d.push(`
944
944
  ## FILES: ${G.length} available. Top: ${S}
@@ -948,7 +948,7 @@ ${j.content}
948
948
  ## PROJECT: ${k}
949
949
  Read files before modifying.
950
950
 
951
- `);let Q=this.filterRelevantState(n);if(Q&&(d.push(`
951
+ `);let Q=this.filterRelevantState(s);if(Q&&(d.push(`
952
952
  ## PRJCT STATE (Project Management Data)
953
953
  `),d.push(Q),d.push(`
954
954
  `)),u?.velocityContext&&(d.push(`
@@ -958,7 +958,7 @@ Read files before modifying.
958
958
 
959
959
  `)),o&&Object.keys(o).some(S=>o[S])){d.push(`
960
960
  ## PROJECT DEFAULTS (apply automatically)
961
- `);for(let[S,j]of Object.entries(o))j&&d.push(`- ${S}: ${j}
961
+ `);for(let[S,D]of Object.entries(o))D&&d.push(`- ${S}: ${D}
962
962
  `)}if(i?.plan&&i.plan.length>0){if(d.push(`
963
963
  ## THINK FIRST (reasoning from analysis)
964
964
  `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
@@ -977,51 +977,51 @@ Read files before modifying.
977
977
 
978
978
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
979
979
  `),d.push(`|---|--------|-------------|--------|
980
- `);for(let j of u.subtasks){let Ce=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} | ${Ce} |
981
- `)}let S=u.subtasks.find(j=>j.status==="in_progress");if(S&&(d.push(`
980
+ `);for(let D of u.subtasks){let Ce=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} | ${Ce} |
981
+ `)}let S=u.subtasks.find(D=>D.status==="in_progress");if(S&&(d.push(`
982
982
  **FOCUS ON SUBTASK #${S.order}**: ${S.description}
983
983
  `),d.push(`Agent: ${S.agent} | Domain: ${S.domain}
984
984
  `),S.dependsOn.length>0&&d.push(`Dependencies: ${S.dependsOn.join(", ")}
985
- `),S.handoff)){let j=S.handoff;d.push(`
985
+ `),S.handoff)){let D=S.handoff;d.push(`
986
986
  ### Previous Subtask Handoff
987
987
 
988
- `),d.push(`**From:** ${j.fromSubtask}
988
+ `),d.push(`**From:** ${D.fromSubtask}
989
989
 
990
990
  `),d.push(`**What was done:**
991
- `);for(let Ce of j.whatWasDone)d.push(`- ${Ce}
992
- `);if(j.filesChanged.length>0){d.push(`
991
+ `);for(let Ce of D.whatWasDone)d.push(`- ${Ce}
992
+ `);if(D.filesChanged.length>0){d.push(`
993
993
  **Files changed:**
994
- `);for(let Ce of j.filesChanged)d.push(`- \`${Ce.path}\` (${Ce.action})
994
+ `);for(let Ce of D.filesChanged)d.push(`- \`${Ce.path}\` (${Ce.action})
995
995
  `)}d.push(`
996
996
  **Context for this subtask:**
997
- ${j.outputForNextAgent}
997
+ ${D.outputForNextAgent}
998
998
  `)}d.push(`
999
- `)}let ne=this.getSchemaTypeForCommand(m);if(ne){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(al(),Dg)),j=S(ne);j&&d.push(`
1000
- ${j}
1001
- `)}if(p.checklist){let S=await this.loadChecklistRouting(),j=await this.loadChecklists();S&&Object.keys(j).length>0&&(d.push(`
999
+ `)}let se=this.getSchemaTypeForCommand(m);if(se){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(al(),jg)),D=S(se);D&&d.push(`
1000
+ ${D}
1001
+ `)}if(p.checklist){let S=await this.loadChecklistRouting(),D=await this.loadChecklists();S&&Object.keys(D).length>0&&(d.push(`
1002
1002
  ## QUALITY CHECKLISTS
1003
1003
  `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
1004
- `),d.push(`Available: ${Object.keys(j).join(", ")}
1004
+ `),d.push(`Available: ${Object.keys(D).join(", ")}
1005
1005
  `),d.push(`Path: templates/checklists/{name}.md
1006
1006
  `),d.push(`Use Read tool to load checklists you determine are relevant.
1007
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new oi({totalPrompt:t.stateData}),r=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=r.includes(i)?500:250,u=n.addSection(`### ${i}
1007
+ `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),s=new oi({totalPrompt:t.stateData}),r=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=r.includes(i)?500:250,u=s.addSection(`### ${i}
1008
1008
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
1009
1009
 
1010
- `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
1010
+ `):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
1011
1011
 
1012
- `),n.push(`Read the project context and provide your analysis.
1013
- `),n.push(`No predetermined patterns - decide based on what you find.
1012
+ `),s.push(`Read the project context and provide your analysis.
1013
+ `),s.push(`No predetermined patterns - decide based on what you find.
1014
1014
 
1015
- `),n.push(`## Project Context
1016
- `),n.push(`- Path: ${t.projectPath}
1017
- `),n.push(`- ID: ${t.projectId}
1015
+ `),s.push(`## Project Context
1016
+ `),s.push(`- Path: ${t.projectPath}
1017
+ `),s.push(`- ID: ${t.projectId}
1018
1018
 
1019
- `),n.join("")}extractPatternSummary(e){if(!e)return null;let t=[],n=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(n){let a=n[0].split(`
1019
+ `),s.join("")}extractPatternSummary(e){if(!e)return null;let t=[],s=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(s){let a=s[0].split(`
1020
1020
  `).filter(c=>c.includes(":")||c.startsWith("-")).slice(0,6).join(`
1021
1021
  `);a&&t.push(a)}let r=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(r){let a=r[0].substring(0,300);t.push(`
1022
1022
  Avoid:
1023
1023
  ${a}`)}let o=t.join(`
1024
- `);return Xn(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
1024
+ `);return Ks(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
1025
1025
  ## RULES (CRITICAL)
1026
1026
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
1027
1027
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -1038,7 +1038,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
1038
1038
  - Prefer structured output (JSON) over free text when applicable.
1039
1039
 
1040
1040
  EXECUTE: Follow flow. Use tools. Decide.
1041
- `}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}}}},JT=new wl,lf=JT});import df from"node:fs/promises";import Dt from"node:path";var qT,KT,kl,Sl,ai,bl=b(()=>{"use strict";ft();Se();U();qT=["task","done","ship","resume","bug","enrich"],KT=["init","sync","pause","next","dash","history","undo","redo"],kl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Dt.dirname(vt.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let r=await this.getProjectId(n),o=A.getGlobalProjectPath(r),a=await(Be(),lt(ct)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Dt.join(u,"templates")}catch{c=Dt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:r,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:Dt.join(c,"agentic","orchestrator.md"),agentRouting:Dt.join(c,"agentic","agent-routing.md"),taskFragmentation:Dt.join(c,"agentic","task-fragmentation.md"),commandTemplate:Dt.join(c,"commands",`${e}.md`),repoAnalysis:Dt.join(o,"analysis","repo-analysis.json"),agentsDir:Dt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:Dt.join(o,"storage","state.json")}}}requiresOrchestration(e){return qT.includes(e)?!0:!KT.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Dt.join(A.getGlobalProjectPath(t),"agents");return(await df.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=Dt.join(A.getGlobalProjectPath(t),"agents");return(await df.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
1041
+ `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let s=t.domains;return{hasFrontend:s.hasFrontend??!1,hasBackend:s.hasBackend??!1,hasDatabase:s.hasDatabase??!1,hasTesting:s.hasTesting??!1,hasDocker:s.hasDocker??!1}}}},zT=new wl,lf=zT});import df from"node:fs/promises";import jt from"node:path";var qT,KT,kl,Sl,ai,bl=b(()=>{"use strict";ft();Se();U();qT=["task","done","ship","resume","bug","enrich"],KT=["init","sync","pause","next","dash","history","undo","redo"],kl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return jt.dirname(vt.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,s){let r=await this.getProjectId(s),o=A.getGlobalProjectPath(r),a=await(Be(),lt(ct)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=jt.join(u,"templates")}catch{c=jt.join(__dirname,"..","..","templates")}return{projectPath:s,projectId:r,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:jt.join(c,"agentic","orchestrator.md"),agentRouting:jt.join(c,"agentic","agent-routing.md"),taskFragmentation:jt.join(c,"agentic","task-fragmentation.md"),commandTemplate:jt.join(c,"commands",`${e}.md`),repoAnalysis:jt.join(o,"analysis","repo-analysis.json"),agentsDir:jt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:jt.join(o,"storage","state.json")}}}requiresOrchestration(e){return qT.includes(e)?!0:!KT.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),s=jt.join(A.getGlobalProjectPath(t),"agents");return(await df.readdir(s)).some(o=>o.endsWith(".md"))}catch(t){return C(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),s=jt.join(A.getGlobalProjectPath(t),"agents");return(await df.readdir(s)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
1042
1042
  ## Agentic Execution Mode
1043
1043
 
1044
1044
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -1121,15 +1121,15 @@ When fragmenting tasks:
1121
1121
  2. Track progress: currentSubtaskIndex, subtaskProgress
1122
1122
  3. Each completed subtask generates a summary
1123
1123
  4. Pass summary to next agent for context handoff
1124
- `,context:e,requiresOrchestration:t}}},Sl=new kl,ai=Sl});function $r(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&XT.has(e.code))return!0;if(e.code&&mf.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 li(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&mf.has(e.code))}function pf(s,e,t){let n=vn.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(vn.delete(s),!1):!0:!1}function vl(s,e){let t=vn.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),vn.set(s,t)}function YT(s){vn.delete(s)}var XT,mf,vn,ci,gf,ui,Tl=b(()=>{"use strict";XT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),mf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l($r,"isTransientError");l(li,"isPermanentError");vn=new Map;l(pf,"isCircuitOpen");l(vl,"recordFailure");l(YT,"recordSuccess");ci=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(pf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return YT(t),o}catch(o){if(n=o,r++,li(o))throw vl(t,this.options.circuitBreakerThreshold),o;if(!($r(o)&&r<this.options.maxAttempts))throw vl(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw vl(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return $r(e)}isCircuitOpen(e){return pf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return vn.get(e)}resetCircuit(e){vn.delete(e)}resetAllCircuits(){vn.clear()}},gf=new ci({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),ui=new ci({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});import{exec as QT}from"node:child_process";import ff from"node:fs/promises";import{promisify as ZT}from"node:util";var eP,Qn,Qe,Pl=b(()=>{"use strict";Tl();eP=ZT(QT),Qn={tools:new Map,register(s,e){this.tools.set(s,e)},get(s){return this.tools.get(s)},isAllowed(s,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?s.startsWith(t.slice(0,-1)):s===t)},list(){return Array.from(this.tools.keys())}};Qn.register("Read",async s=>{try{return await ui.execute(async()=>await ff.readFile(s,"utf-8"),`read-${s}`)}catch(e){return li(e)||$r(e),null}});Qn.register("Write",async(s,e)=>{try{return await ui.execute(async()=>await ff.writeFile(s,e,"utf-8"),`write-${s}`),!0}catch(t){return li(t)||$r(t),!1}});Qn.register("Bash",async s=>{try{return await ui.execute(async()=>await eP(s),`bash-${s}`)}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());Qe=Qn});import Cl from"node:fs/promises";import tP from"node:os";import El from"node:path";function hf(){let s=process.env.PRJCT_CLI_HOME?.trim()||El.join(tP.homedir(),".prjct-cli");return El.join(s,".running")}async function nP(s){try{let e=hf(),t=El.dirname(e);await D(t)||await Cl.mkdir(t,{recursive:!0}),await Cl.writeFile(e,`/p:${s}`)}catch{}}async function sP(){try{let s=hf();await D(s)&&await Cl.unlink(s)}catch{}}var xl,rP,di,Al=b(()=>{"use strict";U();Wm();We();Jm();Km();zc();cg();lg();lr();dl();Ug();uf();bl();Wt();Pl();l(hf,"getRunningFilePath");l(nP,"signalStart");l(sP,"signalEnd");xl=class{static{l(this,"CommandExecutor")}async signalStart(e){await nP(e)}async signalEnd(){await sP()}async execute(e,t,n){await this.signalStart(e);let r=t.task||t.description||"";if(Rs.shouldEscalate(e,r)){let o=Rs.getEscalationInfo(e,r);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await pa.load(e),i=await dt.build(n,t),a=Ue.requiresPlanning(e),c=Ue.isDestructive(e),u=Ue.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ue.startPlanning(i.projectId,e,t):u&&(d=Ue.getActivePlan(i.projectId));let m=null;if(Xo.requiresVerification(e)){let S=await dt.loadStateForCommand(i,e);m=await Xo.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Xo.formatWarnings(m))}let p=null;if(Ko.requiresReasoning(e)){let S=await dt.loadStateForCommand(i,e);p=await Ko.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ko.formatPlan(p)))}let g=t.task||t.description||"",f=await ai.buildContext(e,g,n),k=ai.buildAgenticPrompt(f),w=null;if(ai.requiresOrchestration(e)&&g)try{w=await ni.execute(e,g,n),w.detectedDomains.length>0&&qo.orchestrate(w.detectedDomains);for(let S of w.agents){let j=S.domain||S.name.replace(".md","");qo.startAgent(S.name,j,`Loading ${j} specialist...`),qo.endAgent(!0)}if(w.requiresFragmentation&&w.subtasks){let S=w.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));zm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(S)}`)}let C={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},T=await dt.loadState(i),O=null,G=null;i.projectId&&(O={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}`)},G=await tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Q={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ne=await lf.build(o,C,T,null,O,null,G,Q,w);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Rs.recordSuccess(e,r),await this.signalEnd(),{success:!0,template:o,context:C,state:T,prompt:ne,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:C.agentsPath,agentRoutingPath:C.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:G,orchestratorContext:w,memory:{create:l(S=>tt.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,Ce)=>tt.autoRemember(i.projectId,S,j,Ce),"autoRemember"),search:l(S=>tt.searchMemories(i.projectId,S),"search"),findByTags:l(S=>tt.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>tt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>Ue.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>Ue.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>Ue.proposePlan(i.projectId,S),"propose"),approve:l(S=>Ue.approvePlan(i.projectId,S),"approve"),reject:l(S=>Ue.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>Ue.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ue.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ue.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>Ue.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>Ue.failStep(i.projectId,S),"failStep"),abort:l(S=>Ue.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>Ue.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rs.recordAttempt(e,r,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Rs.getEscalationInfo(e,r);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(!Qe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let r=Qe.get(e);if(!r)throw new Error(`Tool ${e} not found`);return await r(...t)}async executeSimple(e,t,n){try{let o=(await pa.load(e)).frontmatter["allowed-tools"]||[],i=await dt.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(r){return{success:!1,error:y(r)}}}},rP=new xl,di=rP});import pi from"node:fs/promises";import oP from"node:https";import iP from"node:os";import Rl from"node:path";import Nt from"chalk";var Dl,mi,jl=b(()=>{"use strict";U();We();Dl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(iP.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 pi.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"}},r=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)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await D(this.cacheFile))return JSON.parse(await pi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await D(this.cacheDir)||await pi.mkdir(this.cacheDir,{recursive:!0}),await pi.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 r=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
1124
+ `,context:e,requiresOrchestration:t}}},Sl=new kl,ai=Sl});function $r(n){if(!n||typeof n!="object")return!1;let e=n;if(e.code&&XT.has(e.code))return!0;if(e.code&&mf.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 li(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.code&&mf.has(e.code))}function pf(n,e,t){let s=bs.get(n);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(bs.delete(n),!1):!0:!1}function vl(n,e){let t=bs.get(n)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bs.set(n,t)}function YT(n){bs.delete(n)}var XT,mf,bs,ci,gf,ui,Tl=b(()=>{"use strict";XT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),mf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l($r,"isTransientError");l(li,"isPermanentError");bs=new Map;l(pf,"isCircuitOpen");l(vl,"recordFailure");l(YT,"recordSuccess");ci=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(pf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return YT(t),o}catch(o){if(s=o,r++,li(o))throw vl(t,this.options.circuitBreakerThreshold),o;if(!($r(o)&&r<this.options.maxAttempts))throw vl(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw vl(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return $r(e)}isCircuitOpen(e){return pf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bs.get(e)}resetCircuit(e){bs.delete(e)}resetAllCircuits(){bs.clear()}},gf=new ci({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),ui=new ci({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});import{exec as QT}from"node:child_process";import ff from"node:fs/promises";import{promisify as ZT}from"node:util";var eP,Ys,Qe,Pl=b(()=>{"use strict";Tl();eP=ZT(QT),Ys={tools:new Map,register(n,e){this.tools.set(n,e)},get(n){return this.tools.get(n)},isAllowed(n,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?n.startsWith(t.slice(0,-1)):n===t)},list(){return Array.from(this.tools.keys())}};Ys.register("Read",async n=>{try{return await ui.execute(async()=>await ff.readFile(n,"utf-8"),`read-${n}`)}catch(e){return li(e)||$r(e),null}});Ys.register("Write",async(n,e)=>{try{return await ui.execute(async()=>await ff.writeFile(n,e,"utf-8"),`write-${n}`),!0}catch(t){return li(t)||$r(t),!1}});Ys.register("Bash",async n=>{try{return await ui.execute(async()=>await eP(n),`bash-${n}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Ys.register("GetTimestamp",async()=>new Date().toISOString());Ys.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Ys.register("GetDateTime",async()=>new Date().toISOString());Qe=Ys});import Cl from"node:fs/promises";import tP from"node:os";import El from"node:path";function hf(){let n=process.env.PRJCT_CLI_HOME?.trim()||El.join(tP.homedir(),".prjct-cli");return El.join(n,".running")}async function sP(n){try{let e=hf(),t=El.dirname(e);await j(t)||await Cl.mkdir(t,{recursive:!0}),await Cl.writeFile(e,`/p:${n}`)}catch{}}async function nP(){try{let n=hf();await j(n)&&await Cl.unlink(n)}catch{}}var xl,rP,di,Al=b(()=>{"use strict";U();Wm();We();zm();Km();Jc();cg();lg();lr();dl();Ug();uf();bl();Wt();Pl();l(hf,"getRunningFilePath");l(sP,"signalStart");l(nP,"signalEnd");xl=class{static{l(this,"CommandExecutor")}async signalStart(e){await sP(e)}async signalEnd(){await nP()}async execute(e,t,s){await this.signalStart(e);let r=t.task||t.description||"";if(Rn.shouldEscalate(e,r)){let o=Rn.getEscalationInfo(e,r);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await pa.load(e),i=await dt.build(s,t),a=Ue.requiresPlanning(e),c=Ue.isDestructive(e),u=Ue.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ue.startPlanning(i.projectId,e,t):u&&(d=Ue.getActivePlan(i.projectId));let m=null;if(Xo.requiresVerification(e)){let S=await dt.loadStateForCommand(i,e);m=await Xo.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Xo.formatWarnings(m))}let p=null;if(Ko.requiresReasoning(e)){let S=await dt.loadStateForCommand(i,e);p=await Ko.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ko.formatPlan(p)))}let g=t.task||t.description||"",f=await ai.buildContext(e,g,s),k=ai.buildAgenticPrompt(f),w=null;if(ai.requiresOrchestration(e)&&g)try{w=await si.execute(e,g,s),w.detectedDomains.length>0&&qo.orchestrate(w.detectedDomains);for(let S of w.agents){let D=S.domain||S.name.replace(".md","");qo.startAgent(S.name,D,`Loading ${D} specialist...`),qo.endAgent(!0)}if(w.requiresFragmentation&&w.subtasks){let S=w.subtasks.map(D=>({id:D.id,domain:D.domain,description:D.description,status:D.status}));Jm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(S)}`)}let E={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},T=await dt.loadState(i),O=null,G=null;i.projectId&&(O={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}`)},G=await tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Q={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},se=await lf.build(o,E,T,null,O,null,G,Q,w);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Rn.recordSuccess(e,r),await this.signalEnd(),{success:!0,template:o,context:E,state:T,prompt:se,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:E.agentsPath,agentRoutingPath:E.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:G,orchestratorContext:w,memory:{create:l(S=>tt.createMemory(i.projectId,S),"create"),autoRemember:l((S,D,Ce)=>tt.autoRemember(i.projectId,S,D,Ce),"autoRemember"),search:l(S=>tt.searchMemories(i.projectId,S),"search"),findByTags:l(S=>tt.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>tt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>Ue.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>Ue.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>Ue.proposePlan(i.projectId,S),"propose"),approve:l(S=>Ue.approvePlan(i.projectId,S),"approve"),reject:l(S=>Ue.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>Ue.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ue.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ue.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>Ue.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>Ue.failStep(i.projectId,S),"failStep"),abort:l(S=>Ue.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>Ue.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rn.recordAttempt(e,r,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Rn.getEscalationInfo(e,r);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,s){if(!Qe.isAllowed(e,s))throw new Error(`Tool ${e} not allowed for this command`);let r=Qe.get(e);if(!r)throw new Error(`Tool ${e} not found`);return await r(...t)}async executeSimple(e,t,s){try{let o=(await pa.load(e)).frontmatter["allowed-tools"]||[],i=await dt.build(s);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(r){return{success:!1,error:y(r)}}}},rP=new xl,di=rP});import pi from"node:fs/promises";import oP from"node:https";import iP from"node:os";import Rl from"node:path";import Nt from"chalk";var jl,mi,Dl=b(()=>{"use strict";U();We();jl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(iP.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 pi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",y(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},r=oP.request(s,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)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let s=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=r[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 pi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await j(this.cacheDir)||await pi.mkdir(this.cacheDir,{recursive:!0}),await pi.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(),s=Date.now();if(t?.lastCheck&&s-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 r=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
1125
1125
  `+Nt.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")+`
1126
1126
  `+Nt.yellow("\u2502")+" "+Nt.bold("Update available!")+" "+Nt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Nt.yellow("\u2502")+`
1127
1127
  `+Nt.yellow("\u2502")+" "+Nt.yellow("\u2502")+`
1128
1128
  `+Nt.yellow("\u2502")+" Run: "+Nt.cyan("npm update -g prjct-cli")+" "+Nt.yellow("\u2502")+`
1129
1129
  `+Nt.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")+`
1130
- `}},mi=Dl});import gi from"node:fs/promises";import Il from"node:path";var $l,yf,wf=b(()=>{"use strict";ft();Se();U();$l=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=A.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await gi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let r=n.replace(".md",""),o=await gi.readFile(Il.join(this.agentsPath,n),"utf-8");t.push({name:r,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=Il.join(this.agentsPath,`${e}.md`),n=await gi.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 r=Il.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})}
1131
- `;await gi.appendFile(r,o)}catch(r){P(r)||console.error(`Agent usage log error: ${y(r)}`)}}},yf=$l});import kf from"node:path";async function lP(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await D(kf.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await D(kf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function uP(){return{...aP}}function dP(){return{...cP}}async function Sf(){return fi||(fi=await lP()?uP():dP(),fi)}var fi,aP,cP,bf=b(()=>{"use strict";We();fi=null,aP={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}},cP={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(lP,"isClaudeEnvironment");l(uP,"getClaudeAgent");l(dP,"getTerminalAgent");l(Sf,"detect")});import Mr from"node:fs/promises";var Ml,vf,Tf=b(()=>{"use strict";U();Ml=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 Mr.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 Mr.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 Mr.readdir(e)}async fileExists(e){try{return await Mr.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await Mr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1132
- ${e.map((t,n)=>`${n+1}. ${t}`).join(`
1130
+ `}},mi=jl});import gi from"node:fs/promises";import Il from"node:path";var $l,yf,wf=b(()=>{"use strict";ft();Se();U();$l=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=A.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await gi.readdir(this.agentsPath),t=[];for(let s of e)if(s.endsWith(".md")){let r=s.replace(".md",""),o=await gi.readFile(Il.join(this.agentsPath,s),"utf-8");t.push({name:r,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=Il.join(this.agentsPath,`${e}.md`),s=await gi.readFile(t,"utf-8");return{name:e,content:s}}catch(t){return C(t)||console.error(`Agent load error: ${y(t)}`),null}}async buildAssignmentContext(e,t){let s=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:s,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,s){try{let r=Il.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})}
1131
+ `;await gi.appendFile(r,o)}catch(r){C(r)||console.error(`Agent usage log error: ${y(r)}`)}}},yf=$l});import kf from"node:path";async function lP(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let n=process.cwd();if(await j(kf.join(n,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await j(kf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function uP(){return{...aP}}function dP(){return{...cP}}async function Sf(){return fi||(fi=await lP()?uP():dP(),fi)}var fi,aP,cP,bf=b(()=>{"use strict";We();fi=null,aP={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}},cP={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(lP,"isClaudeEnvironment");l(uP,"getClaudeAgent");l(dP,"getTerminalAgent");l(Sf,"detect")});import Mr from"node:fs/promises";var Ml,vf,Tf=b(()=>{"use strict";U();Ml=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let s={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`${s[t]||s.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 Mr.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(s){console.warn(`MCP writeFile failed, falling back to fs: ${y(s)}`)}await Mr.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 Mr.readdir(e)}async fileExists(e){try{return await Mr.access(e),!0}catch(t){if(C(t))return!1;throw t}}async createDirectory(e){await Mr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1132
+ ${e.map((t,s)=>`${s+1}. ${t}`).join(`
1133
1133
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
1134
1134
 
1135
1135
  \u{1F3AF} Current: ${e.currentTask||"None"}
@@ -1149,7 +1149,7 @@ ${e.recentFeatures||""}`}getHelpContent(e){let t={debugging:`\u{1F50D} 1. Isolat
1149
1149
  2. Optimize slowest parts
1150
1150
  3. Cache expensive operations`,default:`\u{1F4A1} 1. Break into smaller tasks
1151
1151
  2. Start with simplest part
1152
- 3. Ship it`},n=Object.keys(t).find(r=>e.toLowerCase().includes(r))||"default";return t[n]}suggestNextAction(e){return{taskCompleted:`What's next?
1152
+ 3. Ship it`},s=Object.keys(t).find(r=>e.toLowerCase().includes(r))||"default";return t[s]}suggestNextAction(e){return{taskCompleted:`What's next?
1153
1153
  \u2022 "start [task]" \u2192 Begin working
1154
1154
  \u2022 "ship feature" \u2192 Track & celebrate
1155
1155
  \u2022 "add idea" \u2192 Brainstorm
@@ -1173,7 +1173,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
1173
1173
 
1174
1174
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
1175
1175
 
1176
- 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}}},vf=Ml});var mP,Ol,Or,Pf=b(()=>{"use strict";wf();Yt();bf();Tf();Tl();mP=["claude"],Ol=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new yf}async initialize(){return this.agent?this.agent:await gf.execute(async()=>{if(this.agentInfo=await Sf(),!this.agentInfo?.isSupported)throw ur.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!mP.includes(e))throw ur.notSupported(this.agentInfo?.type??"unknown");return this.agent=new vf,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 r=await this.agentRouter.getAgentNames();return r.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:r},_agenticNote:`
1176
+ 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}}},vf=Ml});var mP,Ol,Or,Pf=b(()=>{"use strict";wf();Yt();bf();Tf();Tl();mP=["claude"],Ol=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new yf}async initialize(){return this.agent?this.agent:await gf.execute(async()=>{if(this.agentInfo=await Sf(),!this.agentInfo?.isSupported)throw ur.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!mP.includes(e))throw ur.notSupported(this.agentInfo?.type??"unknown");return this.agent=new vf,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,s){try{await this.agentRouter.initialize(t);let r=await this.agentRouter.getAgentNames();return r.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:r},_agenticNote:`
1177
1177
  AGENTIC EXECUTION:
1178
1178
  - Read: templates/agentic/orchestrator.md
1179
1179
  - Analyze task: "${e}"
@@ -1181,10 +1181,10 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
1181
1181
  - Claude decides which agent(s) to use
1182
1182
  - Always prefer specialists over generalist
1183
1183
  - Fragment complex tasks into subtasks
1184
- `}}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}},Or=new Ol});var _l,Is,Nl=b(()=>{"use strict";_l=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"}},Is=new _l});var Fl,Ze,Ll=b(()=>{"use strict";se();Fl=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();N.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1185
- VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let r=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return r.id}getWorkflow(e,t){let n=N.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 N.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),N.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 N.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}}},Ze=new Fl});function Ul(s){return{id:s.id,type:s.type,command:s.command,position:s.position,action:s.action,description:s.description,enabled:s.enabled===1,timeoutMs:s.timeout_ms,createdAt:s.created_at,sortOrder:s.sort_order}}var Hl,je,hi=b(()=>{"use strict";Ll();se();l(Ul,"rowToRule");Hl=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=x.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),r=t.sortOrder||(n?.m??-1)+1;return x.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
1186
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r),x.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(x.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,n){if(!x.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),x.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=x.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?Ul(n):null}getRulesForCommand(e,t){let n=Ze.getWorkflow(e,t);return!n||!n.enabled?[]:x.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Ul)}getAllRules(e){return x.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Ul)}resetRules(e){let t=x.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return x.run(e,"DELETE FROM workflow_rules"),t?.c??0}},je=new Hl});import rt from"node:path";async function gP(s,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await D(rt.join(s,"pnpm-lock.yaml"))?"pnpm":await D(rt.join(s,"yarn.lock"))?"yarn":await D(rt.join(s,"bun.lockb"))||await D(rt.join(s,"bun.lock"))?"bun":(await D(rt.join(s,"package-lock.json")),"npm")}function Cf(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function fP(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function $s(s,e){for(let r of hP)if(await D(rt.join(s,r)))return r;let n=(e??await Xt(s)).find(r=>r.endsWith(yP));if(n)return n}async function an(s){for(let e of wP)if(await D(rt.join(s,e)))return e}async function yi(s){let e=rt.join(s,"package.json"),t=await Ut(e,null);if(t){let a=await gP(s,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Cf(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Cf(a,"typecheck")}),c.test&&(u.test={tool:a,command:fP(a)}),u.versionFile=await $s(s),u.changelogFile=await an(s),u}if(await D(rt.join(s,"pytest.ini"))){let a=await $s(s),c=await an(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await et(rt.join(s,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await $s(s),c=await an(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await D(rt.join(s,"Cargo.toml"))){let a=await an(s);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await D(rt.join(s,"go.mod"))){let a=await $s(s),c=await an(s);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let r=await Xt(s);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await $s(s,r),c=await an(s);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await D(rt.join(s,"pom.xml"))){let a=await an(s);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await D(rt.join(s,"gradlew"))&&(await D(rt.join(s,"build.gradle"))||await D(rt.join(s,"build.gradle.kts")))){let a=await an(s);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await $s(s),i=await an(s);return{stack:"unknown",versionFile:o,changelogFile:i}}var hP,yP,wP,Gl=b(()=>{"use strict";We();l(gP,"detectPackageManager");l(Cf,"pmRun");l(fP,"pmTest");hP=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],yP=".csproj",wP=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l($s,"detectVersionFile");l(an,"detectChangelogFile");l(yi,"detectProjectCommands")});import*as ae from"@clack/prompts";import Zn from"chalk";var wi,Ef,_r,xf=b(()=>{"use strict";qn();wi=[{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."}],Ef=[{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"}],_r=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(){ae.intro(Zn.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 ae.outro(Zn.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=wi.findIndex(n=>n.value===this.detectedType),t=await ae.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:wi.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?wi[e].value:void 0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ae.multiselect({message:"Which AI agents do you use?",options:Ef.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ae.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);ae.note(e,"Detected stack");let t=await ae.confirm({message:"Is this stack correct?",initialValue:!0});if(ae.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ae.group({language:l(()=>ae.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ae.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 ae.group({verbosity:l(()=>ae.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(()=>ae.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=[`${Zn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Zn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Zn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Zn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Zn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1187
- `);ae.note(e,"Configuration Summary");let t=await ae.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ae.isCancel(t)||!t?(ae.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 r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"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"),r=[];try{await e.access(t.join(n.homedir(),".claude")),r.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),r.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),r.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),r.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),r.push("gemini")}catch{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),r.push("codex")}catch{try{await e.access(t.join(n.homedir(),".codex")),r.push("codex")}catch{}}return r.length>0?r:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let r=await e.readdir(this.projectPath);if(r.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",r.includes("bun.lockb")?n.packageManager="Bun":r.includes("pnpm-lock.yaml")?n.packageManager="pnpm":r.includes("yarn.lock")?n.packageManager="Yarn":r.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 r.includes("pyproject.toml")||r.includes("requirements.txt")?n.language="Python":r.includes("go.mod")?n.language="Go":r.includes("Cargo.toml")?n.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,ae.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return wi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Ef.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}}});var Af={};un(Af,{PlanningCommands:()=>ts});import es from"node:path";async function kP(){if(!Vl){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(Si(),Rf));Vl=new s}return Vl}var Vl,ts,ki=b(()=>{"use strict";So();Qt();Tt();Un();rn();hi();U();Es();xs();Gl();xf();ot();Vl=null;l(kP,"getAnalysisCommands");ts=class extends ve{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 _r(t).runNonInteractive());else if(a=await new _r(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await Ss(),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 A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
1184
+ `}}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}},Or=new Ol});var _l,In,Nl=b(()=>{"use strict";_l=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"}},In=new _l});var Fl,Ze,Ll=b(()=>{"use strict";ne();Fl=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();N.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1185
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let r=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return r.id}getWorkflow(e,t){let s=N.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return s?this.rowToWorkflow(s):null}getAllWorkflows(e,t=!1){let s=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 N.query(e,s).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,s){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return s.description!==void 0&&(i.push("description = ?"),a.push(s.description)),s.enabled!==void 0&&(i.push("enabled = ?"),a.push(s.enabled?1:0)),s.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(s.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),N.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let s=this.getWorkflow(e,t);if(!s)return!1;if(s.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return N.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"],s=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||s.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}}},Ze=new Fl});function Ul(n){return{id:n.id,type:n.type,command:n.command,position:n.position,action:n.action,description:n.description,enabled:n.enabled===1,timeoutMs:n.timeout_ms,createdAt:n.created_at,sortOrder:n.sort_order}}var Hl,De,hi=b(()=>{"use strict";Ll();ne();l(Ul,"rowToRule");Hl=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=x.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),r=t.sortOrder||(s?.m??-1)+1;return x.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
1186
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r),x.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(x.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!x.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(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let m=u;a.push(d.transform?d.transform(m):m)}return i.length===0||(a.push(t),x.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=x.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Ul(s):null}getRulesForCommand(e,t){let s=Ze.getWorkflow(e,t);return!s||!s.enabled?[]:x.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Ul)}getAllRules(e){return x.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Ul)}resetRules(e){let t=x.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return x.run(e,"DELETE FROM workflow_rules"),t?.c??0}},De=new Hl});import rt from"node:path";async function gP(n,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(rt.join(n,"pnpm-lock.yaml"))?"pnpm":await j(rt.join(n,"yarn.lock"))?"yarn":await j(rt.join(n,"bun.lockb"))||await j(rt.join(n,"bun.lock"))?"bun":(await j(rt.join(n,"package-lock.json")),"npm")}function Cf(n,e){return n==="yarn"?`yarn ${e}`:n==="pnpm"?`pnpm run ${e}`:n==="bun"?`bun run ${e}`:`npm run ${e}`}function fP(n){return n==="yarn"?"yarn test":n==="pnpm"?"pnpm test":n==="bun"?"bun test":"npm test"}async function $n(n,e){for(let r of hP)if(await j(rt.join(n,r)))return r;let s=(e??await Xt(n)).find(r=>r.endsWith(yP));if(s)return s}async function is(n){for(let e of wP)if(await j(rt.join(n,e)))return e}async function yi(n){let e=rt.join(n,"package.json"),t=await Ut(e,null);if(t){let a=await gP(n,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Cf(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Cf(a,"typecheck")}),c.test&&(u.test={tool:a,command:fP(a)}),u.versionFile=await $n(n),u.changelogFile=await is(n),u}if(await j(rt.join(n,"pytest.ini"))){let a=await $n(n),c=await is(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await et(rt.join(n,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await $n(n),c=await is(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await j(rt.join(n,"Cargo.toml"))){let a=await is(n);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await j(rt.join(n,"go.mod"))){let a=await $n(n),c=await is(n);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let r=await Xt(n);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await $n(n,r),c=await is(n);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await j(rt.join(n,"pom.xml"))){let a=await is(n);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await j(rt.join(n,"gradlew"))&&(await j(rt.join(n,"build.gradle"))||await j(rt.join(n,"build.gradle.kts")))){let a=await is(n);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await $n(n),i=await is(n);return{stack:"unknown",versionFile:o,changelogFile:i}}var hP,yP,wP,Gl=b(()=>{"use strict";We();l(gP,"detectPackageManager");l(Cf,"pmRun");l(fP,"pmTest");hP=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],yP=".csproj",wP=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l($n,"detectVersionFile");l(is,"detectChangelogFile");l(yi,"detectProjectCommands")});import*as ae from"@clack/prompts";import Qs from"chalk";var wi,Ef,_r,xf=b(()=>{"use strict";zs();wi=[{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."}],Ef=[{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"}],_r=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(){ae.intro(Qs.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 ae.outro(Qs.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=wi.findIndex(s=>s.value===this.detectedType),t=await ae.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:wi.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?wi[e].value:void 0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ae.multiselect({message:"Which AI agents do you use?",options:Ef.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ae.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);ae.note(e,"Detected stack");let t=await ae.confirm({message:"Is this stack correct?",initialValue:!0});if(ae.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ae.group({language:l(()=>ae.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ae.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:s.language||this.detectedStack.language,framework:s.framework||void 0}}return!0}async stepPreferences(){let e=await ae.group({verbosity:l(()=>ae.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(()=>ae.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=[`${Qs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Qs.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${Qs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Qs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Qs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1187
+ `);ae.note(e,"Configuration Summary");let t=await ae.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ae.isCancel(t)||!t?(ae.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"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 s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),s=await import("node:os"),r=[];try{await e.access(t.join(s.homedir(),".claude")),r.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),r.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),r.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),r.push("copilot")}catch{}try{await e.access(t.join(s.homedir(),".gemini")),r.push("gemini")}catch{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),r.push("codex")}catch{try{await e.access(t.join(s.homedir(),".codex")),r.push("codex")}catch{}}return r.length>0?r:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let r=await e.readdir(this.projectPath);if(r.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};s.language=c.typescript?"TypeScript":"JavaScript",c.next?s.framework="Next.js":c.nuxt?s.framework="Nuxt":c.react?s.framework="React":c.vue?s.framework="Vue":c["@angular/core"]?s.framework="Angular":c.express?s.framework="Express":c.hono?s.framework="Hono":c.fastify?s.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(s.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",r.includes("bun.lockb")?s.packageManager="Bun":r.includes("pnpm-lock.yaml")?s.packageManager="pnpm":r.includes("yarn.lock")?s.packageManager="Yarn":r.includes("package-lock.json")&&(s.packageManager="npm"),(c.prisma||c["@prisma/client"])&&s.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&s.technologies.push("Drizzle"),c.tailwindcss&&s.technologies.push("Tailwind CSS"),c.zod&&s.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&s.technologies.push("tRPC")}else r.includes("pyproject.toml")||r.includes("requirements.txt")?s.language="Python":r.includes("go.mod")?s.language="Go":r.includes("Cargo.toml")?s.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,ae.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return wi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Ef.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}}});var Af={};ls(Af,{PlanningCommands:()=>en});import Zs from"node:path";async function kP(){if(!Vl){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(Si(),Rf));Vl=new n}return Vl}var Vl,en,ki=b(()=>{"use strict";So();Qt();Tt();Ls();rs();hi();U();En();xn();Gl();xf();ot();Vl=null;l(kP,"getAnalysisCommands");en=class extends ve{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let s={};if(typeof e=="string"||e===null?s={idea:e}:s=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=s.yes||!o||process.env.CI==="true",a=null;if(i)o&&s.yes&&(a=await new _r(t).runNonInteractive());else if(a=await new _r(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await Sn(),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 A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
1188
1188
 
1189
1189
  No current task. Use \`/p:now\` to set focus.
1190
1190
  `,"core/next.md":`# NEXT
@@ -1204,7 +1204,7 @@ No current task. Use \`/p:now\` to set focus.
1204
1204
  `,"planning/roadmap.md":`# ROADMAP
1205
1205
 
1206
1206
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
1207
- `,"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[C,T]of Object.entries(g))await Qe.get("Write")(es.join(p,C),T);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let C=await kP();if((await C.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await C.sync(t,{aiTools:a.agents}):await C.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let w=n.idea;if(f&&!k){if(!w)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 C=es.join(p,"planning","architect-session.md"),T=`# Architect Session
1207
+ `,"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[E,T]of Object.entries(g))await Qe.get("Write")(Zs.join(p,E),T);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let E=await kP();if((await E.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await E.sync(t,{aiTools:a.agents}):await E.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let w=s.idea;if(f&&!k){if(!w)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 E=Zs.join(p,"planning","architect-session.md"),T=`# Architect Session
1208
1208
 
1209
1209
  ## Idea
1210
1210
  ${w}
@@ -1213,8 +1213,8 @@ ${w}
1213
1213
  Initialized - awaiting stack recommendation
1214
1214
 
1215
1215
  Generated: ${new Date().toLocaleString()}
1216
- `;return await Qe.get("Write")(C,T),await Ae.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:w,wizard:a}}return await Ae.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 r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await dt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=he(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Oe.addTasks(r,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 r=await this.ensureProjectInit(t);if(!r.success)return r;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 dt.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 Oe.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(L(te("Bug Reported",e),ut({Severity:a,Priority:m,Agent:u}),le([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),kt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(r){return n.md||h.fail(y(r)),{success:!1,error:y(r)}}}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
1217
- `);let r=await this.getGlobalProjectPath(t),o=es.join(r,"planning","architect-session.md"),i;try{i=await Ee.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1216
+ `;return await Qe.get("Write")(E,T),await Ae.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:w,wizard:a}}return await Ae.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}_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(s=>{switch(s){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 s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await dt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=he(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Oe.addTasks(r,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:J.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(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async bug(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return s.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return s.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||h.spin("tracking bug...");let i=await dt.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 Oe.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:J.getTimestamp()}),s.md?console.log(L(te("Bug Reported",e),ut({Severity:a,Priority:m,Agent:u}),le([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),kt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(r){return s.md||h.fail(y(r)),{success:!1,error:y(r)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let s=await this.ensureProjectInit(t);if(!s.success)return s;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
1217
+ `);let r=await this.getGlobalProjectPath(t),o=Zs.join(r,"planning","architect-session.md"),i;try{i=await Ee.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1218
1218
 
1219
1219
  Create a plan first:
1220
1220
  1. Run /p:init in an empty directory
@@ -1235,7 +1235,7 @@ The architect plan is ready. Claude will now:
1235
1235
  4. Create starter files with boilerplate
1236
1236
  `),console.log(`
1237
1237
  \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.
1238
- `),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 r=await this.ensureProjectInit(t);if(!r.success)return r;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=A.getGlobalProjectPath(o),u=es.join(c,"planning","architect-session.md"),d=`# Architect Session
1238
+ `),await this.logToMemory(t,"architect_executed",{timestamp:J.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async idea(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return s.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return s.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")){s.md||h.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=Zs.join(c,"planning","architect-session.md"),d=`# Architect Session
1239
1239
 
1240
1240
  ## Idea
1241
1241
  ${e}
@@ -1250,14 +1250,14 @@ Initialized - awaiting architecture design
1250
1250
  4. Generate roadmap
1251
1251
 
1252
1252
  Generated: ${new Date().toLocaleString()}
1253
- `;return await Qe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(L(te("Idea Captured",e),ut({Mode:"architecture"}),le([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
1253
+ `;return await Qe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:J.getTimestamp()}),s.md?console.log(L(te("Idea Captured",e),ut({Mode:"architecture"}),le([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
1254
1254
  \u{1F4A1} Use /p:architect execute to continue planning
1255
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await nt.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(L(te("Idea Captured",e),ut({Mode:"capture"}),le([{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)}`),kt("idea")),{success:!0,mode:"capture",idea:e}}catch(r){return n.md||h.fail(y(r)),{success:!1,error:y(r)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=A.getGlobalProjectPath(r),m=es.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
1255
+ `)),{success:!0,mode:"architecture",idea:e}}else return s.md||h.spin("capturing idea..."),await st.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:J.getTimestamp()}),s.md?console.log(L(te("Idea Captured",e),ut({Mode:"capture"}),le([{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)}`),kt("idea")),{success:!0,mode:"capture",idea:e}}catch(r){return s.md||h.fail(y(r)),{success:!1,error:y(r)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=A.getGlobalProjectPath(r),m=Zs.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(`
1256
1256
  \u{1F4A1} Create one with /p:spec "feature name"
1257
1257
  `),{success:!0,specs:[]}):(console.log(`
1258
1258
  \u{1F4CB} SPECIFICATIONS
1259
- `),console.log("\u2550".repeat(50)),f.forEach((k,w)=>{let C=k.replace(".md","").replace(/-/g," ");console.log(` ${w+1}. ${C}`)}),console.log(`${"\u2550".repeat(50)}
1260
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=A.getGlobalProjectPath(r),i=es.join(o,"planning","specs");await Ee.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=es.join(i,`${a}.md`),u=`# Specification: ${e}
1259
+ `),console.log("\u2550".repeat(50)),f.forEach((k,w)=>{let E=k.replace(".md","").replace(/-/g," ");console.log(` ${w+1}. ${E}`)}),console.log(`${"\u2550".repeat(50)}
1260
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=A.getGlobalProjectPath(r),i=Zs.join(o,"planning","specs");await Ee.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Zs.join(i,`${a}.md`),u=`# Specification: ${e}
1261
1261
 
1262
1262
  ## Overview
1263
1263
  [Brief description of the feature]
@@ -1287,33 +1287,33 @@ Generated: ${new Date().toLocaleString()}
1287
1287
  ---
1288
1288
  Created: ${new Date().toLocaleString()}
1289
1289
  Status: Draft
1290
- `;return await Qe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:z.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
1290
+ `;return await Qe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:J.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
1291
1291
  \u{1F4DD} Edit: ~/.prjct-cli/projects/${r}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
1292
- `),{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 yi(t),r=0;je.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:r++,createdAt:new Date().toISOString()}),n.lint&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:r++,createdAt:new Date().toISOString()}),n.test&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:r++,createdAt:new Date().toISOString()})}}});var Wl,ns,Df=b(()=>{"use strict";Yt();So();ft();Se();U();We();qn();Wl=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(()=>(ki(),Af)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw ro.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await A.ensureProjectStructure(t),A.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Ss();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 Xt(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="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 Xt(e)).some(r=>t.includes(r))}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)}},ns=new Wl});var ve,ot=b(()=>{"use strict";Al();zc();Pl();ft();Se();jl();Pf();Nl();Gn();Df();fe();We();qn();ve=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new mi,this.updateNotificationShown=!1,this.commandExecutor=di}get agent(){return Or.getAgent()}get agentInfo(){return Or.getInfo()}get currentAuthor(){return ns.getCurrentAuthor()}async initializeAgent(){return Or.initialize()}async ensureProjectInit(e){return ns.ensureInit(e)}async ensureAuthor(){return ns.ensureAuthor()}async getGlobalProjectPath(e){return ns.getGlobalPath(e)}async logToMemory(e,t,n){let r=await this.ensureAuthor();return yt.log(e,t,n,r.name)}async _detectEmptyDirectory(e){return ns.isEmptyDirectory(e)}async _detectExistingCode(e){return ns.hasExistingCode(e)}_breakdownFeatureTasks(e){return Is.breakdownFeature(e)}_detectBugSeverity(e){return Is.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Or.assignForTask(e,t,n)}}});import SP from"node:path";async function Bl(s,e){let t=Date.now()-e,n=s.contextFiles.length+(s.aiTools?.filter(p=>p.success).length||0),r=s.agents.length,o=s.agents.filter(p=>p.type==="domain").length;await Ae.installGlobalConfig(),h.done(`Synced ${s.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=s.syncMetrics?.compressionRate?Math.round(s.syncMetrics.compressionRate*100):0,a=s.stats.frameworks.length>0?` (${s.stats.frameworks[0]})`:"",c=[`${s.stats.fileCount} files \u2192 ${n} context | ${r} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${s.stats.ecosystem}${a} | Branch: ${s.git.branch}`];h.box("Sync Summary",c.join(`
1293
- `));let u=[];s.contextFiles.length>0&&u.push(`${s.contextFiles.length} context files`);let d=s.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),r>0){let p=o>0?`${r} agents (${o} domain)`:`${r} agents`;u.push(p)}if(s.skills.length>0){let p=s.skills.length===1?"skill":"skills";u.push(`${s.skills.length} ${p}`)}let m=s.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(s.context7&&u.push(`Context7: ${s.context7.verified?"verified":`not ready${s.context7.message?` (${s.context7.message})`:""}`}`),s.analysisSummary&&u.push(`Analysis: ${s.analysisSummary.patterns} patterns | ${s.analysisSummary.antiPatterns} anti-patterns (${s.analysisSummary.criticalAntiPatterns} critical)`),h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),s.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),s.verification){let p=s.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 kt("sync"),{success:!0,data:s,metrics:{elapsed:t,contextFilesCount:n,agentCount:r,fileCount:s.stats.fileCount}}}async function jf(s){try{let e=await yt.getRecentEvents(s,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=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];r=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:r,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Nr(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function zl(s){return s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(1)}s`}function If(s){if(s.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=s.map(r=>r.tokensSaved),n=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/n*(e.length-1)),e.length-1);return e[o]}).join("")}function $f(s,e,t,n,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),r){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.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 | ${Nr(s.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(s.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${uo(s.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${s.syncCount} |`),i.push(`| Avg time | ${zl(s.avgSyncDuration)} |`),i.push(""),s.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=s.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of s.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: ${Nr(s.last30DaysTokens)}`),s.trend!==0){let a=s.trend>0?"+":"";i.push(`- Trend: ${a}${s.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
1294
- `)}function Mf(s,e){let t=[];t.push(`# Repository Analysis
1292
+ `),{success:!0,feature:e,specPath:c}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _seedShipWorkflow(e,t){let s=await yi(t),r=0;De.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:r++,createdAt:new Date().toISOString()}),s.lint&&De.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:r++,createdAt:new Date().toISOString()}),s.test&&De.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:r++,createdAt:new Date().toISOString()})}}});var Wl,tn,jf=b(()=>{"use strict";Yt();So();ft();Se();U();We();zs();Wl=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(()=>(ki(),Af)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw ro.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await A.ensureProjectStructure(t),A.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Sn();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 Xt(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="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 Xt(e)).some(r=>t.includes(r))}catch(t){return C(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},tn=new Wl});var ve,ot=b(()=>{"use strict";Al();Jc();Pl();ft();Se();Dl();Pf();Nl();Hs();jf();fe();We();zs();ve=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new mi,this.updateNotificationShown=!1,this.commandExecutor=di}get agent(){return Or.getAgent()}get agentInfo(){return Or.getInfo()}get currentAuthor(){return tn.getCurrentAuthor()}async initializeAgent(){return Or.initialize()}async ensureProjectInit(e){return tn.ensureInit(e)}async ensureAuthor(){return tn.ensureAuthor()}async getGlobalProjectPath(e){return tn.getGlobalPath(e)}async logToMemory(e,t,s){let r=await this.ensureAuthor();return yt.log(e,t,s,r.name)}async _detectEmptyDirectory(e){return tn.isEmptyDirectory(e)}async _detectExistingCode(e){return tn.hasExistingCode(e)}_breakdownFeatureTasks(e){return In.breakdownFeature(e)}_detectBugSeverity(e){return In.detectBugSeverity(e)}async _assignAgentForTask(e,t,s){return Or.assignForTask(e,t,s)}}});import SP from"node:path";async function Bl(n,e){let t=Date.now()-e,s=n.contextFiles.length+(n.aiTools?.filter(p=>p.success).length||0),r=n.agents.length,o=n.agents.filter(p=>p.type==="domain").length;await Ae.installGlobalConfig(),h.done(`Synced ${n.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=n.syncMetrics?.compressionRate?Math.round(n.syncMetrics.compressionRate*100):0,a=n.stats.frameworks.length>0?` (${n.stats.frameworks[0]})`:"",c=[`${n.stats.fileCount} files \u2192 ${s} context | ${r} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${n.stats.ecosystem}${a} | Branch: ${n.git.branch}`];h.box("Sync Summary",c.join(`
1293
+ `));let u=[];n.contextFiles.length>0&&u.push(`${n.contextFiles.length} context files`);let d=n.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),r>0){let p=o>0?`${r} agents (${o} domain)`:`${r} agents`;u.push(p)}if(n.skills.length>0){let p=n.skills.length===1?"skill":"skills";u.push(`${n.skills.length} ${p}`)}let m=n.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(n.context7&&u.push(`Context7: ${n.context7.verified?"verified":`not ready${n.context7.message?` (${n.context7.message})`:""}`}`),n.analysisSummary&&u.push(`Analysis: ${n.analysisSummary.patterns} patterns | ${n.analysisSummary.antiPatterns} anti-patterns (${n.analysisSummary.criticalAntiPatterns} critical)`),h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),n.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),n.verification){let p=n.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 kt("sync"),{success:!0,data:n,metrics:{elapsed:t,contextFilesCount:s,agentCount:r,fileCount:n.stats.fileCount}}}async function Df(n){try{let e=await yt.getRecentEvents(n,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=null;if(s.length>=2){let u=s.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];r=J.formatDuration(d)}}let o=s.filter(u=>u.action==="task_completed").length,i=s.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of s)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:r,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Nr(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:n.toLocaleString()}function Jl(n){return n<1e3?`${Math.round(n)}ms`:`${(n/1e3).toFixed(1)}s`}function If(n){if(n.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=n.map(r=>r.tokensSaved),s=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/s*(e.length-1)),e.length-1);return e[o]}).join("")}function $f(n,e,t,s,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),r){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.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 | ${Nr(n.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(n.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${uo(n.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${n.syncCount} |`),i.push(`| Avg time | ${Jl(n.avgSyncDuration)} |`),i.push(""),n.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=n.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of n.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: ${Nr(n.last30DaysTokens)}`),n.trend!==0){let a=n.trend>0?"+":"";i.push(`- Trend: ${a}${n.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
1294
+ `)}function Mf(n,e){let t=[];t.push(`# Repository Analysis
1295
1295
  `),t.push(`Generated: ${new Date().toLocaleString()}
1296
- `);let n=SP.basename(e);if(t.push(`## Project: ${n}
1296
+ `);let s=SP.basename(e);if(t.push(`## Project: ${s}
1297
1297
  `),t.push(`## Stack Detected
1298
- `),s.packageJson){let i=s.packageJson;if(t.push(`### JavaScript/TypeScript
1299
- `),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)`:""}`)}s.hasNextConfig&&t.push("- **Framework**: Next.js detected"),s.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),s.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}s.cargoToml&&(t.push(`### Rust
1298
+ `),n.packageJson){let i=n.packageJson;if(t.push(`### JavaScript/TypeScript
1299
+ `),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)`:""}`)}n.hasNextConfig&&t.push("- **Framework**: Next.js detected"),n.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),n.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}n.cargoToml&&(t.push(`### Rust
1300
1300
  `),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
1301
- `)),s.goMod&&(t.push(`### Go
1301
+ `)),n.goMod&&(t.push(`### Go
1302
1302
  `),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
1303
- `)),s.requirements&&(t.push(`### Python
1303
+ `)),n.requirements&&(t.push(`### Python
1304
1304
  `),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
1305
- `));let r=s.directories;t.push(`## Structure
1306
- `),t.push(`- **Total Files**: ${s.fileCount}`),t.push(`- **Directories**: ${r?.slice(0,15).join(", ")||"none"}${(r?.length||0)>15?` (+${(r?.length||0)-15} more)`:""}`),s.hasDockerfile&&t.push("- **Docker**: Detected"),s.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),s.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=s.gitStats;return t.push(`## Git Statistics
1307
- `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),s.gitLog&&(t.push(`## Recent Activity
1308
- `),s.gitLog.split(`
1305
+ `));let r=n.directories;t.push(`## Structure
1306
+ `),t.push(`- **Total Files**: ${n.fileCount}`),t.push(`- **Directories**: ${r?.slice(0,15).join(", ")||"none"}${(r?.length||0)>15?` (+${(r?.length||0)-15} more)`:""}`),n.hasDockerfile&&t.push("- **Docker**: Detected"),n.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),n.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=n.gitStats;return t.push(`## Git Statistics
1307
+ `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),n.gitLog&&(t.push(`## Recent Activity
1308
+ `),n.gitLog.split(`
1309
1309
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1310
1310
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1311
1311
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1312
- `)}var Of=b(()=>{"use strict";Qt();po();Gn();xs();qn();ot();l(Bl,"showSyncResult");l(jf,"getSessionActivity");l(Nr,"formatTokens");l(zl,"formatDuration");l(If,"generateSparkline");l($f,"generateStatsMarkdown");l(Mf,"generateAnalysisSummary")});var Rf={};un(Rf,{AnalysisCommands:()=>rs});import Jl from"node:fs/promises";import _f from"node:path";import*as ss from"@clack/prompts";var rs,Si=b(()=>{"use strict";lr();Ju();Qt();po();fa();Ad();Md();Ma();Fc();ys();se();va();ic();U();Es();xs();qn();Of();ot();rs=class extends ve{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1313
- `),ze.init(t);let n=await dt.build(t,e),r={packageJson:await ze.readPackageJson(),cargoToml:await ze.readCargoToml(),goMod:await ze.readGoMod(),requirements:await ze.readRequirements(),directories:await ze.listDirectories(),fileCount:await ze.countFiles(),gitStats:await ze.getGitStats(),gitLog:await ze.getGitLog(20),hasDockerfile:await ze.fileExists("Dockerfile"),hasDockerCompose:await ze.fileExists("docker-compose.yml"),hasReadme:await ze.fileExists("README.md"),hasTsconfig:await ze.fileExists("tsconfig.json"),hasViteConfig:await ze.fileExists("vite.config.ts")||await ze.fileExists("vite.config.js"),hasNextConfig:await ze.fileExists("next.config.js")||await ze.fileExists("next.config.mjs")},o=Mf(r,t),i=await $.getProjectId(t),a=n.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Qe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:z.getTimestamp(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits});let u=await(Be(),lt(ct)).getActiveProvider(),d=await Ae.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1312
+ `)}var Of=b(()=>{"use strict";Qt();po();Hs();xn();zs();ot();l(Bl,"showSyncResult");l(Df,"getSessionActivity");l(Nr,"formatTokens");l(Jl,"formatDuration");l(If,"generateSparkline");l($f,"generateStatsMarkdown");l(Mf,"generateAnalysisSummary")});var Rf={};ls(Rf,{AnalysisCommands:()=>nn});import zl from"node:fs/promises";import _f from"node:path";import*as sn from"@clack/prompts";var nn,Si=b(()=>{"use strict";lr();zu();Qt();po();fa();Ad();Md();Ma();Fc();yn();ne();va();ic();U();En();xn();zs();Of();ot();nn=class extends ve{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1313
+ `),Je.init(t);let s=await dt.build(t,e),r={packageJson:await Je.readPackageJson(),cargoToml:await Je.readCargoToml(),goMod:await Je.readGoMod(),requirements:await Je.readRequirements(),directories:await Je.listDirectories(),fileCount:await Je.countFiles(),gitStats:await Je.getGitStats(),gitLog:await Je.getGitLog(20),hasDockerfile:await Je.fileExists("Dockerfile"),hasDockerCompose:await Je.fileExists("docker-compose.yml"),hasReadme:await Je.fileExists("README.md"),hasTsconfig:await Je.fileExists("tsconfig.json"),hasViteConfig:await Je.fileExists("vite.config.ts")||await Je.fileExists("vite.config.js"),hasNextConfig:await Je.fileExists("next.config.js")||await Je.fileExists("next.config.mjs")},o=Mf(r,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Qe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:J.getTimestamp(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits});let u=await(Be(),lt(ct)).getActiveProvider(),d=await Ae.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1314
1314
  `),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1315
- `),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:r}}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 r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(r),i=Date.now();if(t.package){let m=await A.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 Bn.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(L(we(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=_f.join(o,"context","CLAUDE.md"),c=null;try{c=await Jl.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 Bn.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(L("## \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 Jl.readFile(a,"utf-8")}catch{p=""}let g=jd(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(L(we("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 Jl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let w=[];for(let T of g.added)w.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)w.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)w.push(`Removed: ${T.name} (${T.lineCount} lines)`);let C=L("## \u26A1 Sync Preview",w.length>0?te("Changes",Re(w)):"No section changes.",ut({"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(C),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let w={added:g.added.map(C=>({name:C.name,lineCount:C.lineCount})),modified:g.modified.map(C=>({name:C.name,lineCount:C.lineCount})),removed:g.removed.map(C=>({name:C.name,lineCount:C.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:w,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(Id(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await ss.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(ss.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(`
1316
- ${$d(g)}`);let w=await ss.confirm({message:"Apply these changes?",initialValue:!0});if(ss.isCancel(w)||!w)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),Bl(m,i)}t.md||h.spin("Syncing project...");let d=await Bn.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(L("## \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(T=>T.success).length||0),g=d.agents.length,f=null;try{let T=await qe.diff(r);T?.hasChanges&&(f=ga(T))}catch{}let k=`## LLM Analysis (hybrid pipeline)
1315
+ `),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:r}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(r),i=Date.now();if(t.package){let m=await A.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 Ws.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(L(we(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=_f.join(o,"context","CLAUDE.md"),c=null;try{c=await zl.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 Ws.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(L("## \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 zl.readFile(a,"utf-8")}catch{p=""}let g=Dd(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(L(we("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 zl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let w=[];for(let T of g.added)w.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)w.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)w.push(`Removed: ${T.name} (${T.lineCount} lines)`);let E=L("## \u26A1 Sync Preview",w.length>0?te("Changes",Re(w)):"No section changes.",ut({"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(E),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let w={added:g.added.map(E=>({name:E.name,lineCount:E.lineCount})),modified:g.modified.map(E=>({name:E.name,lineCount:E.lineCount})),removed:g.removed.map(E=>({name:E.name,lineCount:E.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:w,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(Id(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await sn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(sn.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(`
1316
+ ${$d(g)}`);let w=await sn.confirm({message:"Apply these changes?",initialValue:!0});if(sn.isCancel(w)||!w)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),Bl(m,i)}t.md||h.spin("Syncing project...");let d=await Ws.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(L("## \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(T=>T.success).length||0),g=d.agents.length,f=null;try{let T=await qe.diff(r);T?.hasChanges&&(f=ga(T))}catch{}let k=`## LLM Analysis (hybrid pipeline)
1317
1317
 
1318
1318
  After sync, run the analysis payload builder:
1319
1319
  \`\`\`bash
@@ -1347,9 +1347,9 @@ Otherwise, analyze the JSON payload and produce a structured \`LLMAnalysis\` JSO
1347
1347
  Save the analysis:
1348
1348
  \`\`\`bash
1349
1349
  prjct analysis-save-llm '<your JSON here>' --md
1350
- \`\`\``,w=Jo("sync"),C=L(we("Sync Complete"),ut({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Fm("Uncommitted changes detected"):null,k,le(w.map(T=>({label:T.desc,command:T.cmd}))));return console.log(C),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Bl(d,i)}catch(n){return t.md?console.log(L("## \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 r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Bn.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&&ws.isCurrent(r,i))return t.md?console.log(L(we("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 xd(r,e,o.git,o.stats);return t.md?console.log(L("## \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 r=await this.ensureProjectInit(t);if(!r.success)return r;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."}:(ws.save(o,i),n.md?console.log(L(we("LLM Analysis Saved"),ut({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(r){return{success:!1,error:y(r)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=ws.getActive(r);if(!o)return t.md?console.log(L("## 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=[we(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(te("Architecture Insights",Re(o.architecture.insights))),o.patterns.length>0&&i.push(te("Patterns",Re(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(te("Anti-Patterns",Re(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(te("Tech Debt",Re(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(te("Conventions",Re(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...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 r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Ts.getSummary(r),i=await Ts.getDailyStats(r,30),a=await jf(r),c=await tt.getPatternsSummary(r);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=x.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await Ts.read(r),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: ${Nr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${uo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${zl(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=If(i);if(console.log(` ${p} ${Nr(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=$f(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 r=await $.getProjectId(e);if(!r)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=yo(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await qe.getStatus(r);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=_f.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=L(`## \u26A1 Status: ${u}`,ut({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?te("Analysis",Re(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 r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async diff(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.diff(r);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(L("## 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(L(ga(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(sd(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 r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Diff Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.seal(r);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 r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async rollback(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.rollback(r);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(L(we("Analysis Rolled Back"),ut({"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(L("## \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 r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Rollback Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}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 r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await qe.verify(r);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 r=y(n);return h.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)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=x.getDoc(r,"project")?.repoPath||e}catch{}let i=await qe.semanticVerify(r,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 r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}}});function Gs(s){return Buffer.from(`${JSON.stringify(s)}
1351
- `)}var Ne,Yf,Qf,du=b(()=>{"use strict";Ne={runDir:l(()=>`${process.env.HOME||vt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ne.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ne.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ne.runDir()}/daemon.log`,"log")},Yf=1800*1e3,Qf=1024*1024;l(Gs,"encodeMessage")});var th={};un(th,{executeViaDaemon:()=>WP,forceKillDaemon:()=>zP,getDaemonStatus:()=>VP,isDaemonRunning:()=>Zf,sendRequest:()=>Ur,spawnDaemon:()=>eh,stopDaemon:()=>BP});import Di from"node:crypto";import Xe from"node:fs";import{connect as GP}from"node:net";async function Zf(){let s=Ne.socket();if(!Xe.existsSync(s))return!1;try{return(await Ur({id:Di.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Xe.unlinkSync(s)}catch{}return!1}}async function VP(){let s=Ne.socket(),e=Ne.pid();if(!Xe.existsSync(s))return{running:!1};try{let t=await Ur({id:Di.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Xe.existsSync(e)?{running:!1,pid:parseInt(Xe.readFileSync(e,"utf-8").trim(),10),socketPath:s}:{running:!1}}function Ur(s){return new Promise((e,t)=>{let n=Ne.socket(),r=GP(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(Gs(s))}),r.on("data",c=>{o+=c.toString();let u=o.indexOf(`
1352
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function WP(s,e,t,n,r,o=!0){let i=Ne.socket();if(!Xe.existsSync(i))return o&&eh().catch(()=>{}),null;try{return await Ur({id:Di.randomUUID(),command:s,args:e,options:t,cwd:n,perfStartNs:r})}catch{return null}}async function BP(){try{return(await Ur({id:Di.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function zP(){let s=Ne.pid(),e=Ne.socket(),t=!1;if(Xe.existsSync(s)){let n=parseInt(Xe.readFileSync(s,"utf-8").trim(),10);if(!Number.isNaN(n))try{process.kill(n,"SIGKILL"),t=!0}catch{}}try{Xe.existsSync(s)&&Xe.unlinkSync(s)}catch{}try{Xe.existsSync(e)&&Xe.unlinkSync(e)}catch{}return t}async function eh(){let{spawn:s}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Xe.existsSync(t))o=t,i="bun";else if(Xe.existsSync(n))o=n,i=Qi()?"bun":"node";else if(Xe.existsSync(r))o=r,i=Qi()?"bun":"node";else return!1;let a=Ne.runDir();Xe.mkdirSync(a,{recursive:!0});let c=Ne.log(),u=Xe.openSync(c,"a");s(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Xe.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await Zf())return!0;return!1}var nh=b(()=>{"use strict";sr();du();l(Zf,"isDaemonRunning");l(VP,"getDaemonStatus");l(Ur,"sendRequest");l(WP,"executeViaDaemon");l(BP,"stopDaemon");l(zP,"forceKillDaemon");l(eh,"spawnDaemon")});import Fe from"node:fs";import{createServer as BC}from"node:net";Si();Ma();se();Un();rn();Ps();Et();U();Es();ot();import bP from"node:path";ft();Se();U();fe();var ql=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,r){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,r)}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(r=>r.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),r=n.filter((a,c)=>n.indexOf(a)!==c);r.length>0&&e.push(`Duplicate command names: ${r.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:A.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:v()};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 r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:v()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:v()};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()}},B=new ql;var Ms=class extends ve{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=bP.basename(t),a=await F.getCurrentTask(o),c=await Oe.getActiveTasks(o),u=await ht.getRecent(o,5),d=await nt.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 w=p.toISOString();g=x.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",w).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(w=>w.action==="task_completed").length,featuresShipped:g.filter(w=>w.action==="feature_shipped").length,totalActions:g.length};console.log(`
1350
+ \`\`\``,w=zo("sync"),E=L(we("Sync Complete"),ut({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Fm("Uncommitted changes detected"):null,k,le(w.map(T=>({label:T.desc,command:T.cmd}))));return console.log(E),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Bl(d,i)}catch(s){return t.md?console.log(L("## \u274C Sync Failed",`> ${y(s)}`)):h.fail(y(s)),{success:!1,error:y(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Ws.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&&wn.isCurrent(r,i))return t.md?console.log(L(we("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 xd(r,e,o.git,o.stats);return t.md?console.log(L("## \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(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;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."}:(wn.save(o,i),s.md?console.log(L(we("LLM Analysis Saved"),ut({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(r){return{success:!1,error:y(r)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=wn.getActive(r);if(!o)return t.md?console.log(L("## 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=[we(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(te("Architecture Insights",Re(o.architecture.insights))),o.patterns.length>0&&i.push(te("Patterns",Re(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(te("Anti-Patterns",Re(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(te("Tech Debt",Re(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(te("Conventions",Re(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Tn.getSummary(r),i=await Tn.getDailyStats(r,30),a=await Df(r),c=await tt.getPatternsSummary(r);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=x.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await Tn.read(r),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: ${Nr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${uo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Jl(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=If(i);if(console.log(` ${p} ${Nr(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=$f(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(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)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=yo(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await qe.getStatus(r);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=_f.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=L(`## \u26A1 Status: ${u}`,ut({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?te("Analysis",Re(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(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.diff(r);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(L("## 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(L(ga(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(nd(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(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Diff Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.seal(r);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(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.rollback(r);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(L(we("Analysis Rolled Back"),ut({"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(L("## \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(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Rollback Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await qe.verify(r);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(s){let r=y(s);return h.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)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=x.getDoc(r,"project")?.repoPath||e}catch{}let i=await qe.semanticVerify(r,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(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}}});function Gn(n){return Buffer.from(`${JSON.stringify(n)}
1351
+ `)}var Ne,Yf,Qf,du=b(()=>{"use strict";Ne={runDir:l(()=>`${process.env.HOME||vt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ne.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ne.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ne.runDir()}/daemon.log`,"log")},Yf=1800*1e3,Qf=1024*1024;l(Gn,"encodeMessage")});var th={};ls(th,{executeViaDaemon:()=>WP,forceKillDaemon:()=>JP,getDaemonStatus:()=>VP,isDaemonRunning:()=>Zf,sendRequest:()=>Ur,spawnDaemon:()=>eh,stopDaemon:()=>BP});import ji from"node:crypto";import Xe from"node:fs";import{connect as GP}from"node:net";async function Zf(){let n=Ne.socket();if(!Xe.existsSync(n))return!1;try{return(await Ur({id:ji.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Xe.unlinkSync(n)}catch{}return!1}}async function VP(){let n=Ne.socket(),e=Ne.pid();if(!Xe.existsSync(n))return{running:!1};try{let t=await Ur({id:ji.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Xe.existsSync(e)?{running:!1,pid:parseInt(Xe.readFileSync(e,"utf-8").trim(),10),socketPath:n}:{running:!1}}function Ur(n){return new Promise((e,t)=>{let s=Ne.socket(),r=GP(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(Gn(n))}),r.on("data",c=>{o+=c.toString();let u=o.indexOf(`
1352
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function WP(n,e,t,s,r,o=!0){let i=Ne.socket();if(!Xe.existsSync(i))return o&&eh().catch(()=>{}),null;try{return await Ur({id:ji.randomUUID(),command:n,args:e,options:t,cwd:s,perfStartNs:r})}catch{return null}}async function BP(){try{return(await Ur({id:ji.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function JP(){let n=Ne.pid(),e=Ne.socket(),t=!1;if(Xe.existsSync(n)){let s=parseInt(Xe.readFileSync(n,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Xe.existsSync(n)&&Xe.unlinkSync(n)}catch{}try{Xe.existsSync(e)&&Xe.unlinkSync(e)}catch{}return t}async function eh(){let{spawn:n}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Xe.existsSync(t))o=t,i="bun";else if(Xe.existsSync(s))o=s,i=Qi()?"bun":"node";else if(Xe.existsSync(r))o=r,i=Qi()?"bun":"node";else return!1;let a=Ne.runDir();Xe.mkdirSync(a,{recursive:!0});let c=Ne.log(),u=Xe.openSync(c,"a");n(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Xe.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await Zf())return!0;return!1}var sh=b(()=>{"use strict";nr();du();l(Zf,"isDaemonRunning");l(VP,"getDaemonStatus");l(Ur,"sendRequest");l(WP,"executeViaDaemon");l(BP,"stopDaemon");l(JP,"forceKillDaemon");l(eh,"spawnDaemon")});import Fe from"node:fs";import{createServer as BC}from"node:net";Si();Ma();ne();Ls();rs();Pn();Et();U();En();ot();import bP from"node:path";ft();Se();U();fe();var ql=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,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,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,s,r){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} 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,r)}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 s of this.categories.keys())t[s]=e.filter(r=>r.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),r=s.filter((a,c)=>s.indexOf(a)!==c);r.length>0&&e.push(`Duplicate command names: ${r.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:A.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,s=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:v()};else try{o=await this.buildContext(s)}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,s=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};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()}},B=new ql;var Mn=class extends ve{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=bP.basename(t),a=await F.getCurrentTask(o),c=await Oe.getActiveTasks(o),u=await ht.getRecent(o,5),d=await st.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=J.getDaysAgo(m),g=[];try{let w=p.toISOString();g=x.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",w).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(w=>w.action==="task_completed").length,featuresShipped:g.filter(w=>w.action==="feature_shipped").length,totalActions:g.length};console.log(`
1353
1353
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1354
1354
  `),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(`
1355
1355
  Activity: ${k}
@@ -1358,32 +1358,32 @@ prjct analysis-save-llm '<your JSON here>' --md
1358
1358
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1359
1359
  `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let w=f.split(`
1360
1360
  `)[0].trim();console.log(` ${k+1}. ${w}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1361
- `),{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 w=k.priority?` [${k.priority}]`:"";return`${k.description}${w}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let w=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${w?` (${w})`:""}`}):["Nothing shipped yet"],f=L(`## \u26A1 Dashboard: ${i}`,te("Current Focus",m),te(`Queue (${c.length})`,Re(p,!0)),te("Recent Ships",Re(g)),te("Ideas",`${d.length} pending`),le([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1361
+ `),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${J.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let w=k.priority?` [${k.priority}]`:"";return`${k.description}${w}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let w=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${w?` (${w})`:""}`}):["Nothing shipped yet"],f=L(`## \u26A1 Dashboard: ${i}`,te("Current Focus",m),te(`Queue (${c.length})`,Re(p,!0)),te("Recent Ships",Re(g)),te("Ideas",`${d.length} pending`),le([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1362
1362
  \u{1F4CA} DASHBOARD - ${i}
1363
1363
  `),console.log("\u2550".repeat(50));let m=yo(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1364
1364
  ${g}`),console.log(`
1365
- \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(`
1365
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=J.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1366
1366
  \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let w=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${w}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1367
1367
  \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(`
1368
1368
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1369
1369
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1370
- `)}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(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1370
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:J.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1371
1371
  PRJCT COMMANDS
1372
1372
  `),console.log("=".repeat(50));let i=B.getAllCategories(),a=B.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(`
1373
1373
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1374
1374
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1375
- `),{success:!0,topic:"overview"}}let n=B.getByName(e);if(n){if(console.log(`
1376
- \u{1F4DA} HELP: /p:${n.name}
1377
- `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1378
- Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
1379
- Features:`);for(let i of n.features)console.log(` \u2022 ${i}`)}return console.log(`
1375
+ `),{success:!0,topic:"overview"}}let s=B.getByName(e);if(s){if(console.log(`
1376
+ \u{1F4DA} HELP: /p:${s.name}
1377
+ `),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
1378
+ Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
1379
+ Features:`);for(let i of s.features)console.log(` \u2022 ${i}`)}return console.log(`
1380
1380
  ${"\u2550".repeat(50)}
1381
- `),{success:!0,topic:e,command:n}}let r={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(r))if(o.includes(i))return console.log(`
1381
+ `),{success:!0,topic:e,command:s}}let r={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(r))if(o.includes(i))return console.log(`
1382
1382
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1383
1383
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1384
1384
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1385
- `),{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"],r=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(r);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("")}};dl();ft();Se();Et();U();import vP from"node:fs/promises";import TP from"node:path";var os=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),r=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=A.getGlobalProjectPath(a),u=await F.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await ni.execute(r,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=TP.join(e,"analysis","repo-analysis.json"),n=await vP.readFile(t,"utf-8"),r=JSON.parse(n);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return P(t),null}}},t1=new os;Zo();ot();Se();Gn();se();Un();rn();U();ot();import Kl from"node:fs";import Nf from"node:path";async function bi(s){let e=await $.getProjectId(s),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let r=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(r>500){let o=r-500;N.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(bi,"cleanupMemory");async function vi(s){let e=await $.getProjectId(s);if(!e)return;let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let r=n-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",r)}}l(vi,"cleanupMemoryInternal");async function Xl(s={},e=process.cwd()){try{if(s.memory===!0||s.type==="memory"){h.spin("cleaning memory...");let a=await bi(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 r=[],i=N.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;N.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),r.push(`Memory: ${a} old entries removed`)}else r.push("Memory: No cleanup needed");try{let a=await nt.cleanup(n);a.removed>0?r.push(`Ideas: ${a.removed} old archived ideas removed`):r.push("Ideas: No cleanup needed")}catch(a){r.push(`Ideas: Error - ${y(a)}`)}try{let c=(await Oe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?r.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):r.push("Queue: No completed tasks")}catch(a){r.push(`Queue: Error - ${y(a)}`)}return await vi(e),await yt.log(e,"cleanup_performed",{items:r.length,timestamp:z.getTimestamp()}),h.done(`${r.length} items cleaned`),{success:!0,cleaned:r}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(Xl,"cleanup");var PP=[/^qa-/,/^nonexistent-/,/^test-/];async function Ff(s){let e=A.getGlobalBasePath(),t=Nf.join(e,"projects");if(!Kl.existsSync(t))return{success:!0,message:"No projects directory found"};let n=Kl.readdirSync(t,{withFileTypes:!0}),r=[],o=[];for(let i of n){if(!i.isDirectory())continue;let a=i.name,c=Nf.join(t,a);if(!PP.some(d=>d.test(a))){o.push(a);continue}if(s.dryRun){r.push(a);continue}try{N.close(a),Kl.rmSync(c,{recursive:!0,force:!0}),r.push(a)}catch{o.push(a)}}if(s.md){let i=[`## ${s.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${r.length} |`,`| Kept | ${o.length} |`];return r.length>0&&i.push("","### Removed",...r.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
1386
- `)}}return{success:!0,message:`Cleaned ${r.length} stale project(s), kept ${o.length}`,removed:r,kept:o.length}}l(Ff,"cleanupProjects");Gn();U();ot();import Lf from"node:path";async function Yl(s=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=s||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=Lf.join(A.getGlobalProjectPath(i),"planning","designs");await Ee.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1385
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],r=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(r);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=>s[Math.floor(a/i*(s.length-1))]).join("")}};dl();ft();Se();Et();U();import vP from"node:fs/promises";import TP from"node:path";var rn=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let s=(e||"").trim().split(/\s+/),r=s[0]||"task",o=s.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=A.getGlobalProjectPath(a),u=await F.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await si.execute(r,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(s){return{success:!1,message:`Context error: ${y(s)}`}}}async loadRepoAnalysis(e){try{let t=TP.join(e,"analysis","repo-analysis.json"),s=await vP.readFile(t,"utf-8"),r=JSON.parse(s);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return C(t),null}}},t1=new rn;Zo();ot();Se();Hs();ne();Ls();rs();U();ot();import Kl from"node:fs";import Nf from"node:path";async function bi(n){let e=await $.getProjectId(n),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let r=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(r>500){let o=r-500;N.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(bi,"cleanupMemory");async function vi(n){let e=await $.getProjectId(n);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let r=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",r)}}l(vi,"cleanupMemoryInternal");async function Xl(n={},e=process.cwd()){try{if(n.memory===!0||n.type==="memory"){h.spin("cleaning memory...");let a=await bi(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let r=[],i=N.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;N.run(s,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),r.push(`Memory: ${a} old entries removed`)}else r.push("Memory: No cleanup needed");try{let a=await st.cleanup(s);a.removed>0?r.push(`Ideas: ${a.removed} old archived ideas removed`):r.push("Ideas: No cleanup needed")}catch(a){r.push(`Ideas: Error - ${y(a)}`)}try{let c=(await Oe.getActiveTasks(s)).filter(u=>u.completed).length;c>0?r.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):r.push("Queue: No completed tasks")}catch(a){r.push(`Queue: Error - ${y(a)}`)}return await vi(e),await yt.log(e,"cleanup_performed",{items:r.length,timestamp:J.getTimestamp()}),h.done(`${r.length} items cleaned`),{success:!0,cleaned:r}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(Xl,"cleanup");var PP=[/^qa-/,/^nonexistent-/,/^test-/];async function Ff(n){let e=A.getGlobalBasePath(),t=Nf.join(e,"projects");if(!Kl.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Kl.readdirSync(t,{withFileTypes:!0}),r=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=Nf.join(t,a);if(!PP.some(d=>d.test(a))){o.push(a);continue}if(n.dryRun){r.push(a);continue}try{N.close(a),Kl.rmSync(c,{recursive:!0,force:!0}),r.push(a)}catch{o.push(a)}}if(n.md){let i=[`## ${n.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${r.length} |`,`| Kept | ${o.length} |`];return r.length>0&&i.push("","### Removed",...r.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
1386
+ `)}}return{success:!0,message:`Cleaned ${r.length} stale project(s), kept ${o.length}`,removed:r,kept:o.length}}l(Ff,"cleanupProjects");Hs();U();ot();import Lf from"node:path";async function Yl(n=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return h.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=n||"system";h.spin(`designing ${s}...`);let i=await $.getProjectId(t),a=Lf.join(A.getGlobalProjectPath(i),"planning","designs");await Ee.ensureDir(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1387
1387
 
1388
1388
  *Use templates/design/architecture.md for full design*
1389
1389
  `;break;case"api":c=`# API Design: ${o}
@@ -1398,14 +1398,14 @@ ${"\u2550".repeat(50)}
1398
1398
  `;break;case"flow":c=`# Flow Design: ${o}
1399
1399
 
1400
1400
  *Use templates/design/flow.md for full design*
1401
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Lf.join(a,u);return await Ee.writeFile(d,c),await yt.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(Yl,"design");Gn();import Os from"node:path";import{exec as CP}from"node:child_process";import{promisify as EP}from"node:util";Yt();se();var Ve={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:"*"};Fn();hn();var Ql=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=ap.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(),r={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).forEach(u=>{u.status==="rejected"&&H.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,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(Ve.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let r=this.listeners.get(Ve.ALL);r&&t.push(...r);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 H.error("Event callback error:",n),n}}async logEvent(e){try{x.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",Z(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(r=>r.type===t||r.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())}},it=new Ql,Fr={sessionStarted:l(s=>it.emit(Ve.SESSION_STARTED,s),"sessionStarted"),sessionPaused:l(s=>it.emit(Ve.SESSION_PAUSED,s),"sessionPaused"),sessionResumed:l(s=>it.emit(Ve.SESSION_RESUMED,s),"sessionResumed"),sessionCompleted:l(s=>it.emit(Ve.SESSION_COMPLETED,s),"sessionCompleted"),taskCreated:l(s=>it.emit(Ve.TASK_CREATED,s),"taskCreated"),taskCompleted:l(s=>it.emit(Ve.TASK_COMPLETED,s),"taskCompleted"),featureAdded:l(s=>it.emit(Ve.FEATURE_ADDED,s),"featureAdded"),featureShipped:l(s=>it.emit(Ve.FEATURE_SHIPPED,s),"featureShipped"),ideaCaptured:l(s=>it.emit(Ve.IDEA_CAPTURED,s),"ideaCaptured"),snapshotCreated:l(s=>it.emit(Ve.SNAPSHOT_CREATED,s),"snapshotCreated"),snapshotRestored:l(s=>it.emit(Ve.SNAPSHOT_RESTORED,s),"snapshotRestored"),commitCreated:l(s=>it.emit(Ve.COMMIT_CREATED,s),"commitCreated"),pushCompleted:l(s=>it.emit(Ve.PUSH_COMPLETED,s),"pushCompleted"),projectInitialized:l(s=>it.emit(Ve.PROJECT_INITIALIZED,s),"projectInitialized"),projectSynced:l(s=>it.emit(Ve.PROJECT_SYNCED,s),"projectSynced"),analysisCompleted:l(s=>it.emit(Ve.ANALYSIS_COMPLETED,s),"analysisCompleted")};ft();se();U();Tt();var Uf=he;function Ti(s){let e=0,t=null;for(let n of s.timeline)n.type==="start"||n.type==="resume"?t=new Date(n.at):(n.type==="pause"||n.type==="complete")&&t&&(e+=new Date(n.at).getTime()-t.getTime(),t=null);return t&&s.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}l(Ti,"calculateDuration");function Hf(s){if(s<60)return`${s}s`;if(s<3600)return`${Math.round(s/60)}m`;let e=Math.floor(s/3600),t=Math.round(s%3600/60);return t===0?`${e}h`:`${e}h ${t}m`}l(Hf,"formatDuration");var Gf=EP(CP);function Vf(s){return{id:s.id,projectId:s.project_id,task:s.task,status:s.status,startedAt:s.started_at,pausedAt:s.paused_at,completedAt:s.completed_at,duration:s.duration,metrics:JSON.parse(s.metrics),timeline:JSON.parse(s.timeline)}}l(Vf,"rowToSession");var Pi=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await $.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");x.getDb(this.projectId),this.initialized=!0}generateId(){return Uf()}async getCurrent(){this.initialized||await this.initialize();let e=x.get(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status IN ('active', 'paused') ORDER BY started_at DESC LIMIT 1",this.projectId);return e?Vf(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let n=new Date().toISOString(),r={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:n,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:n}]};return this.saveSession(r),await this.logEvent("session_started",{sessionId:r.id,task:e}),await Fr.sessionStarted({sessionId:r.id,task:e,projectId:this.projectId}),r}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let n=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:n}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await Fr.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=Ti(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Fr.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=Ti(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await Fr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Ti(e)}async calculateMetrics(e){let t={...e.metrics};try{let n=e.startedAt.split("T")[0],{stdout:r}=await Gf(`git rev-list --count --since="${n}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(r.trim(),10)||0;let{stdout:o}=await Gf(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1402
- `),c=(i[i.length-2]||"").match(/(\d+) files? changed(?:, (\d+) insertions?)?(?:, (\d+) deletions?)?/);c&&(t.filesChanged=parseInt(c[1],10)||0,t.linesAdded=parseInt(c[2],10)||0,t.linesRemoved=parseInt(c[3],10)||0)}catch(n){P(n)||console.error(`Metrics calculation warning: ${y(n)}`)}return t}saveSession(e){x.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1403
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),x.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Vf)}async logEvent(e,t){try{x.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Hf(e)}};U();ot();async function Zl(s=process.cwd()){try{if(!await $.getProjectId(s))return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let n=await new Pi(s).getCurrent(),r=n?{task:n.task,startedAt:n.startedAt}:null;if(!r||!r.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1401
+ `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Lf.join(a,u);return await Ee.writeFile(d,c),await yt.log(t,"design_created",{type:s,target:o,timestamp:J.getTimestamp()}),h.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}l(Yl,"design");Hs();import On from"node:path";import{exec as CP}from"node:child_process";import{promisify as EP}from"node:util";Yt();ne();var Ve={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:"*"};Ns();fs();var Ql=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=ap.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 s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),r={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).forEach(u=>{u.status==="rejected"&&H.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,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(Ve.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let r=this.listeners.get(Ve.ALL);r&&t.push(...r);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let s=e(t);s instanceof Promise&&await s}catch(s){throw H.error("Event callback error:",s),s}}async logEvent(e){try{x.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",Z(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(r=>r.type===t||r.type.startsWith(t))),s.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())}},it=new Ql,Fr={sessionStarted:l(n=>it.emit(Ve.SESSION_STARTED,n),"sessionStarted"),sessionPaused:l(n=>it.emit(Ve.SESSION_PAUSED,n),"sessionPaused"),sessionResumed:l(n=>it.emit(Ve.SESSION_RESUMED,n),"sessionResumed"),sessionCompleted:l(n=>it.emit(Ve.SESSION_COMPLETED,n),"sessionCompleted"),taskCreated:l(n=>it.emit(Ve.TASK_CREATED,n),"taskCreated"),taskCompleted:l(n=>it.emit(Ve.TASK_COMPLETED,n),"taskCompleted"),featureAdded:l(n=>it.emit(Ve.FEATURE_ADDED,n),"featureAdded"),featureShipped:l(n=>it.emit(Ve.FEATURE_SHIPPED,n),"featureShipped"),ideaCaptured:l(n=>it.emit(Ve.IDEA_CAPTURED,n),"ideaCaptured"),snapshotCreated:l(n=>it.emit(Ve.SNAPSHOT_CREATED,n),"snapshotCreated"),snapshotRestored:l(n=>it.emit(Ve.SNAPSHOT_RESTORED,n),"snapshotRestored"),commitCreated:l(n=>it.emit(Ve.COMMIT_CREATED,n),"commitCreated"),pushCompleted:l(n=>it.emit(Ve.PUSH_COMPLETED,n),"pushCompleted"),projectInitialized:l(n=>it.emit(Ve.PROJECT_INITIALIZED,n),"projectInitialized"),projectSynced:l(n=>it.emit(Ve.PROJECT_SYNCED,n),"projectSynced"),analysisCompleted:l(n=>it.emit(Ve.ANALYSIS_COMPLETED,n),"analysisCompleted")};ft();ne();U();Tt();var Uf=he;function Ti(n){let e=0,t=null;for(let s of n.timeline)s.type==="start"||s.type==="resume"?t=new Date(s.at):(s.type==="pause"||s.type==="complete")&&t&&(e+=new Date(s.at).getTime()-t.getTime(),t=null);return t&&n.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}l(Ti,"calculateDuration");function Hf(n){if(n<60)return`${n}s`;if(n<3600)return`${Math.round(n/60)}m`;let e=Math.floor(n/3600),t=Math.round(n%3600/60);return t===0?`${e}h`:`${e}h ${t}m`}l(Hf,"formatDuration");var Gf=EP(CP);function Vf(n){return{id:n.id,projectId:n.project_id,task:n.task,status:n.status,startedAt:n.started_at,pausedAt:n.paused_at,completedAt:n.completed_at,duration:n.duration,metrics:JSON.parse(n.metrics),timeline:JSON.parse(n.timeline)}}l(Vf,"rowToSession");var Pi=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await $.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");x.getDb(this.projectId),this.initialized=!0}generateId(){return Uf()}async getCurrent(){this.initialized||await this.initialize();let e=x.get(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status IN ('active', 'paused') ORDER BY started_at DESC LIMIT 1",this.projectId);return e?Vf(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let s=new Date().toISOString(),r={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:s,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:s}]};return this.saveSession(r),await this.logEvent("session_started",{sessionId:r.id,task:e}),await Fr.sessionStarted({sessionId:r.id,task:e,projectId:this.projectId}),r}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let s=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:s}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await Fr.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=Ti(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Fr.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=Ti(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await Fr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Ti(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:r}=await Gf(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(r.trim(),10)||0;let{stdout:o}=await Gf(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1402
+ `),c=(i[i.length-2]||"").match(/(\d+) files? changed(?:, (\d+) insertions?)?(?:, (\d+) deletions?)?/);c&&(t.filesChanged=parseInt(c[1],10)||0,t.linesAdded=parseInt(c[2],10)||0,t.linesRemoved=parseInt(c[3],10)||0)}catch(s){C(s)||console.error(`Metrics calculation warning: ${y(s)}`)}return t}saveSession(e){x.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1403
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),x.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Vf)}async logEvent(e,t){try{x.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Hf(e)}};U();ot();async function Zl(n=process.cwd()){try{if(!await $.getProjectId(n))return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let s=await new Pi(n).getCurrent(),r=s?{task:s.task,startedAt:s.startedAt}:null;if(!r||!r.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1404
1404
  Found abandoned session:
1405
- `),console.log(` Task: ${r.task}`),r.startedAt){let o=z.calculateDuration(new Date(r.startedAt));console.log(` Started: ${o} ago`)}return r.context&&console.log(` Context: ${r.context.slice(0,100)}...`),console.log(`
1405
+ `),console.log(` Task: ${r.task}`),r.startedAt){let o=J.calculateDuration(new Date(r.startedAt));console.log(` Started: ${o} ago`)}return r.context&&console.log(` Context: ${r.context.slice(0,100)}...`),console.log(`
1406
1406
  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
1407
- `),{success:!0,session:r}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Zl,"recover");async function eu(s=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Os.join(A.getGlobalProjectPath(e),"snapshots");await Ee.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:s,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:s,encoding:"utf-8"});let a=Os.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await Ee.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 Ee.writeFile(a,JSON.stringify(c,null,2)),await yt.log(s,"undo_performed",{snapshotId:i,timestamp:z.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(r){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(r)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(eu,"undo");async function tu(s=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Os.join(A.getGlobalProjectPath(e),"snapshots"),n=Os.join(t,"history.json"),r;try{let i=await Ee.readFile(n);r=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(r.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:s,encoding:"utf-8"}).trim();return i?i.split(`
1408
- `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:s,encoding:"utf-8"}),r.snapshots.pop(),r.current=Math.max(0,r.current-1),await Ee.writeFile(n,JSON.stringify(r,null,2)),await yt.log(s,"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(tu,"redo");async function nu(s=process.cwd()){try{let e=await $.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Os.join(A.getGlobalProjectPath(e),"snapshots"),n=Os.join(t,"history.json"),r;try{let o=await Ee.readFile(n);r=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1407
+ `),{success:!0,session:r}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Zl,"recover");async function eu(n=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(n);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=On.join(A.getGlobalProjectPath(e),"snapshots");await Ee.ensureDir(t);let{execSync:s}=await import("node:child_process");try{if(!s("git status --porcelain",{cwd:n,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,"-")}`;s(`git stash push -m "${i}"`,{cwd:n,encoding:"utf-8"});let a=On.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await Ee.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 Ee.writeFile(a,JSON.stringify(c,null,2)),await yt.log(n,"undo_performed",{snapshotId:i,timestamp:J.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(r){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(r)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(eu,"undo");async function tu(n=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(n);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=On.join(A.getGlobalProjectPath(e),"snapshots"),s=On.join(t,"history.json"),r;try{let i=await Ee.readFile(s);r=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(r.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:n,encoding:"utf-8"}).trim();return i?i.split(`
1408
+ `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:n,encoding:"utf-8"}),r.snapshots.pop(),r.current=Math.max(0,r.current-1),await Ee.writeFile(s,JSON.stringify(r,null,2)),await yt.log(n,"redo_performed",{timestamp:J.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(tu,"redo");async function su(n=process.cwd()){try{let e=await $.getProjectId(n);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=On.join(A.getGlobalProjectPath(e),"snapshots"),s=On.join(t,"history.json"),r;try{let o=await Ee.readFile(s);r=JSON.parse(o)}catch(o){if(C(o)||o instanceof SyntaxError)return console.log(`
1409
1409
  SNAPSHOT HISTORY
1410
1410
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1411
1411
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1413,18 +1413,18 @@ ${"\u2550".repeat(50)}
1413
1413
  `),console.log("=".repeat(50)),r.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1414
1414
  `)):(r.snapshots.forEach((o,i)=>{let a=i===r.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${r.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1415
1415
  `)),console.log(`${"=".repeat(50)}
1416
- `),{success:!0,snapshots:r.snapshots,current:r.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(nu,"history");var _s=class extends ve{static{l(this,"MaintenanceCommands")}_cleanupMemory=bi;_cleanupMemoryInternal=vi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Xl(e,t):n}async cleanupProjects(e={}){return Ff(e)}async design(e=null,t={},n=process.cwd()){let r=await this.ensureProjectInit(n);return r.success?Yl(e,t,n):r}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Zl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?eu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?tu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?nu(e):t}async enrich(e=null,t=process.cwd(),n={}){let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await Ds(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(u=>({path:u.path,score:Number(u.score.toFixed(3)),reasons:u.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(n.json)return console.log(JSON.stringify(c,null,2)),{success:!0};if(n.md){let u=[];if(u.push("## Enrichment Context"),u.push(""),u.push(`- Query: ${o}`),i&&u.push(`- Issue ID: ${i}`),u.push(`- Candidate files: ${c.files.length}`),u.push(""),u.push("### Suggested Files"),u.push(""),c.files.length===0)u.push("- No relevant files found.");else for(let d of c.files)u.push(`- \`${d.path}\` (${d.score})`);return u.push(""),u.push("### Publish"),u.push(""),u.push("- Update description via MCP"),u.push("- Add enrichment as comment via MCP"),u.push("- Or keep local only"),console.log(u.join(`
1417
- `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};import Ie from"chalk";se();var xP=BigInt(300*1e9),su=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),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}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,n]of this.marks)e-n>xP&&this.marks.delete(t)}recordTiming(e,t,n,r){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:r})}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(),r=[{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 r)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.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 N.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 r=this.getMetrics(e,n),o={period:`${t}d`},i=r.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=r.filter(p=>"metric"in p&&p.metric==="heap_used"),c=r.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,w)=>k+w,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,w)=>k+w,0)/f.length):0}}let u=r.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=r.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=r.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,w)=>k+w,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},AP=new su,Wf=AP;U();ot();var Tn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Ci(s,e,t){return t==="below"?s<=e?Ie.green("\u2713"):Ie.yellow("\u26A0"):s>=e?Ie.green("\u2713"):Ie.yellow("\u26A0")}l(Ci,"statusIcon");var Ns=class extends ve{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Wf.getReport(r,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1416
+ `),{success:!0,snapshots:r.snapshots,current:r.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(su,"history");var _n=class extends ve{static{l(this,"MaintenanceCommands")}_cleanupMemory=bi;_cleanupMemoryInternal=vi;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?Xl(e,t):s}async cleanupProjects(e={}){return Ff(e)}async design(e=null,t={},s=process.cwd()){let r=await this.ensureProjectInit(s);return r.success?Yl(e,t,s):r}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Zl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?eu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?tu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?su(e):t}async enrich(e=null,t=process.cwd(),s={}){let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await jn(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(u=>({path:u.path,score:Number(u.score.toFixed(3)),reasons:u.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(s.json)return console.log(JSON.stringify(c,null,2)),{success:!0};if(s.md){let u=[];if(u.push("## Enrichment Context"),u.push(""),u.push(`- Query: ${o}`),i&&u.push(`- Issue ID: ${i}`),u.push(`- Candidate files: ${c.files.length}`),u.push(""),u.push("### Suggested Files"),u.push(""),c.files.length===0)u.push("- No relevant files found.");else for(let d of c.files)u.push(`- \`${d.path}\` (${d.score})`);return u.push(""),u.push("### Publish"),u.push(""),u.push("- Update description via MCP"),u.push("- Add enrichment as comment via MCP"),u.push("- Or keep local only"),console.log(u.join(`
1417
+ `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};import Ie from"chalk";ne();var xP=BigInt(300*1e9),nu=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let s=process.hrtime.bigint();return this.marks.delete(e),Number(s-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,s]of this.marks)e-s>xP&&this.marks.delete(t)}recordTiming(e,t,s,r){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:r})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),r=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of r)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let r=this.getMetrics(e,s),o={period:`${t}d`},i=r.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=r.filter(p=>"metric"in p&&p.metric==="heap_used"),c=r.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,w)=>k+w,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,w)=>k+w,0)/f.length):0}}let u=r.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=r.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=r.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,w)=>k+w,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},AP=new nu,Wf=AP;U();ot();var vs={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Ci(n,e,t){return t==="below"?n<=e?Ie.green("\u2713"):Ie.yellow("\u26A0"):n>=e?Ie.green("\u2713"):Ie.yellow("\u26A0")}l(Ci,"statusIcon");var Nn=class extends ve{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Wf.getReport(r,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1418
1418
  ${Ie.dim("No performance data yet.")}`),console.log(`${Ie.dim("Metrics are collected automatically as you use the CLI.")}
1419
1419
  `),{success:!0,message:"No data"};if(console.log(`
1420
- ${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Ci(i.startup.avg,Tn.startup.max,"below");console.log(` Startup: avg ${Ie.bold(`${i.startup.avg}ms`)} ${Ie.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ie.dim(`target: <${Tn.startup.max}ms`)}`)}if(i.memory){let c=Ci(i.memory.peakHeapMB,Tn.heapMB.max,"below");console.log(` Memory: avg ${Ie.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ie.dim(`target: <${Tn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Ci(i.contextCorrectness.rate,Tn.contextRate.min,"above");console.log(` Context: ${Ie.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ie.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ie.dim(`target: ${Tn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Ci(i.subtaskHandoff.rate,Tn.handoffRate.min,"above");console.log(` Handoff: ${Ie.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ie.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ie.dim(`target: ${Tn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1421
- ${Ie.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ie.bold(`${u.avg}ms`)} ${Ie.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)}}}};ki();Qt();Se();fr();U();We();import lu from"node:fs/promises";import IP from"node:path";import de from"chalk";import ou from"node:fs/promises";import zf from"node:os";import iu from"node:path";sr();import Bf from"node:fs";import Ei from"node:path";function RP(s){if(Dn()){let{Database:r}=vt("bun:sqlite");return new r(s,{create:!0})}let e=vt("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}l(RP,"openDatabase");var ru=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ei.resolve(e):Ei.join(vt("node:os").homedir(),".prjct-cli");this.dbPath=Ei.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ei.dirname(this.dbPath);Bf.existsSync(e)||Bf.mkdirSync(e,{recursive:!0});let t=RP(this.dbPath);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
1420
+ ${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Ci(i.startup.avg,vs.startup.max,"below");console.log(` Startup: avg ${Ie.bold(`${i.startup.avg}ms`)} ${Ie.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ie.dim(`target: <${vs.startup.max}ms`)}`)}if(i.memory){let c=Ci(i.memory.peakHeapMB,vs.heapMB.max,"below");console.log(` Memory: avg ${Ie.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ie.dim(`target: <${vs.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Ci(i.contextCorrectness.rate,vs.contextRate.min,"above");console.log(` Context: ${Ie.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ie.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ie.dim(`target: ${vs.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Ci(i.subtaskHandoff.rate,vs.handoffRate.min,"above");console.log(` Handoff: ${Ie.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ie.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ie.dim(`target: ${vs.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1421
+ ${Ie.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ie.bold(`${u.avg}ms`)} ${Ie.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}};ki();Qt();Se();fr();U();We();import lu from"node:fs/promises";import IP from"node:path";import de from"chalk";import ou from"node:fs/promises";import Jf from"node:os";import iu from"node:path";nr();import Bf from"node:fs";import Ei from"node:path";function RP(n){if(Rs()){let{Database:r}=vt("bun:sqlite");return new r(n,{create:!0})}let e=vt("better-sqlite3"),t=new e(n),s=t.exec.bind(t);return t.run=r=>s(r),t}l(RP,"openDatabase");var ru=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ei.resolve(e):Ei.join(vt("node:os").homedir(),".prjct-cli");this.dbPath=Ei.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ei.dirname(this.dbPath);Bf.existsSync(e)||Bf.mkdirSync(e,{recursive:!0});let t=RP(this.dbPath);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
1422
1422
  CREATE TABLE IF NOT EXISTS _system_migrations (
1423
1423
  version INTEGER PRIMARY KEY,
1424
1424
  name TEXT NOT NULL,
1425
1425
  applied_at TEXT NOT NULL
1426
1426
  )
1427
- `);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(r=>r.version)),n=[{version:1,name:"mcp-health-table",up:l(r=>{r.run(`
1427
+ `);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(r=>r.version)),s=[{version:1,name:"mcp-health-table",up:l(r=>{r.run(`
1428
1428
  CREATE TABLE mcp_health (
1429
1429
  provider TEXT PRIMARY KEY,
1430
1430
  status TEXT NOT NULL,
@@ -1435,12 +1435,12 @@ ${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u
1435
1435
  oauth_valid INTEGER NOT NULL DEFAULT 0,
1436
1436
  updated_at TEXT NOT NULL
1437
1437
  )
1438
- `)},"up")}];for(let r of n)t.has(r.version)||(r.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(r.version,r.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let n=this.getDb(),r=new Date().toISOString();n.prepare(`
1438
+ `)},"up")}];for(let r of s)t.has(r.version)||(r.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(r.version,r.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let s=this.getDb(),r=new Date().toISOString();s.prepare(`
1439
1439
  INSERT OR REPLACE INTO mcp_health
1440
1440
  (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
1441
1441
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1442
- `).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},DP=new ru;U();var xi="mcp-remote@0.1.38",au={linear:{command:"npx",args:["-y",xi,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",xi,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},TU={linear:`npx -y ${xi} https://mcp.linear.app/mcp`,jira:`npx -y ${xi} https://mcp.atlassian.com/v1/mcp`};function cn(){return process.env.PRJCT_TEST_MODE==="1"?iu.join(zf.tmpdir(),"prjct-context7-test","mcp.json"):iu.join(zf.homedir(),".claude","mcp.json")}l(cn,"getClaudeMcpConfigPath");async function Jf(s=cn()){try{let e=await ou.readFile(s,"utf-8");return JSON.parse(e)}catch(e){let t=y(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${s}: ${y(e)}`)}}l(Jf,"readMcpConfig");async function jP(s,e=cn()){await ou.mkdir(iu.dirname(e),{recursive:!0}),await ou.writeFile(e,JSON.stringify(s,null,2),"utf-8")}l(jP,"writeMcpConfig");async function cu(s,e,t=cn()){let n=await Jf(t),r={...n.mcpServers||{}},o=r[s];r[s]=e,n.mcpServers=r;let i=JSON.stringify(o)!==JSON.stringify(e);return await jP(n,t),{path:t,changed:i}}l(cu,"upsertMcpServer");async function Lr(s,e=cn()){return!!(await Jf(e)).mcpServers?.[s]}l(Lr,"hasMcpServer");Pt();ot();var Fs=class extends ve{static{l(this,"SetupCommands")}async start(){let e=await Ae.checkInstallation(),t=(Be(),lt(ct)),n=await t.detectCodex(),r=e.providerDetected,o=r?await t.getActiveProvider():null,i=r?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1443
- `),!r&&!n.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1442
+ `).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},jP=new ru;U();var xi="mcp-remote@0.1.38",au={linear:{command:"npx",args:["-y",xi,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",xi,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},TU={linear:`npx -y ${xi} https://mcp.linear.app/mcp`,jira:`npx -y ${xi} https://mcp.atlassian.com/v1/mcp`};function as(){return process.env.PRJCT_TEST_MODE==="1"?iu.join(Jf.tmpdir(),"prjct-context7-test","mcp.json"):iu.join(Jf.homedir(),".claude","mcp.json")}l(as,"getClaudeMcpConfigPath");async function zf(n=as()){try{let e=await ou.readFile(n,"utf-8");return JSON.parse(e)}catch(e){let t=y(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${n}: ${y(e)}`)}}l(zf,"readMcpConfig");async function DP(n,e=as()){await ou.mkdir(iu.dirname(e),{recursive:!0}),await ou.writeFile(e,JSON.stringify(n,null,2),"utf-8")}l(DP,"writeMcpConfig");async function cu(n,e,t=as()){let s=await zf(t),r={...s.mcpServers||{}},o=r[n];r[n]=e,s.mcpServers=r;let i=JSON.stringify(o)!==JSON.stringify(e);return await DP(s,t),{path:t,changed:i}}l(cu,"upsertMcpServer");async function Lr(n,e=as()){return!!(await zf(e)).mcpServers?.[n]}l(Lr,"hasMcpServer");Pt();ot();var Fn=class extends ve{static{l(this,"SetupCommands")}async start(){let e=await Ae.checkInstallation(),t=(Be(),lt(ct)),s=await t.detectCodex(),r=e.providerDetected,o=r?await t.getActiveProvider():null,i=r?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1443
+ `),!r&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1444
1444
 
1445
1445
  Please install one first:
1446
1446
  - Claude Code: https://docs.anthropic.com/claude-code
@@ -1448,17 +1448,17 @@ Please install one first:
1448
1448
  - OpenAI Codex: https://github.com/openai/codex`};if(r){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Ae.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1449
1449
  \u2705 Installed ${a.installed?.length??0} commands to:
1450
1450
  ${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1451
- \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(n.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(Io(),sc));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(a)}`)}return await this.setupMcpServers(),console.log(`
1451
+ \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(Io(),nc));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(a)}`)}return await this.setupMcpServers(),console.log(`
1452
1452
  \u{1F389} Setup complete!`),console.log(`
1453
1453
  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...
1454
1454
  `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ae.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ae.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1455
1455
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1456
1456
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1457
- \u{1F4DD} Installing global configuration...`);let n=await Ae.installGlobalConfig(),r=n.path?A.getDisplayPath(n.path):"global config";n.success?n.action==="created"?console.log(`\u2705 Created ${r}`):n.action==="updated"?console.log(`\u2705 Updated ${r}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${r}`):console.log(`\u26A0\uFE0F ${n.error}`);let o=(Be(),lt(ct)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1458
- \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)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(Io(),sc));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(c)}`)}return await this.setupMcpServers(),console.log(`
1457
+ \u{1F4DD} Installing global configuration...`);let s=await Ae.installGlobalConfig(),r=s.path?A.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${r}`):s.action==="updated"?console.log(`\u2705 Updated ${r}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${r}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(Be(),lt(ct)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1458
+ \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)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(Io(),nc));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(c)}`)}return await this.setupMcpServers(),console.log(`
1459
1459
  \u{1F389} Setup complete!
1460
1460
  `),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
1461
- \u{1F50C} Configuring MCP servers...`);try{await sn.install();let e=await sn.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${y(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=cn();await Lr("linear",e)?console.log("\u2705 Linear MCP already configured"):(await cu("linear",au.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${y(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=cn();await Lr("jira",e)?console.log("\u2705 Jira MCP already configured"):(await cu("jira",au.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${y(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),n=IP.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
1461
+ \u{1F50C} Configuring MCP servers...`);try{await ns.install();let e=await ns.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${y(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=as();await Lr("linear",e)?console.log("\u2705 Linear MCP already configured"):(await cu("linear",au.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${y(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=as();await Lr("jira",e)?console.log("\u2705 Jira MCP already configured"):(await cu("jira",au.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${y(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),s=IP.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
1462
1462
  # prjct Status Line for Claude Code
1463
1463
  # Shows version update notifications and current task
1464
1464
 
@@ -1514,45 +1514,45 @@ fi
1514
1514
 
1515
1515
  # Default: show prjct branding
1516
1516
  echo "\u26A1 prjct"
1517
- `;await lu.writeFile(n,r,{mode:493});let o={};if(await D(t))try{o=JSON.parse(await lu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await lu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(de.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(de.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(de.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(de.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(de.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(de.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(de.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(` ${de.bold.cyan("prjct")}${de.magenta("/")}${de.green("cli")} ${de.dim.white(`v${xe} installed`)}`),console.log(""),console.log(` ${de.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${de.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${de.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(de.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(de.bold.cyan("\u{1F680} Quick Start")),console.log(de.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(` ${de.bold("1.")} Initialize your project:`),console.log(` ${de.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${de.bold("2.")} Start your first task:`),console.log(` ${de.green('prjct task "build auth"')}`),console.log(""),console.log(` ${de.bold("3.")} Ship & celebrate:`),console.log(` ${de.green('prjct ship "user login"')}`),console.log(""),console.log(de.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(` ${de.dim("Documentation:")} ${de.cyan("https://prjct.app")}`),console.log(` ${de.dim("Report issues:")} ${de.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(de.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};lr();fe();We();import qf from"node:path";var $P=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],MP=`# Changelog
1517
+ `;await lu.writeFile(s,r,{mode:493});let o={};if(await j(t))try{o=JSON.parse(await lu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:s},await lu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(de.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(de.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(de.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(de.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(de.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(de.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(de.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(` ${de.bold.cyan("prjct")}${de.magenta("/")}${de.green("cli")} ${de.dim.white(`v${xe} installed`)}`),console.log(""),console.log(` ${de.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${de.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${de.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(de.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(de.bold.cyan("\u{1F680} Quick Start")),console.log(de.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(` ${de.bold("1.")} Initialize your project:`),console.log(` ${de.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${de.bold("2.")} Start your first task:`),console.log(` ${de.green('prjct task "build auth"')}`),console.log(""),console.log(` ${de.bold("3.")} Ship & celebrate:`),console.log(` ${de.green('prjct ship "user login"')}`),console.log(""),console.log(de.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(` ${de.dim("Documentation:")} ${de.cyan("https://prjct.app")}`),console.log(` ${de.dim("Report issues:")} ${de.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(de.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};lr();fe();We();import qf from"node:path";var $P=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],MP=`# Changelog
1518
1518
 
1519
1519
  All notable changes to this project will be documented in this file.
1520
1520
 
1521
1521
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
1522
1522
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1523
- `,Ai=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of $P){let r=qf.join(this.projectPath,n);if(await D(r)){let o=await et(r),i=this.detectFormat(o);return{filePath:r,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=qf.join(this.projectPath,e);return await Ht(t,`${MP}
1524
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await et(t.filePath),r=e.date||ls(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,r):o=this.insertMarkdownEntry(n,e,r),await Ht(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 r=this.formatKeepAChangelogEntry(t,n),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+r}
1523
+ `,Ai=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of $P){let r=qf.join(this.projectPath,s);if(await j(r)){let o=await et(r),i=this.detectFormat(o);return{filePath:r,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=qf.join(this.projectPath,e);return await Ht(t,`${MP}
1524
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await et(t.filePath),r=e.date||ln(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,r):o=this.insertMarkdownEntry(s,e,r),await Ht(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,s){let r=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+r}
1525
1525
  ${a}`}return`${e.trimEnd()}
1526
1526
 
1527
- ${r}`}insertMarkdownEntry(e,t,n){let r=this.formatMarkdownEntry(t,n),o=e.indexOf(`
1527
+ ${r}`}insertMarkdownEntry(e,t,s){let r=this.formatMarkdownEntry(t,s),o=e.indexOf(`
1528
1528
  `);if(o!==-1){let i=e.slice(0,o+1),a=e.slice(o+1);return`${i}
1529
1529
  ${r}
1530
1530
  ${a}`}return`${r}
1531
1531
 
1532
- ${e}`}formatKeepAChangelogEntry(e,t){let n=[`## [${e.version}] - ${t}`];if(n.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){n.push(`### ${r}`);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(`
1533
- `)}formatMarkdownEntry(e,t){let n=[`## ${e.version} - ${t}`];if(n.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){n.push(`### ${r}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push(`- ${e.description}`),n.push(""));return n.join(`
1534
- `)}};Fc();We();import{exec as OP}from"node:child_process";import Ls from"node:path";import{promisify as _P}from"node:util";var Kf=_P(OP),Ri=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=Ls.join(this.projectPath,"package.json"),t=await Ut(e,null);return t?.version?{current:t.version,next:Us(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Ls.join(this.projectPath,"Cargo.toml"),t=await et(e,"");if(!t)return null;let n=NP(t);return n?{current:n,next:Us(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Ls.join(this.projectPath,"pyproject.toml"),t=await et(e,"");if(!t)return null;let n=FP(t);return n?{current:n,next:Us(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await Xt(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Ls.join(this.projectPath,e[0]),n=await et(t,"");if(!n)return null;let r=LP(n);return r?{current:r,next:Us(r),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Ls.join(this.projectPath,e),n=await et(t,"");if(!n)return null;let r=n.trim();return Xf(r)?{current:r,next:Us(r),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Kf("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1535
- `);for(let n of t){let r=n.trim().replace(/^v/,"");if(Xf(r))return{current:r,next:Us(r),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Ls.join(this.projectPath,"VERSION");return await Ht(e,`0.1.0
1532
+ ${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){s.push(`### ${r}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push("### Added"),s.push(`- ${e.description}`),s.push(""));return s.join(`
1533
+ `)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){s.push(`### ${r}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
1534
+ `)}};Fc();We();import{exec as OP}from"node:child_process";import Ln from"node:path";import{promisify as _P}from"node:util";var Kf=_P(OP),Ri=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 s=await t();if(s)return s}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Ln.join(this.projectPath,"package.json"),t=await Ut(e,null);return t?.version?{current:t.version,next:Un(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Ln.join(this.projectPath,"Cargo.toml"),t=await et(e,"");if(!t)return null;let s=NP(t);return s?{current:s,next:Un(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Ln.join(this.projectPath,"pyproject.toml"),t=await et(e,"");if(!t)return null;let s=FP(t);return s?{current:s,next:Un(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Xt(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Ln.join(this.projectPath,e[0]),s=await et(t,"");if(!s)return null;let r=LP(s);return r?{current:r,next:Un(r),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Ln.join(this.projectPath,e),s=await et(t,"");if(!s)return null;let r=s.trim();return Xf(r)?{current:r,next:Un(r),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Kf("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1535
+ `);for(let s of t){let r=s.trim().replace(/^v/,"");if(Xf(r))return{current:r,next:Un(r),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Ln.join(this.projectPath,"VERSION");return await Ht(e,`0.1.0
1536
1536
  `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Kf(`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 Ht(e.file,`${e.next}
1537
- `);break}}async writeJsonVersion(e,t){let n=await Ut(e,{});n&&(n.version=t,await An(e,n))}async writeTomlVersion(e,t){let n=await et(e,"");if(!n)return;let r=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Ht(e,r)}async writeXmlVersion(e,t){let n=await et(e,"");if(!n)return;let r=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Ht(e,r)}};function Xf(s){return/^\d+\.\d+\.\d+/.test(s)}l(Xf,"isSemver");function Us(s){let e=s.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return s;let[,t,n,r]=e;return`${t}.${n}.${Number(r)+1}`}l(Us,"bumpPatch");function NP(s){let e=s.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(NP,"parseTomlVersion");function FP(s){let e=s.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=s.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}l(FP,"parsePyprojectVersion");function LP(s){return s.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(LP,"parseCsprojVersion");Ps();Et();U();Es();xs();hi();U();import{exec as UP}from"node:child_process";import{promisify as HP}from"node:util";import bt from"chalk";var uu=HP(UP);async function Ft(s,e,t,n={}){let r={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(n.skipRules)return r;let i=je.getRulesForCommand(s,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(`
1538
- ${bt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${bt.green("\u2713")} ${bt.dim(`gate passed (${k})`)}`)}catch(g){return console.log(`${bt.red("\u2717")} gate failed: ${p}`),r.gatesFailed.push(p),r.success=!1,r.output+=`Gate failed: ${p}
1537
+ `);break}}async writeJsonVersion(e,t){let s=await Ut(e,{});s&&(s.version=t,await xs(e,s))}async writeTomlVersion(e,t){let s=await et(e,"");if(!s)return;let r=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Ht(e,r)}async writeXmlVersion(e,t){let s=await et(e,"");if(!s)return;let r=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Ht(e,r)}};function Xf(n){return/^\d+\.\d+\.\d+/.test(n)}l(Xf,"isSemver");function Un(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return n;let[,t,s,r]=e;return`${t}.${s}.${Number(r)+1}`}l(Un,"bumpPatch");function NP(n){let e=n.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(NP,"parseTomlVersion");function FP(n){let e=n.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=n.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}l(FP,"parsePyprojectVersion");function LP(n){return n.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(LP,"parseCsprojVersion");Pn();Et();U();En();xn();hi();U();import{exec as UP}from"node:child_process";import{promisify as HP}from"node:util";import bt from"chalk";var uu=HP(UP);async function Ft(n,e,t,s={}){let r={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return r;let i=De.getRulesForCommand(n,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(`
1538
+ ${bt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${bt.green("\u2713")} ${bt.dim(`gate passed (${k})`)}`)}catch(g){return console.log(`${bt.red("\u2717")} gate failed: ${p}`),r.gatesFailed.push(p),r.success=!1,r.output+=`Gate failed: ${p}
1539
1539
  ${y(g)}
1540
1540
  `,r}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
1541
1541
  ${bt.dim(`[instruction] ${t}-${e}: ${p}`)}`),r.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
1542
- ${bt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await uu(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(`${bt.green("\u2713")} ${bt.dim(`(${f})`)}`)}catch(p){console.log(`${bt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),r.hooksFailed.push(m.description||m.action),r.output+=`Hook failed: ${m.action}
1542
+ ${bt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${bt.green("\u2713")} ${bt.dim(`(${f})`)}`)}catch(p){console.log(`${bt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),r.hooksFailed.push(m.description||m.action),r.output+=`Hook failed: ${m.action}
1543
1543
  ${y(p)}
1544
1544
  `}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
1545
- ${bt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await uu(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(`${bt.green("\u2713")} ${bt.dim(`step passed (${f})`)}`),r.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${bt.red("\u2717")} step failed: ${m.action}`),r.gatesFailed.push(m.description||m.action),r.success=!1,r.output+=`Step failed: ${m.action}
1545
+ ${bt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${bt.green("\u2713")} ${bt.dim(`step passed (${f})`)}`),r.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${bt.red("\u2717")} step failed: ${m.action}`),r.gatesFailed.push(m.description||m.action),r.success=!1,r.output+=`Step failed: ${m.action}
1546
1546
  ${y(p)}
1547
- `,r}}return r}l(Ft,"executeWorkflowRules");ot();var Hs=class extends ve{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;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 F.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await F.completeTask(o)),i||(i="current work");let c=await Ft(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 Ri(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new Ai(t).addFeature(d,i),n.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let w=await this._gitPush(t);g=w.success?"pushed":w.message}await ht.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:z.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 Ft(o,"ship","after",{projectPath:t,skipRules:n.skipHooks}),k=[...c.instructions,...f.instructions];try{n.md||h.step(4,4,"Updating AI context..."),await Bn.sync(t),n.md||h.done("\u2713 AI context updated")}catch(w){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(w))}if(n.md){let w=Jo("ship"),C=L(we(`Shipped: ${i}`,`Version: ${d}`),te("Results",Re([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),k.length>0?te("Agent Instructions",Re(k)):null,le(w.map(T=>({label:T.desc,command:T.cmd}))));console.log(C)}else h.done(`v${d} shipped`),kt("ship");return{success:!0,feature:i,version:d}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async _createShipCommit(e,t){try{await Qe.get("Bash")("git add .");let n=`feat: ${e}
1547
+ `,r}}return r}l(Ft,"executeWorkflowRules");ot();var Hn=class extends ve{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;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 F.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await F.completeTask(o)),i||(i="current work");let c=await Ft(o,"ship","before",{projectPath:t,skipRules:s.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};s.md||h.step(1,4,"Bumping version...");let d=await new Ri(t).bump();s.md||h.step(2,4,"Updating changelog..."),await new Ai(t).addFeature(d,i),s.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let w=await this._gitPush(t);g=w.success?"pushed":w.message}await ht.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:J.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 Ft(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),k=[...c.instructions,...f.instructions];try{s.md||h.step(4,4,"Updating AI context..."),await Ws.sync(t),s.md||h.done("\u2713 AI context updated")}catch(w){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(w))}if(s.md){let w=zo("ship"),E=L(we(`Shipped: ${i}`,`Version: ${d}`),te("Results",Re([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),k.length>0?te("Agent Instructions",Re(k)):null,le(w.map(T=>({label:T.desc,command:T.cmd}))));console.log(E)}else h.done(`v${d} shipped`),kt("ship");return{success:!0,feature:i,version:d}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async _createShipCommit(e,t){try{await Qe.get("Bash")("git add .");let s=`feat: ${e}
1548
1548
 
1549
- Generated with [p/](https://www.prjct.app/)`;return await Qe.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 Qe.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)"}}}};Qt();tc();Se();jl();uc();U();qn();Pt();ot();import{execSync as Hr}from"node:child_process";import JP from"node:fs/promises";import qP from"node:path";import Vs from"chalk";function sh(){try{return!!Hr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(sh,"isHomebrewInstall");function rh(){try{let e=Hr("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}l(rh,"getCurrentVersion");var Ws=class extends ve{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,r=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(r||h.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(n),r||h.stop(),r||h.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(n),r||h.stop(),r||h.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(n),r||h.stop(),!n){try{await Ro.updateVersion(xe)}catch{}try{await new mi().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?this.formatMdOutput(o,n):this.formatTerminalOutput(o,n)}catch(i){return r||h.stop(),h.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=rh();if(e)return sh()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(sh()){try{Hr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=rh();n&&o&&n!==o?t.details.push(`${n} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(r){t.success=!1,t.errors.push(y(r))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},n=await this.getAllProjectIds();if(n.length===0)t.details.push("No projects found");else{let r=0,o=0;for(let i of n)if(!e)try{let a=await $o(i),c=await Mo(i);if(r+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${n.length} project(s)`);else{let i=[`${n.length} project(s) checked`];r>0&&i.push(`${r} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config");else{try{let r=new gn,o=await r.installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`),await r.cleanupLegacyCommands()&&t.details.push("Removed legacy p/ subdirectory")}catch(r){t.errors.push(`Commands: ${y(r)}`)}try{await new gn().installGlobalConfig(),t.details.push("Global config reinstalled")}catch(r){t.errors.push(`Global config: ${y(r)}`)}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(nh(),th));await n()?(await r()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(n){t.success=!1,t.errors.push(y(n))}return t}formatTerminalOutput(e,t){let n=e.phase1.success&&e.phase2.success,r=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?Vs.green("\u2713"):c?Vs.red("\u2717"):Vs.yellow("\u26A0");console.log(` ${u} ${Vs.bold(i)}`);for(let d of a.details)console.log(` ${Vs.dim(d)}`);for(let d of a.errors)console.log(` ${Vs.yellow("\u26A0")} ${d}`)}return console.log(""),t?h.done("Dry run complete \u2014 no changes made"):n?h.done("System updated"):h.warn(`Updated with ${r.length} error(s)`),{success:n,message:t?"Dry run complete":n?"System updated":"Updated with errors"}}formatMdOutput(e,t){let n=e.phase1.success&&e.phase2.success,r=[];r.push(t?"# Update (Dry Run)":"# System Update"),r.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"\u2705":c?"\u274C":"\u26A0\uFE0F";r.push(`## ${u} ${i}`);for(let d of a.details)r.push(`- ${d}`);for(let d of a.errors)r.push(`- \u26A0\uFE0F ${d}`);r.push("")}return t||r.push(n?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(r.join(`
1550
- `)),{success:n,message:t?"Dry run complete":n?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=qP.join(A.getGlobalBasePath(),"projects");try{return(await JP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};Qc();Ar();import $e from"chalk";Ar();Zt();var pu=class extends Je{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:dg,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}},oh=new pu;U();js();ot();var Bs=class extends ve{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await pt.getAll(r);if(i.length===0)return console.log(`
1549
+ Generated with [p/](https://www.prjct.app/)`;return await Qe.get("Bash")(`git commit -m "${s.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(s){return C(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Qe.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)"}}}};Qt();tc();Se();Dl();uc();U();zs();Pt();ot();import{execSync as Hr}from"node:child_process";import zP from"node:fs/promises";import qP from"node:path";import Vn from"chalk";function nh(){try{return!!Hr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(nh,"isHomebrewInstall");function rh(){try{let e=Hr("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}l(rh,"getCurrentVersion");var Wn=class extends ve{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,r=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(r||h.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),r||h.stop(),r||h.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),r||h.stop(),r||h.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),r||h.stop(),!s){try{await Ro.updateVersion(xe)}catch{}try{await new mi().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return r||h.stop(),h.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=rh();if(e)return nh()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(nh()){try{Hr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=rh();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(r){t.success=!1,t.errors.push(y(r))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let r=0,o=0;for(let i of s)if(!e)try{let a=await $o(i),c=await Mo(i);if(r+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];r>0&&i.push(`${r} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config");else{try{let r=new ms,o=await r.installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`),await r.cleanupLegacyCommands()&&t.details.push("Removed legacy p/ subdirectory")}catch(r){t.errors.push(`Commands: ${y(r)}`)}try{await new ms().installGlobalConfig(),t.details.push("Global config reinstalled")}catch(r){t.errors.push(`Global config: ${y(r)}`)}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:s,stopDaemon:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(sh(),th));await s()?(await r()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(y(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,r=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?Vn.green("\u2713"):c?Vn.red("\u2717"):Vn.yellow("\u26A0");console.log(` ${u} ${Vn.bold(i)}`);for(let d of a.details)console.log(` ${Vn.dim(d)}`);for(let d of a.errors)console.log(` ${Vn.yellow("\u26A0")} ${d}`)}return console.log(""),t?h.done("Dry run complete \u2014 no changes made"):s?h.done("System updated"):h.warn(`Updated with ${r.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,r=[];r.push(t?"# Update (Dry Run)":"# System Update"),r.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"\u2705":c?"\u274C":"\u26A0\uFE0F";r.push(`## ${u} ${i}`);for(let d of a.details)r.push(`- ${d}`);for(let d of a.errors)r.push(`- \u26A0\uFE0F ${d}`);r.push("")}return t||r.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(r.join(`
1550
+ `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=qP.join(A.getGlobalBasePath(),"projects");try{return(await zP.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Qc();Ar();import $e from"chalk";Ar();Zt();var pu=class extends ze{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:dg,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}},oh=new pu;U();Dn();ot();var Bn=class extends ve{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await pt.getAll(r);if(i.length===0)return console.log(`
1551
1551
  ${$e.dim("No velocity data yet.")}`),console.log(`${$e.dim("Complete tasks with estimates to build velocity history.")}
1552
1552
  `),{success:!0,message:"No data"};let a=Yo(i,o);await oh.saveMetrics(r,a),console.log(`
1553
1553
  ${$e.cyan("Sprint Velocity")} ${$e.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?$e.green:m.estimationAccuracy>=60?$e.yellow:$e.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${$e.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?$e.green("\u2191"):a.velocityTrend==="declining"?$e.red("\u2193"):$e.dim("\u2192");if(console.log(` Average: ${$e.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${$e.bold(`${a.estimationAccuracy}%`)} ${$e.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1554
1554
  ${$e.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${$e.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${$e.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${$e.green("\u2713")} ${m.category} tasks estimated within ${$e.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=mg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1555
- ${$e.dim("Projection:")}`),console.log(` Backlog: ${$e.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${$e.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{...Sn,...n.velocity}}catch{}return Sn}};Al();bl();import oC from"node:fs/promises";import iC from"node:path";js();var ah=[1,2,3,5,8,13,21],ch={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}},lh=l(s=>ah.includes(s),"isValidPoint"),is=l(s=>ch[s],"pointsToMinutes"),ih=l(s=>{if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),uh=l(s=>{let e=is(s);return`${ih(e.min)}\u2013${ih(e.max)}`},"pointsToTimeRange"),dh=l(async(s,e)=>{let n=(await pt.getAll(s)).filter(a=>a.tags?.includes(e));if(n.length<3)return null;let o=n.reduce((a,c)=>a+XP(c.actualDuration),0)/n.length;return{points:KP(o),basedOn:n.length}},"suggestFromHistory"),KP=l(s=>{let e=1,t=Number.POSITIVE_INFINITY;for(let n of ah){let r=Math.abs(ch[n].typical-s);r<t&&(t=r,e=n)}return e},"findClosestPoint"),XP=l(s=>{let e=0,t=s.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=s.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),e},"parseDuration");Se();U();import ji from"node:fs/promises";import YP from"node:os";import Ii from"node:path";var mu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ii.join(YP.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await ji.mkdir(this.commandsPath,{recursive:!0});let n=Ii.join(this.commandsPath,`${e}.md`),r=this.buildTemplateContent(e,t);return await ji.writeFile(n,r,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=Ii.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=Ii.join(this.commandsPath,`${e}.md`);return await ji.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
1555
+ ${$e.dim("Projection:")}`),console.log(` Backlog: ${$e.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${$e.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async loadVelocityConfig(e){try{let s=await $.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...ks,...s.velocity}}catch{}return ks}};Al();bl();import oC from"node:fs/promises";import iC from"node:path";Dn();var ah=[1,2,3,5,8,13,21],ch={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}},lh=l(n=>ah.includes(n),"isValidPoint"),on=l(n=>ch[n],"pointsToMinutes"),ih=l(n=>{if(n<60)return`${n}m`;let e=Math.floor(n/60),t=n%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),uh=l(n=>{let e=on(n);return`${ih(e.min)}\u2013${ih(e.max)}`},"pointsToTimeRange"),dh=l(async(n,e)=>{let s=(await pt.getAll(n)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+XP(c.actualDuration),0)/s.length;return{points:KP(o),basedOn:s.length}},"suggestFromHistory"),KP=l(n=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of ah){let r=Math.abs(ch[s].typical-n);r<t&&(t=r,e=s)}return e},"findClosestPoint"),XP=l(n=>{let e=0,t=n.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=n.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),e},"parseDuration");Se();U();import Di from"node:fs/promises";import YP from"node:os";import Ii from"node:path";var mu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ii.join(YP.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Di.mkdir(this.commandsPath,{recursive:!0});let s=Ii.join(this.commandsPath,`${e}.md`),r=this.buildTemplateContent(e,t);return await Di.writeFile(s,r,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=Ii.join(this.commandsPath,`${e}.md`);return await Di.unlink(t),{success:!0}}catch(t){return C(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Ii.join(this.commandsPath,`${e}.md`);return await Di.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
1556
1556
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1557
1557
  ---
1558
1558
 
@@ -1588,47 +1588,47 @@ Suggest relevant actions based on the workflow results:
1588
1588
  - View rules: \`prjct workflow ${e} --md\`
1589
1589
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1590
1590
  - Run again: \`p. ${e}\`
1591
- `}},gu=new mu;Tt();fr();Nl();function QP(s){switch(s){case"low":return 2;case"medium":return 5;case"high":return 8}}l(QP,"complexityToPoints");async function ZP(s,e){let t=Is.detectTaskType(e),n=await dh(s,t);if(n){let a=is(n.points);return{taskType:t,estimatedPoints:n.points,estimatedMinutes:a.typical,source:"history"}}let r=Is.estimateComplexity(e),o=QP(r.level),i=is(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(ZP,"estimateTaskForStart");var fu=ZP;Se();se();fe();import{exec as eC}from"node:child_process";import{promisify as tC}from"node:util";var ph=tC(eC),zs="session-snapshot",nC=30,hu=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let r=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:r,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:v(),resumeHint:c};return x.setDoc(e,zs,u),u}getSnapshot(e){try{return x.getDoc(e,zs)}catch{return null}}clearSnapshot(e){try{x.deleteDoc(e,zs)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let n of e)try{if(!x.exists(n))continue;let r=x.getDoc(n,zs);r&&t.push(r)}catch{}return t.sort((n,r)=>new Date(r.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=nC){let t=await A.listProjects(),n=Date.now()-e*24*60*60*1e3,r=0;for(let o of t)try{if(!x.exists(o))continue;let i=x.getDoc(o,zs);i&&new Date(i.timestamp).getTime()<n&&(x.deleteDoc(o,zs),r++)}catch{}return r}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${Kt(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 r=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${r}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${Kt(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1592
- `)}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 ${Kt(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await ph("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await ph("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1593
- `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},Pn=new hu;ys();se();var yu=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,n,r){x.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1594
- VALUES (?, ?, ?, ?)`,t,JSON.stringify(n),JSON.stringify(r),new Date().toISOString())}completeFeedback(e,t,n){let r=x.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!r)return;let o=new Set(JSON.parse(r.suggested_files)),i=new Set(n),a=[...o].filter(d=>i.has(d)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;x.run(e,`UPDATE context_feedback
1591
+ `}},gu=new mu;Tt();fr();Nl();function QP(n){switch(n){case"low":return 2;case"medium":return 5;case"high":return 8}}l(QP,"complexityToPoints");async function ZP(n,e){let t=In.detectTaskType(e),s=await dh(n,t);if(s){let a=on(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let r=In.estimateComplexity(e),o=QP(r.level),i=on(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(ZP,"estimateTaskForStart");var fu=ZP;Se();ne();fe();import{exec as eC}from"node:child_process";import{promisify as tC}from"node:util";var ph=tC(eC),Jn="session-snapshot",sC=30,hu=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let r=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=s.startedAt?Math.round((Date.now()-new Date(s.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(s,i),u={sessionId:s.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:s.taskDescription,taskStatus:s.taskStatus,activeSubtaskIndex:s.activeSubtaskIndex,subtaskCount:s.subtaskCount,branch:r,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:v(),resumeHint:c};return x.setDoc(e,Jn,u),u}getSnapshot(e){try{return x.getDoc(e,Jn)}catch{return null}}clearSnapshot(e){try{x.deleteDoc(e,Jn)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!x.exists(s))continue;let r=x.getDoc(s,Jn);r&&t.push(r)}catch{}return t.sort((s,r)=>new Date(r.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=sC){let t=await A.listProjects(),s=Date.now()-e*24*60*60*1e3,r=0;for(let o of t)try{if(!x.exists(o))continue;let i=x.getDoc(o,Jn);i&&new Date(i.timestamp).getTime()<s&&(x.deleteDoc(o,Jn),r++)}catch{}return r}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${Kt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let r=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${r}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${Kt(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1592
+ `)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${Kt(t*1e3)} of work`),s.join(" ")}async getGitBranch(e){try{let{stdout:t}=await ph("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await ph("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1593
+ `).filter(s=>s.length>0).slice(0,20)}catch{return[]}}},Ts=new hu;yn();ne();var yu=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,r){x.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1594
+ VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(r),new Date().toISOString())}completeFeedback(e,t,s){let r=x.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!r)return;let o=new Set(JSON.parse(r.suggested_files)),i=new Set(s),a=[...o].filter(d=>i.has(d)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;x.run(e,`UPDATE context_feedback
1595
1595
  SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
1596
- WHERE id = ?`,JSON.stringify(n),c,u,new Date().toISOString(),r.id)}getFeedback(e,t){let n=x.get(e,"SELECT precision, recall FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);return n?{precision:n.precision,recall:n.recall}:null}getHistoricalBoosts(e,t){let n=new Map;if(t.length===0)return n;let r=x.query(e,`SELECT * FROM context_feedback
1596
+ WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),r.id)}getFeedback(e,t){let s=x.get(e,"SELECT precision, recall FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);return s?{precision:s.precision,recall:s.recall}:null}getHistoricalBoosts(e,t){let s=new Map;if(t.length===0)return s;let r=x.query(e,`SELECT * FROM context_feedback
1597
1597
  WHERE actual_files IS NOT NULL
1598
- ORDER BY id DESC LIMIT 50`);if(r.length===0)return n;let o=new Set(t),i=new Map;for(let c of r){let u=JSON.parse(c.keywords),d=new Set(u),m=[...o].filter(w=>d.has(w)).length,p=new Set([...o,...d]).size,g=p>0?m/p:0;if(g===0)continue;let f=new Set(JSON.parse(c.suggested_files)),k=new Set(JSON.parse(c.actual_files));for(let w of k){let C=i.get(w)??0;i.set(w,C+g)}for(let w of f)if(!k.has(w)){let C=i.get(w)??0;i.set(w,C-g*.5)}}if(i.size===0)return n;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,u]of i)n.set(c,u/a);return n}},Gr=new yu;Ll();rn();Et();hi();Zo();U();Es();xs();Gl();js();ot();Se();U();fe();se();import sC from"node:crypto";import $i from"node:fs/promises";import mh from"node:path";var Js="1.0.0";function rC(){return{version:Js,lastUpdated:"",checksums:{}}}l(rC,"getDefaultChecksums");var wu=class{static{l(this,"IndexStorage")}getIndexPath(e){return mh.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await $i.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Js?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 rC()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await $i.readFile(e);return sC.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let r=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in r?r[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(r))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:Js,lastUpdated:v(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{x.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await $i.readdir(t);await Promise.all(n.map(r=>$i.unlink(mh.join(t,r))))}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!==Js?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Js)return 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!==Js?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),r=new Map;if(!n)return r;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&r.set(i.path,i.categories);return r}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let r=x.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setIndexMeta(e,t,n){let r=x.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},gh=new wu;function Mi(s,e,t,n){if(s.length===0)return[];let r=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=s.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&r.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(m=>m.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,n).map(a=>a.pattern)}l(Mi,"rankPatterns");function fh(s){let e=new Set;return s.filter(t=>{let n=t.toLowerCase().replace(/[`*_()]/g,"").trim();return e.has(n)?!1:(e.add(n),!0)})}l(fh,"deduplicateDecisions");function hh(s,e){let t=s.toLowerCase(),n=new Set;if(e)try{let r=gh.readDomainsSync(e);if(r?.domains)for(let o of r.domains){if(t.includes(o.name.toLowerCase())){n.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){n.add(o.name);break}}}catch{}return n.size>0?[...n]:["general"]}l(hh,"detectDomainsFromTask");function ku(s,e){if(!s)return null;let t=s.patterns,n=s.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let r=Mi(t,s,e,5),o=new Set;return`### Pattern Briefing (for this task)
1598
+ ORDER BY id DESC LIMIT 50`);if(r.length===0)return s;let o=new Set(t),i=new Map;for(let c of r){let u=JSON.parse(c.keywords),d=new Set(u),m=[...o].filter(w=>d.has(w)).length,p=new Set([...o,...d]).size,g=p>0?m/p:0;if(g===0)continue;let f=new Set(JSON.parse(c.suggested_files)),k=new Set(JSON.parse(c.actual_files));for(let w of k){let E=i.get(w)??0;i.set(w,E+g)}for(let w of f)if(!k.has(w)){let E=i.get(w)??0;i.set(w,E-g*.5)}}if(i.size===0)return s;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,u]of i)s.set(c,u/a);return s}},Gr=new yu;Ll();rs();Et();hi();Zo();U();En();xn();Gl();Dn();ot();Se();U();fe();ne();import nC from"node:crypto";import $i from"node:fs/promises";import mh from"node:path";var zn="1.0.0";function rC(){return{version:zn,lastUpdated:"",checksums:{}}}l(rC,"getDefaultChecksums");var wu=class{static{l(this,"IndexStorage")}getIndexPath(e){return mh.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await $i.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==zn?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 rC()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await $i.readFile(e);return nC.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let r=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in r?r[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(r))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 s={version:zn,lastUpdated:v(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{x.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await $i.readdir(t);await Promise.all(s.map(r=>$i.unlink(mh.join(t,r))))}catch(s){if(!C(s))throw s}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let s=new Date(t.lastFullScan);return(new Date().getTime()-s.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==zn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===zn)return 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!==zn?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let s=await this.readCategories(e),r=new Map;if(!s)return r;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&r.set(i.path,i.categories);return r}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let r=x.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setIndexMeta(e,t,s){let r=x.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},gh=new wu;function Mi(n,e,t,s){if(n.length===0)return[];let r=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=n.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&r.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(m=>m.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}l(Mi,"rankPatterns");function fh(n){let e=new Set;return n.filter(t=>{let s=t.toLowerCase().replace(/[`*_()]/g,"").trim();return e.has(s)?!1:(e.add(s),!0)})}l(fh,"deduplicateDecisions");function hh(n,e){let t=n.toLowerCase(),s=new Set;if(e)try{let r=gh.readDomainsSync(e);if(r?.domains)for(let o of r.domains){if(t.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){s.add(o.name);break}}}catch{}return s.size>0?[...s]:["general"]}l(hh,"detectDomainsFromTask");function ku(n,e){if(!n)return null;let t=n.patterns,s=n.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let r=Mi(t,n,e,5),o=new Set;return`### Pattern Briefing (for this task)
1599
1599
 
1600
- ${r.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(f=>f.length>2),p;if(Array.isArray(n))for(let f=0;f<n.length;f++){if(o.has(f))continue;let k=`${n[f].issue} ${n[f].suggestion}`.toLowerCase();if(m.some(w=>k.includes(w))){p=n[f],o.add(f);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return p&&g.push(` - VIOLATION: ${p.issue} \u2014 ${p.suggestion}`),g.join(`
1600
+ ${r.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(f=>f.length>2),p;if(Array.isArray(s))for(let f=0;f<s.length;f++){if(o.has(f))continue;let k=`${s[f].issue} ${s[f].suggestion}`.toLowerCase();if(m.some(w=>k.includes(w))){p=s[f],o.add(f);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return p&&g.push(` - VIOLATION: ${p.issue} \u2014 ${p.suggestion}`),g.join(`
1601
1601
  `)}).join(`
1602
1602
 
1603
- `)}`}l(ku,"buildPatternBriefing");function Su(s,e,t,n,r,o){let i=e.map(T=>T.path),a=e.slice(0,6).map(T=>`\`${T.path}\``),c=["### Context Contract",`- **Goal**: ${s}`];n&&c.push(`- **Scope**: ${n.taskType} \xB7 ~${n.estimatedPoints}pts \xB7 ~${n.estimatedMinutes}min (${n.source})`),r&&r.length>0&&c.push(`- **Domains**: ${r.join(", ")}`),c.push(`- **Key files**: ${a.length>0?a.join(", "):"Run `prjct sync` to improve file targeting"}`);let d=["All commits include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"],m=o?.rules;if(Array.isArray(m))for(let T of m)typeof T=="string"&&d.push(T);let p=t?.antiPatterns||[];if(Array.isArray(p)){let T=p.filter(O=>O.severity==="high");for(let O of T.slice(0,3))d.push(O.suggestion)}let g=t?.patterns||[],f=new Set;if(Array.isArray(g)){let T=Mi(g.filter(O=>O.source==="repo"),t,i,3);for(let O of T){let G=O.location?` (\`${O.location}\`)`:"";d.push(`${O.description}${G}`),f.add(O.name)}}let k=fh(d);c.push(""),c.push("#### Locked Decisions (NON-NEGOTIABLE)");for(let T of k)c.push(`- ${T}`);let w=Array.isArray(g)?g.filter(T=>!f.has(T.name)):[],C=w.length>0?Mi(w,t,i||[],3):[];return C.length>0&&(c.push(""),c.push("#### Task Patterns (MUST follow)"),C.forEach((T,O)=>{let G=T.location?` (\`${T.location}\`)`:"";c.push(`${O+1}. **${T.name}** \u2014 ${T.description}${G}`)})),c.join(`
1604
- `)}l(Su,"buildContextContract");var aC=[{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}],qs=class extends ve{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;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 Ft(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)&&(a=e),n.md){try{await sn.ensureReady()}catch(Le){return Rt("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(Le)}),{success:!1,error:y(Le)}}let f=await fu(o,c),k=await F.getCurrentTask(o);if(k)return Rt("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:k.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:k};await F.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a,type:f.taskType,estimatedPoints:f.estimatedPoints,estimatedMinutes:f.estimatedMinutes});let w=A.getGlobalProjectPath(o),C=Zc(c),T;try{T=Gr.getHistoricalBoosts(o,C),T.size===0&&(T=void 0)}catch{}let G=({bug:30,chore:40,improvement:80,feature:100}[f.taskType]??80)>=80?15:10,[Q,ne,S,j]=await Promise.all([cC(),qe.getActive(o).catch(()=>null),lC(w),Ds(c,t,{maxFiles:G,minScore:.15,historicalBoosts:T}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),Ce=null;try{let Le=Pn.getSnapshot(o);Le&&(Ce=Pn.formatContinuityContext(Le),Pn.clearSnapshot(o))}catch{}let En=null;if(ne?.analyzedAt){let Le=new Date(ne.analyzedAt),Lt=Math.floor((Date.now()-Le.getTime())/(1e3*60*60*24));Lt>7&&(En=Uc("warn",`Analysis is ${Lt} days old. Run \`p. sync\` to refresh patterns and file index.`))}else ne||(En=Uc("info","No project analysis found. Run `p. sync` for better context targeting."));let cs=null;if(T&&T.size>0){let Le=[...T.entries()].filter(([,Lt])=>Lt>.3).sort((Lt,qr)=>qr[1]-Lt[1]).slice(0,5);Le.length>0&&(cs=`### Previously Useful Files
1605
- ${Le.map(([qr])=>`\`${qr}\``).join(", ")}`)}let Br=hh(c,o),Ui=Hc({description:c,branch:Q,linearId:a,type:f.taskType,estimatedPoints:f.estimatedPoints,estimatedMinutes:f.estimatedMinutes,estimateSource:f.source,domains:Br}),Hi=uC(ne,S),zr=Nm(j.files.map(Le=>({path:Le.path,description:Le.reasons.join(", ")}))),_=j.files.map(Le=>Le.path),Gi=ku(ne,_),Jr=Su(c,j.files,ne,f,Br,S),tr=le([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(Ce,En,Ui,Jr,Hi,zr,cs,Gi,tr));try{let Le=await F.getCurrentTask(o);Le&&Gr.recordSuggestions(o,Le.id,C,j.files.map(Lt=>Lt.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:z.getTimestamp()}),await Ft(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await di.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let m=await fu(o,c);await F.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let p=await Sl.getAvailableAgents(t),g=d.orchestratorContext?.agents?.length||p.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Er("working"),kt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:p,orchestratorContext:d.orchestratorContext,timestamp:z.getTimestamp()}),await Ft(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:p,fibonacci:{isValidPoint:lh,pointsToMinutes:is,pointsToTimeRange:uh,storeEstimate:l(async f=>{let k=is(f);return await F.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return n.md?Rt("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=Hc({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?_m(u,d):"",p=le([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(r){let o=y(r);return n.md?o.includes("Cannot run")||o.includes("working state")?Rt("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 r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await F.getCurrentTask(r);if(!o)return t.md?Rt("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 Ft(r,"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 G=new Date(o.startedAt);c=z.calculateDuration(G),u=Math.round((Date.now()-G.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints,p=o.type||"feature",g=o.linearId;try{await pt.record(r,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:z.getTimestamp(),estimatedDuration:d?yh(d):"0m",actualDuration:c||"0m",variance:d?mC(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[p,g].filter(Boolean)})}catch{}let f="";if(m&&d){let G=u-d,Q=d>0?Math.round((u-d)/d*100):0,ne=G>=0?"+":"";f=` | est: ${m}pt (${yh(d)}) \u2192 ${ne}${Q}%`}let k=[],w=null,C=null;try{if(k=await pC(e,o.startedAt),k.length>0){Gr.completeFeedback(r,o.id,k);let G=Gr.getFeedback(r,o.id);G&&(w=G.precision,C=G.recall)}}catch{}await F.completeTask(r,t.feedback);try{Pn.clearSnapshot(r)}catch{}let T=o.linearId,O=T!=null?await Lr("linear",cn()).catch(()=>!1):!1;if(t.md){let G=c?` (${c})`:"",Q=null;if(k.length>0){let S=k.slice(0,20).map(j=>`\`${j}\``);Q=`### Files Modified (${k.length})
1606
- ${S.join(", ")}`}let ne=null;if(w!==null&&C!==null){let S=Math.round(w*100),j=Math.round(C*100);ne=`### Context Accuracy
1603
+ `)}`}l(ku,"buildPatternBriefing");function Su(n,e,t,s,r,o){let i=e.map(T=>T.path),a=e.slice(0,6).map(T=>`\`${T.path}\``),c=["### Context Contract",`- **Goal**: ${n}`];s&&c.push(`- **Scope**: ${s.taskType} \xB7 ~${s.estimatedPoints}pts \xB7 ~${s.estimatedMinutes}min (${s.source})`),r&&r.length>0&&c.push(`- **Domains**: ${r.join(", ")}`),c.push(`- **Key files**: ${a.length>0?a.join(", "):"Run `prjct sync` to improve file targeting"}`);let d=["All commits include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"],m=o?.rules;if(Array.isArray(m))for(let T of m)typeof T=="string"&&d.push(T);let p=t?.antiPatterns||[];if(Array.isArray(p)){let T=p.filter(O=>O.severity==="high");for(let O of T.slice(0,3))d.push(O.suggestion)}let g=t?.patterns||[],f=new Set;if(Array.isArray(g)){let T=Mi(g.filter(O=>O.source==="repo"),t,i,3);for(let O of T){let G=O.location?` (\`${O.location}\`)`:"";d.push(`${O.description}${G}`),f.add(O.name)}}let k=fh(d);c.push(""),c.push("#### Locked Decisions (NON-NEGOTIABLE)");for(let T of k)c.push(`- ${T}`);let w=Array.isArray(g)?g.filter(T=>!f.has(T.name)):[],E=w.length>0?Mi(w,t,i||[],3):[];return E.length>0&&(c.push(""),c.push("#### Task Patterns (MUST follow)"),E.forEach((T,O)=>{let G=T.location?` (\`${T.location}\`)`:"";c.push(`${O+1}. **${T.name}** \u2014 ${T.description}${G}`)})),c.join(`
1604
+ `)}l(Su,"buildContextContract");var aC=[{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}],qn=class extends ve{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.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 Ft(o,"task","before",{projectPath:t,skipRules:s.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)&&(a=e),s.md){try{await ns.ensureReady()}catch(Le){return Rt("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(Le)}),{success:!1,error:y(Le)}}let f=await fu(o,c),k=await F.getCurrentTask(o);if(k)return Rt("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:k.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:k};await F.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a,type:f.taskType,estimatedPoints:f.estimatedPoints,estimatedMinutes:f.estimatedMinutes});let w=A.getGlobalProjectPath(o),E=Zc(c),T;try{T=Gr.getHistoricalBoosts(o,E),T.size===0&&(T=void 0)}catch{}let G=({bug:30,chore:40,improvement:80,feature:100}[f.taskType]??80)>=80?15:10,[Q,se,S,D]=await Promise.all([cC(),qe.getActive(o).catch(()=>null),lC(w),jn(c,t,{maxFiles:G,minScore:.15,historicalBoosts:T}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),Ce=null;try{let Le=Ts.getSnapshot(o);Le&&(Ce=Ts.formatContinuityContext(Le),Ts.clearSnapshot(o))}catch{}let Cs=null;if(se?.analyzedAt){let Le=new Date(se.analyzedAt),Lt=Math.floor((Date.now()-Le.getTime())/(1e3*60*60*24));Lt>7&&(Cs=Uc("warn",`Analysis is ${Lt} days old. Run \`p. sync\` to refresh patterns and file index.`))}else se||(Cs=Uc("info","No project analysis found. Run `p. sync` for better context targeting."));let cn=null;if(T&&T.size>0){let Le=[...T.entries()].filter(([,Lt])=>Lt>.3).sort((Lt,qr)=>qr[1]-Lt[1]).slice(0,5);Le.length>0&&(cn=`### Previously Useful Files
1605
+ ${Le.map(([qr])=>`\`${qr}\``).join(", ")}`)}let Br=hh(c,o),Ui=Hc({description:c,branch:Q,linearId:a,type:f.taskType,estimatedPoints:f.estimatedPoints,estimatedMinutes:f.estimatedMinutes,estimateSource:f.source,domains:Br}),Hi=uC(se,S),Jr=Nm(D.files.map(Le=>({path:Le.path,description:Le.reasons.join(", ")}))),_=D.files.map(Le=>Le.path),Gi=ku(se,_),zr=Su(c,D.files,se,f,Br,S),tr=le([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(Ce,Cs,Ui,zr,Hi,Jr,cn,Gi,tr));try{let Le=await F.getCurrentTask(o);Le&&Gr.recordSuggestions(o,Le.id,E,D.files.map(Lt=>Lt.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:J.getTimestamp()}),await Ft(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await di.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let m=await fu(o,c);await F.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let p=await Sl.getAvailableAgents(t),g=d.orchestratorContext?.agents?.length||p.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Er("working"),kt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:p,orchestratorContext:d.orchestratorContext,timestamp:J.getTimestamp()}),await Ft(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:p,fibonacci:{isValidPoint:lh,pointsToMinutes:on,pointsToTimeRange:uh,storeEstimate:l(async f=>{let k=on(f);return await F.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return s.md?Rt("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(s.md){let a=i.startedAt?J.calculateDuration(new Date(i.startedAt)):void 0,c=Hc({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?_m(u,d):"",p=le([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(r){let o=y(r);return s.md?o.includes("Cannot run")||o.includes("working state")?Rt("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 s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await F.getCurrentTask(r);if(!o)return t.md?Rt("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 Ft(r,"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 G=new Date(o.startedAt);c=J.calculateDuration(G),u=Math.round((Date.now()-G.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints,p=o.type||"feature",g=o.linearId;try{await pt.record(r,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:J.getTimestamp(),estimatedDuration:d?yh(d):"0m",actualDuration:c||"0m",variance:d?mC(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[p,g].filter(Boolean)})}catch{}let f="";if(m&&d){let G=u-d,Q=d>0?Math.round((u-d)/d*100):0,se=G>=0?"+":"";f=` | est: ${m}pt (${yh(d)}) \u2192 ${se}${Q}%`}let k=[],w=null,E=null;try{if(k=await pC(e,o.startedAt),k.length>0){Gr.completeFeedback(r,o.id,k);let G=Gr.getFeedback(r,o.id);G&&(w=G.precision,E=G.recall)}}catch{}await F.completeTask(r,t.feedback);try{Ts.clearSnapshot(r)}catch{}let T=o.linearId,O=T!=null?await Lr("linear",as()).catch(()=>!1):!1;if(t.md){let G=c?` (${c})`:"",Q=null;if(k.length>0){let S=k.slice(0,20).map(D=>`\`${D}\``);Q=`### Files Modified (${k.length})
1606
+ ${S.join(", ")}`}let se=null;if(w!==null&&E!==null){let S=Math.round(w*100),D=Math.round(E*100);se=`### Context Accuracy
1607
1607
  | Metric | Value |
1608
1608
  |--------|-------|
1609
1609
  | Precision | ${S}% of suggested files were used |
1610
- | Recall | ${j}% of modified files were suggested |`}console.log(L(we("Completed",`${a}${G}`),ut({Duration:c||"unknown",...f?{Variance:f.replace(" | ","")}:{}}),Q,ne,le([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let G=c?` (${c}${f})`:"";T&&O?h.done(`${a}${G} \u2192 Linear linked (update via MCP)`):h.done(`${a}${G}`),Er("completed"),kt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:z.getTimestamp()}),await Ft(r,"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 r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Oe.getActiveTasks(r);if(o.length===0)return t.md?Rt("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(L(te("Queue",`${o.length} task${o.length!==1?"s":""}`),Re(i,!0),le([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),kt("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 r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return n.md?Rt("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 F.pauseTask(o,e);try{await Pn.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(L(we("Task Paused",`**Paused:** ${i.description}`),ut({Reason:e||void 0,"Duration worked":a||void 0}),le([{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})`:""}`),Er("paused"),kt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:z.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async resume(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return n.md?Rt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await F.resumeTask(o);return a?(n.md?console.log(L(we("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Er("working"),kt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?Rt("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(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async workflow(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;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(r){return n.md?console.log(`> Error: ${y(r)}`):h.fail(y(r)),{success:!1,error:y(r)}}}_detectIntent(e){let t=e.trim();for(let{type:n,patterns:r}of aC){let o=t.match(r);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(r=>r.action.toLowerCase().includes(n)||(r.description?.toLowerCase().includes(n)??!1)||r.command.toLowerCase().includes(n)||String(r.id)===n)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let r=t.indexOf('"',1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}if(t.startsWith("'")){let r=t.indexOf("'",1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+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[r,o]=this._parseAction(e);if(!r||!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=Ze.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ze.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=je.addRule(t,{type:"hook",command:c,position:a,action:r,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(L(we("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${r}\``),le([{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 ${r}`),{success:!0,ruleId:d}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ze.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=je.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(L(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),le([{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=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let f=Ze.getAllWorkflows(t).map(w=>w.name).join(", "),k=`Workflow '${o}' not found. Available: ${f}`;return n.md?console.log(`> ${k}`):h.warn(k),{success:!1,error:k}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[m]=this._parseAction(d);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let p=je.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(L(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),le([{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 r=parseInt(e.trim(),10);if(Number.isNaN(r)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!je.removeRule(t,r)){let i=`Rule #${r} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(L(we("Rule Removed",`Removed rule #${r}`))):h.done(`removed rule #${r}`),{success:!0}}async _workflowReset(e,t){let n=je.resetRules(e);return t.md?console.log(L(we("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 r=e.trim(),o=parseInt(r,10);if(!Number.isNaN(o)){let c=je.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 je.updateRule(t,o,{enabled:!1}),n.md?console.log(L(we("Rule Disabled",`#${o} [${c.type}] ${c.action}`),le([{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=je.getAllRules(t),a=this._searchRules(i,r);if(a.length===0){let c=`No rules matching "${r}"`;return n.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return je.updateRule(t,c.id,{enabled:!1}),n.md?console.log(L(we("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(L(te("Multiple matches",`${a.length} rules match "${r}"`),Re(c),le(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${r}" \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(L(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",Re(["`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"])),te("Natural Language (EN/ES)",Re(['`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 r=["task","done","ship","sync"],o;if(e&&r.includes(e)?o=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return n.md?console.log(L(te("Workflow Rules","No rules configured"),le([{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]:r,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(dC(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(te(c,u),a.length>0?Om(a.join(`
1610
+ | Recall | ${D}% of modified files were suggested |`}console.log(L(we("Completed",`${a}${G}`),ut({Duration:c||"unknown",...f?{Variance:f.replace(" | ","")}:{}}),Q,se,le([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let G=c?` (${c}${f})`:"";T&&O?h.done(`${a}${G} \u2192 Linear linked (update via MCP)`):h.done(`${a}${G}`),Er("completed"),kt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:J.getTimestamp()}),await Ft(r,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Oe.getActiveTasks(r);if(o.length===0)return t.md?Rt("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(L(te("Queue",`${o.length} task${o.length!==1?"s":""}`),Re(i,!0),le([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),kt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async pause(e="",t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return s.md?Rt("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=J.calculateDuration(new Date(i.startedAt))),await F.pauseTask(o,e);try{await Ts.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(s.md)console.log(L(we("Task Paused",`**Paused:** ${i.description}`),ut({Reason:e||void 0,"Duration worked":a||void 0}),le([{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})`:""}`),Er("paused"),kt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:J.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async resume(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return s.md?Rt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await F.resumeTask(o);return a?(s.md?console.log(L(we("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Er("working"),kt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:J.getTimestamp()}),{success:!0,task:a.description}):(s.md?Rt("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(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async workflow(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.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,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(r){return s.md?console.log(`> Error: ${y(r)}`):h.fail(y(r)),{success:!1,error:y(r)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:r}of aC){let o=t.match(r);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:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(r=>r.action.toLowerCase().includes(s)||(r.description?.toLowerCase().includes(s)??!1)||r.command.toLowerCase().includes(s)||String(r.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let r=t.indexOf('"',1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}if(t.startsWith("'")){let r=t.indexOf("'",1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[r,o]=this._parseAction(e);if(!r||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.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 s.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=Ze.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ze.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return s.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=De.addRule(t,{type:"hook",command:c,position:a,action:r,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${r}\``),le([{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 ${r}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ze.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.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 s.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=De.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),le([{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,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let f=Ze.getAllWorkflows(t).map(w=>w.name).join(", "),k=`Workflow '${o}' not found. Available: ${f}`;return s.md?console.log(`> ${k}`):h.warn(k),{success:!1,error:k}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.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 s.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let p=De.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),le([{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,s){let r=parseInt(e.trim(),10);if(Number.isNaN(r)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!De.removeRule(t,r)){let i=`Rule #${r} not found`;return s.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return s.md?console.log(L(we("Rule Removed",`Removed rule #${r}`))):h.done(`removed rule #${r}`),{success:!0}}async _workflowReset(e,t){let s=De.resetRules(e);return t.md?console.log(L(we("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):h.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let r=e.trim(),o=parseInt(r,10);if(!Number.isNaN(o)){let c=De.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return De.updateRule(t,o,{enabled:!1}),s.md?console.log(L(we("Rule Disabled",`#${o} [${c.type}] ${c.action}`),le([{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=De.getAllRules(t),a=this._searchRules(i,r);if(a.length===0){let c=`No rules matching "${r}"`;return s.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return De.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(we("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(te("Multiple matches",`${a.length} rules match "${r}"`),Re(c),le(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${r}" \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(L(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",Re(["`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"])),te("Natural Language (EN/ES)",Re(['`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,s){let r=["task","done","ship","sync"],o;if(e&&r.includes(e)?o=De.getRulesForCommand(t,e):o=De.getAllRules(t),o.length===0)return s.md?console.log(L(te("Workflow Rules","No rules configured"),le([{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(s.md){let i=e?[e]:r,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(dC(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(te(c,u),a.length>0?Om(a.join(`
1611
1611
 
1612
- `),""):null,le([{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 r=je.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(r.length>0){let u=`Ship workflow already has ${r.length} rule${r.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 yi(t),i=0,a=[],c=je.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=je.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=je.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(L(we("Workflow Initialized",`Added ${a.length} default ship rules`),Re(a),le([{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,r){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Ze.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ze.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ze.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=Ze.createWorkflow(t,{name:i,description:a}),d=await gu.generateWorkflowTemplate(i,a);if(!d.success){Ze.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return r.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return r.md?console.log(L(we("Workflow Created",`Created workflow: ${i}`),te("Description",a),te("Template",`Installed at ${d.path}`),le([{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(`
1613
- Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return r.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let n=Ze.getAllWorkflows(e);if(n.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):h.warn(i),{success:!0,workflows:[]}}let r=n.filter(i=>i.isBuiltin),o=n.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(r.length>0){let a=r.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
1612
+ `),""):null,le([{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,s){let r=De.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(r.length>0){let u=`Ship workflow already has ${r.length} rule${r.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let o=await yi(t),i=0,a=[],c=De.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=De.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=De.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(s.md)console.log(L(we("Workflow Initialized",`Added ${a.length} default ship rules`),Re(a),le([{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,s,r){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Ze.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ze.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ze.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=Ze.createWorkflow(t,{name:i,description:a}),d=await gu.generateWorkflowTemplate(i,a);if(!d.success){Ze.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return r.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return r.md?console.log(L(we("Workflow Created",`Created workflow: ${i}`),te("Description",a),te("Template",`Installed at ${d.path}`),le([{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(`
1613
+ Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return r.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Ze.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):h.warn(i),{success:!0,workflows:[]}}let r=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(r.length>0){let a=r.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
1614
1614
  `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Custom Workflows",a.join(`
1615
- `)))}console.log(L(...i,le([{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":""}`),r.length>0){console.log(`
1615
+ `)))}console.log(L(...i,le([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(h.done(`${s.length} workflow${s.length!==1?"s":""}`),r.length>0){console.log(`
1616
1616
  Built-in:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1617
- Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:n}}async _workflowDelete(e,t,n){let r=e.trim();if(!r){let o="Usage: prjct workflow delete <name>";return n.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!Ze.deleteWorkflow(t,r)){let i=`Workflow '${r}' not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await gu.deleteWorkflowTemplate(r),n.md?console.log(L(we("Workflow Deleted",`Deleted workflow: ${r}`))):h.done(`deleted workflow: ${r}`),{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 r=await this.ensureProjectInit(t);if(!r.success)return r;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=Ze.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 Ft(o,i,"before",{projectPath:t});if(!c.success){if(n.md)Rt("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 Ft(o,i,"after",{projectPath:t}),n.md?console.log(L(we(`Workflow: ${i}`,a.description||""),le([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=y(r);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 r=await Pn.cleanup();return t.md?console.log(we("Cleanup",`Removed ${r} stale snapshot${r!==1?"s":""}`)):h.done(`cleaned ${r} stale snapshot${r!==1?"s":""}`),{success:!0,cleaned:r}}let n=await Pn.listAllSnapshots();if(n.length===0)return t.md?Rt("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 r=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(L(te("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),Re(r),le([{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 r of n){let o=z.formatDuration(Date.now()-new Date(r.timestamp).getTime()),i=r.projectName||r.projectId.slice(0,8);console.log(` [${r.taskStatus}] ${i} \u2014 ${r.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function yh(s){if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`}l(yh,"formatMinutesToDuration");async function cC(){try{let{execSync:s}=await import("node:child_process");return s("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(cC,"getGitBranch");async function lC(s){try{let e=iC.join(s,"analysis","repo-analysis.json"),t=await oC.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(lC,"loadRepoAnalysis");function uC(s,e){if(!s&&!e)return null;let t=e?.ecosystem||null,n=s?.languages?.join(", ")||null,r=s?.frameworks?.join(", ")||null,o=s?.packageManager||null,i=s?.sourceDir||e?.structure?.srcDir||null,a=s?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),r&&(c.Frameworks=r),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=ut(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
1617
+ Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let r=e.trim();if(!r){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!Ze.deleteWorkflow(t,r)){let i=`Workflow '${r}' not found`;return s.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await gu.deleteWorkflowTemplate(r),s.md?console.log(L(we("Workflow Deleted",`Deleted workflow: ${r}`))):h.done(`deleted workflow: ${r}`),{success:!0}}catch(o){let i=y(o);return s.md?console.log(`> Error: ${i}`):h.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.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 s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let a=Ze.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=await Ft(o,i,"before",{projectPath:t});if(!c.success){if(s.md)Rt("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 Ft(o,i,"after",{projectPath:t}),s.md?console.log(L(we(`Workflow: ${i}`,a.description||""),le([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=y(r);return s.md?console.log(`> Error: ${o}`):h.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let r=await Ts.cleanup();return t.md?console.log(we("Cleanup",`Removed ${r} stale snapshot${r!==1?"s":""}`)):h.done(`cleaned ${r} stale snapshot${r!==1?"s":""}`),{success:!0,cleaned:r}}let s=await Ts.listAllSnapshots();if(s.length===0)return t.md?Rt("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 r=s.map(o=>{let i=J.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(L(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Re(r),le([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let r of s){let o=J.formatDuration(Date.now()-new Date(r.timestamp).getTime()),i=r.projectName||r.projectId.slice(0,8);console.log(` [${r.taskStatus}] ${i} \u2014 ${r.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}};function yh(n){if(n<60)return`${n}m`;let e=Math.floor(n/60),t=n%60;return t>0?`${e}h ${t}m`:`${e}h`}l(yh,"formatMinutesToDuration");async function cC(){try{let{execSync:n}=await import("node:child_process");return n("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(cC,"getGitBranch");async function lC(n){try{let e=iC.join(n,"analysis","repo-analysis.json"),t=await oC.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e),null}}l(lC,"loadRepoAnalysis");function uC(n,e){if(!n&&!e)return null;let t=e?.ecosystem||null,s=n?.languages?.join(", ")||null,r=n?.frameworks?.join(", ")||null,o=n?.packageManager||null,i=n?.sourceDir||e?.structure?.srcDir||null,a=n?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),s&&(c.Languages=s),r&&(c.Frameworks=r),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=ut(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
1618
1618
  ${Re(g)}`}return[u?`### Project
1619
1619
  ${u}`:null,m].filter(Boolean).join(`
1620
1620
 
1621
- `)||null}l(uC,"buildProjectContext");function dC(s,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),n=e.filter(p=>p.type==="instruction"&&p.position==="before"),r=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),c=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=l((p,g,f)=>{let k=g.map(O=>` ${O.enabled?f:"o"} #${O.id} ${O.action}`),w=[p,...k],T=Math.max(...w.map(O=>O.length))+2;u.push(`+${"-".repeat(T)}+`);for(let O of w)u.push(`| ${O.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"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)),r.length>0&&(d("HOOKS (before)",r,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${s.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(`
1622
- `)}l(dC,"buildFlowDiagram");async function pC(s,e){let{execSync:t}=await import("node:child_process"),n=new Set,r={cwd:s,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,r);for(let i of o.split(`
1623
- `)){let a=i.trim();a&&n.add(a)}}catch{}try{let o=t("git diff --cached --name-only",r);for(let i of o.split(`
1624
- `)){let a=i.trim();a&&n.add(a)}}catch{}try{let o=t("git diff --name-only",r);for(let i of o.split(`
1625
- `)){let a=i.trim();a&&n.add(a)}}catch{}return[...n]}l(pC,"getFilesModifiedSinceTaskStart");function mC(s){let e=s>=0?"+":"-",t=Math.abs(s);if(t>=60){let n=Math.floor(t/60),r=t%60;return r>0?`${e}${n}h ${r}m`:`${e}${n}h`}return`${e}${t}m`}l(mC,"formatVariance");var Ks=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new qs,this.planning=new ts,this.shipping=new Hs,this.analytics=new Ms,this.performanceCmds=new Ns,this.maintenance=new _s,this.analysis=new rs,this.setupCmds=new Fs,this.updateCmds=new Ws,this.velocityCmds=new Bs,this.contextCmds=new os,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 cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}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 enrich(e=null,t=process.cwd(),n={}){return this.maintenance.enrich(e,t,n)}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)}},yV=new Ks;Si();var wh={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}},kh=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,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,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];ki();Qt();Se();U();We();ot();import{execSync as Oi}from"node:child_process";import mt from"node:fs/promises";import gC from"node:os";import ln from"node:path";import fC from"node:readline";import Te from"chalk";var _i="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Vr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function bh(s){let e=0;try{let t=await mt.readdir(s,{withFileTypes:!0});for(let n of t){let r=ln.join(s,n.name);if(n.isDirectory())e+=await bh(r);else try{let o=await mt.stat(r);e+=o.size}catch{}}}catch{}return e}l(bh,"getDirectorySize");function Sh(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}l(Sh,"formatSize");async function hC(s){try{return(await mt.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(hC,"countDirectoryItems");function yC(){let s={homebrew:!1,npm:!1};try{Oi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{Oi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}l(yC,"detectInstallation");async function wC(){let s=[],e=Yu(),t=A.getGlobalBasePath(),n=await D(t),r=n?await hC(ln.join(t,"projects")):0,o=n?await bh(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=ln.join(e.claude.config,"CLAUDE.md"),a=await D(i),c=!1;if(a)try{let T=await mt.readFile(i,"utf-8");c=T.includes(_i)&&T.includes(Vr)}catch{}s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await D(u);s.push({path:u,type:"file",description:"Claude router",exists:d});let m=ln.join(e.claude.config,"prjct-statusline.sh"),p=await D(m);s.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,f=await D(g);s.push({path:g,type:"file",description:"Gemini router",exists:f});let k=ln.join(e.gemini.config,"GEMINI.md"),w=await D(k),C=!1;if(w)try{let T=await mt.readFile(k,"utf-8");C=T.includes(_i)&&T.includes(Vr)}catch{}return w&&C&&s.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}l(wC,"gatherUninstallItems");async function kC(s){try{let e=await mt.readFile(s,"utf-8");if(!e.includes(_i)||!e.includes(Vr))return!1;let t=e.indexOf(_i),n=e.indexOf(Vr)+Vr.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
1626
-
1627
- `).trim(),!r||r.trim().length===0?await mt.unlink(s):await mt.writeFile(s,`${r}
1628
- `,"utf-8"),!0}catch{return!1}}l(kC,"removePrjctSection");async function SC(){let s=gC.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ln.join(s,`.prjct-backup-${e}`);try{await mt.mkdir(t,{recursive:!0});let n=A.getGlobalBasePath();return await D(n)&&await vh(n,ln.join(t,".prjct-cli")),t}catch{return null}}l(SC,"createBackup");async function vh(s,e){await mt.mkdir(e,{recursive:!0});let t=await mt.readdir(s,{withFileTypes:!0});for(let n of t){let r=ln.join(s,n.name),o=ln.join(e,n.name);n.isDirectory()?await vh(r,o):await mt.copyFile(r,o)}}l(vh,"copyDirectory");async function bC(s,e,t){let n=[],r=[];for(let o of s)if(o.exists)try{o.type==="section"?await kC(o.path)&&n.push(o.path):o.type==="directory"?(await mt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await mt.unlink(o.path),n.push(o.path))}catch(i){r.push(`${o.path}: ${y(i)}`)}try{await new gn().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Oi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Oi("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){r.push(`npm: ${y(o)}`)}}return{deleted:n,errors:r}}l(bC,"performUninstall");async function vC(s){let e=fC.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(s,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(vC,"promptConfirmation");async function TC(s={},e=process.cwd()){let t=await wC(),n=yC(),r=t.filter(c=>c.exists);if(r.length===0&&!n.homebrew&&!n.npm)return console.log(Te.yellow(`
1629
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Te.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Te.white("The following will be permanently deleted:")),console.log("");for(let c of r){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Te.dim("(section only)"):c.size&&(d=Te.dim(`(${Sh(c.size)})`)),console.log(` ${Te.cyan(u.padEnd(35))} ${d}`),console.log(` ${Te.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Te.cyan("Homebrew".padEnd(35))} ${Te.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Te.cyan("npm global".padEnd(35))} ${Te.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Te.dim(` Total size: ${Sh(o)}`)),console.log("")),s.dryRun)return console.log(Te.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(s.backup){console.log(Te.blue("Creating backup..."));let c=await SC();c?(console.log(Te.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Te.yellow("Failed to create backup, continuing..."))}if(!s.force&&(console.log(Te.yellow('Type "uninstall" to confirm:')),!await vC("> ")))return console.log(Te.yellow(`
1630
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Te.blue("Removing prjct..."));let{deleted:i,errors:a}=await bC(t,n,s);if(console.log(""),i.length>0&&console.log(Te.green(`Removed ${i.length} items`)),a.length>0){console.log(Te.yellow(`
1631
- ${a.length} errors:`));for(let c of a)console.log(Te.red(` - ${c}`))}return console.log(""),console.log(Te.green("prjct has been uninstalled.")),console.log(Te.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(TC,"uninstall");var Ni=class extends ve{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return TC(e,t)}};var as=new qs,Fi=new ts,PC=new Hs,Th=new Ms,CC=new Ns,Cn=new _s,Xs=new rs,Ph=new Fs,EC=new os,xC=new Bs,AC=new Ni,RC=new Ws;function DC(){for(let[s,e]of Object.entries(wh))B.registerCategory(s,e)}l(DC,"registerCategories");function jC(){if(B.has("work"))return;DC();let s=l(e=>kh.find(t=>t.name===e),"getMeta");B.registerMethod("task",as,"now",s("task")),B.registerMethod("done",as,"done",s("done")),B.registerMethod("next",as,"next",s("next")),B.registerMethod("pause",as,"pause",s("pause")),B.registerMethod("resume",as,"resume",s("resume")),B.registerMethod("workflow",as,"workflow",s("workflow")),B.registerMethod("sessions",as,"sessions",s("sessions")),B.registerMethod("init",Fi,"init",s("init")),B.registerMethod("bug",Fi,"bug",s("bug")),B.registerMethod("idea",Fi,"idea",s("idea")),B.registerMethod("spec",Fi,"spec",s("spec")),B.registerMethod("ship",PC,"ship",s("ship")),B.registerMethod("dash",Th,"dash",s("dash")),B.registerMethod("help",Th,"help",s("help")),B.registerMethod("perf",CC,"perf",s("perf")),B.registerMethod("velocity",xC,"velocity",s("velocity")),B.registerMethod("cleanup",Cn,"cleanup",s("cleanup")),B.registerMethod("cleanup-projects",Cn,"cleanupProjects",s("cleanup-projects")),B.registerMethod("design",Cn,"design",s("design")),B.registerMethod("recover",Cn,"recover",s("recover")),B.registerMethod("undo",Cn,"undo",s("undo")),B.registerMethod("redo",Cn,"redo",s("redo")),B.registerMethod("history",Cn,"history",s("history")),B.registerMethod("enrich",Cn,"enrich",s("enrich")),B.registerMethod("analyze",Xs,"analyze",s("analyze")),B.registerMethod("sync",Xs,"sync",s("sync")),B.registerMethod("stats",Xs,"stats",s("stats")),B.registerMethod("status",Xs,"status",s("status")),B.registerMethod("seal",Xs,"seal",s("seal")),B.registerMethod("verify",Xs,"verify",s("verify")),B.registerMethod("start",Ph,"start",s("start")),B.registerMethod("setup",Ph,"setup",s("setup")),B.registerMethod("uninstall",AC,"uninstall",s("uninstall")),B.registerMethod("update",RC,"update",s("update")),B.registerMethod("context",EC,"context",s("context"))}l(jC,"registerAllCommands");jC();ft();sr();Pt();import{Hono as GC}from"hono";import{cors as VC}from"hono/cors";import{logger as WC}from"hono/logger";Se();se();Un();rn();Ps();Et();U();hn();import IC from"node:fs/promises";import $C from"node:path";import{Hono as MC}from"hono";function OC(s){return A.getGlobalProjectPath(s)}l(OC,"getProjectDataPath");function Ch(s,e){let t=new MC,n=OC(s);return t.get("/state",async r=>{let o=await F.read(s);return r.json(o)}),t.get("/queue",async r=>{let o=await Oe.read(s);return r.json(o)}),t.get("/ideas",async r=>{let o=await nt.read(s);return r.json(o)}),t.get("/roadmap",async r=>{let o=x.getDoc(s,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await ht.read(s);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([F.read(s),Oe.read(s),nt.read(s),ht.read(s)]),u=x.getDoc(s,"roadmap");return r.json({projectId:s,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await F.write(s,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=$C.join(n,"context",`${o}.md`),c=await IC.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||H.error(`Context read error: ${y(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Ch,"createRoutes");Se();se();Un();rn();Ps();Et();import Ys from"node:fs/promises";import _C from"node:path";import{Hono as NC}from"hono";var FC=A.getGlobalBasePath(),Qs=_C.join(FC,"projects");function Li(s){return x.getDoc(s,"project")}l(Li,"getProjectConfig");async function bu(s){if(!s)return"";let e=new Date(s),n=new Date().getTime()-e.getTime(),r=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}l(bu,"calculateDuration");function Eh(){let s=new NC;return s.get("/projects",async e=>{try{await Ys.mkdir(Qs,{recursive:!0});let n=(await Ys.readdir(Qs,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(n.map(async o=>{let i=Li(o),a=await F.read(o),c=await Oe.read(o),u=await nt.read(o),d=await ht.read(o),m=a?.currentTask,p=await bu(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 r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),s.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,r,o,i,a]=await Promise.all([Promise.resolve(Li(t)),F.read(t),Oe.read(t),nt.read(t),ht.read(t)]),c=x.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await bu(r.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:r||{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)}}),s.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await F.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,o=await F.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:r},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await F.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await F.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:r}=n;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([F.read(t),Oe.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===r);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=n;if(!r)return e.json({success:!1,error:"text required"},400);let a=await nt.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.get("/stats/global",async e=>{try{await Ys.mkdir(Qs,{recursive:!0});let n=(await Ys.readdir(Qs,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of n){let u=await F.read(c),d=await Oe.read(c),m=await nt.read(c),p=await ht.read(c);u?.currentTask&&a++,r+=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:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Ys.mkdir(Qs,{recursive:!0});let r=(await Ys.readdir(Qs,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Li(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await F.read(d),p=Li(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await bu(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:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s}l(Eh,"createExtendedRoutes");import{streamSSE as LC}from"hono/streaming";var xh=3600*1e3,UC=300*1e3,HC=3e4;function Ah(){let s=new Map,e=null;function t(o){let i=s.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),s.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of s)o-new Date(a.client.connectedAt).getTime()>xh&&t(i)},UC),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),n(),{handleConnection(o){return LC(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},HC),p=setTimeout(()=>{t(a)},xh);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),s.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 s)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return s.size},shutdown(){r();for(let o of[...s.keys()])t(o)}}}l(Ah,"createSSEManager");function Rh(s){let e=new GC,t=Ah();s.enableCors!==!1&&e.use("*",VC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),s.enableLogging!==!1&&e.use("*",WC()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:xe,projectId:s.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=Ch(s.projectId,s.projectPath);e.route("/api",n);let r=Eh();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=s.port,a=s.host||"0.0.0.0";if(Dn())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: ${s.projectId}`),console.log(` Runtime: ${Dn()?"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(Rh,"createServer");var Dh=3478;se();du();var zC=50,Zs=null,Wr=null,ge=null,Pe=null;async function jh(s){let e=Ne.socket(),t=Ne.pid(),n=Ne.runDir();if(Fe.mkdirSync(n,{recursive:!0}),Fe.existsSync(t)){let i=parseInt(Fe.readFileSync(t,"utf-8").trim(),10);YC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Fe.unlinkSync(t)}Fe.existsSync(e)&&Fe.unlinkSync(e),eE();let r=QC(),o=null;if(r)try{o=Fe.statSync(r).mtimeMs}catch{}if(Pe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Yf,idleTimer:null,entryPath:r,entryMtime:o},ge=new Ks,Zs=BC(i=>JC(i)),Zs.listen(e,()=>{Fe.chmodSync(e,384),Fe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),Ih()}),Zs.on("error",i=>{console.error("Daemon socket error:",i.message),er(1)}),!s.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=s.port||Dh;Wr=Rh({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Wr.start()}}catch{}if(process.on("SIGTERM",()=>er(0)),process.on("SIGINT",()=>er(0)),process.on("SIGHUP",()=>{ge=new Ks,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}l(jh,"startDaemon");function JC(s){let e="";s.on("data",async t=>{if(e+=t.toString(),e.length>Qf){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};s.write(Gs(r)),s.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1632
- `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await qC(o);s.write(Gs(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(Gs(i))}}}),s.on("error",()=>{})}l(JC,"handleConnection");async function qC(s){if(!Pe||!ge)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Ih(),Pe.commandsServed++,Pe.lastActivity=Date.now(),Pe.commandsServed%zC===0&&N.checkpointAll(),$h()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),er(0)},200)),s.command==="daemon")return XC(s);if(s.command==="__ping")return{id:s.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await KC(s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1621
+ `)||null}l(uC,"buildProjectContext");function dC(n,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),s=e.filter(p=>p.type==="instruction"&&p.position==="before"),r=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),c=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=l((p,g,f)=>{let k=g.map(O=>` ${O.enabled?f:"o"} #${O.id} ${O.action}`),w=[p,...k],T=Math.max(...w.map(O=>O.length))+2;u.push(`+${"-".repeat(T)}+`);for(let O of w)u.push(`| ${O.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"drawBox"),m=l(p=>{p.push(" |"),p.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),m(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),m(u)),r.length>0&&(d("HOOKS (before)",r,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${n.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(`
1622
+ `)}l(dC,"buildFlowDiagram");async function pC(n,e){let{execSync:t}=await import("node:child_process"),s=new Set,r={cwd:n,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,r);for(let i of o.split(`
1623
+ `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",r);for(let i of o.split(`
1624
+ `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",r);for(let i of o.split(`
1625
+ `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(pC,"getFilesModifiedSinceTaskStart");function mC(n){let e=n>=0?"+":"-",t=Math.abs(n);if(t>=60){let s=Math.floor(t/60),r=t%60;return r>0?`${e}${s}h ${r}m`:`${e}${s}h`}return`${e}${t}m`}l(mC,"formatVariance");var Kn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new qn,this.planning=new en,this.shipping=new Hn,this.analytics=new Mn,this.performanceCmds=new Nn,this.maintenance=new _n,this.analysis=new nn,this.setupCmds=new Fn,this.updateCmds=new Wn,this.velocityCmds=new Bn,this.contextCmds=new rn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}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(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}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(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}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 cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}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 enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}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(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}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,s){return this.workflow.logToMemory(e,t,s)}},yV=new Kn;Si();var wh={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}},kh=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,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,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];ki();Qt();Se();U();We();ot();import{execSync as Oi}from"node:child_process";import mt from"node:fs/promises";import gC from"node:os";import cs from"node:path";import fC from"node:readline";import Te from"chalk";var _i="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Vr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function bh(n){let e=0;try{let t=await mt.readdir(n,{withFileTypes:!0});for(let s of t){let r=cs.join(n,s.name);if(s.isDirectory())e+=await bh(r);else try{let o=await mt.stat(r);e+=o.size}catch{}}}catch{}return e}l(bh,"getDirectorySize");function Sh(n){if(n===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(n)/Math.log(1024));return`${(n/1024**t).toFixed(1)} ${e[t]}`}l(Sh,"formatSize");async function hC(n){try{return(await mt.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(hC,"countDirectoryItems");function yC(){let n={homebrew:!1,npm:!1};try{Oi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{Oi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}l(yC,"detectInstallation");async function wC(){let n=[],e=Yu(),t=A.getGlobalBasePath(),s=await j(t),r=s?await hC(cs.join(t,"projects")):0,o=s?await bh(t):0;n.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:s});let i=cs.join(e.claude.config,"CLAUDE.md"),a=await j(i),c=!1;if(a)try{let T=await mt.readFile(i,"utf-8");c=T.includes(_i)&&T.includes(Vr)}catch{}n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await j(u);n.push({path:u,type:"file",description:"Claude router",exists:d});let m=cs.join(e.claude.config,"prjct-statusline.sh"),p=await j(m);n.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,f=await j(g);n.push({path:g,type:"file",description:"Gemini router",exists:f});let k=cs.join(e.gemini.config,"GEMINI.md"),w=await j(k),E=!1;if(w)try{let T=await mt.readFile(k,"utf-8");E=T.includes(_i)&&T.includes(Vr)}catch{}return w&&E&&n.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}l(wC,"gatherUninstallItems");async function kC(n){try{let e=await mt.readFile(n,"utf-8");if(!e.includes(_i)||!e.includes(Vr))return!1;let t=e.indexOf(_i),s=e.indexOf(Vr)+Vr.length,r=e.substring(0,t)+e.substring(s);return r=r.replace(/\n{3,}/g,`
1626
+
1627
+ `).trim(),!r||r.trim().length===0?await mt.unlink(n):await mt.writeFile(n,`${r}
1628
+ `,"utf-8"),!0}catch{return!1}}l(kC,"removePrjctSection");async function SC(){let n=gC.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=cs.join(n,`.prjct-backup-${e}`);try{await mt.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await j(s)&&await vh(s,cs.join(t,".prjct-cli")),t}catch{return null}}l(SC,"createBackup");async function vh(n,e){await mt.mkdir(e,{recursive:!0});let t=await mt.readdir(n,{withFileTypes:!0});for(let s of t){let r=cs.join(n,s.name),o=cs.join(e,s.name);s.isDirectory()?await vh(r,o):await mt.copyFile(r,o)}}l(vh,"copyDirectory");async function bC(n,e,t){let s=[],r=[];for(let o of n)if(o.exists)try{o.type==="section"?await kC(o.path)&&s.push(o.path):o.type==="directory"?(await mt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await mt.unlink(o.path),s.push(o.path))}catch(i){r.push(`${o.path}: ${y(i)}`)}try{await new ms().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Oi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Oi("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){r.push(`npm: ${y(o)}`)}}return{deleted:s,errors:r}}l(bC,"performUninstall");async function vC(n){let e=fC.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l(vC,"promptConfirmation");async function TC(n={},e=process.cwd()){let t=await wC(),s=yC(),r=t.filter(c=>c.exists);if(r.length===0&&!s.homebrew&&!s.npm)return console.log(Te.yellow(`
1629
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Te.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Te.white("The following will be permanently deleted:")),console.log("");for(let c of r){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Te.dim("(section only)"):c.size&&(d=Te.dim(`(${Sh(c.size)})`)),console.log(` ${Te.cyan(u.padEnd(35))} ${d}`),console.log(` ${Te.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Te.cyan("Homebrew".padEnd(35))} ${Te.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Te.cyan("npm global".padEnd(35))} ${Te.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Te.dim(` Total size: ${Sh(o)}`)),console.log("")),n.dryRun)return console.log(Te.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(n.backup){console.log(Te.blue("Creating backup..."));let c=await SC();c?(console.log(Te.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Te.yellow("Failed to create backup, continuing..."))}if(!n.force&&(console.log(Te.yellow('Type "uninstall" to confirm:')),!await vC("> ")))return console.log(Te.yellow(`
1630
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Te.blue("Removing prjct..."));let{deleted:i,errors:a}=await bC(t,s,n);if(console.log(""),i.length>0&&console.log(Te.green(`Removed ${i.length} items`)),a.length>0){console.log(Te.yellow(`
1631
+ ${a.length} errors:`));for(let c of a)console.log(Te.red(` - ${c}`))}return console.log(""),console.log(Te.green("prjct has been uninstalled.")),console.log(Te.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(TC,"uninstall");var Ni=class extends ve{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return TC(e,t)}};var an=new qn,Fi=new en,PC=new Hn,Th=new Mn,CC=new Nn,Ps=new _n,Xn=new nn,Ph=new Fn,EC=new rn,xC=new Bn,AC=new Ni,RC=new Wn;function jC(){for(let[n,e]of Object.entries(wh))B.registerCategory(n,e)}l(jC,"registerCategories");function DC(){if(B.has("work"))return;jC();let n=l(e=>kh.find(t=>t.name===e),"getMeta");B.registerMethod("task",an,"now",n("task")),B.registerMethod("done",an,"done",n("done")),B.registerMethod("next",an,"next",n("next")),B.registerMethod("pause",an,"pause",n("pause")),B.registerMethod("resume",an,"resume",n("resume")),B.registerMethod("workflow",an,"workflow",n("workflow")),B.registerMethod("sessions",an,"sessions",n("sessions")),B.registerMethod("init",Fi,"init",n("init")),B.registerMethod("bug",Fi,"bug",n("bug")),B.registerMethod("idea",Fi,"idea",n("idea")),B.registerMethod("spec",Fi,"spec",n("spec")),B.registerMethod("ship",PC,"ship",n("ship")),B.registerMethod("dash",Th,"dash",n("dash")),B.registerMethod("help",Th,"help",n("help")),B.registerMethod("perf",CC,"perf",n("perf")),B.registerMethod("velocity",xC,"velocity",n("velocity")),B.registerMethod("cleanup",Ps,"cleanup",n("cleanup")),B.registerMethod("cleanup-projects",Ps,"cleanupProjects",n("cleanup-projects")),B.registerMethod("design",Ps,"design",n("design")),B.registerMethod("recover",Ps,"recover",n("recover")),B.registerMethod("undo",Ps,"undo",n("undo")),B.registerMethod("redo",Ps,"redo",n("redo")),B.registerMethod("history",Ps,"history",n("history")),B.registerMethod("enrich",Ps,"enrich",n("enrich")),B.registerMethod("analyze",Xn,"analyze",n("analyze")),B.registerMethod("sync",Xn,"sync",n("sync")),B.registerMethod("stats",Xn,"stats",n("stats")),B.registerMethod("status",Xn,"status",n("status")),B.registerMethod("seal",Xn,"seal",n("seal")),B.registerMethod("verify",Xn,"verify",n("verify")),B.registerMethod("start",Ph,"start",n("start")),B.registerMethod("setup",Ph,"setup",n("setup")),B.registerMethod("uninstall",AC,"uninstall",n("uninstall")),B.registerMethod("update",RC,"update",n("update")),B.registerMethod("context",EC,"context",n("context"))}l(DC,"registerAllCommands");DC();ft();nr();Pt();import{Hono as GC}from"hono";import{cors as VC}from"hono/cors";import{logger as WC}from"hono/logger";Se();ne();Ls();rs();Pn();Et();U();fs();import IC from"node:fs/promises";import $C from"node:path";import{Hono as MC}from"hono";function OC(n){return A.getGlobalProjectPath(n)}l(OC,"getProjectDataPath");function Ch(n,e){let t=new MC,s=OC(n);return t.get("/state",async r=>{let o=await F.read(n);return r.json(o)}),t.get("/queue",async r=>{let o=await Oe.read(n);return r.json(o)}),t.get("/ideas",async r=>{let o=await st.read(n);return r.json(o)}),t.get("/roadmap",async r=>{let o=x.getDoc(n,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await ht.read(n);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([F.read(n),Oe.read(n),st.read(n),ht.read(n)]),u=x.getDoc(n,"roadmap");return r.json({projectId:n,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await F.write(n,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=$C.join(s,"context",`${o}.md`),c=await IC.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return C(a)||H.error(`Context read error: ${y(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Ch,"createRoutes");Se();ne();Ls();rs();Pn();Et();import Yn from"node:fs/promises";import _C from"node:path";import{Hono as NC}from"hono";var FC=A.getGlobalBasePath(),Qn=_C.join(FC,"projects");function Li(n){return x.getDoc(n,"project")}l(Li,"getProjectConfig");async function bu(n){if(!n)return"";let e=new Date(n),s=new Date().getTime()-e.getTime(),r=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}l(bu,"calculateDuration");function Eh(){let n=new NC;return n.get("/projects",async e=>{try{await Yn.mkdir(Qn,{recursive:!0});let s=(await Yn.readdir(Qn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(s.map(async o=>{let i=Li(o),a=await F.read(o),c=await Oe.read(o),u=await st.read(o),d=await ht.read(o),m=a?.currentTask,p=await bu(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 r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),n.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,r,o,i,a]=await Promise.all([Promise.resolve(Li(t)),F.read(t),Oe.read(t),st.read(t),ht.read(t)]),c=x.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await bu(r.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:s?.name||t,path:s?.path,state:r||{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(s){return e.json({error:String(s)},500)}}),n.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await F.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,o=await F.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:r},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await F.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await F.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:r}=s;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([F.read(t),Oe.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===r);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=s;if(!r)return e.json({success:!1,error:"text required"},400);let a=await st.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.get("/stats/global",async e=>{try{await Yn.mkdir(Qn,{recursive:!0});let s=(await Yn.readdir(Qn,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of s){let u=await F.read(c),d=await Oe.read(c),m=await st.read(c),p=await ht.read(c);u?.currentTask&&a++,r+=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:s.length,activeProjects:a,totalTasks:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),n.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Yn.mkdir(Qn,{recursive:!0});let r=(await Yn.readdir(Qn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Li(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await F.read(d),p=Li(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await bu(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:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),n}l(Eh,"createExtendedRoutes");import{streamSSE as LC}from"hono/streaming";var xh=3600*1e3,UC=300*1e3,HC=3e4;function Ah(){let n=new Map,e=null;function t(o){let i=n.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),n.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of n)o-new Date(a.client.connectedAt).getTime()>xh&&t(i)},UC),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),s(),{handleConnection(o){return LC(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},HC),p=setTimeout(()=>{t(a)},xh);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),n.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 n)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return n.size},shutdown(){r();for(let o of[...n.keys()])t(o)}}}l(Ah,"createSSEManager");function Rh(n){let e=new GC,t=Ah();n.enableCors!==!1&&e.use("*",VC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),n.enableLogging!==!1&&e.use("*",WC()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:xe,projectId:n.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 s=Ch(n.projectId,n.projectPath);e.route("/api",s);let r=Eh();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=n.port,a=n.host||"0.0.0.0";if(Rs())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: ${n.projectId}`),console.log(` Runtime: ${Rs()?"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(Rh,"createServer");var jh=3478;ne();du();var JC=50,Zn=null,Wr=null,ge=null,Pe=null;async function Dh(n){let e=Ne.socket(),t=Ne.pid(),s=Ne.runDir();if(Fe.mkdirSync(s,{recursive:!0}),Fe.existsSync(t)){let i=parseInt(Fe.readFileSync(t,"utf-8").trim(),10);YC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Fe.unlinkSync(t)}Fe.existsSync(e)&&Fe.unlinkSync(e),eE();let r=QC(),o=null;if(r)try{o=Fe.statSync(r).mtimeMs}catch{}if(Pe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Yf,idleTimer:null,entryPath:r,entryMtime:o},ge=new Kn,Zn=BC(i=>zC(i)),Zn.listen(e,()=>{Fe.chmodSync(e,384),Fe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),Ih()}),Zn.on("error",i=>{console.error("Daemon socket error:",i.message),er(1)}),!n.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=n.port||jh;Wr=Rh({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Wr.start()}}catch{}if(process.on("SIGTERM",()=>er(0)),process.on("SIGINT",()=>er(0)),process.on("SIGHUP",()=>{ge=new Kn,console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}l(Dh,"startDaemon");function zC(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>Qf){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(Gn(r)),n.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1632
+ `))!==-1;){let r=e.slice(0,s);if(e=e.slice(s+1),!!r.trim())try{let o=JSON.parse(r),i=await qC(o);n.write(Gn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(Gn(i))}}}),n.on("error",()=>{})}l(zC,"handleConnection");async function qC(n){if(!Pe||!ge)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Ih(),Pe.commandsServed++,Pe.lastActivity=Date.now(),Pe.commandsServed%JC===0&&N.checkpointAll(),$h()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),er(0)},200)),n.command==="daemon")return XC(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await KC(n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1633
1633
  `)||o.message||void 0,stderr:t.join(`
1634
- `)||o.error||void 0,result:o}}finally{console.log=n,console.error=r}}catch(e){return{id:s.id,success:!1,exitCode:1,stderr:e.message}}}l(qC,"handleRequest");async function KC(s){let e=s.args.join(" ")||null,t=s.options,n=t.md===!0;switch(s.command){case"sync":return ge.sync(s.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 ge.status(s.cwd,{json:t.json===!0,md:n});case"stats":return ge.stats(s.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ge.diff(s.cwd,{json:t.json===!0,md:n});case"seal":return ge.seal(s.cwd,{json:t.json===!0});case"rollback":return ge.rollback(s.cwd,{json:t.json===!0,md:n});case"verify":return ge.verify(s.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ge.task(e,s.cwd,{md:n});case"done":return ge.done(s.cwd,{md:n});case"next":return ge.next(s.cwd,{md:n});case"pause":return ge.pause(e||"",s.cwd,{md:n});case"resume":return ge.resume(e,s.cwd,{md:n});case"bug":return ge.bug(e||"",s.cwd,{md:n});case"idea":return ge.idea(e||"",s.cwd,{md:n});case"ship":return ge.ship(e,s.cwd,{md:n});case"dash":return ge.dash(e||"default",s.cwd,{md:n});case"workflow":return ge.workflowPrefs(e,s.cwd,{md:n});case"sessions":return ge.sessions(s.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return ge.design(e||"",t,s.cwd);case"analysis-payload":return ge.analysisPayload(s.cwd,{json:t.json===!0,md:n});case"analysis-save-llm":return ge.saveLlmAnalysis(e||"",s.cwd,{md:n});case"analysis-llm":return ge.getLlmAnalysis(s.cwd,{json:t.json===!0,md:n});case"analyze":return ge.analyze(t,s.cwd);case"cleanup":return ge.cleanup(t,s.cwd);case"cleanup-projects":return ge.cleanupProjects({dryRun:t["dry-run"]===!0,md:n});default:return B.execute(s.command,e,s.cwd)}}l(KC,"executeCommand");function XC(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ne.socket(),uptime:Pe?Date.now()-Pe.startedAt:0,commandsServed:Pe?.commandsServed??0,lastActivity:Pe?new Date(Pe.lastActivity).toISOString():null,registeredCommands:B.list().length,stale:$h()}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>er(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(XC,"handleDaemonCommand");function Ih(){Pe&&(Pe.idleTimer&&clearTimeout(Pe.idleTimer),Pe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Pe.idleTimeoutMs/1e3/60} minutes, shutting down`),er(0)},Pe.idleTimeoutMs),Pe.idleTimer.unref&&Pe.idleTimer.unref())}l(Ih,"resetIdleTimer");function er(s){console.log("Daemon shutting down..."),Pe?.idleTimer&&clearTimeout(Pe.idleTimer),Wr&&(Wr.stop(),Wr=null),Zs&&(Zs.close(),Zs=null),N.close();let e=Ne.socket(),t=Ne.pid();try{Fe.existsSync(e)&&Fe.unlinkSync(e)}catch{}try{Fe.existsSync(t)&&Fe.unlinkSync(t)}catch{}process.exit(s)}l(er,"shutdown");function YC(s){try{return process.kill(s,0),!0}catch{return!1}}l(YC,"isProcessRunning");function QC(){let s=vt("node:path"),e=__dirname;for(let r=0;r<5;r++){if(Fe.existsSync(s.join(e,"package.json"))){let o=s.join(e,"dist","daemon","entry.mjs");if(Fe.existsSync(o))return o;break}e=s.dirname(e)}let t=[s.join(__dirname,"..","daemon","entry.mjs"),s.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of t)if(Fe.existsSync(r))return r;let n=process.argv[1];return n&&Fe.existsSync(n)?n:null}l(QC,"resolveEntryPath");var ZC=1024*1024;function eE(){let s=Ne.log();try{if(Fe.statSync(s).size>ZC){let t=`${s}.1`;try{Fe.unlinkSync(t)}catch{}Fe.renameSync(s,t)}}catch{}}l(eE,"rotateLog");function $h(){if(!Pe?.entryPath||Pe.entryMtime===null)return!1;try{return Fe.statSync(Pe.entryPath).mtimeMs!==Pe.entryMtime}catch{return!1}}l($h,"isCodeStale");var vu=process.argv.slice(2),tE=parseInt(vu.find(s=>s.startsWith("--port="))?.split("=")[1]||"",10)||void 0,nE=vu.includes("--no-http"),sE=vu.includes("--foreground");jh({port:tE,noHttp:nE,foreground:sE}).catch(s=>{console.error("Failed to start daemon:",s.message),process.exit(1)});
1634
+ `)||o.error||void 0,result:o}}finally{console.log=s,console.error=r}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}l(qC,"handleRequest");async function KC(n){let e=n.args.join(" ")||null,t=n.options,s=t.md===!0;switch(n.command){case"sync":return ge.sync(n.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:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return ge.status(n.cwd,{json:t.json===!0,md:s});case"stats":return ge.stats(n.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ge.diff(n.cwd,{json:t.json===!0,md:s});case"seal":return ge.seal(n.cwd,{json:t.json===!0});case"rollback":return ge.rollback(n.cwd,{json:t.json===!0,md:s});case"verify":return ge.verify(n.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ge.task(e,n.cwd,{md:s});case"done":return ge.done(n.cwd,{md:s});case"next":return ge.next(n.cwd,{md:s});case"pause":return ge.pause(e||"",n.cwd,{md:s});case"resume":return ge.resume(e,n.cwd,{md:s});case"bug":return ge.bug(e||"",n.cwd,{md:s});case"idea":return ge.idea(e||"",n.cwd,{md:s});case"ship":return ge.ship(e,n.cwd,{md:s});case"dash":return ge.dash(e||"default",n.cwd,{md:s});case"workflow":return ge.workflowPrefs(e,n.cwd,{md:s});case"sessions":return ge.sessions(n.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return ge.design(e||"",t,n.cwd);case"analysis-payload":return ge.analysisPayload(n.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return ge.saveLlmAnalysis(e||"",n.cwd,{md:s});case"analysis-llm":return ge.getLlmAnalysis(n.cwd,{json:t.json===!0,md:s});case"analyze":return ge.analyze(t,n.cwd);case"cleanup":return ge.cleanup(t,n.cwd);case"cleanup-projects":return ge.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return B.execute(n.command,e,n.cwd)}}l(KC,"executeCommand");function XC(n){let e=n.args[0];if(e==="status")return{id:n.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ne.socket(),uptime:Pe?Date.now()-Pe.startedAt:0,commandsServed:Pe?.commandsServed??0,lastActivity:Pe?new Date(Pe.lastActivity).toISOString():null,registeredCommands:B.list().length,stale:$h()}};if(e==="stop"){let t={id:n.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>er(0),100),t}return{id:n.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(XC,"handleDaemonCommand");function Ih(){Pe&&(Pe.idleTimer&&clearTimeout(Pe.idleTimer),Pe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Pe.idleTimeoutMs/1e3/60} minutes, shutting down`),er(0)},Pe.idleTimeoutMs),Pe.idleTimer.unref&&Pe.idleTimer.unref())}l(Ih,"resetIdleTimer");function er(n){console.log("Daemon shutting down..."),Pe?.idleTimer&&clearTimeout(Pe.idleTimer),Wr&&(Wr.stop(),Wr=null),Zn&&(Zn.close(),Zn=null),N.close();let e=Ne.socket(),t=Ne.pid();try{Fe.existsSync(e)&&Fe.unlinkSync(e)}catch{}try{Fe.existsSync(t)&&Fe.unlinkSync(t)}catch{}process.exit(n)}l(er,"shutdown");function YC(n){try{return process.kill(n,0),!0}catch{return!1}}l(YC,"isProcessRunning");function QC(){let n=vt("node:path"),e=__dirname;for(let r=0;r<5;r++){if(Fe.existsSync(n.join(e,"package.json"))){let o=n.join(e,"dist","daemon","entry.mjs");if(Fe.existsSync(o))return o;break}e=n.dirname(e)}let t=[n.join(__dirname,"..","daemon","entry.mjs"),n.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of t)if(Fe.existsSync(r))return r;let s=process.argv[1];return s&&Fe.existsSync(s)?s:null}l(QC,"resolveEntryPath");var ZC=1024*1024;function eE(){let n=Ne.log();try{if(Fe.statSync(n).size>ZC){let t=`${n}.1`;try{Fe.unlinkSync(t)}catch{}Fe.renameSync(n,t)}}catch{}}l(eE,"rotateLog");function $h(){if(!Pe?.entryPath||Pe.entryMtime===null)return!1;try{return Fe.statSync(Pe.entryPath).mtimeMs!==Pe.entryMtime}catch{return!1}}l($h,"isCodeStale");var vu=process.argv.slice(2),tE=parseInt(vu.find(n=>n.startsWith("--port="))?.split("=")[1]||"",10)||void 0,sE=vu.includes("--no-http"),nE=vu.includes("--foreground");Dh({port:tE,noHttp:sE,foreground:nE}).catch(n=>{console.error("Failed to start daemon:",n.message),process.exit(1)});