prjct-cli 1.52.3 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,13 +4,17 @@ import { dirname as __pathDirname } from 'path';
4
4
  var require = __createRequire(import.meta.url);
5
5
  var __filename = __fileURLToPath(import.meta.url);
6
6
  var __dirname = __pathDirname(__filename);
7
- var hy=Object.create;var Lr=Object.defineProperty;var yy=Object.getOwnPropertyDescriptor;var wy=Object.getOwnPropertyNames;var ky=Object.getPrototypeOf,Sy=Object.prototype.hasOwnProperty;var l=(r,e)=>Lr(r,"name",{value:e,configurable:!0}),jt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var by=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),we=(r,e)=>{for(var t in e)Lr(r,t,{get:e[t],enumerable:!0})},cd=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of wy(e))!Sy.call(r,n)&&n!==t&&Lr(r,n,{get:()=>e[n],enumerable:!(s=yy(e,n))||s.enumerable});return r};var vy=(r,e,t)=>(t=r!=null?hy(ky(r)):{},cd(e||!r||!r.__esModule?Lr(t,"default",{value:r,enumerable:!0}):t,r)),St=r=>cd(Lr({},"__esModule",{value:!0}),r);var ld={};we(ld,{DAEMON_PATHS:()=>$e,IDLE_TIMEOUT_MS:()=>Pa,MAX_BUFFER_SIZE:()=>xa,decodeMessage:()=>Ty,encodeMessage:()=>en});function en(r){return Buffer.from(`${JSON.stringify(r)}
8
- `)}function Ty(r){return JSON.parse(r.trim())}var $e,Pa,xa,Po=S(()=>{"use strict";$e={runDir:l(()=>`${process.env.HOME||jt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${$e.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${$e.runDir()}/daemon.pid`,"pid"),log:l(()=>`${$e.runDir()}/daemon.log`,"log")},Pa=1800*1e3,xa=1024*1024;l(en,"encodeMessage");l(Ty,"decodeMessage")});function ud(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ra(){if(ud()==="bun")return!0;try{let{execSync:r}=jt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function tn(){return ud()==="bun"}var Fr=S(()=>{"use strict";l(ud,"detectRuntime");l(Ra,"isBunAvailable");l(tn,"isBun")});var ms={};we(ms,{executeViaDaemon:()=>Py,forceKillDaemon:()=>Ry,getDaemonStatus:()=>Cy,isDaemonRunning:()=>dd,sendRequest:()=>Ur,spawnDaemon:()=>md,stopDaemon:()=>xy});import xo from"node:crypto";import tt from"node:fs";import{connect as Ey}from"node:net";async function dd(){let r=$e.socket();if(!tt.existsSync(r))return!1;try{return(await Ur({id:xo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{tt.unlinkSync(r)}catch{}return!1}}async function Cy(){let r=$e.socket(),e=$e.pid();if(!tt.existsSync(r))return{running:!1};try{let t=await Ur({id:xo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return tt.existsSync(e)?{running:!1,pid:parseInt(tt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Ur(r){return new Promise((e,t)=>{let s=$e.socket(),n=Ey(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(en(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Py(r,e,t,s,n,o=!0){let i=$e.socket();if(!tt.existsSync(i))return o&&md().catch(()=>{}),null;try{return await Ur({id:xo.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function xy(){try{return(await Ur({id:xo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function Ry(){let r=$e.pid(),e=$e.socket(),t=!1;if(tt.existsSync(r)){let s=parseInt(tt.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{tt.existsSync(r)&&tt.unlinkSync(r)}catch{}try{tt.existsSync(e)&&tt.unlinkSync(e)}catch{}return t}async function md(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(tt.existsSync(t))o=t,i="bun";else if(tt.existsSync(s))o=s,i=Ra()?"bun":"node";else if(tt.existsSync(n))o=n,i=Ra()?"bun":"node";else return!1;let a=$e.runDir();tt.mkdirSync(a,{recursive:!0});let c=$e.log(),u=tt.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),tt.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await dd())return!0;return!1}var ps=S(()=>{"use strict";Fr();Po();l(dd,"isDaemonRunning");l(Cy,"getDaemonStatus");l(Ur,"sendRequest");l(Py,"executeViaDaemon");l(xy,"stopDaemon");l(Ry,"forceKillDaemon");l(md,"spawnDaemon")});var Hr=S(()=>{"use strict"});import{z as rs}from"zod";function pd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var XC,YC,QC,In,ZC,Ro=S(()=>{"use strict";XC=rs.enum(["opus","sonnet","haiku"]),YC=rs.enum(["2.5-pro","2.5-flash","2.0-flash"]),QC=rs.string().min(1),In=rs.object({provider:rs.string(),model:rs.string(),cliVersion:rs.string().optional(),recordedAt:rs.string()}),ZC=rs.object({preferredModel:rs.string().optional(),lastAnalysisModel:In.optional()});l(pd,"compareSemver")});var fd={};we(fd,{execAsync:()=>F,execFileAsync:()=>sn});import{exec as Ay,execFile as jy}from"node:child_process";import{promisify as gd}from"node:util";var F,sn,ze=S(()=>{"use strict";F=gd(Ay),sn=gd(jy)});var hd,yd,wd,Aa=S(()=>{"use strict";hd=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),yd=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],wd=/(?:import|from)\s+['"]([^'"]+)['"]/g});function Dy(r){return r instanceof Error&&"code"in r}function I(r){return Dy(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function ja(r){if(r instanceof Error)return r.stack}var H=S(()=>{"use strict";l(Dy,"isNodeError");l(I,"isNotFoundError");l(k,"getErrorMessage");l(ja,"getErrorStack")});import bd from"node:fs/promises";async function vd(r,e){let t;try{t=await bd.readFile(r,"utf-8")}catch(o){if(I(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await kd(r,t),Sd(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await kd(r,t),Sd(r,Iy(n.error)),null)}async function kd(r,e){let t=`${r}.backup`;try{await bd.writeFile(t,e,"utf-8")}catch{}}function Sd(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function Iy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Td=S(()=>{"use strict";H();l(vd,"safeRead");l(kd,"createBackup");l(Sd,"logCorruption");l(Iy,"formatZodError")});var Dt={};we(Dt,{appendLine:()=>Da,appendToFile:()=>My,atomicWrite:()=>$y,batchProcess:()=>rn,copyFile:()=>Uy,deleteDir:()=>Ny,deleteFile:()=>Oy,dirExists:()=>qt,ensureDir:()=>Qe,fileExists:()=>E,getFileExtension:()=>Vy,getFileModifiedTime:()=>Fy,getFileNameWithoutExtension:()=>By,getFileSize:()=>Ly,listFiles:()=>fs,moveFile:()=>Hy,prependToFile:()=>_y,readFile:()=>De,readJson:()=>je,readLines:()=>Gy,walkDir:()=>nn,writeFile:()=>bt,writeJson:()=>ce,writeLines:()=>Wy});import be from"node:fs/promises";import gs from"node:path";async function nn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await be.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(hd.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=gs.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(gs.relative(r,d))}}return l(o,"walk"),await o(r),t}async function rn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function je(r,e=null,t){if(t)return await vd(r,t)??e;try{let s=await be.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(I(s))return e;throw s}}async function ce(r,e,t=2){let s=gs.dirname(r);await be.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await be.writeFile(r,n,"utf-8")}async function De(r,e=""){try{return await be.readFile(r,"utf-8")}catch(t){if(I(t))return e;throw t}}async function bt(r,e){let t=gs.dirname(r);await be.mkdir(t,{recursive:!0}),await be.writeFile(r,e,"utf-8")}async function $y(r,e){let t=gs.dirname(r);await be.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await be.writeFile(s,e,"utf-8"),await be.rename(s,r)}async function My(r,e){await be.appendFile(r,e,"utf-8")}async function Da(r,e){let t=gs.dirname(r);await be.mkdir(t,{recursive:!0}),await be.appendFile(r,`${e}
10
- `,"utf-8")}async function _y(r,e){try{let t=await be.readFile(r,"utf-8");await be.writeFile(r,e+t,"utf-8")}catch(t){if(I(t))await be.writeFile(r,e,"utf-8");else throw t}}async function E(r){try{return await be.access(r),!0}catch(e){if(I(e))return!1;throw e}}async function qt(r){try{return(await be.stat(r)).isDirectory()}catch(e){if(I(e))return!1;throw e}}async function Qe(r){await be.mkdir(r,{recursive:!0})}async function Oy(r){try{return await be.unlink(r),!0}catch(e){if(I(e))return!1;throw e}}async function Ny(r){try{return await be.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(I(e))return!1;throw e}}async function fs(r,e={}){try{let s=await be.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(I(t))return[];throw t}}async function Ly(r){return(await be.stat(r)).size}async function Fy(r){return(await be.stat(r)).mtime}async function Uy(r,e){await be.copyFile(r,e)}async function Hy(r,e){await be.rename(r,e)}async function Gy(r){return(await De(r,"")).split(`
11
- `)}async function Wy(r,e){let t=e.join(`
12
- `);await bt(r,t)}function Vy(r){return gs.extname(r)}function By(r){return gs.basename(r,gs.extname(r))}var V=S(()=>{"use strict";Aa();Td();H();l(nn,"walkDir");l(rn,"batchProcess");l(je,"readJson");l(ce,"writeJson");l(De,"readFile");l(bt,"writeFile");l($y,"atomicWrite");l(My,"appendToFile");l(Da,"appendLine");l(_y,"prependToFile");l(E,"fileExists");l(qt,"dirExists");l(Qe,"ensureDir");l(Oy,"deleteFile");l(Ny,"deleteDir");l(fs,"listFiles");l(Ly,"getFileSize");l(Fy,"getFileModifiedTime");l(Uy,"copyFile");l(Hy,"moveFile");l(Gy,"readLines");l(Wy,"writeLines");l(Vy,"getFileExtension");l(By,"getFileNameWithoutExtension")});function Ds(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var $n,on=S(()=>{"use strict";l(Ds,"isExpired");$n=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,n)=>s[1].timestamp-n[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 Pd={};we(Pd,{invalidateProviderCache:()=>Ky,readProviderCache:()=>$a,writeProviderCache:()=>Ma});import Ed from"node:fs/promises";import zy from"node:os";import Cd from"node:path";async function $a(){try{let r=await Ed.readFile(Ia,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ds(e.timestamp,Jy)?null:e.detection}catch{return null}}async function Ma(r){let e={timestamp:new Date().toISOString(),detection:r};await ce(Ia,e)}async function Ky(){try{await Ed.unlink(Ia)}catch{}}var qy,Ia,Jy,_a=S(()=>{"use strict";on();V();qy=Cd.join(zy.homedir(),".prjct-cli","cache"),Ia=Cd.join(qy,"providers.json"),Jy=600*1e3;l($a,"readProviderCache");l(Ma,"writeProviderCache");l(Ky,"invalidateProviderCache")});var It={};we(It,{AntigravityProvider:()=>Na,ClaudeProvider:()=>Ao,CodexProvider:()=>La,CursorProvider:()=>Rd,GeminiProvider:()=>Oa,Providers:()=>Ue,WindsurfProvider:()=>Ad,detectAllProviders:()=>hs,detectAntigravity:()=>Mn,detectCodex:()=>an,detectCursorProject:()=>Id,detectProvider:()=>jo,detectWindsurfProject:()=>$d,getActiveProvider:()=>Zy,getCapabilities:()=>Yy,getCommandsDir:()=>iw,getGlobalContextPath:()=>nw,getGlobalSettingsPath:()=>rw,getProjectCommandsPath:()=>aw,getProviderBranding:()=>Do,getSkillsPath:()=>ow,hasProviderConfig:()=>ew,needsCursorRouterRegeneration:()=>tw,needsWindsurfRouterRegeneration:()=>sw,selectProvider:()=>Fa,validateCliVersion:()=>Dd});import Is from"node:os";import Ze from"node:path";function Yy(r,e){return{...Xy[r],...e}}async function jd(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Qy(r){try{let{stdout:e}=await F(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function jo(r){let e=Ue[r];if(!e.cliCommand)return{installed:!1};let t=await jd(e.cliCommand);if(!t)return{installed:!1};let s=await Qy(e.cliCommand),n=Dd(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Dd(r,e){let t=Ue[r];return!t.minCliVersion||!e?null:pd(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 hs(r=!1){if(!r){let i=await $a();if(i)return i}let[e,t,s]=await Promise.all([jo("claude"),jo("gemini"),an()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await Ma(o).catch(()=>{}),o}async function Zy(r){if(r&&Ue[r])return Ue[r];let e=await hs();return e.claude.installed&&!e.gemini.installed?Ao:e.gemini.installed&&!e.claude.installed?Oa:Ao}async function ew(r){let e=Ue[r];return e.configDir?E(e.configDir):!1}function Do(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Id(r){let e=Ze.join(r,".cursor"),t=Ze.join(e,"rules"),s=Ze.join(t,"prjct.mdc"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function tw(r){let e=await Id(r);return e.detected&&!e.routerInstalled}async function $d(r){let e=Ze.join(r,".windsurf"),t=Ze.join(e,"rules"),s=Ze.join(t,"prjct.md"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function sw(r){let e=await $d(r);return e.detected&&!e.routerInstalled}async function Mn(){let r=Na.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ze.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([E(r),E(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function an(){let r=La.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await jd("codex"),t=Ze.join(r,"skills","prjct","SKILL.md"),s=await E(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function nw(r){let e=Ue[r];return e.configDir?Ze.join(e.configDir,e.contextFile):null}function rw(r){let e=Ue[r];return!e.configDir||!e.settingsFile?null:Ze.join(e.configDir,e.settingsFile)}function ow(r){return Ue[r].skillsDir}function iw(r){return Ue[r].commandsDir}function aw(r,e){let t=Ue[r];return Ze.join(e,t.commandsDir)}async function Fa(){let r=await hs(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var Xy,Ao,Oa,Na,Rd,Ad,La,Ue,st=S(()=>{"use strict";Hr();Ro();ze();V();_a();Xy={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");Ao={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ze.join(Is.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ze.join(Is.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"},Oa={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ze.join(Is.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ze.join(Is.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"},Na={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ze.join(Is.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ze.join(Is.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"},Rd={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Ad={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"},La={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ze.join(Is.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ze.join(Is.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"},Ue={claude:Ao,gemini:Oa,cursor:Rd,antigravity:Na,windsurf:Ad,codex:La};l(jd,"whichCommand");l(Qy,"getCliVersion");l(jo,"detectProvider");l(Dd,"validateCliVersion");l(hs,"detectAllProviders");l(Zy,"getActiveProvider");l(ew,"hasProviderConfig");l(Do,"getProviderBranding");l(Id,"detectCursorProject");l(tw,"needsCursorRouterRegeneration");l($d,"detectWindsurfProject");l(sw,"needsWindsurfRouterRegeneration");l(Mn,"detectAntigravity");l(an,"detectCodex");l(nw,"getGlobalContextPath");l(rw,"getGlobalSettingsPath");l(ow,"getSkillsPath");l(iw,"getCommandsDir");l(aw,"getProjectCommandsPath");l(Fa,"selectProvider")});import{z as Pe}from"zod";function cw(r){return r instanceof _n}function de(r){return cw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var On,MP,_P,OP,NP,LP,FP,_n,Io,$o,Gr,ys=S(()=>{"use strict";On={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},MP=On.create("FileError",Pe.object({path:Pe.string(),operation:Pe.enum(["read","write","delete","create","copy"]),reason:Pe.string().optional()})),_P=On.create("ValidationError",Pe.object({field:Pe.string(),expected:Pe.string(),received:Pe.string().optional(),message:Pe.string().optional()})),OP=On.create("PermissionError",Pe.object({action:Pe.string(),resource:Pe.string(),reason:Pe.string().optional()})),NP=On.create("TaskError",Pe.object({taskId:Pe.string().optional(),operation:Pe.enum(["create","update","complete","pause","resume","delete"]),reason:Pe.string()})),LP=On.create("SessionError",Pe.object({sessionId:Pe.string().optional(),reason:Pe.string()})),FP=On.create("SyncError",Pe.object({projectId:Pe.string().optional(),operation:Pe.enum(["push","pull","auth","connect"]),reason:Pe.string()})),_n=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)}},Io=class r extends _n{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},$o=class r extends _n{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Gr=class r extends _n{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(cw,"isPrjctError");l(de,"getErrorMessage")});import{formatDistanceToNowStrict as WP}from"date-fns";function Md(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function _d(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function v(){return new Date().toISOString()}function $s(r){let e=new Date;return e.setDate(e.getDate()-r),e}function vt(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function ws(r,e=new Date){let t=e.getTime()-r.getTime();return vt(t)}function Nn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function $t(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=S(()=>{"use strict";l(Md,"formatDate");l(_d,"getYearMonthDay");l(v,"getTimestamp");l($s,"getDaysAgo");l(vt,"formatDuration");l(ws,"calculateDuration");l(Nn,"parseVarianceMinutes");l($t,"parseDurationMinutes")});var Ln={};we(Ln,{PACKAGE_ROOT:()=>Tt,VERSION:()=>me,compareVersions:()=>Od,getPackageInfo:()=>lw,getPackageRoot:()=>Ga,getVersion:()=>cn,isCompatible:()=>uw,needsMigration:()=>dw});import Ua from"node:fs";import _o from"node:path";function Ga(){if(Wr)return Wr;let r=__dirname;for(let e=0;e<5;e++){let t=_o.join(r,"package.json");if(Ua.existsSync(t))try{if(JSON.parse(Ua.readFileSync(t,"utf-8")).name==="prjct-cli")return Wr=r,r}catch{}r=_o.dirname(r)}return Wr=_o.join(__dirname,"..","..",".."),Wr}function cn(){if(Mo)return Mo;try{let r=_o.join(Ga(),"package.json"),e=JSON.parse(Ua.readFileSync(r,"utf-8"));return Mo=e.version,Ha=e,Mo}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function lw(){return Ha||cn(),Ha}function Od(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function uw(r){let e=cn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function dw(r,e=null){let t=e||cn();return Od(r,t)<0}var Mo,Ha,Wr,me,Tt,nt=S(()=>{"use strict";H();Mo=null,Ha=null,Wr=null;l(Ga,"getPackageRoot");l(cn,"getVersion");l(lw,"getPackageInfo");l(Od,"compareVersions");l(uw,"isCompatible");l(dw,"needsMigration");me=cn(),Tt=Ga()});async function Oo(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function mw(){let r=await Oo("gh api user --jq .login");return r.success&&r.output||(r=await Oo("git config --global github.user"),r.success&&r.output)?r.output:null}async function pw(){let r=await Oo("git config user.name");return r.success&&r.output?r.output:null}async function gw(){let r=await Oo("git config user.email");return r.success&&r.output?r.output:null}async function Fn(){let[r,e,t]=await Promise.all([mw(),pw(),gw()]);return{github:r,email:t,name:e||r||"Unknown"}}var No=S(()=>{"use strict";ze();l(Oo,"execCommand");l(mw,"detectGitHubUsername");l(pw,"detectGitName");l(gw,"detectGitEmail");l(Fn,"detect")});import fw from"node:crypto";import os from"node:fs/promises";import Va from"node:os";import q from"node:path";import{globSync as hw}from"glob";var Ba,yw,D,ke=S(()=>{"use strict";K();V();Ba=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?q.resolve(e):q.join(Va.homedir(),".prjct-cli"),this.globalProjectsDir=q.join(this.globalBaseDir,"projects"),this.globalConfigDir=q.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=q.resolve(e),this.globalProjectsDir=q.join(this.globalBaseDir,"projects"),this.globalConfigDir=q.join(this.globalBaseDir,"config")}generateProjectId(e){return fw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return q.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return q.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return q.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return q.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await qt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await E(t)}async ensureGlobalStructure(){await Qe(this.globalBaseDir),await Qe(this.globalProjectsDir),await Qe(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await Qe(q.join(t,n));return await Qe(q.join(t,"planning","tasks")),await Qe(q.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=_d(t);return q.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await Qe(s),s}async listSessions(e,t=null,s=null){let n=q.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await os.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=q.join(n,a.name),u=await os.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=q.join(c,d.name),m=await os.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:q.join(p,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 q.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await os.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 qt(t)}getDisplayPath(e){let t=Va.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return q.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return q.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return q.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return q.join(this.globalBaseDir,".running")}getDocsPath(){return q.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(st(),St(It)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(st(),St(It)).getActiveProvider();return(st(),St(It)).getGlobalSettingsPath(e.name)}getClaudeDir(){return q.join(Va.homedir(),".claude")}getClaudeSettingsPath(){return q.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return q.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return q.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 n of s){let o=q.join(e,n.file);if(await E(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=q.join(e,"package.json");if(await E(n))try{let o=await os.readFile(n,"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=[],n=[];try{if(t==="pnpm"){let i=(await os.readFile(q.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
13
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=q.join(e,"package.json"),i=await os.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=q.join(e,"lerna.json");if(await E(c)){let u=await os.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=q.join(e,"package.json"),i=await os.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=hw(o,{cwd:e,absolute:!1});for(let a of i){let c=q.join(e,a),u=q.join(c,"package.json");if(await E(u))try{let d=await os.readFile(u,"utf-8"),p=JSON.parse(d),m=q.join(c,"PRJCT.md");s.push({name:p.name||q.basename(a),path:c,relativePath:a,hasPrjctMd:await E(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=q.resolve(e);for(let n of t.packages){let o=q.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=q.resolve(e),s=q.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=q.dirname(t)}return null}},yw=new Ba,D=yw});var Ld={};we(Ld,{default:()=>M});import za from"node:fs/promises";import ww from"node:path";import*as Lo from"jsonc-parser";function Nd(r){let e=[],t=Lo.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${Lo.printParseErrorCode(s.error)}`)}return t}var qa,kw,M,ve=S(()=>{"use strict";ys();H();K();V();nt();No();ke();l(Nd,"parseJsonc");qa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=D.getLocalConfigPath(e),s=await za.readFile(t,"utf-8");return Nd(s)}catch(t){return I(t)||console.warn(`Warning: Could not read config at ${e}: ${de(t)}`),null}}async writeConfig(e,t){let s=D.getLocalConfigPath(e);await ce(s,t)}async readGlobalConfig(e){try{let t=D.getGlobalProjectConfigPath(e),s=await za.readFile(t,"utf-8");return Nd(s)}catch(t){return I(t)||console.warn(`Warning: Could not read global config for ${e}: ${de(t)}`),null}}async writeGlobalConfig(e,t){let s=D.getGlobalProjectConfigPath(e);await ce(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=v();t={projectId:e,authors:[],version:me,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=D.generateProjectId(e),n=D.getGlobalProjectPath(s),o=D.getDisplayPath(n),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:me,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 D.hasLegacyStructure(e))return!1;if(!await D.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=D.getGlobalProjectPath(n.projectId);try{return(await za.readdir(ww.join(o,"core"))).length===0}catch(i){return I(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:D.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.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 n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=v(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Fn(),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=D.generateProjectId(e);return{projectId:s,dataPath:D.getDisplayPath(D.getGlobalProjectPath(s))}}},kw=new qa,M=kw});var Ud={};we(Ud,{default:()=>Vr});import Ja from"node:fs/promises";import Sw from"node:os";import Fd from"node:path";var Ka,bw,Vr,Fo=S(()=>{"use strict";H();V();Ka=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Sw.homedir(),this.configDir=Fd.join(this.homeDir,".prjct-cli","config"),this.configFile=Fd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ja.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await Ja.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",k(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await ce(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",k(n)),!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 ce(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",k(t)),!1}}async configExists(){return E(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Ja.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},bw=new Ka,Vr=bw});var Ho={};we(Ho,{PrjctDatabase:()=>Uo,default:()=>N,prjctDb:()=>x});import Xa from"node:fs";import Hd from"node:path";function vw(r){if(tn()){let{Database:n}=jt("bun:sqlite");return new n(r,{create:!0})}let e=jt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Tw,Ew,Uo,x,N,ee=S(()=>{"use strict";ke();Fr();l(vw,"openDatabase");Tw=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
7
+ var _y=Object.create;var Wr=Object.defineProperty;var Oy=Object.getOwnPropertyDescriptor;var Ny=Object.getOwnPropertyNames;var Ly=Object.getPrototypeOf,Fy=Object.prototype.hasOwnProperty;var l=(r,e)=>Wr(r,"name",{value:e,configurable:!0}),Dt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var Uy=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),we=(r,e)=>{for(var t in e)Wr(r,t,{get:e[t],enumerable:!0})},Cd=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ny(e))!Fy.call(r,n)&&n!==t&&Wr(r,n,{get:()=>e[n],enumerable:!(s=Oy(e,n))||s.enumerable});return r};var Hy=(r,e,t)=>(t=r!=null?_y(Ly(r)):{},Cd(e||!r||!r.__esModule?Wr(t,"default",{value:r,enumerable:!0}):t,r)),vt=r=>Cd(Wr({},"__esModule",{value:!0}),r);var Pd={};we(Pd,{DAEMON_PATHS:()=>_e,IDLE_TIMEOUT_MS:()=>Fa,MAX_BUFFER_SIZE:()=>Ua,decodeMessage:()=>Wy,encodeMessage:()=>nn});function nn(r){return Buffer.from(`${JSON.stringify(r)}
8
+ `)}function Wy(r){return JSON.parse(r.trim())}var _e,Fa,Ua,Io=S(()=>{"use strict";_e={runDir:l(()=>`${process.env.HOME||Dt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${_e.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${_e.runDir()}/daemon.pid`,"pid"),log:l(()=>`${_e.runDir()}/daemon.log`,"log")},Fa=1800*1e3,Ua=1024*1024;l(nn,"encodeMessage");l(Wy,"decodeMessage")});function xd(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ha(){if(xd()==="bun")return!0;try{let{execSync:r}=Dt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function rn(){return xd()==="bun"}var Gr=S(()=>{"use strict";l(xd,"detectRuntime");l(Ha,"isBunAvailable");l(rn,"isBun")});var gs={};we(gs,{executeViaDaemon:()=>Vy,forceKillDaemon:()=>zy,getDaemonStatus:()=>By,isDaemonRunning:()=>Rd,sendRequest:()=>Br,spawnDaemon:()=>Ad,stopDaemon:()=>qy});import Do from"node:crypto";import nt from"node:fs";import{connect as Gy}from"node:net";async function Rd(){let r=_e.socket();if(!nt.existsSync(r))return!1;try{return(await Br({id:Do.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{nt.unlinkSync(r)}catch{}return!1}}async function By(){let r=_e.socket(),e=_e.pid();if(!nt.existsSync(r))return{running:!1};try{let t=await Br({id:Do.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return nt.existsSync(e)?{running:!1,pid:parseInt(nt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Br(r){return new Promise((e,t)=>{let s=_e.socket(),n=Gy(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(nn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Vy(r,e,t,s,n,o=!0){let i=_e.socket();if(!nt.existsSync(i))return o&&Ad().catch(()=>{}),null;try{return await Br({id:Do.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function qy(){try{return(await Br({id:Do.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function zy(){let r=_e.pid(),e=_e.socket(),t=!1;if(nt.existsSync(r)){let s=parseInt(nt.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{nt.existsSync(r)&&nt.unlinkSync(r)}catch{}try{nt.existsSync(e)&&nt.unlinkSync(e)}catch{}return t}async function Ad(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(nt.existsSync(t))o=t,i="bun";else if(nt.existsSync(s))o=s,i=Ha()?"bun":"node";else if(nt.existsSync(n))o=n,i=Ha()?"bun":"node";else return!1;let a=_e.runDir();nt.mkdirSync(a,{recursive:!0});let c=_e.log(),u=nt.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),nt.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Rd())return!0;return!1}var fs=S(()=>{"use strict";Gr();Io();l(Rd,"isDaemonRunning");l(By,"getDaemonStatus");l(Br,"sendRequest");l(Vy,"executeViaDaemon");l(qy,"stopDaemon");l(zy,"forceKillDaemon");l(Ad,"spawnDaemon")});var Vr=S(()=>{"use strict"});import{z as is}from"zod";function jd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var yP,wP,kP,On,SP,$o=S(()=>{"use strict";yP=is.enum(["opus","sonnet","haiku"]),wP=is.enum(["2.5-pro","2.5-flash","2.0-flash"]),kP=is.string().min(1),On=is.object({provider:is.string(),model:is.string(),cliVersion:is.string().optional(),recordedAt:is.string()}),SP=is.object({preferredModel:is.string().optional(),lastAnalysisModel:On.optional()});l(jd,"compareSemver")});var Dd={};we(Dd,{execAsync:()=>L,execFileAsync:()=>on});import{exec as Jy,execFile as Ky}from"node:child_process";import{promisify as Id}from"node:util";var L,on,Ge=S(()=>{"use strict";L=Id(Jy),on=Id(Ky)});var $d,Md,_d,Wa=S(()=>{"use strict";$d=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),Md=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],_d=/(?:import|from)\s+['"]([^'"]+)['"]/g});function Xy(r){return r instanceof Error&&"code"in r}function I(r){return Xy(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function Ga(r){if(r instanceof Error)return r.stack}var H=S(()=>{"use strict";l(Xy,"isNodeError");l(I,"isNotFoundError");l(k,"getErrorMessage");l(Ga,"getErrorStack")});import Ld from"node:fs/promises";async function Fd(r,e){let t;try{t=await Ld.readFile(r,"utf-8")}catch(o){if(I(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Od(r,t),Nd(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Od(r,t),Nd(r,Yy(n.error)),null)}async function Od(r,e){let t=`${r}.backup`;try{await Ld.writeFile(t,e,"utf-8")}catch{}}function Nd(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function Yy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ud=S(()=>{"use strict";H();l(Fd,"safeRead");l(Od,"createBackup");l(Nd,"logCorruption");l(Yy,"formatZodError")});var $t={};we($t,{appendLine:()=>Ba,appendToFile:()=>Zy,atomicWrite:()=>Qy,batchProcess:()=>cn,copyFile:()=>ow,deleteDir:()=>sw,deleteFile:()=>tw,dirExists:()=>zt,ensureDir:()=>et,fileExists:()=>E,getFileExtension:()=>lw,getFileModifiedTime:()=>rw,getFileNameWithoutExtension:()=>uw,getFileSize:()=>nw,listFiles:()=>ys,moveFile:()=>iw,prependToFile:()=>ew,readFile:()=>$e,readJson:()=>De,readLines:()=>aw,walkDir:()=>an,writeFile:()=>Tt,writeJson:()=>le,writeLines:()=>cw});import Ce from"node:fs/promises";import hs from"node:path";async function an(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Ce.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if($d.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=hs.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(hs.relative(r,d))}}return l(o,"walk"),await o(r),t}async function cn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function De(r,e=null,t){if(t)return await Fd(r,t)??e;try{let s=await Ce.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(I(s))return e;throw s}}async function le(r,e,t=2){let s=hs.dirname(r);await Ce.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Ce.writeFile(r,n,"utf-8")}async function $e(r,e=""){try{return await Ce.readFile(r,"utf-8")}catch(t){if(I(t))return e;throw t}}async function Tt(r,e){let t=hs.dirname(r);await Ce.mkdir(t,{recursive:!0}),await Ce.writeFile(r,e,"utf-8")}async function Qy(r,e){let t=hs.dirname(r);await Ce.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await Ce.writeFile(s,e,"utf-8"),await Ce.rename(s,r)}async function Zy(r,e){await Ce.appendFile(r,e,"utf-8")}async function Ba(r,e){let t=hs.dirname(r);await Ce.mkdir(t,{recursive:!0}),await Ce.appendFile(r,`${e}
10
+ `,"utf-8")}async function ew(r,e){try{let t=await Ce.readFile(r,"utf-8");await Ce.writeFile(r,e+t,"utf-8")}catch(t){if(I(t))await Ce.writeFile(r,e,"utf-8");else throw t}}async function E(r){try{return await Ce.access(r),!0}catch(e){if(I(e))return!1;throw e}}async function zt(r){try{return(await Ce.stat(r)).isDirectory()}catch(e){if(I(e))return!1;throw e}}async function et(r){await Ce.mkdir(r,{recursive:!0})}async function tw(r){try{return await Ce.unlink(r),!0}catch(e){if(I(e))return!1;throw e}}async function sw(r){try{return await Ce.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(I(e))return!1;throw e}}async function ys(r,e={}){try{let s=await Ce.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(I(t))return[];throw t}}async function nw(r){return(await Ce.stat(r)).size}async function rw(r){return(await Ce.stat(r)).mtime}async function ow(r,e){await Ce.copyFile(r,e)}async function iw(r,e){await Ce.rename(r,e)}async function aw(r){return(await $e(r,"")).split(`
11
+ `)}async function cw(r,e){let t=e.join(`
12
+ `);await Tt(r,t)}function lw(r){return hs.extname(r)}function uw(r){return hs.basename(r,hs.extname(r))}var B=S(()=>{"use strict";Wa();Ud();H();l(an,"walkDir");l(cn,"batchProcess");l(De,"readJson");l(le,"writeJson");l($e,"readFile");l(Tt,"writeFile");l(Qy,"atomicWrite");l(Zy,"appendToFile");l(Ba,"appendLine");l(ew,"prependToFile");l(E,"fileExists");l(zt,"dirExists");l(et,"ensureDir");l(tw,"deleteFile");l(sw,"deleteDir");l(ys,"listFiles");l(nw,"getFileSize");l(rw,"getFileModifiedTime");l(ow,"copyFile");l(iw,"moveFile");l(aw,"readLines");l(cw,"writeLines");l(lw,"getFileExtension");l(uw,"getFileNameWithoutExtension")});function Ms(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var Nn,ln=S(()=>{"use strict";l(Ms,"isExpired");Nn=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,n)=>s[1].timestamp-n[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 Gd={};we(Gd,{invalidateProviderCache:()=>gw,readProviderCache:()=>qa,writeProviderCache:()=>za});import Hd from"node:fs/promises";import dw from"node:os";import Wd from"node:path";async function qa(){try{let r=await Hd.readFile(Va,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ms(e.timestamp,pw)?null:e.detection}catch{return null}}async function za(r){let e={timestamp:new Date().toISOString(),detection:r};await le(Va,e)}async function gw(){try{await Hd.unlink(Va)}catch{}}var mw,Va,pw,Ja=S(()=>{"use strict";ln();B();mw=Wd.join(dw.homedir(),".prjct-cli","cache"),Va=Wd.join(mw,"providers.json"),pw=600*1e3;l(qa,"readProviderCache");l(za,"writeProviderCache");l(gw,"invalidateProviderCache")});var Mt={};we(Mt,{AntigravityProvider:()=>Xa,ClaudeProvider:()=>Mo,CodexProvider:()=>Ya,CursorProvider:()=>Vd,GeminiProvider:()=>Ka,Providers:()=>Be,WindsurfProvider:()=>qd,detectAllProviders:()=>ws,detectAntigravity:()=>Ln,detectCodex:()=>un,detectCursorProject:()=>Kd,detectProvider:()=>_o,detectWindsurfProject:()=>Xd,getActiveProvider:()=>ww,getCapabilities:()=>hw,getCommandsDir:()=>Cw,getGlobalContextPath:()=>vw,getGlobalSettingsPath:()=>Tw,getProjectCommandsPath:()=>Pw,getProviderBranding:()=>Oo,getSkillsPath:()=>Ew,hasProviderConfig:()=>kw,needsCursorRouterRegeneration:()=>Sw,needsWindsurfRouterRegeneration:()=>bw,selectProvider:()=>Qa,validateCliVersion:()=>Jd});import _s from"node:os";import tt from"node:path";function hw(r,e){return{...fw[r],...e}}async function zd(r){try{let{stdout:e}=await L(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function yw(r){try{let{stdout:e}=await L(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function _o(r){let e=Be[r];if(!e.cliCommand)return{installed:!1};let t=await zd(e.cliCommand);if(!t)return{installed:!1};let s=await yw(e.cliCommand),n=Jd(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Jd(r,e){let t=Be[r];return!t.minCliVersion||!e?null:jd(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 ws(r=!1){if(!r){let i=await qa();if(i)return i}let[e,t,s]=await Promise.all([_o("claude"),_o("gemini"),un()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await za(o).catch(()=>{}),o}async function ww(r){if(r&&Be[r])return Be[r];let e=await ws();return e.claude.installed&&!e.gemini.installed?Mo:e.gemini.installed&&!e.claude.installed?Ka:Mo}async function kw(r){let e=Be[r];return e.configDir?E(e.configDir):!1}function Oo(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Kd(r){let e=tt.join(r,".cursor"),t=tt.join(e,"rules"),s=tt.join(t,"prjct.mdc"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Sw(r){let e=await Kd(r);return e.detected&&!e.routerInstalled}async function Xd(r){let e=tt.join(r,".windsurf"),t=tt.join(e,"rules"),s=tt.join(t,"prjct.md"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function bw(r){let e=await Xd(r);return e.detected&&!e.routerInstalled}async function Ln(){let r=Xa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=tt.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([E(r),E(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function un(){let r=Ya.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await zd("codex"),t=tt.join(r,"skills","prjct","SKILL.md"),s=await E(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function vw(r){let e=Be[r];return e.configDir?tt.join(e.configDir,e.contextFile):null}function Tw(r){let e=Be[r];return!e.configDir||!e.settingsFile?null:tt.join(e.configDir,e.settingsFile)}function Ew(r){return Be[r].skillsDir}function Cw(r){return Be[r].commandsDir}function Pw(r,e){let t=Be[r];return tt.join(e,t.commandsDir)}async function Qa(){let r=await ws(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var fw,Mo,Ka,Xa,Vd,qd,Ya,Be,rt=S(()=>{"use strict";Vr();$o();Ge();B();Ja();fw={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(hw,"getCapabilities");Mo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:tt.join(_s.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:tt.join(_s.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"},Ka={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:tt.join(_s.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:tt.join(_s.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"},Xa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:tt.join(_s.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:tt.join(_s.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"},Vd={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"},qd={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"},Ya={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:tt.join(_s.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:tt.join(_s.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"},Be={claude:Mo,gemini:Ka,cursor:Vd,antigravity:Xa,windsurf:qd,codex:Ya};l(zd,"whichCommand");l(yw,"getCliVersion");l(_o,"detectProvider");l(Jd,"validateCliVersion");l(ws,"detectAllProviders");l(ww,"getActiveProvider");l(kw,"hasProviderConfig");l(Oo,"getProviderBranding");l(Kd,"detectCursorProject");l(Sw,"needsCursorRouterRegeneration");l(Xd,"detectWindsurfProject");l(bw,"needsWindsurfRouterRegeneration");l(Ln,"detectAntigravity");l(un,"detectCodex");l(vw,"getGlobalContextPath");l(Tw,"getGlobalSettingsPath");l(Ew,"getSkillsPath");l(Cw,"getCommandsDir");l(Pw,"getProjectCommandsPath");l(Qa,"selectProvider")});import{z as Ae}from"zod";function xw(r){return r instanceof Fn}function pe(r){return xw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Un,tx,sx,nx,rx,ox,ix,Fn,No,Lo,qr,ks=S(()=>{"use strict";Un={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},tx=Un.create("FileError",Ae.object({path:Ae.string(),operation:Ae.enum(["read","write","delete","create","copy"]),reason:Ae.string().optional()})),sx=Un.create("ValidationError",Ae.object({field:Ae.string(),expected:Ae.string(),received:Ae.string().optional(),message:Ae.string().optional()})),nx=Un.create("PermissionError",Ae.object({action:Ae.string(),resource:Ae.string(),reason:Ae.string().optional()})),rx=Un.create("TaskError",Ae.object({taskId:Ae.string().optional(),operation:Ae.enum(["create","update","complete","pause","resume","delete"]),reason:Ae.string()})),ox=Un.create("SessionError",Ae.object({sessionId:Ae.string().optional(),reason:Ae.string()})),ix=Un.create("SyncError",Ae.object({projectId:Ae.string().optional(),operation:Ae.enum(["push","pull","auth","connect"]),reason:Ae.string()})),Fn=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)}},No=class r extends Fn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Lo=class r extends Fn{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},qr=class r extends Fn{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(xw,"isPrjctError");l(pe,"getErrorMessage")});import{formatDistanceToNowStrict as ux}from"date-fns";function Yd(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function Qd(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function b(){return new Date().toISOString()}function Os(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Et(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function Ss(r,e=new Date){let t=e.getTime()-r.getTime();return Et(t)}function Hn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function _t(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=S(()=>{"use strict";l(Yd,"formatDate");l(Qd,"getYearMonthDay");l(b,"getTimestamp");l(Os,"getDaysAgo");l(Et,"formatDuration");l(Ss,"calculateDuration");l(Hn,"parseVarianceMinutes");l(_t,"parseDurationMinutes")});var Wn={};we(Wn,{PACKAGE_ROOT:()=>Ct,VERSION:()=>ge,compareVersions:()=>Zd,getPackageInfo:()=>Rw,getPackageRoot:()=>tc,getVersion:()=>dn,isCompatible:()=>Aw,needsMigration:()=>jw});import Za from"node:fs";import Uo from"node:path";function tc(){if(zr)return zr;let r=__dirname;for(let e=0;e<5;e++){let t=Uo.join(r,"package.json");if(Za.existsSync(t))try{if(JSON.parse(Za.readFileSync(t,"utf-8")).name==="prjct-cli")return zr=r,r}catch{}r=Uo.dirname(r)}return zr=Uo.join(__dirname,"..","..",".."),zr}function dn(){if(Fo)return Fo;try{let r=Uo.join(tc(),"package.json"),e=JSON.parse(Za.readFileSync(r,"utf-8"));return Fo=e.version,ec=e,Fo}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Rw(){return ec||dn(),ec}function Zd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Aw(r){let e=dn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function jw(r,e=null){let t=e||dn();return Zd(r,t)<0}var Fo,ec,zr,ge,Ct,ot=S(()=>{"use strict";H();Fo=null,ec=null,zr=null;l(tc,"getPackageRoot");l(dn,"getVersion");l(Rw,"getPackageInfo");l(Zd,"compareVersions");l(Aw,"isCompatible");l(jw,"needsMigration");ge=dn(),Ct=tc()});async function Ho(r){try{let{stdout:e}=await L(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Iw(){let r=await Ho("gh api user --jq .login");return r.success&&r.output||(r=await Ho("git config --global github.user"),r.success&&r.output)?r.output:null}async function Dw(){let r=await Ho("git config user.name");return r.success&&r.output?r.output:null}async function $w(){let r=await Ho("git config user.email");return r.success&&r.output?r.output:null}async function Gn(){let[r,e,t]=await Promise.all([Iw(),Dw(),$w()]);return{github:r,email:t,name:e||r||"Unknown"}}var Wo=S(()=>{"use strict";Ge();l(Ho,"execCommand");l(Iw,"detectGitHubUsername");l(Dw,"detectGitName");l($w,"detectGitEmail");l(Gn,"detect")});import Mw from"node:crypto";import as from"node:fs/promises";import nc from"node:os";import z from"node:path";import{globSync as _w}from"glob";var rc,Ow,j,Te=S(()=>{"use strict";K();B();rc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(nc.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return Mw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await zt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await E(t)}async ensureGlobalStructure(){await et(this.globalBaseDir),await et(this.globalProjectsDir),await et(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await et(z.join(t,n));return await et(z.join(t,"planning","tasks")),await et(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Qd(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await et(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await as.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await as.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=z.join(c,d.name),m=await as.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:z.join(p,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 z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await as.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 zt(t)}getDisplayPath(e){let t=nc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(rt(),vt(Mt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(rt(),vt(Mt)).getActiveProvider();return(rt(),vt(Mt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(nc.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.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 n of s){let o=z.join(e,n.file);if(await E(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await E(n))try{let o=await as.readFile(n,"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=[],n=[];try{if(t==="pnpm"){let i=(await as.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
13
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=z.join(e,"package.json"),i=await as.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=z.join(e,"lerna.json");if(await E(c)){let u=await as.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=z.join(e,"package.json"),i=await as.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=_w(o,{cwd:e,absolute:!1});for(let a of i){let c=z.join(e,a),u=z.join(c,"package.json");if(await E(u))try{let d=await as.readFile(u,"utf-8"),p=JSON.parse(d),m=z.join(c,"PRJCT.md");s.push({name:p.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await E(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=z.resolve(e);for(let n of t.packages){let o=z.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=z.resolve(e),s=z.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=z.dirname(t)}return null}},Ow=new rc,j=Ow});var Go={};we(Go,{default:()=>Jt,worktreeService:()=>tm});import oc from"node:fs/promises";import cs from"node:path";var em,ic,tm,Jt,Jr=S(()=>{"use strict";Ge();B();em=".worktrees",ic=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=cs.join(n,em,t),i=s.branch||`feat/${t}`;await oc.mkdir(cs.join(n,em),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await L(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await L("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await L("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await L(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await L(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await L("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await L("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await L("git rev-parse --git-dir",{cwd:e}),n=cs.resolve(e,t.trim()),o=cs.resolve(e,s.trim());if(n!==o){let{stdout:i}=await L("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await L("git rev-parse HEAD",{cwd:e}),{stdout:c}=await L("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=cs.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await L("git worktree list --porcelain",{cwd:e}),n=s.split(`
14
+ `)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await L("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=cs.join(t,".env");await E(s)&&await oc.copyFile(s,cs.join(e,".env"));let n=cs.join(t,".prjct"),o=cs.join(e,".prjct");await E(n)&&!await E(o)&&await oc.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await L("git worktree prune",{cwd:n});for(let o of t)o.isMain||await E(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
15
+
16
+ `);for(let o of n){if(!o.trim())continue;let i=o.trim().split(`
17
+ `),a="",c="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?c=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;s.push({path:a,branch:u,commit:c,isMain:p,slug:p?"main":cs.basename(a)})}}return s}},tm=new ic,Jt=tm});var nm={};we(nm,{default:()=>_});import ac from"node:fs/promises";import Nw from"node:path";import*as Bo from"jsonc-parser";function sm(r){let e=[],t=Bo.parse(r,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 cc,Lw,_,Ee=S(()=>{"use strict";ks();H();K();B();ot();Wo();Te();l(sm,"parseJsonc");cc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=j.getLocalConfigPath(e),s=await ac.readFile(t,"utf-8");return sm(s)}catch(t){return I(t)||console.warn(`Warning: Could not read config at ${e}: ${pe(t)}`),null}}async writeConfig(e,t){let s=j.getLocalConfigPath(e);await le(s,t)}async readGlobalConfig(e){try{let t=j.getGlobalProjectConfigPath(e),s=await ac.readFile(t,"utf-8");return sm(s)}catch(t){return I(t)||console.warn(`Warning: Could not read global config for ${e}: ${pe(t)}`),null}}async writeGlobalConfig(e,t){let s=j.getGlobalProjectConfigPath(e);await le(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=b();t={projectId:e,authors:[],version:ge,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=j.generateProjectId(e),n=j.getGlobalProjectPath(s),o=j.getDisplayPath(n),i=b(),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:ge,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=b(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await j.hasLegacyStructure(e))return!1;if(!await j.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=j.getGlobalProjectPath(n.projectId);try{return(await ac.readdir(Nw.join(o,"core"))).length===0}catch(i){return I(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(Jr(),Go));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return j.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.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=b();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 n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=b(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Gn(),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=j.generateProjectId(e);return{projectId:s,dataPath:j.getDisplayPath(j.getGlobalProjectPath(s))}}},Lw=new cc,_=Lw});var om={};we(om,{default:()=>Kr});import lc from"node:fs/promises";import Fw from"node:os";import rm from"node:path";var uc,Uw,Kr,Vo=S(()=>{"use strict";H();B();uc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Fw.homedir(),this.configDir=rm.join(this.homeDir,".prjct-cli","config"),this.configFile=rm.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await lc.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await lc.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",k(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await le(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",k(n)),!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 le(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",k(t)),!1}}async configExists(){return E(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await lc.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},Uw=new uc,Kr=Uw});var zo={};we(zo,{PrjctDatabase:()=>qo,default:()=>N,prjctDb:()=>x});import dc from"node:fs";import im from"node:path";function Hw(r){if(rn()){let{Database:n}=Dt("bun:sqlite");return new n(r,{create:!0})}let e=Dt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Ww,Gw,qo,x,N,se=S(()=>{"use strict";Te();Gr();l(Hw,"openDatabase");Ww=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
14
18
  -- =======================================================================
15
19
  -- Document storage (backward-compatible with JSON file pattern)
16
20
  -- =======================================================================
@@ -460,60 +464,60 @@ var hy=Object.create;var Lr=Object.defineProperty;var yy=Object.getOwnPropertyDe
460
464
 
461
465
  CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
462
466
  CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
463
- `);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],Ew=3,Uo=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Hd.join(D.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Ew&&this.evictLru();let s=this.getDbPath(e),n=Hd.dirname(s);Xa.existsSync(n)||Xa.mkdirSync(n,{recursive:!0});let o=vw(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 Xa.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.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,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.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(`
467
+ `);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],Gw=3,qo=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return im.join(j.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Gw&&this.evictLru();let s=this.getDbPath(e),n=im.dirname(s);dc.existsSync(n)||dc.mkdirSync(n,{recursive:!0});let o=Hw(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 dc.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.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,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.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(`
464
468
  CREATE TABLE IF NOT EXISTS _migrations (
465
469
  version INTEGER PRIMARY KEY,
466
470
  name TEXT NOT NULL,
467
471
  applied_at TEXT NOT NULL
468
472
  )
469
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Tw)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 Uo,N=x});import{z}from"zod";var Cw,Pw,Gd,xw,Rw,Aw,jw,Dw,Wd,Cx,Vd=S(()=>{"use strict";Cw=z.enum(["low","medium","high"]),Pw=z.enum(["pending","converted","completed","archived","dormant"]),Gd=z.enum(["high","medium","low"]),xw=z.object({impact:Gd,effort:Gd}),Rw=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),Aw=z.object({name:z.string(),description:z.string()}),jw=z.object({name:z.string(),description:z.string().optional()}),Dw=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:Cw,status:Pw,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:xw.optional(),implementationNotes:z.string().optional(),stack:Rw.optional(),modules:z.array(Aw).optional(),roles:z.array(jw).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Wd=z.object({ideas:z.array(Dw),lastUpdated:z.string()}),Cx={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import Iw from"node:crypto";import{homedir as $w}from"node:os";import{join as Mw}from"node:path";function Se(){return Iw.randomUUID()}var Dx,Ut=S(()=>{"use strict";l(Se,"generateUUID");Dx=Mw($w(),".prjct-cli","projects")});var ks,Ya,Ht,ln=S(()=>{"use strict";Ut();K();ee();ks={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ya=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Se(),n=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,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return x.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Se(),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 n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.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(),n=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ht=new Ya});var Qa,Ms,Za=S(()=>{"use strict";ke();K();V();Qa=class{static{l(this,"SyncEventBus")}async publish(e){let t=D.getSyncPendingPath(e.projectId),s=await je(t,[])??[];s.push(e),await ce(t,s)}async getPending(e){let t=D.getSyncPendingPath(e);return await je(t,[])??[]}async clearPending(e){let t=D.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=D.getLastSyncPath(e),s={timestamp:v(),success:!0};await ce(t,s)}async getLastSync(e){let t=D.getLastSyncPath(e);return await je(t,null)}},Ms=new Qa});var rt,Ss=S(()=>{"use strict";Za();on();K();ee();rt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new $n({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),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Ms.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,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()}}});var ec,qe,_s=S(()=>{"use strict";Vd();Ut();K();ln();Ss();ec=class extends rt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Wd)}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 n={id:Se(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.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(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.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(n=>n.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 n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.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=$s(ks.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Ht.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.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:n.length}),n.length}},qe=new ec});import{z as C}from"zod";var _w,Go,Ow,Nw,Lw,tc,zd,qd,Jd,Kd,Bd,Fw,Uw,Xd,Yd,Qd,Hw,Gw,rR,sc=S(()=>{"use strict";Ro();_w=C.enum(["low","medium","high","critical"]),Go=C.enum(["feature","bug","improvement","chore"]),Ow=C.enum(["active","backlog","previously_active"]),Nw=C.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Lw=C.enum(["task_completed","feature_shipped","idea_captured","session_started"]),tc=C.object({title:C.string(),description:C.string(),filesChanged:C.array(C.object({path:C.string(),action:C.enum(["created","modified","deleted"])})),whatWasDone:C.array(C.string()).min(1),outputForNextAgent:C.string().min(1),notes:C.string().optional()}),zd=C.object({output:C.string().min(1,"Subtask output is required"),summary:tc}),qd=C.object({id:C.string(),description:C.string(),domain:C.string(),agent:C.string(),status:Nw,dependsOn:C.array(C.string()),startedAt:C.string().optional(),completedAt:C.string().optional(),output:C.string().optional(),summary:tc.optional(),skipReason:C.string().optional(),blockReason:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional()}),Jd=C.object({completed:C.number(),total:C.number(),percentage:C.number()}),Kd=C.object({id:C.string(),description:C.string(),type:Go.optional(),startedAt:C.string(),sessionId:C.string(),featureId:C.string().optional(),subtasks:C.array(qd).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:Jd.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:In.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional(),parentDescription:C.string().optional(),branch:C.string().optional(),prUrl:C.string().optional()}),Bd=C.object({id:C.string(),description:C.string(),status:C.literal("paused"),startedAt:C.string(),pausedAt:C.string(),pauseReason:C.string().optional(),type:Go.optional(),sessionId:C.string().optional(),featureId:C.string().optional(),subtasks:C.array(qd).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:Jd.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:In.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),Fw=C.object({stackConfirmed:C.array(C.string()).optional(),patternsDiscovered:C.array(C.string()).optional(),agentAccuracy:C.array(C.object({agent:C.string(),rating:C.enum(["helpful","neutral","inaccurate"]),note:C.string().optional()})).optional(),issuesEncountered:C.array(C.string()).optional()}),Uw=C.object({taskId:C.string(),title:C.string(),classification:Go,startedAt:C.string(),completedAt:C.string(),subtaskCount:C.number(),subtaskSummaries:C.array(tc),outcome:C.string(),branchName:C.string(),linearId:C.string().optional(),linearUuid:C.string().optional(),prUrl:C.string().optional(),feedback:Fw.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),Xd=C.object({currentTask:Kd.nullable(),previousTask:Bd.nullable().optional(),pausedTasks:C.array(Bd).optional(),taskHistory:C.array(Uw).optional(),lastUpdated:C.string()}),Yd=C.object({id:C.string(),description:C.string(),priority:_w,type:Go,featureId:C.string().optional(),originFeature:C.string().optional(),completed:C.boolean(),completedAt:C.string().optional(),createdAt:C.string(),section:Ow,agent:C.string().optional(),groupName:C.string().optional(),groupId:C.string().optional()}),Qd=C.object({tasks:C.array(Yd),lastUpdated:C.string()}),Hw=C.object({tasksToday:C.number(),tasksThisWeek:C.number(),streak:C.number(),velocity:C.string(),avgDuration:C.string()}),Gw=C.object({type:Lw,description:C.string(),timestamp:C.string(),duration:C.string().optional()}),rR=C.object({projectId:C.string(),currentTask:Kd.nullable(),queue:C.array(Yd),stats:Hw,recentActivity:C.array(Gw),lastSync:C.string()})});function tm(r){return[...r].sort((e,t)=>{let s=em[e.section]-em[t.section];return s!==0?s:Zd[e.priority]-Zd[t.priority]})}function nc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Zd,em,rc=S(()=>{"use strict";Zd={critical:0,high:1,medium:2,low:3},em={active:0,previously_active:1,backlog:2};l(tm,"sortBySectionAndPriority");l(nc,"uniqueBy")});var oc,Ee,is=S(()=>{"use strict";Ut();sc();rc();K();ln();Ss();oc=class extends rt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Qd)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(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 tm(t)[0]||null}async addTask(e,t){let s={...t,id:Se(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.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(),n=t.map(o=>({...o,id:Se(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.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,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=$s(ks.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Ht.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.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:n.length}),n.length}},Ee=new oc});import{z as te}from"zod";var Ww,sm,Vw,Bw,zw,qw,Jw,Kw,Xw,nm,rm=S(()=>{"use strict";Ww=te.enum(["feature","fix","improvement","refactor"]),sm=te.enum(["pass","warning","fail","skipped"]),Vw=te.enum(["added","changed","fixed","removed"]),Bw=te.object({hours:te.number(),minutes:te.number(),totalMinutes:te.number()}),zw=te.object({filesChanged:te.number().nullable().optional(),linesAdded:te.number().nullable().optional(),linesRemoved:te.number().nullable().optional(),commits:te.number().nullable().optional()}),qw=te.object({description:te.string(),type:Vw.optional()}),Jw=te.object({lintStatus:sm.nullable().optional(),lintDetails:te.string().optional(),testStatus:sm.nullable().optional(),testDetails:te.string().optional()}),Kw=te.object({hash:te.string().optional(),message:te.string().optional(),branch:te.string().optional()}),Xw=te.object({id:te.string(),name:te.string(),version:te.string().nullable().optional(),type:Ww,agent:te.string().optional(),description:te.string().optional(),changes:te.array(qw).optional(),codeSnippets:te.array(te.string()).optional(),commit:Kw.optional(),codeMetrics:zw.optional(),qualityMetrics:Jw.optional(),quantitativeImpact:te.string().optional(),duration:Bw.optional(),tasksCompleted:te.number().nullable().optional(),shippedAt:te.string(),featureId:te.string().optional()}),nm=te.object({shipped:te.array(Xw),lastUpdated:te.string()})});var ic,lt,un=S(()=>{"use strict";Ut();rm();K();ln();Ss();ic=class extends rt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",nm)}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((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Se(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...n.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(n=>n.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,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=$s(ks.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Ht.archiveMany(e,n.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:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},lt=new ic});var Br,ac,dn,cc=S(()=>{"use strict";Br={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"}},ac=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=Br[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}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 Br[e]}getPrompt(e){return Br[e].prompt}getValidCommands(e){return Br[e].transitions}formatNextSteps(e){return Br[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}`}})}},dn=new ac});var lc,L,xt=S(()=>{"use strict";Ut();sc();K();cc();ln();Ss();lc=class extends rt{static{l(this,"StateStorage")}constructor(){super("state.json",Xd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=dn.getCurrentState(e),n=dn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.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 n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,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:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.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:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),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 n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...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:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:v(),sessionId:i.sessionId??Se()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}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),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Ht.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(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;g.stackConfirmed&&n.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(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=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:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=zd.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
473
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Ww)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 qo,N=x});import{z as q}from"zod";var Bw,Vw,am,qw,zw,Jw,Kw,Xw,cm,Yx,lm=S(()=>{"use strict";Bw=q.enum(["low","medium","high"]),Vw=q.enum(["pending","converted","completed","archived","dormant"]),am=q.enum(["high","medium","low"]),qw=q.object({impact:am,effort:am}),zw=q.object({frontend:q.string().optional(),backend:q.string().optional(),payments:q.string().optional(),ai:q.string().optional(),deploy:q.string().optional(),other:q.array(q.string()).optional()}),Jw=q.object({name:q.string(),description:q.string()}),Kw=q.object({name:q.string(),description:q.string().optional()}),Xw=q.object({id:q.string(),text:q.string(),details:q.string().optional(),priority:Bw,status:Vw,tags:q.array(q.string()),addedAt:q.string(),completedAt:q.string().optional(),convertedTo:q.string().optional(),source:q.string().optional(),sourceFiles:q.array(q.string()).optional(),painPoints:q.array(q.string()).optional(),solutions:q.array(q.string()).optional(),filesAffected:q.array(q.string()).optional(),impactEffort:qw.optional(),implementationNotes:q.string().optional(),stack:zw.optional(),modules:q.array(Jw).optional(),roles:q.array(Kw).optional(),risks:q.array(q.string()).optional(),risksCount:q.number().optional()}),cm=q.object({ideas:q.array(Xw),lastUpdated:q.string()}),Yx={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import Yw from"node:crypto";import{homedir as Qw}from"node:os";import{join as Zw}from"node:path";function Q(){return Yw.randomUUID()}var nR,Nt=S(()=>{"use strict";l(Q,"generateUUID");nR=Zw(Qw(),".prjct-cli","projects")});var bs,mc,Gt,mn=S(()=>{"use strict";Nt();K();se();bs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},mc=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Q(),n=b();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,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=b();return x.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Q(),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 n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.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(),n=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Gt=new mc});var pc,Ns,gc=S(()=>{"use strict";Te();K();B();pc=class{static{l(this,"SyncEventBus")}async publish(e){let t=j.getSyncPendingPath(e.projectId),s=await De(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=j.getSyncPendingPath(e);return await De(t,[])??[]}async clearPending(e){let t=j.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=j.getLastSyncPath(e),s={timestamp:b(),success:!0};await le(t,s)}async getLastSync(e){let t=j.getLastSyncPath(e);return await De(t,null)}},Ns=new pc});var it,vs=S(()=>{"use strict";gc();ln();K();se();it=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Nn({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),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:b(),projectId:e};await Ns.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:b()};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()}}});var fc,Xe,Ls=S(()=>{"use strict";lm();Nt();K();mn();vs();fc=class extends it{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",cm)}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 n={id:Q(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:b()}))}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 n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=Os(bs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Gt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Xe=new fc});import{z as C}from"zod";var ek,Jo,tk,sk,nk,hc,dm,mm,pm,yc,um,rk,ok,ik,gm,fm,hm,ak,ck,jR,wc=S(()=>{"use strict";$o();ek=C.enum(["low","medium","high","critical"]),Jo=C.enum(["feature","bug","improvement","chore"]),tk=C.enum(["active","backlog","previously_active"]),sk=C.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),nk=C.enum(["task_completed","feature_shipped","idea_captured","session_started"]),hc=C.object({title:C.string(),description:C.string(),filesChanged:C.array(C.object({path:C.string(),action:C.enum(["created","modified","deleted"])})),whatWasDone:C.array(C.string()).min(1),outputForNextAgent:C.string().min(1),notes:C.string().optional()}),dm=C.object({output:C.string().min(1,"Subtask output is required"),summary:hc}),mm=C.object({id:C.string(),description:C.string(),domain:C.string(),agent:C.string(),status:sk,dependsOn:C.array(C.string()),startedAt:C.string().optional(),completedAt:C.string().optional(),output:C.string().optional(),summary:hc.optional(),skipReason:C.string().optional(),blockReason:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional()}),pm=C.object({completed:C.number(),total:C.number(),percentage:C.number()}),yc=C.object({id:C.string(),description:C.string(),type:Jo.optional(),startedAt:C.string(),sessionId:C.string(),featureId:C.string().optional(),subtasks:C.array(mm).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:pm.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:On.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional(),parentDescription:C.string().optional(),branch:C.string().optional(),prUrl:C.string().optional()}),um=C.object({id:C.string(),description:C.string(),status:C.literal("paused"),startedAt:C.string(),pausedAt:C.string(),pauseReason:C.string().optional(),type:Jo.optional(),sessionId:C.string().optional(),featureId:C.string().optional(),subtasks:C.array(mm).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:pm.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:On.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),rk=C.object({stackConfirmed:C.array(C.string()).optional(),patternsDiscovered:C.array(C.string()).optional(),agentAccuracy:C.array(C.object({agent:C.string(),rating:C.enum(["helpful","neutral","inaccurate"]),note:C.string().optional()})).optional(),issuesEncountered:C.array(C.string()).optional()}),ok=C.object({taskId:C.string(),title:C.string(),classification:Jo,startedAt:C.string(),completedAt:C.string(),subtaskCount:C.number(),subtaskSummaries:C.array(hc),outcome:C.string(),branchName:C.string(),linearId:C.string().optional(),linearUuid:C.string().optional(),prUrl:C.string().optional(),feedback:rk.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),ik=yc.extend({workspaceId:C.string(),worktreePath:C.string().optional(),agentSessionId:C.string().optional(),jiraId:C.string().optional(),jiraUuid:C.string().optional(),dispatchedFrom:C.string().optional()}),gm=C.object({currentTask:yc.nullable(),previousTask:um.nullable().optional(),pausedTasks:C.array(um).optional(),taskHistory:C.array(ok).optional(),activeTasks:C.array(ik).optional(),lastUpdated:C.string()}),fm=C.object({id:C.string(),description:C.string(),priority:ek,type:Jo,featureId:C.string().optional(),originFeature:C.string().optional(),completed:C.boolean(),completedAt:C.string().optional(),createdAt:C.string(),section:tk,agent:C.string().optional(),groupName:C.string().optional(),groupId:C.string().optional()}),hm=C.object({tasks:C.array(fm),lastUpdated:C.string()}),ak=C.object({tasksToday:C.number(),tasksThisWeek:C.number(),streak:C.number(),velocity:C.string(),avgDuration:C.string()}),ck=C.object({type:nk,description:C.string(),timestamp:C.string(),duration:C.string().optional()}),jR=C.object({projectId:C.string(),currentTask:yc.nullable(),queue:C.array(fm),stats:ak,recentActivity:C.array(ck),lastSync:C.string()})});function Ko(r){return[...r].sort((e,t)=>{let s=wm[e.section]-wm[t.section];return s!==0?s:ym[e.priority]-ym[t.priority]})}function kc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var ym,wm,Xo=S(()=>{"use strict";ym={critical:0,high:1,medium:2,low:3},wm={active:0,previously_active:1,backlog:2};l(Ko,"sortBySectionAndPriority");l(kc,"uniqueBy")});var Sc,ke,Kt=S(()=>{"use strict";Nt();wc();Xo();K();mn();vs();Sc=class extends it{static{l(this,"QueueStorage")}constructor(){super("queue.json",hm)}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 Ko(t)[0]||null}async addTask(e,t){let s={...t,id:Q(),createdAt:b(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:b()})),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=b(),n=t.map(o=>({...o,id:Q(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:b()},s):i),lastUpdated:b()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:b()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=Os(bs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Gt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ke=new Sc});import{z as ne}from"zod";var lk,km,uk,dk,mk,pk,gk,fk,hk,Sm,bm=S(()=>{"use strict";lk=ne.enum(["feature","fix","improvement","refactor"]),km=ne.enum(["pass","warning","fail","skipped"]),uk=ne.enum(["added","changed","fixed","removed"]),dk=ne.object({hours:ne.number(),minutes:ne.number(),totalMinutes:ne.number()}),mk=ne.object({filesChanged:ne.number().nullable().optional(),linesAdded:ne.number().nullable().optional(),linesRemoved:ne.number().nullable().optional(),commits:ne.number().nullable().optional()}),pk=ne.object({description:ne.string(),type:uk.optional()}),gk=ne.object({lintStatus:km.nullable().optional(),lintDetails:ne.string().optional(),testStatus:km.nullable().optional(),testDetails:ne.string().optional()}),fk=ne.object({hash:ne.string().optional(),message:ne.string().optional(),branch:ne.string().optional()}),hk=ne.object({id:ne.string(),name:ne.string(),version:ne.string().nullable().optional(),type:lk,agent:ne.string().optional(),description:ne.string().optional(),changes:ne.array(pk).optional(),codeSnippets:ne.array(ne.string()).optional(),commit:fk.optional(),codeMetrics:mk.optional(),qualityMetrics:gk.optional(),quantitativeImpact:ne.string().optional(),duration:dk.optional(),tasksCompleted:ne.number().nullable().optional(),shippedAt:ne.string(),featureId:ne.string().optional()}),Sm=ne.object({shipped:ne.array(hk),lastUpdated:ne.string()})});var bc,dt,pn=S(()=>{"use strict";Nt();bm();K();mn();vs();bc=class extends it{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Sm)}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((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Q(),shippedAt:b()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:b()})),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(n=>n.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,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=Os(bs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Gt.archiveMany(e,n.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:b()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},dt=new bc});var Xr,vc,gn,Tc=S(()=>{"use strict";Xr={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"}},vc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.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 s?"working":"idle"}}canTransition(e,t){let s=Xr[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}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 Xr[e]}getPrompt(e){return Xr[e].prompt}getValidCommands(e){return Xr[e].transitions}formatNextSteps(e){return Xr[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}`}})}},gn=new vc});var Ec,F,Pt=S(()=>{"use strict";Nt();wc();K();Tc();mn();vs();Ec=class extends it{static{l(this,"StateStorage")}constructor(){super("state.json",gm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=gn.getCurrentState(e),n=gn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.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 n={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=b(),i=this.createTaskHistoryEntry(n,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:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.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:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),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 n={...s.currentTask,status:"paused",pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:b(),sessionId:i.sessionId??Q()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}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),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Gt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:b()}))}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(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:b()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=b(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:b()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:b()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=dm.safeParse(t);if(!s.success){let w=s.error.issues.map(v=>`${v.path.join(".")}: ${v.message}`);throw new Error(`Subtask completion requires handoff data:
470
474
  ${w.join(`
471
- `)}`)}let{output:n,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:n,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+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:n},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}},L=new lc});function Qw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Yw.has(r)||r.includes("prjct"))return{level:Un.debug,name:"debug"};let e=Un[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Wo(r,e,t){return om>=r?(...s)=>console[t](e,...s):ek}var Un,Yw,om,Zw,ek,tk,B,bs=S(()=>{"use strict";Un={error:0,warn:1,info:2,debug:3},Yw=new Set(["1","true","*"]);l(Qw,"getLogLevel");({level:om,name:Zw}=Qw()),ek=l(()=>{},"noop");l(Wo,"createLogMethod");tk={error:Wo(Un.error,"[prjct:error]","error"),warn:Wo(Un.warn,"[prjct:warn]","warn"),info:Wo(Un.info,"[prjct:info]","log"),debug:Wo(Un.debug,"[prjct:debug]","log"),isEnabled:l(()=>om>=0,"isEnabled"),level:l(()=>Zw,"level")},B=tk});import sk from"node:fs/promises";import nk from"node:path";import{Hono as rk}from"hono";function ok(r){return D.getGlobalProjectPath(r)}function im(r,e){let t=new rk,s=ok(r);return t.get("/state",async n=>{let o=await L.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await Ee.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await qe.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=x.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await lt.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([L.read(r),Ee.read(r),qe.read(r),lt.read(r)]),u=x.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await L.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=nk.join(s,"context",`${o}.md`),c=await sk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return I(a)||B.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var am=S(()=>{"use strict";ke();ee();_s();is();un();xt();H();bs();l(ok,"getProjectDataPath");l(im,"createRoutes")});import Hn from"node:fs/promises";import ik from"node:path";import{Hono as ak}from"hono";function Vo(r){return x.getDoc(r,"project")}async function uc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function cm(){let r=new ak;return r.get("/projects",async e=>{try{await Hn.mkdir(Gn,{recursive:!0});let s=(await Hn.readdir(Gn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Vo(o),a=await L.read(o),c=await Ee.read(o),u=await qe.read(o),d=await lt.read(o),p=a?.currentTask,m=await uc(p?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:p?{...p,duration:m}: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 n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(Vo(t)),L.read(t),Ee.read(t),qe.read(t),lt.read(t)]),c=x.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await uc(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=d)?.length||0,g=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=p)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:i?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await L.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:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([L.read(t),Ee.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===n);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 L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await qe.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await Hn.mkdir(Gn,{recursive:!0});let s=(await Hn.readdir(Gn,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await L.read(c),d=await Ee.read(c),p=await qe.read(c),m=await lt.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Hn.mkdir(Gn,{recursive:!0});let n=(await Hn.readdir(Gn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=Vo(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await L.read(d),m=Vo(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await uc(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}var ck,Gn,lm=S(()=>{"use strict";ke();ee();_s();is();un();xt();ck=D.getGlobalBasePath(),Gn=ik.join(ck,"projects");l(Vo,"getProjectConfig");l(uc,"calculateDuration");l(cm,"createExtendedRoutes")});var um=S(()=>{"use strict"});import{streamSSE as lk}from"hono/streaming";function mm(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>dm&&t(i)},uk),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return lk(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},dk),m=setTimeout(()=>{t(a)},dm);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}var dm,uk,dk,pm=S(()=>{"use strict";um();dm=3600*1e3,uk=300*1e3,dk=3e4;l(mm,"createSSEManager")});var gm={};we(gm,{DEFAULT_PORT:()=>zo,createServer:()=>Bo,startServer:()=>hk});import{Hono as mk}from"hono";import{cors as pk}from"hono/cors";import{logger as gk}from"hono/logger";import{secureHeaders as fk}from"hono/secure-headers";function Bo(r){let e=new mk,t=mm();e.use("*",fk()),r.enableCors!==!1&&e.use("*",pk({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",gk()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:me,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=im(r.projectId,r.projectPath);e.route("/api",s);let n=cm();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(tn())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${tn()?"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)}}}async function hk(r,e,t=zo){let s=Bo({port:t,projectId:r,projectPath:e});return await s.start(),s}var zo,dc=S(()=>{"use strict";Fr();nt();am();lm();pm();l(Bo,"createServer");zo=3478;l(hk,"startServer")});import mn from"chalk";var fm,yk,wk,Jt,hm=S(()=>{"use strict";st();fm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],yk=80,wk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:fm,speed:yk},cli:{header:l(()=>`${mn.cyan.bold("\u26A1")} ${mn.cyan("prjct")}`,"header"),footer:l(()=>mn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${mn.cyan("\u26A1")} ${mn.cyan("prjct")} ${mn.cyan(fm[r%10])} ${mn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>Do(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Do(r).signature,"getSignature")},Jt=wk});function Wn(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return kk[r]}var le,mc,pc,qo,kk,Gt,ym,pn=S(()=>{"use strict";le={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},mc=["feature","spec","design","refactor","migrate"],pc=["ship","cleanup","git","migrate"],qo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],kk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Wn,"getTimeout");Gt={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},ym={HISTORY_MAX:100}});var zr,gc=S(()=>{"use strict";zr={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 gn(r,e){return{...zr[r],...e}}function Vn(r,e,t){return{message:r,hint:e,...t}}var qr=S(()=>{"use strict";gc();gc();l(gn,"getError");l(Vn,"createError")});var km={};we(km,{ERRORS:()=>zr,ICONS:()=>Os,OUTPUT_TIERS:()=>wm,createError:()=>Vn,default:()=>f,formatForHuman:()=>Ek,getError:()=>gn,getOutputTier:()=>bk,getTierConfig:()=>Ko,isQuietMode:()=>Tk,limitLines:()=>Jo,setOutputTier:()=>Sk,setQuietMode:()=>vk});import ie from"chalk";function Sk(r){zn=r}function bk(){return zn}function Ko(){return wm[zn]}function vk(r){Et=r}function Tk(){return Et}function Jo(r,e){let t=e??Ko().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
475
+ `)}`)}let{output:n,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:b(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:b()})),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 Ec});function wk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(yk.has(r)||r.includes("prjct"))return{level:Bn.debug,name:"debug"};let e=Bn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Yo(r,e,t){return vm>=r?(...s)=>console[t](e,...s):Sk}var Bn,yk,vm,kk,Sk,bk,V,Ts=S(()=>{"use strict";Bn={error:0,warn:1,info:2,debug:3},yk=new Set(["1","true","*"]);l(wk,"getLogLevel");({level:vm,name:kk}=wk()),Sk=l(()=>{},"noop");l(Yo,"createLogMethod");bk={error:Yo(Bn.error,"[prjct:error]","error"),warn:Yo(Bn.warn,"[prjct:warn]","warn"),info:Yo(Bn.info,"[prjct:info]","log"),debug:Yo(Bn.debug,"[prjct:debug]","log"),isEnabled:l(()=>vm>=0,"isEnabled"),level:l(()=>kk,"level")},V=bk});import vk from"node:fs/promises";import Tk from"node:path";import{Hono as Ek}from"hono";function Ck(r){return j.getGlobalProjectPath(r)}function Tm(r,e){let t=new Ek,s=Ck(r);return t.get("/state",async n=>{let o=await F.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await ke.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Xe.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=x.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await dt.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([F.read(r),ke.read(r),Xe.read(r),dt.read(r)]),u=x.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await F.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=Tk.join(s,"context",`${o}.md`),c=await vk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return I(a)||V.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var Em=S(()=>{"use strict";Te();se();Ls();Kt();pn();Pt();H();Ts();l(Ck,"getProjectDataPath");l(Tm,"createRoutes")});import Vn from"node:fs/promises";import Pk from"node:path";import{Hono as xk}from"hono";function Qo(r){return x.getDoc(r,"project")}async function Cc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function Cm(){let r=new xk;return r.get("/projects",async e=>{try{await Vn.mkdir(qn,{recursive:!0});let s=(await Vn.readdir(qn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Qo(o),a=await F.read(o),c=await ke.read(o),u=await Xe.read(o),d=await dt.read(o),p=a?.currentTask,m=await Cc(p?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:p?{...p,duration:m}: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 n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(Qo(t)),F.read(t),ke.read(t),Xe.read(t),dt.read(t)]),c=x.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Cc(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=d)?.length||0,g=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=p)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:i?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.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 n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,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:n},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{return e.json({success:!1,error:"Internal server error"},500)}}),r.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 n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([F.read(t),ke.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===n);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{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await Xe.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await Vn.mkdir(qn,{recursive:!0});let s=(await Vn.readdir(qn,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await F.read(c),d=await ke.read(c),p=await Xe.read(c),m=await dt.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Vn.mkdir(qn,{recursive:!0});let n=(await Vn.readdir(qn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=Qo(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await F.read(d),m=Qo(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await Cc(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}var Rk,qn,Pm=S(()=>{"use strict";Te();se();Ls();Kt();pn();Pt();Rk=j.getGlobalBasePath(),qn=Pk.join(Rk,"projects");l(Qo,"getProjectConfig");l(Cc,"calculateDuration");l(Cm,"createExtendedRoutes")});var xm=S(()=>{"use strict"});import{streamSSE as Ak}from"hono/streaming";function Am(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Rm&&t(i)},jk),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return Ak(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},Ik),m=setTimeout(()=>{t(a)},Rm);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}var Rm,jk,Ik,jm=S(()=>{"use strict";xm();Rm=3600*1e3,jk=300*1e3,Ik=3e4;l(Am,"createSSEManager")});var Im={};we(Im,{DEFAULT_PORT:()=>ei,createServer:()=>Zo,startServer:()=>Ok});import{Hono as Dk}from"hono";import{cors as $k}from"hono/cors";import{logger as Mk}from"hono/logger";import{secureHeaders as _k}from"hono/secure-headers";function Zo(r){let e=new Dk,t=Am();e.use("*",_k()),r.enableCors!==!1&&e.use("*",$k({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",Mk()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:ge,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=Tm(r.projectId,r.projectPath);e.route("/api",s);let n=Cm();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(rn())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${rn()?"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)}}}async function Ok(r,e,t=ei){let s=Zo({port:t,projectId:r,projectPath:e});return await s.start(),s}var ei,Pc=S(()=>{"use strict";Gr();ot();Em();Pm();jm();l(Zo,"createServer");ei=3478;l(Ok,"startServer")});import fn from"chalk";var Dm,Nk,Lk,Xt,$m=S(()=>{"use strict";rt();Dm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Nk=80,Lk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Dm,speed:Nk},cli:{header:l(()=>`${fn.cyan.bold("\u26A1")} ${fn.cyan("prjct")}`,"header"),footer:l(()=>fn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${fn.cyan("\u26A1")} ${fn.cyan("prjct")} ${fn.cyan(Dm[r%10])} ${fn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>Oo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Oo(r).signature,"getSignature")},Xt=Lk});function zn(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return Fk[r]}var ue,xc,Rc,ti,Fk,Bt,Mm,hn=S(()=>{"use strict";ue={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},xc=["feature","spec","design","refactor","migrate"],Rc=["ship","cleanup","git","migrate"],ti=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Fk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(zn,"getTimeout");Bt={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},Mm={HISTORY_MAX:100}});var Yr,Ac=S(()=>{"use strict";Yr={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 yn(r,e){return{...Yr[r],...e}}function Jn(r,e,t){return{message:r,hint:e,...t}}var Qr=S(()=>{"use strict";Ac();Ac();l(yn,"getError");l(Jn,"createError")});var Om={};we(Om,{ERRORS:()=>Yr,ICONS:()=>Fs,OUTPUT_TIERS:()=>_m,createError:()=>Jn,default:()=>f,formatForHuman:()=>Bk,getError:()=>yn,getOutputTier:()=>Hk,getTierConfig:()=>ni,isQuietMode:()=>Gk,limitLines:()=>si,setOutputTier:()=>Uk,setQuietMode:()=>Wk});import ce from"chalk";function Uk(r){Xn=r}function Hk(){return Xn}function ni(){return _m[Xn]}function Wk(r){xt=r}function Gk(){return xt}function si(r,e){let t=e??ni().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
472
476
  `);if(s.length<=t)return r;let n=s.slice(0,t),o=s.length-t;return`${n.join(`
473
477
  `)}
474
- ${ie.dim(`...${o} more lines`)}`}function Ek(r){let e=Ko();if(zn==="silent")return"";if(zn==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Wt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Wt(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&zn==="compact"&&o.push(ie.dim(String(t.url))),Jo(o.join(`
475
- `),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${Wt(String(a.title),Gt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(ie.dim(`...${o.length-e.maxLines} more`)),i.join(`
476
- `)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?Jo(n.map(o=>`${o}: ${Wt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
477
- `),e.maxLines):Jo(JSON.stringify(r,null,2),e.maxLines)}var UA,fc,wm,zn,Os,Bn,hc,Et,Wt,Ck,Pk,f,Je=S(()=>{"use strict";hm();pn();qr();qr();UA=Jt.spinner.frames,fc=Jt.spinner.speed,wm={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}},zn="compact";l(Sk,"setOutputTier");l(bk,"getOutputTier");l(Ko,"getTierConfig");Os={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")},Bn=null,hc=0,Et=!1;l(vk,"setQuietMode");l(Tk,"isQuietMode");Wt=l((r,e)=>{let t=e??(Ko().maxCharsPerLine||Gt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Jo,"limitLines");l(Ek,"formatForHuman");Ck=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Gt.CLEAR_WIDTH)}\r`):!0,"clear"),Pk={start(){return Et||console.log(Jt.cli.header()),this},end(){return Et||console.log(Jt.cli.footer()),this},spin(r){return Et?this:(this.stop(),process.stdout.isTTY?(Bn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(hc++,Wt(r,Gt.SPINNER_MSG))}`)},fc),this):(process.stdout.write(`${Jt.cli.spin(0,Wt(r,Gt.SPINNER_MSG))}
478
- `),this))},done(r,e){if(this.stop(),!Et){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(`${Os.success} ${Wt(r,Gt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Os.fail} ${Wt(r,Gt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?gn(r):r;return console.error(),console.error(`${Os.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(r){return this.stop(),Et||console.log(`${Os.warn} ${Wt(r,Gt.WARN_MSG)}`),this},info(r){return this.stop(),Et||console.log(`${Os.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!Et&&e&&console.log(`${Os.debug} ${ie.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),Et)return this;let t=e.bullet||Os.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),Et||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(ie.dim(n)),console.log(ie.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),Et)return this;let t=e.split(`
479
- `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(ie.dim(`\u250C${n}\u2510`)),console.log(`${ie.dim("\u2502")} ${ie.bold(r.padEnd(s))} ${ie.dim("\u2502")}`),console.log(ie.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${ie.dim("\u2502")} ${o.padEnd(s)} ${ie.dim("\u2502")}`);return console.log(ie.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),Et?this:(console.log(`
480
- ${ie.bold(r)}`),console.log(ie.dim("\u2500".repeat(r.length))),this)},stop(){return Bn&&(clearInterval(Bn),Bn=null,Ck()),this},step(r,e,t){if(Et)return this;this.stop();let s=ie.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Bn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(hc++,`${s} ${Wt(t,Gt.STEP_MSG)}`)}`)},fc),this):(process.stdout.write(`${Jt.cli.spin(0,`${s} ${Wt(t,Gt.STEP_MSG)}`)}
481
- `),this)},progress(r,e,t){if(Et)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=ie.cyan("\u2588".repeat(n))+ie.dim("\u2591".repeat(o)),a=t?` ${Wt(t,Gt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Bn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(hc++,`[${i}] ${s}%${a}`)}`)},fc),this):(process.stdout.write(`${Jt.cli.spin(0,`[${i}] ${s}%${a}`)}
482
- `),this)}},f=Pk});var vm={};we(vm,{default:()=>Rk,sessionTracker:()=>Ns});var Sm,bm,yc,Ns,Rk,Xo=S(()=>{"use strict";Hr();ee();on();K();Sm=50,bm=200,yc=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:18e5}}}isExpired(e,t){return Ds(e.lastActivity,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 n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>Sm&&(n.current.commands=n.current.commands.slice(-Sm)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>bm&&(n.current.files=n.current.files.slice(-bm)),await this.write(e,n)}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,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:vt(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:vt(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}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}},Ns=new yc,Rk=Ns});var Em={};we(Em,{default:()=>fn,performanceTracker:()=>Tm});var Ak,wc,Tm,fn,Yo=S(()=>{"use strict";ee();Ak=BigInt(300*1e9),wc=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>Ak&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}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(),n=[{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 n)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 n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,w)=>g+w,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),w=c.map(b=>b.value);o.memory={avgHeapMB:m(g.reduce((b,h)=>b+h,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:w.length>0?m(w.reduce((b,h)=>b+h,0)/w.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let w=g.context?.command||"unknown";m[w]||(m[w]=[]),m[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(m))o.commandDurations[g]={avg:Math.round(w.reduce((b,h)=>b+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},Tm=new wc,fn=Tm});import Qo from"node:fs/promises";var kc,jk,hn,Zo=S(()=>{"use strict";ve();ke();H();on();V();kc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new $n({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await M.getProjectId(e),n=D.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:D.getFilePath(s,"core","now.md"),next:D.getFilePath(s,"core","next.md"),context:D.getFilePath(s,"core","context.md"),shipped:D.getFilePath(s,"progress","shipped.md"),metrics:D.getFilePath(s,"progress","metrics.md"),ideas:D.getFilePath(s,"planning","ideas.md"),roadmap:D.getFilePath(s,"planning","roadmap.md"),specs:D.getFilePath(s,"planning","specs"),memory:D.getFilePath(s,"memory","context.jsonl"),patterns:D.getFilePath(s,"memory","patterns.json"),analysis:D.getFilePath(s,"analysis","repo-summary.md"),codePatterns:D.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={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Qo.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(I(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[p,m]=await Promise.all([Qo.readFile(d,"utf-8"),Qo.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(I(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}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"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Qo.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(I(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);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){return E(e)}getCacheStats(){return this._cache.stats()}},jk=new kc,hn=jk});function ei(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Ke,Jr=S(()=>{"use strict";Ke={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"};l(ei,"calculateConfidence")});var ti,si,ni,Sc=S(()=>{"use strict";ee();Jr();K();ti=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),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},si=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()}},ni=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(n=>JSON.parse(n.data))}}});var ri,Cm=S(()=>{"use strict";ee();Jr();K();Sc();ri=class r extends ti{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))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",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:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=ei(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 n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=v();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=ei(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:ei(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.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 getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&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{createHash as Pm}from"node:crypto";function Kr(r){return Pm("sha256").update(r).digest("hex")}function yn(r){return Kr(r).slice(0,16)}function xm(r){return Pm("md5").update(r).digest("hex")}var wn=S(()=>{"use strict";l(Kr,"sha256");l(yn,"sha256Short");l(xm,"md5")});function vs(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var qn,bc=S(()=>{"use strict";Ut();ee();Jr();K();wn();l(vs,"rowToMemory");qn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Ke));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=v(),d=yn(s),p=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
483
- revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=Se();return N.run(e,`INSERT INTO memories
478
+ ${ce.dim(`...${o} more lines`)}`}function Bk(r){let e=ni();if(Xn==="silent")return"";if(Xn==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Vt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Vt(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&Xn==="compact"&&o.push(ce.dim(String(t.url))),si(o.join(`
479
+ `),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${Vt(String(a.title),Bt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(ce.dim(`...${o.length-e.maxLines} more`)),i.join(`
480
+ `)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?si(n.map(o=>`${o}: ${Vt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
481
+ `),e.maxLines):si(JSON.stringify(r,null,2),e.maxLines)}var mj,jc,_m,Xn,Fs,Kn,Ic,xt,Vt,Vk,qk,f,Ve=S(()=>{"use strict";$m();hn();Qr();Qr();mj=Xt.spinner.frames,jc=Xt.spinner.speed,_m={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}},Xn="compact";l(Uk,"setOutputTier");l(Hk,"getOutputTier");l(ni,"getTierConfig");Fs={success:ce.green("\u2713"),fail:ce.red("\u2717"),warn:ce.yellow("\u26A0"),info:ce.blue("\u2139"),debug:ce.dim("\u{1F527}"),bullet:ce.dim("\u2022"),arrow:ce.dim("\u2192"),check:ce.green("\u2713"),cross:ce.red("\u2717"),spinner:ce.cyan("\u25D0")},Kn=null,Ic=0,xt=!1;l(Wk,"setQuietMode");l(Gk,"isQuietMode");Vt=l((r,e)=>{let t=e??(ni().maxCharsPerLine||Bt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(si,"limitLines");l(Bk,"formatForHuman");Vk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Bt.CLEAR_WIDTH)}\r`):!0,"clear"),qk={start(){return xt||console.log(Xt.cli.header()),this},end(){return xt||console.log(Xt.cli.footer()),this},spin(r){return xt?this:(this.stop(),process.stdout.isTTY?(Kn=setInterval(()=>{process.stdout.write(`\r${Xt.cli.spin(Ic++,Vt(r,Bt.SPINNER_MSG))}`)},jc),this):(process.stdout.write(`${Xt.cli.spin(0,Vt(r,Bt.SPINNER_MSG))}
482
+ `),this))},done(r,e){if(this.stop(),!xt){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=ce.dim(` [${s.join(" | ")}]`))}console.log(`${Fs.success} ${Vt(r,Bt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Fs.fail} ${Vt(r,Bt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?yn(r):r;return console.error(),console.error(`${Fs.fail} ${e.message}`),e.file&&console.error(ce.dim(` File: ${e.file}`)),e.hint&&console.error(ce.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ce.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),xt||console.log(`${Fs.warn} ${Vt(r,Bt.WARN_MSG)}`),this},info(r){return this.stop(),xt||console.log(`${Fs.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!xt&&e&&console.log(`${Fs.debug} ${ce.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),xt)return this;let t=e.bullet||Fs.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),xt||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(ce.dim(n)),console.log(ce.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),xt)return this;let t=e.split(`
483
+ `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(ce.dim(`\u250C${n}\u2510`)),console.log(`${ce.dim("\u2502")} ${ce.bold(r.padEnd(s))} ${ce.dim("\u2502")}`),console.log(ce.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${ce.dim("\u2502")} ${o.padEnd(s)} ${ce.dim("\u2502")}`);return console.log(ce.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),xt?this:(console.log(`
484
+ ${ce.bold(r)}`),console.log(ce.dim("\u2500".repeat(r.length))),this)},stop(){return Kn&&(clearInterval(Kn),Kn=null,Vk()),this},step(r,e,t){if(xt)return this;this.stop();let s=ce.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Kn=setInterval(()=>{process.stdout.write(`\r${Xt.cli.spin(Ic++,`${s} ${Vt(t,Bt.STEP_MSG)}`)}`)},jc),this):(process.stdout.write(`${Xt.cli.spin(0,`${s} ${Vt(t,Bt.STEP_MSG)}`)}
485
+ `),this)},progress(r,e,t){if(xt)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=ce.cyan("\u2588".repeat(n))+ce.dim("\u2591".repeat(o)),a=t?` ${Vt(t,Bt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Kn=setInterval(()=>{process.stdout.write(`\r${Xt.cli.spin(Ic++,`[${i}] ${s}%${a}`)}`)},jc),this):(process.stdout.write(`${Xt.cli.spin(0,`[${i}] ${s}%${a}`)}
486
+ `),this)}},f=qk});var Fm={};we(Fm,{default:()=>Jk,sessionTracker:()=>Us});var Nm,Lm,Dc,Us,Jk,ri=S(()=>{"use strict";Vr();se();ln();K();Nm=50,Lm=200,Dc=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:18e5}}}isExpired(e,t){return Ms(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=b();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>Nm&&(n.current.commands=n.current.commands.slice(-Nm)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=b();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>Lm&&(n.current.files=n.current.files.slice(-Lm)),await this.write(e,n)}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,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:Et(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:Et(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}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}},Us=new Dc,Jk=Us});var Hm={};we(Hm,{default:()=>wn,performanceTracker:()=>Um});var Kk,$c,Um,wn,oi=S(()=>{"use strict";se();Kk=BigInt(300*1e9),$c=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>Kk&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}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(),n=[{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 n)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 n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,w)=>g+w,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(v=>Math.round(v/1048576*10)/10,"toMB"),g=a.map(v=>v.value),w=c.map(v=>v.value);o.memory={avgHeapMB:m(g.reduce((v,h)=>v+h,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:w.length>0?m(w.reduce((v,h)=>v+h,0)/w.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let w=g.context?.command||"unknown";m[w]||(m[w]=[]),m[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(m))o.commandDurations[g]={avg:Math.round(w.reduce((v,h)=>v+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},Um=new $c,wn=Um});import ii from"node:fs/promises";var Mc,Xk,kn,ai=S(()=>{"use strict";Ee();Te();H();ln();B();Mc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Nn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await _.getProjectId(e),n=j.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:j.getFilePath(s,"core","now.md"),next:j.getFilePath(s,"core","next.md"),context:j.getFilePath(s,"core","context.md"),shipped:j.getFilePath(s,"progress","shipped.md"),metrics:j.getFilePath(s,"progress","metrics.md"),ideas:j.getFilePath(s,"planning","ideas.md"),roadmap:j.getFilePath(s,"planning","roadmap.md"),specs:j.getFilePath(s,"planning","specs"),memory:j.getFilePath(s,"memory","context.jsonl"),patterns:j.getFilePath(s,"memory","patterns.json"),analysis:j.getFilePath(s,"analysis","repo-summary.md"),codePatterns:j.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={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await ii.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(I(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[p,m]=await Promise.all([ii.readFile(d,"utf-8"),ii.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(I(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}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"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await ii.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(I(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);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){return E(e)}getCacheStats(){return this._cache.stats()}},Xk=new Mc,kn=Xk});function ci(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Ye,Zr=S(()=>{"use strict";Ye={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"};l(ci,"calculateConfidence")});var li,ui,di,_c=S(()=>{"use strict";se();Zr();K();li=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),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},ui=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()}},di=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:b(),...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(n=>JSON.parse(n.data))}}});var mi,Wm=S(()=>{"use strict";se();Zr();K();_c();mi=class r extends li{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))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=ci(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 n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=b();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=ci(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:b(),confidence:ci(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=b(),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 getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&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{createHash as Gm}from"node:crypto";function eo(r){return Gm("sha256").update(r).digest("hex")}function Sn(r){return eo(r).slice(0,16)}function Bm(r){return Gm("md5").update(r).digest("hex")}var bn=S(()=>{"use strict";l(eo,"sha256");l(Sn,"sha256Short");l(Bm,"md5")});function Es(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var Yn,Oc=S(()=>{"use strict";Nt();se();Zr();K();bn();l(Es,"rowToMemory");Yn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Ye));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=b(),d=Sn(s),p=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
487
+ revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=Q();return N.run(e,`INSERT INTO memories
484
488
  (id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
485
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?yn(i):n.content_hash;return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
486
- revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,v(),t),!0}async deleteMemory(e,t){return N.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",v(),t),!0):!1}async findByTags(e,t,s=!1){let n=this._coerceTags(t);if(n.length===0)return[];let o=n.map(()=>"(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)"),i=s?" AND ":" OR ",a=o.join(i),c=[e];for(let d of n)c.push(d,`${d},%`,`%,${d},%`,`%,${d}`);return N.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
487
- AND (${a}) ORDER BY updated_at DESC`,...c).map(vs)}async searchMemories(e,t,s=20,n=0){try{return N.query(e,`SELECT m.* FROM memories m
489
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?Sn(i):n.content_hash;return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
490
+ revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,b(),t),!0}async deleteMemory(e,t){return N.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",b(),t),!0):!1}async findByTags(e,t,s=!1){let n=this._coerceTags(t);if(n.length===0)return[];let o=n.map(()=>"(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)"),i=s?" AND ":" OR ",a=o.join(i),c=[e];for(let d of n)c.push(d,`${d},%`,`%,${d},%`,`%,${d}`);return N.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
491
+ AND (${a}) ORDER BY updated_at DESC`,...c).map(Es)}async searchMemories(e,t,s=20,n=0){try{return N.query(e,`SELECT m.* FROM memories m
488
492
  JOIN memories_fts fts ON m.rowid = fts.rowid
489
493
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
490
- ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(vs)}catch{let o=`%${t}%`;return N.query(e,`SELECT * FROM memories
494
+ ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(Es)}catch{let o=`%${t}%`;return N.query(e,`SELECT * FROM memories
491
495
  WHERE project_id = ? AND deleted_at IS NULL
492
496
  AND (title LIKE ? OR content LIKE ?)
493
- ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(vs)}}async getRelevantMemories(e,t,s=5){let n=[];if(t.commandName&&n.push(t.commandName),t.params?.description&&n.push(String(t.params.description)),t.params?.task&&n.push(String(t.params.task)),t.params?.feature&&n.push(String(t.params.feature)),n.length===0)return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(vs);let o=n.join(" ");try{return N.query(e,`SELECT m.* FROM memories m
497
+ ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(Es)}}async getRelevantMemories(e,t,s=5){let n=[];if(t.commandName&&n.push(t.commandName),t.params?.description&&n.push(String(t.params.description)),t.params?.task&&n.push(String(t.params.task)),t.params?.feature&&n.push(String(t.params.feature)),n.length===0)return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Es);let o=n.join(" ");try{return N.query(e,`SELECT m.* FROM memories m
494
498
  JOIN memories_fts fts ON m.rowid = fts.rowid
495
499
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
496
- ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(vs)}catch{return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(vs)}}async getRelevantMemoriesWithMetrics(e,t){let n=N.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,p)=>d+p.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[Ke.COMMIT_STYLE],branch_naming:[Ke.BRANCH_NAMING],test_before_ship:[Ke.TEST_BEHAVIOR,Ke.SHIP_WORKFLOW],preferred_agent:[Ke.AGENT_PREFERENCE],code_style:[Ke.CODE_STYLE],verbosity:[Ke.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
500
+ ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(Es)}catch{return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Es)}}async getRelevantMemoriesWithMetrics(e,t){let n=N.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,p)=>d+p.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[Ye.COMMIT_STYLE],branch_naming:[Ye.BRANCH_NAMING],test_before_ship:[Ye.TEST_BEHAVIOR,Ye.SHIP_WORKFLOW],preferred_agent:[Ye.AGENT_PREFERENCE],code_style:[Ye.CODE_STYLE],verbosity:[Ye.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
497
501
  Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async findSimilar(e,t,s=5){let n=await this.getMemoryById(e,t);if(!n)return[];let o=n.title.split(/\s+/).filter(a=>a.length>2).slice(0,8);if(o.length===0)return[];let i=o.join(" OR ");try{return N.query(e,`SELECT m.* FROM memories m
498
502
  JOIN memories_fts fts ON m.rowid = fts.rowid
499
503
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
500
- ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(vs)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=N.query(e,`SELECT title, COUNT(*) as cnt FROM memories
504
+ ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Es)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=N.query(e,`SELECT title, COUNT(*) as cnt FROM memories
501
505
  WHERE project_id = ? AND deleted_at IS NULL
502
- GROUP BY title HAVING cnt > 1`,e),n=v();for(let o of s){let i=N.query(e,`SELECT * FROM memories
506
+ GROUP BY title HAVING cnt > 1`,e),n=b();for(let o of s){let i=N.query(e,`SELECT * FROM memories
503
507
  WHERE project_id = ? AND title = ? AND deleted_at IS NULL
504
508
  ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(m=>m.content!==a.content).map(m=>m.content)].filter((m,g,w)=>w.indexOf(m)===g).join(`
505
509
 
506
510
  ---
507
511
 
508
- `),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&N.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?vs(s):null}async getAllMemories(e){return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(vs)}async getMemoryStats(e){let t=N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var vc,Dk,ft,oi=S(()=>{"use strict";Sc();Cm();bc();vc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new qn,this._patternStore=new ri,this._historyStore=new ni,this._sessionStore=new si}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,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(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,n){return this._patternStore.recordDecision(e,t,s,n)}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,n){return this._patternStore.setPreference(e,t,s,n)}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)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(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 n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Dk=new vc,ft=Dk});import Vt from"node:fs/promises";import Kt from"node:path";var Tc,Ik,ot,Rm=S(()=>{"use strict";H();ze();V();Tc=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Kt.join(this.projectPath,"package.json"),t=await Vt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Kt.join(this.projectPath,"Cargo.toml");return await Vt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readRequirements(){try{let e=Kt.join(this.projectPath,"requirements.txt");return await Vt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readGoMod(){try{let e=Kt.join(this.projectPath,"go.mod");return await Vt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readGemfile(){try{let e=Kt.join(this.projectPath,"Gemfile");return await Vt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readMixExs(){try{let e=Kt.join(this.projectPath,"mix.exs");return await Vt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readPomXml(){try{let e=Kt.join(this.projectPath,"pom.xml");return await Vt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readComposerJson(){try{let e=Kt.join(this.projectPath,"composer.json"),t=await Vt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Kt.join(this.projectPath,"pyproject.toml");return await Vt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await F('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(`
509
- `).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Vt.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(n=>n.test(s)))}catch(e){if(I(e))return[];throw e}}async listDirectories(){try{return(await Vt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(I(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await F(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await F("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await F('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await F('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 F('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){return E(Kt.join(this.projectPath,e))}async readFile(e){try{let t=Kt.join(this.projectPath,e);return await Vt.readFile(t,"utf-8")}catch(t){if(I(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await F(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
510
- `).filter(Boolean)}catch{return[]}}},Ik=new Tc,ot=Ik});import Cc from"node:fs";import $k from"node:fs/promises";import ii from"node:path";function Pc(){if(Am)return Ec;Am=!0;let r=ii.join(Tt,"dist","templates.json");try{let e=Cc.readFileSync(r,"utf-8");return Ec=JSON.parse(e),Ec}catch{return null}}function _k(r){let e=kn.indexOf(r);e>-1&&kn.splice(e,1),kn.push(r)}function Ok(){for(;Jn.size>=Mk&&kn.length>0;){let r=kn.shift();r&&Jn.delete(r)}}function jm(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
511
- `).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:n.trim()}}async function Dm(r){if(Jn.has(r))return _k(r),Jn.get(r);let e,t=Pc();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=ii.join(Tt,"templates","commands",`${r}.md`);try{e=await $k.readFile(n,"utf-8")}catch{throw $o.notFound(r)}}let s=jm(e);return Ok(),Jn.set(r,s),kn.push(r),s}async function Nk(r){return(await Dm(r)).frontmatter["allowed-tools"]||[]}function Lk(){Jn.clear(),kn.length=0}function ht(r){let e=Pc();if(e?.[r])return e[r];let t=ii.join(Tt,"templates",r);try{return Cc.readFileSync(t,"utf-8")}catch{return null}}function Ls(r){let e=Pc();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=ii.join(Tt,"templates",r);try{return Cc.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var Mk,Jn,kn,Ec,Am,Fk,Im,Fs=S(()=>{"use strict";ys();nt();Mk=50,Jn=new Map,kn=[],Ec=null,Am=!1;l(Pc,"loadBundle");l(_k,"updateLruOrder");l(Ok,"evictLru");l(jm,"parseFrontmatter");l(Dm,"load");l(Nk,"getAllowedTools");l(Lk,"clearCache");l(ht,"getTemplateContent");l(Ls,"listTemplates");Fk={load:Dm,parseFrontmatter:jm,getAllowedTools:Nk,clearCache:Lk,getTemplateContent:ht,listTemplates:Ls},Im=Fk});function ai(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
512
+ `),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&N.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?Es(s):null}async getAllMemories(e){return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(Es)}async getMemoryStats(e){let t=N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var Nc,Yk,yt,pi=S(()=>{"use strict";_c();Wm();Oc();Nc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Yn,this._patternStore=new mi,this._historyStore=new di,this._sessionStore=new ui}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,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(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,n){return this._patternStore.recordDecision(e,t,s,n)}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,n){return this._patternStore.setPreference(e,t,s,n)}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)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(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 n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Yk=new Nc,yt=Yk});import qt from"node:fs/promises";import Yt from"node:path";var Lc,Qk,at,Vm=S(()=>{"use strict";H();Ge();B();Lc=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Yt.join(this.projectPath,"package.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Yt.join(this.projectPath,"Cargo.toml");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readRequirements(){try{let e=Yt.join(this.projectPath,"requirements.txt");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readGoMod(){try{let e=Yt.join(this.projectPath,"go.mod");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readGemfile(){try{let e=Yt.join(this.projectPath,"Gemfile");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readMixExs(){try{let e=Yt.join(this.projectPath,"mix.exs");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readPomXml(){try{let e=Yt.join(this.projectPath,"pom.xml");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readComposerJson(){try{let e=Yt.join(this.projectPath,"composer.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Yt.join(this.projectPath,"pyproject.toml");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await L('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(`
513
+ `).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await qt.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(n=>n.test(s)))}catch(e){if(I(e))return[];throw e}}async listDirectories(){try{return(await qt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(I(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await L(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await L("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await L('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await L('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 L('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){return E(Yt.join(this.projectPath,e))}async readFile(e){try{let t=Yt.join(this.projectPath,e);return await qt.readFile(t,"utf-8")}catch(t){if(I(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await L(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
514
+ `).filter(Boolean)}catch{return[]}}},Qk=new Lc,at=Qk});import Uc from"node:fs";import Zk from"node:fs/promises";import gi from"node:path";function Hc(){if(qm)return Fc;qm=!0;let r=gi.join(Ct,"dist","templates.json");try{let e=Uc.readFileSync(r,"utf-8");return Fc=JSON.parse(e),Fc}catch{return null}}function tS(r){let e=vn.indexOf(r);e>-1&&vn.splice(e,1),vn.push(r)}function sS(){for(;Qn.size>=eS&&vn.length>0;){let r=vn.shift();r&&Qn.delete(r)}}function zm(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
515
+ `).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:n.trim()}}async function Jm(r){if(Qn.has(r))return tS(r),Qn.get(r);let e,t=Hc();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=gi.join(Ct,"templates","commands",`${r}.md`);try{e=await Zk.readFile(n,"utf-8")}catch{throw Lo.notFound(r)}}let s=zm(e);return sS(),Qn.set(r,s),vn.push(r),s}async function nS(r){return(await Jm(r)).frontmatter["allowed-tools"]||[]}function rS(){Qn.clear(),vn.length=0}function wt(r){let e=Hc();if(e?.[r])return e[r];let t=gi.join(Ct,"templates",r);try{return Uc.readFileSync(t,"utf-8")}catch{return null}}function Hs(r){let e=Hc();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=gi.join(Ct,"templates",r);try{return Uc.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var eS,Qn,vn,Fc,qm,oS,Km,Ws=S(()=>{"use strict";ks();ot();eS=50,Qn=new Map,vn=[],Fc=null,qm=!1;l(Hc,"loadBundle");l(tS,"updateLruOrder");l(sS,"evictLru");l(zm,"parseFrontmatter");l(Jm,"load");l(nS,"getAllowedTools");l(rS,"clearCache");l(wt,"getTemplateContent");l(Hs,"listTemplates");oS={load:Jm,parseFrontmatter:zm,getAllowedTools:nS,clearCache:rS,getTemplateContent:wt,listTemplates:Hs},Km=oS});function fi(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
512
516
 
513
- ${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var xc=S(()=>{"use strict";Fs();H();V();bs();nt();l(ai,"mergeWithMarkers")});import ut from"node:fs/promises";import ci from"node:os";import Ce from"node:path";async function Uk(){try{let r=Ce.join(ci.homedir(),".prjct-cli","docs");await ut.mkdir(r,{recursive:!0});let e=Ls("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=ht(n);if(o){let i=Ce.basename(n);await ut.writeFile(Ce.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(nt(),St(Ln)),s=Ce.join(t,"templates/global/docs");try{let n=await ut.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Ce.join(s,o),a=Ce.join(r,o),c=await ut.readFile(i,"utf-8");await ut.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:k(r)}}}async function Hk(){let r=(st(),St(It)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await ut.mkdir(e.configDir,{recursive:!0});let n=Ce.join(e.configDir,e.contextFile),o=$m;if(t!=="claude"){let g=ht(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(nt(),St(Ln)),b=Ce.join(w,"templates","global",e.contextFile);try{o=await ut.readFile(b,"utf-8")}catch{t==="gemini"&&(o=$m.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await ut.readFile(n,"utf-8"),a=!0}catch(g){if(I(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),w=i.substring(i.indexOf(u)+u.length);i=`${(g+w).replace(/\n{3,}/g,`
517
+ ${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var Wc=S(()=>{"use strict";Ws();H();B();Ts();ot();l(fi,"mergeWithMarkers")});import mt from"node:fs/promises";import hi from"node:os";import Re from"node:path";async function iS(){try{let r=Re.join(hi.homedir(),".prjct-cli","docs");await mt.mkdir(r,{recursive:!0});let e=Hs("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=wt(n);if(o){let i=Re.basename(n);await mt.writeFile(Re.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(ot(),vt(Wn)),s=Re.join(t,"templates/global/docs");try{let n=await mt.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Re.join(s,o),a=Re.join(r,o),c=await mt.readFile(i,"utf-8");await mt.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:k(r)}}}async function aS(){let r=(rt(),vt(Mt)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await mt.mkdir(e.configDir,{recursive:!0});let n=Re.join(e.configDir,e.contextFile),o=Xm;if(t!=="claude"){let g=wt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(ot(),vt(Wn)),v=Re.join(w,"templates","global",e.contextFile);try{o=await mt.readFile(v,"utf-8")}catch{t==="gemini"&&(o=Xm.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await mt.readFile(n,"utf-8"),a=!0}catch(g){if(I(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),w=i.substring(i.indexOf(u)+u.length);i=`${(g+w).replace(/\n{3,}/g,`
514
518
 
515
519
  `).trim()}
516
- `}let m=ai(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await ut.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function Mm(){let r=ci.homedir();return{claude:{commands:Ce.join(r,".claude","commands"),config:Ce.join(r,".claude"),router:Ce.join(r,".claude","commands","p.md")},gemini:{commands:Ce.join(r,".gemini","commands"),config:Ce.join(r,".gemini"),router:Ce.join(r,".gemini","commands","p.toml")}}}var $m,Ts,Gk,Me,Es=S(()=>{"use strict";Fs();H();V();xc();$m=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
520
+ `}let m=fi(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await mt.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function Ym(){let r=hi.homedir();return{claude:{commands:Re.join(r,".claude","commands"),config:Re.join(r,".claude"),router:Re.join(r,".claude","commands","p.md")},gemini:{commands:Re.join(r,".gemini","commands"),config:Re.join(r,".gemini"),router:Re.join(r,".gemini","commands","p.toml")}}}var Xm,Cs,cS,Oe,Ps=S(()=>{"use strict";Ws();H();B();Wc();Xm=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
517
521
  # p/ \u2014 Context layer for AI agents
518
522
 
519
523
  Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
@@ -529,20 +533,20 @@ Data:
529
533
 
530
534
  **Auto-managed by prjct-cli** | https://prjct.app
531
535
  <!-- prjct:end - DO NOT REMOVE THIS MARKER -->
532
- `;l(Uk,"installDocs");l(Hk,"installGlobalConfig");Ts=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=ci.homedir()}async ensureInit(){if(this._initialized)return;let t=await(st(),St(It)).getActiveProvider();this.commandsPath=Ce.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),E(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(st(),St(It)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=Ce.join(this.commandsPath,t);try{await ut.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:k(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:k(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:k(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=Ce.join(this.commandsPath,t);try{await ut.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Ce.join(this.commandsPath,"p");try{if((await ut.stat(e).catch(()=>null))?.isDirectory())return await ut.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Hk()}async cleanupAllLegacy(){let e=ci.homedir(),t=[],s=[Ce.join(e,".claude","commands","p.md"),Ce.join(e,".claude","commands","p.toml"),Ce.join(e,".gemini","commands","p.md"),Ce.join(e,".gemini","commands","p.toml")];for(let i of s)try{await ut.unlink(i),t.push(i)}catch{}let n=[Ce.join(e,".claude","commands","p"),Ce.join(e,".gemini","commands","p")];for(let i of n)try{(await ut.stat(i).catch(()=>null))?.isDirectory()&&(await ut.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Ce.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await ut.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Uk()}};l(Mm,"getProviderPaths");Gk=new Ts,Me=Gk});import{z as He}from"zod";function Lm(r,e="default"){let t=_m[e]||_m.default;return r/1e3*t}function li(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Wk,Vk,Om,Nm,_m,ui=S(()=>{"use strict";Wk=He.object({date:He.string(),tokensSaved:He.number(),syncs:He.number(),avgCompressionRate:He.number(),totalDuration:He.number()}),Vk=He.object({agentName:He.string(),usageCount:He.number(),tokensSaved:He.number()}),Om=He.object({totalTokensSaved:He.number(),avgCompressionRate:He.number(),syncCount:He.number(),watchTriggers:He.number(),avgSyncDuration:He.number(),totalSyncDuration:He.number(),agentUsage:He.array(Vk),dailyStats:He.array(Wk),firstSync:He.string(),lastUpdated:He.string()}),Nm={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},_m={"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(Lm,"estimateCostSaved");l(li,"formatCost")});function Fm(r,e){let t=[];Xr("Languages",r.languages,e.languages,t),Xr("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),Xr("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);Xr("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Xr("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Rc(r){if(!r.hasChanges)return`## Analysis Diff
536
+ `;l(iS,"installDocs");l(aS,"installGlobalConfig");Cs=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=hi.homedir()}async ensureInit(){if(this._initialized)return;let t=await(rt(),vt(Mt)).getActiveProvider();this.commandsPath=Re.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),E(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(rt(),vt(Mt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=Re.join(this.commandsPath,t);try{await mt.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:k(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:k(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:k(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=Re.join(this.commandsPath,t);try{await mt.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Re.join(this.commandsPath,"p");try{if((await mt.stat(e).catch(()=>null))?.isDirectory())return await mt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return aS()}async cleanupAllLegacy(){let e=hi.homedir(),t=[],s=[Re.join(e,".claude","commands","p.md"),Re.join(e,".claude","commands","p.toml"),Re.join(e,".gemini","commands","p.md"),Re.join(e,".gemini","commands","p.toml")];for(let i of s)try{await mt.unlink(i),t.push(i)}catch{}let n=[Re.join(e,".claude","commands","p"),Re.join(e,".gemini","commands","p")];for(let i of n)try{(await mt.stat(i).catch(()=>null))?.isDirectory()&&(await mt.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Re.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await mt.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return iS()}};l(Ym,"getProviderPaths");cS=new Cs,Oe=cS});import{z as qe}from"zod";function tp(r,e="default"){let t=Qm[e]||Qm.default;return r/1e3*t}function yi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var lS,uS,Zm,ep,Qm,wi=S(()=>{"use strict";lS=qe.object({date:qe.string(),tokensSaved:qe.number(),syncs:qe.number(),avgCompressionRate:qe.number(),totalDuration:qe.number()}),uS=qe.object({agentName:qe.string(),usageCount:qe.number(),tokensSaved:qe.number()}),Zm=qe.object({totalTokensSaved:qe.number(),avgCompressionRate:qe.number(),syncCount:qe.number(),watchTriggers:qe.number(),avgSyncDuration:qe.number(),totalSyncDuration:qe.number(),agentUsage:qe.array(uS),dailyStats:qe.array(lS),firstSync:qe.string(),lastUpdated:qe.string()}),ep={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Qm={"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(tp,"estimateCostSaved");l(yi,"formatCost")});function sp(r,e){let t=[];to("Languages",r.languages,e.languages,t),to("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),to("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);to("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);to("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Gc(r){if(!r.hasChanges)return`## Analysis Diff
533
537
 
534
538
  No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let n=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${n} | ${s.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
535
- `)}function Um(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
536
- `)}function Xr(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var Ac=S(()=>{"use strict";l(Fm,"generateAnalysisDiff");l(Rc,"formatAnalysisDiffMd");l(Um,"formatAnalysisDiffText");l(Xr,"diffStringArray")});var jc,Dc,Hm,Yr=S(()=>{"use strict";jc=[1,2,3,5,8,13,21],Dc={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}},Hm={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Bk from"node:fs/promises";import zk from"node:path";function Kn(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function qk(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...Kn(m));let n=[/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 m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Kn(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 m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Kn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...Kn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...Kn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Vm.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function Jk(r){return r.split(/\s+/).flatMap(e=>Kn(e)).filter(e=>e.length>1&&!Vm.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Kk(r){let e=await nn(r),t={},s={},n=0,o=await rn(e,50,async a=>{try{let c=await Bk.readFile(zk.join(r,a),"utf-8"),u=qk(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Xk(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function Yk(r,e){let t=Jk(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=Xk(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function Qk(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,Bm,t)}function di(r){let e=N.getDoc(r,Bm);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function zm(r,e){let t=await Kk(r);return Qk(e,t),t}function qm(r,e,t=15){let s=di(r);return s?Yk(e,s).slice(0,t):[]}var Vm,Bm,Ic=S(()=>{"use strict";Yr();ee();V();Vm=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"]);l(Kn,"splitIdentifier");l(qk,"tokenizeFile");l(Jk,"tokenizeQuery");l(Kk,"buildIndex");l(Xk,"idf");l(Yk,"score");Bm="bm25-index";l(Qk,"saveIndex");l(di,"loadIndex");l(zm,"indexProject");l(qm,"queryFiles")});import $c from"node:fs/promises";import Us from"node:path";import{z as Y}from"zod";async function nS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Us.join(e,"package.json"),n=await $c.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.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 I(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 rS(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await cS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=sS[a];if(!c)continue;c.some(d=>n.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 oS(r,e){let t=Date.now(),s=r.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 n=[],o=[];for(let i of s){let a=i.location,c=Us.join(e,a);await E(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.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: ${n.join(", ")}`,durationMs:Date.now()-t}}async function iS(r,e){let t=Date.now();try{let s=await lS(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, 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 aS(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=Us.join(e,o.file);await E(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.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 Jm(r,e){let t=Date.now(),s=await Promise.all([nS(r,e),rS(r,e),oS(r,e),iS(r,e),aS(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function cS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await $c.readdir(n,{withFileTypes:!0});for(let i of o){let a=Us.join(n,i.name),c=Us.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=Us.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function lS(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await $c.readdir(n,{withFileTypes:!0});for(let i of o){let a=Us.join(n,i.name),c=Us.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var Zk,eS,tS,Mc,R0,sS,Km=S(()=>{"use strict";H();V();Ro();Zk=Y.enum(["draft","verified","sealed"]),eS=Y.object({name:Y.string(),description:Y.string(),location:Y.string().optional(),severity:Y.enum(["low","medium","high"]).optional(),language:Y.string().optional(),framework:Y.string().optional(),source:Y.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Y.number().min(0).max(1).optional()}),tS=Y.object({issue:Y.string(),file:Y.string(),suggestion:Y.string(),severity:Y.enum(["low","medium","high"]).optional(),language:Y.string().optional(),framework:Y.string().optional(),source:Y.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Y.number().min(0).max(1).optional()}),Mc=Y.object({projectId:Y.string(),languages:Y.array(Y.string()),frameworks:Y.array(Y.string()),packageManager:Y.string().optional(),sourceDir:Y.string().optional(),testDir:Y.string().optional(),configFiles:Y.array(Y.string()),fileCount:Y.number(),patterns:Y.array(eS),antiPatterns:Y.array(tS),analyzedAt:Y.string(),modelMetadata:In.optional(),status:Zk.default("draft"),commitHash:Y.string().optional(),signature:Y.string().optional(),sealedAt:Y.string().optional(),verifiedAt:Y.string().optional()}),R0={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},sS={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(nS,"verifyFrameworks");l(rS,"verifyLanguages");l(oS,"verifyPatternLocations");l(iS,"verifyFileCount");l(aS,"verifyAntiPatternFiles");l(Jm,"semanticVerify");l(cS,"getProjectExtensions");l(lS,"countProjectFiles")});var _c,it,Xn=S(()=>{"use strict";Km();Ac();K();wn();Ss();_c=class extends rt{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"};Mc.parse(s),await this.update(e,n=>({...n,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),n=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Mc.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),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:Fm(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),n=s.sealed??s.draft;return n?await Jm(n,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 Kr(JSON.stringify(t))}},it=new _c});var Oc,uS,Xt,Qr=S(()=>{"use strict";K();ee();Oc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=x.getDb(e),n=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),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(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},uS=new Oc,Xt=uS});import Xm from"node:fs/promises";import Ym from"node:path";async function Lc(r,e,t,s){let[n,o,i,a]=await Promise.all([pS(r,e,s),gS(r),fS(r),hS(r)]);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,dS).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function pS(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=qm(r,n,Nc*2);for(let a of o){if(s.length>=Nc)break;try{let c=Ym.join(e,a.path),u=await Xm.readFile(c,"utf-8");u.length>mi*3?s.push({path:a.path,content:`${u.slice(0,mi)}
537
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,mi),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>=Nc)break;if(!s.some(c=>c.path===a))try{let c=Ym.join(e,a),u=await Xm.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,mi),reason:"entry point"})}catch{}}return s}async function gS(r){try{let e=await it.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function fS(r){try{return(await L.getTaskHistory(r)).slice(0,mS).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function hS(r){try{let e=Xt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return B.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var mi,Nc,dS,mS,Qm=S(()=>{"use strict";Ic();Xn();Qr();xt();bs();mi=3e3,Nc=15,dS=15,mS=10;l(Lc,"buildAnalysisPayload");l(pS,"selectCodeSamples");l(gS,"getExistingPatterns");l(fS,"getTaskHistory");l(hS,"getPreviousAnalysisSummary")});var pi=S(()=>{"use strict"});import Cs from"chalk";function Zm(r){return Math.ceil(r.length/4)}function ep(r){let e=r.split(`
539
+ `)}function np(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
540
+ `)}function to(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var Bc=S(()=>{"use strict";l(sp,"generateAnalysisDiff");l(Gc,"formatAnalysisDiffMd");l(np,"formatAnalysisDiffText");l(to,"diffStringArray")});var Vc,qc,rp,so=S(()=>{"use strict";Vc=[1,2,3,5,8,13,21],qc={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}},rp={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import dS from"node:fs/promises";import mS from"node:path";function Zn(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function pS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...Zn(m));let n=[/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 m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Zn(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 m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Zn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...Zn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...Zn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!ap.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function gS(r){return r.split(/\s+/).flatMap(e=>Zn(e)).filter(e=>e.length>1&&!ap.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function fS(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async a=>{try{let c=await dS.readFile(mS.join(r,a),"utf-8"),u=pS(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function hS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function yS(r,e){let t=gS(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=hS(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function wS(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,cp,t)}function ki(r){let e=N.getDoc(r,cp);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function lp(r,e){let t=await fS(r);return wS(e,t),t}function up(r,e,t=15){let s=ki(r);return s?yS(e,s).slice(0,t):[]}var ap,cp,zc=S(()=>{"use strict";so();se();B();ap=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"]);l(Zn,"splitIdentifier");l(pS,"tokenizeFile");l(gS,"tokenizeQuery");l(fS,"buildIndex");l(hS,"idf");l(yS,"score");cp="bm25-index";l(wS,"saveIndex");l(ki,"loadIndex");l(lp,"indexProject");l(up,"queryFiles")});import Jc from"node:fs/promises";import Gs from"node:path";import{z as Z}from"zod";async function TS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Gs.join(e,"package.json"),n=await Jc.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.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 I(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 ES(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await RS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=vS[a];if(!c)continue;c.some(d=>n.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 CS(r,e){let t=Date.now(),s=r.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 n=[],o=[];for(let i of s){let a=i.location,c=Gs.join(e,a);await E(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.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: ${n.join(", ")}`,durationMs:Date.now()-t}}async function PS(r,e){let t=Date.now();try{let s=await AS(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, 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 xS(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=Gs.join(e,o.file);await E(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.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 dp(r,e){let t=Date.now(),s=await Promise.all([TS(r,e),ES(r,e),CS(r,e),PS(r,e),xS(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function RS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Jc.readdir(n,{withFileTypes:!0});for(let i of o){let a=Gs.join(n,i.name),c=Gs.relative(r,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(r),Array.from(e)}async function AS(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Jc.readdir(n,{withFileTypes:!0});for(let i of o){let a=Gs.join(n,i.name),c=Gs.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var kS,SS,bS,Kc,eI,vS,mp=S(()=>{"use strict";H();B();$o();kS=Z.enum(["draft","verified","sealed"]),SS=Z.object({name:Z.string(),description:Z.string(),location:Z.string().optional(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),bS=Z.object({issue:Z.string(),file:Z.string(),suggestion:Z.string(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),Kc=Z.object({projectId:Z.string(),languages:Z.array(Z.string()),frameworks:Z.array(Z.string()),packageManager:Z.string().optional(),sourceDir:Z.string().optional(),testDir:Z.string().optional(),configFiles:Z.array(Z.string()),fileCount:Z.number(),patterns:Z.array(SS),antiPatterns:Z.array(bS),analyzedAt:Z.string(),modelMetadata:On.optional(),status:kS.default("draft"),commitHash:Z.string().optional(),signature:Z.string().optional(),sealedAt:Z.string().optional(),verifiedAt:Z.string().optional()}),eI={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},vS={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(TS,"verifyFrameworks");l(ES,"verifyLanguages");l(CS,"verifyPatternLocations");l(PS,"verifyFileCount");l(xS,"verifyAntiPatternFiles");l(dp,"semanticVerify");l(RS,"getProjectExtensions");l(AS,"countProjectFiles")});var Xc,ct,er=S(()=>{"use strict";mp();Bc();K();bn();vs();Xc=class extends it{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"};Kc.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:b()})),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),n=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Kc.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),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=b();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:sp(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),n=s.sealed??s.draft;return n?await dp(n,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 eo(JSON.stringify(t))}},ct=new Xc});var Yc,jS,Qt,no=S(()=>{"use strict";K();se();Yc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=x.getDb(e),n=b();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),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(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},jS=new Yc,Qt=jS});import pp from"node:fs/promises";import gp from"node:path";async function Zc(r,e,t,s){let[n,o,i,a]=await Promise.all([$S(r,e,s),MS(r),_S(r),OS(r)]);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,IS).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function $S(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=up(r,n,Qc*2);for(let a of o){if(s.length>=Qc)break;try{let c=gp.join(e,a.path),u=await pp.readFile(c,"utf-8");u.length>Si*3?s.push({path:a.path,content:`${u.slice(0,Si)}
541
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Si),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>=Qc)break;if(!s.some(c=>c.path===a))try{let c=gp.join(e,a),u=await pp.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Si),reason:"entry point"})}catch{}}return s}async function MS(r){try{let e=await ct.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function _S(r){try{return(await F.getTaskHistory(r)).slice(0,DS).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function OS(r){try{let e=Qt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return V.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Si,Qc,IS,DS,fp=S(()=>{"use strict";zc();er();no();Pt();Ts();Si=3e3,Qc=15,IS=15,DS=10;l(Zc,"buildAnalysisPayload");l($S,"selectCodeSamples");l(MS,"getExistingPatterns");l(_S,"getTaskHistory");l(OS,"getPreviousAnalysisSummary")});var bi=S(()=>{"use strict"});import xs from"chalk";function hp(r){return Math.ceil(r.length/4)}function yp(r){let e=r.split(`
538
542
  `),t=[],s=null;for(let n=0;n<e.length;n++){let o=e[n],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=n-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:n,endLine:n}):s&&(s.content+=`
539
- ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Fc(r){return r.includes("<!-- prjct:preserve")}function tp(r,e){let t=ep(r),s=ep(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Zm(r),tokensAfter:Zm(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.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)Fc(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
540
- `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Fc(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
543
+ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function el(r){return r.includes("<!-- prjct:preserve")}function wp(r,e){let t=yp(r),s=yp(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:hp(r),tokensAfter:hp(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.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)el(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
544
+ `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(el(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
541
545
  `).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
542
- `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Fc(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
543
- `).length}),n.hasChanges=!0)}return n}function sp(r,e={}){let{colorize:t=!0}=e,s=[],n=t?Cs.green:m=>m,o=t?Cs.red:m=>m,i=t?Cs.yellow:m=>m,a=t?Cs.dim:m=>m,c=t?Cs.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
546
+ `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!el(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
547
+ `).length}),n.hasChanges=!0)}return n}function kp(r,e={}){let{colorize:t=!0}=e,s=[],n=t?xs.green:m=>m,o=t?xs.red:m=>m,i=t?xs.yellow:m=>m,a=t?xs.dim:m=>m,c=t?xs.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
544
548
  `);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let m of r.added)s.push(n(`+ \u2502 + ${m.name} (new)`));if(r.modified.length>0)for(let m of r.modified)s.push(i(`~ \u2502 ${m.name} (modified)`));if(r.removed.length>0)for(let m of r.removed)s.push(o(`- \u2502 - ${m.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let m of r.preserved)s.push(a(` \u2502 \u2713 ${m.name} (${m.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=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",p=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${p(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
545
- `)}function np(r,e={}){let{colorize:t=!0}=e,s=[],n=t?Cs.green:c=>c,o=t?Cs.red:c=>c,i=t?Cs.cyan:c=>c,a=t?Cs.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
549
+ `)}function Sp(r,e={}){let{colorize:t=!0}=e,s=[],n=t?xs.green:c=>c,o=t?xs.red:c=>c,i=t?xs.cyan:c=>c,a=t?xs.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
546
550
  `))s.push(n(`+ ${u}`));s.push("")}for(let c of r.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
547
551
  `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
548
552
  `).length>5&&s.push(a(` ... ${c.before.split(`
@@ -553,19 +557,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Fc(r){return r.incl
553
557
  `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
554
558
  `).length>5&&s.push(a(` ... ${c.before.split(`
555
559
  `).length-5} more lines`))}s.push("")}return s.join(`
556
- `)}var rp=S(()=>{"use strict";pi();l(Zm,"estimateTokens");l(ep,"parseMarkdownSections");l(Fc,"isPreservedSection");l(tp,"generateSyncDiff");l(sp,"formatDiffPreview");l(np,"formatFullDiff")});var yS,Uc,gi,Hc=S(()=>{"use strict";ee();H();ze();Xo();yS={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Uc=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...yS,...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 n=s.lastSync;try{let{stdout:c}=await F("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([F(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),F(`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(`
560
+ `)}var bp=S(()=>{"use strict";bi();l(hp,"estimateTokens");l(yp,"parseMarkdownSections");l(el,"isPreservedSection");l(wp,"generateSyncDiff");l(kp,"formatDiffPreview");l(Sp,"formatFullDiff")});var NS,tl,vi,sl=S(()=>{"use strict";se();H();Ge();ri();NS={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},tl=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...NS,...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 n=s.lastSync;try{let{stdout:c}=await L("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([L(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),L(`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(`
557
561
  `).filter(Boolean):[],n){let c=new Date(n),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: ${k(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 n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let n of e.significantChanges.slice(0,5))t.push(` \u2022 ${n}`);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(`
558
- `)}async getSessionInfo(e){return Ns.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
562
+ `)}async getSessionInfo(e){return Us.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
559
563
  `);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let n=new Set,o=[];for(let i of e.commands)n.has(i)||(n.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 n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
560
- `)}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}},gi=l((r,e)=>new Uc(r,e),"createStalenessChecker")});import op from"node:fs/promises";import Qn from"node:path";function wS(r){let e=[],t,s=new RegExp(wd.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function kS(r,e,t){let s;if(r.startsWith("@/"))s=Qn.join(t,"src",r.slice(2));else{let n=Qn.dirname(Qn.join(t,e));s=Qn.resolve(n,r)}for(let n of yd){let o=s+n;try{if((await op.stat(o)).isFile())return Qn.relative(t,o)}catch{}}return null}async function SS(r){let e=await nn(r),t={},s={},n=0,o=await rn(e,50,async i=>{try{let a=await op.readFile(Qn.join(r,i),"utf-8"),c=wS(a),u=[];for(let d of c){let p=await kS(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function bS(r,e){N.setDoc(r,ip,e)}function fi(r){return N.getDoc(r,ip)}async function ap(r,e){let t=await SS(r);return bS(e,t),t}var ip,Gc=S(()=>{"use strict";Aa();ee();V();l(wS,"extractImportSources");l(kS,"resolveImport");l(SS,"buildGraph");ip="import-graph";l(bS,"saveGraph");l(fi,"loadGraph");l(ap,"indexImports")});function cp(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=fi(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function lp(r){let e=new Set;for(let t of r){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 up=S(()=>{"use strict";Gc();l(cp,"propagateChanges");l(lp,"affectedDomains")});import dp from"node:fs/promises";import vS from"node:path";function TS(r){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(r).toString(36)}`;let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function ES(r){let e=await nn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await rn(e,100,async n=>{try{let o=vS.join(r,n),[i,a]=await Promise.all([dp.readFile(o,"utf-8"),dp.stat(o)]);return{path:n,hash:TS(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function CS(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function Wc(r,e){let t=N.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),N.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function PS(r){let e=new Map;try{let t=N.query(r,"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 Vc(r,e){let[t,s]=await Promise.all([ES(r),Promise.resolve(PS(e))]);return{diff:CS(t,s),currentHashes:t}}function mp(r){return N.hasDoc(r,"file-hashes-meta")}var pp=S(()=>{"use strict";ee();V();l(TS,"hashContent");l(ES,"computeHashes");l(CS,"diffHashes");l(Wc,"saveHashes");l(PS,"loadHashes");l(Vc,"detectChanges");l(mp,"hasHashRegistry")});async function RS(r,e=100){try{let{stdout:t}=await F(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
561
- `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&AS(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function AS(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function jS(r,e=100){let t=await RS(r,e),s=new Map,n=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=DS(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,p=s.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(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 DS(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function IS(r,e){N.setDoc(r,hp,e)}function yp(r){return N.getDoc(r,hp)}async function wp(r,e,t=100){let s=await jS(r,t);return IS(e,s),s}var hp,kp=S(()=>{"use strict";Yr();ee();ze();l(RS,"parseGitLog");l(AS,"isSourceFile");l(jS,"buildMatrix");l(DS,"pairKey");hp="cochange-index";l(IS,"saveMatrix");l(yp,"loadMatrix");l(wp,"indexCoChanges")});import Tp from"node:fs/promises";import Sp from"node:os";import Bc from"node:path";function MS(){let r=ht("mcp-config.json");if(!r)return{mcpServers:{context7:zc}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:zc}}}}function Ep(){return MS().mcpServers?.context7||zc}function bp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Bc.join(Sp.tmpdir(),"prjct-context7-test","mcp.json"):Bc.join(Sp.homedir(),".claude","mcp.json")}async function vp(r){try{let e=await Tp.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(I(e))return{};throw e}}async function _S(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Ep(),e=[...r.args||[],"--help"];await sn(r.command||"npx",e,{timeout:15e3})}var zc,Zn,qc,OS,Yt,er=S(()=>{"use strict";Fs();Hr();H();ze();V();zc={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Zn=null;l(MS,"parseTemplateConfig");l(Ep,"getContext7Config");l(bp,"getConfigPath");l(vp,"readConfig");l(_S,"runSmokeCheck");qc=class{static{l(this,"Context7Service")}async install(){let e=bp(),t=Bc.dirname(e);await Tp.mkdir(t,{recursive:!0});let s=await vp(e),n=s.mcpServers||{};return n.context7=Ep(),s.mcpServers=n,await ce(e,s),Zn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(Zn&&Date.now()-Zn.at<3e5)return Zn.status;let e=bp(),n=((await vp(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await _S();let o={installed:!0,verified:!0,configPath:e};return Zn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${k(o)}`};return Zn={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}},OS=new qc,Yt=OS});import{execFileSync as Cp,execSync as NS}from"node:child_process";var hi,Jc,yi,Pp,xp=S(()=>{"use strict";on();qr();hi={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"}},Jc=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=hi[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=hi[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new yi(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=hi[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
562
- `);throw new yi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
563
- ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(hi),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=NS(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:Vn(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:Vn(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Cp(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Cp(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Vn(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ds(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())}},yi=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}},Pp=new Jc});var ki={};we(ki,{installAntigravitySkill:()=>Ip,installCodexSkill:()=>Kc,needsAntigravityInstallation:()=>GS,run:()=>Dp,verifyCodexPRouterReady:()=>tr});import{execFileSync as LS}from"node:child_process";import se from"node:fs/promises";import Sn from"node:os";import ue from"node:path";import he from"chalk";async function FS(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Pp.isAvailable("npm"))return console.log(`${he.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${he.dim(`Install ${r.displayName} using one of:`)}`),console.log(he.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(he.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(he.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(he.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),LS("npm",["install","-g",e],{stdio:"inherit",timeout:Wn("NPM_INSTALL")}),console.log(""),console.log(`${he.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(he.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(he.dim("The npm install took too long. Try:")),console.log(he.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(he.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(he.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(he.dim("Alternative installation methods:")),console.log(he.dim(` \u2022 npm: npm install -g ${e}`)),console.log(he.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(he.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(he.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Dp(){let r=await hs(),e=await Fa(),t=Ue[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=Ue[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await FS(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Me.detectActiveProvider()){let m=await Me.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await Me.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Me.installDocs(),await zS(),await Yt.ensureReady()}}else if(a==="gemini"){await US()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await HS();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await Mn()).installed&&(await Ip()).success&&console.log(` ${he.green("\u2713")} Antigravity skill installed`),(await an()).installed){if(!(await Kc()).success)throw new Error("Codex skill installation failed");let c=await tr({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${he.green("\u2713")} Codex skill installed`),console.log(` ${he.green("\u2713")} Codex p. router ready`)}await Vr.saveConfig(me,await Me.getInstallPath(),e.provider),await BS();for(let a of s.providers)qS(a,Ue[a.provider]);return s}async function US(){try{let r=ue.join(Sn.homedir(),".gemini","commands"),e=ue.join(r,"p.toml");try{return await se.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return B.warn(`Gemini router cleanup warning: ${k(r)}`),!1}}async function HS(){try{let r=ue.join(Sn.homedir(),".gemini"),e=ue.join(r,"GEMINI.md");await se.mkdir(r,{recursive:!0});let t=ht("global/GEMINI.md");if(!t){let c=ue.join(Tt,"templates","global","GEMINI.md");t=await se.readFile(c,"utf-8")}let s="",n=!1;try{s=await se.readFile(e,"utf-8"),n=!0}catch(c){if(I(c))n=!1;else throw c}let a=ai(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await se.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return B.warn(`Gemini config warning: ${k(r)}`),{success:!1,action:null}}}async function Ip(){try{let r=ue.join(Sn.homedir(),".gemini","antigravity","skills"),e=ue.join(r,"prjct"),t=ue.join(e,"SKILL.md");await se.mkdir(e,{recursive:!0});let s=await E(t),n=ht("antigravity/SKILL.md");if(!n){let o=ue.join(Tt,"templates","antigravity","SKILL.md");if(!await E(o))return B.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await se.readFile(o,"utf-8")}return await se.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return B.warn(`Antigravity skill warning: ${k(r)}`),{success:!1,action:null}}}async function GS(){let r=await Mn();return r.installed&&!r.skillInstalled}function Mp(){return ue.join(Sn.homedir(),".codex","skills","prjct","SKILL.md")}function WS(r){return`<!-- ${$p}: ${JSON.stringify({version:me,templateHash:r})} -->`}function Rp(r){let e=r.match(new RegExp(`<!--\\s*${$p}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function VS(r){return Kr(r)}async function _p(){let r=ht("codex/SKILL.md");if(r)return r;let e=ue.join(Tt,"templates","codex","SKILL.md");return await E(e)?se.readFile(e,"utf-8"):null}function Op(r){let e=r.trimEnd(),t=VS(e),s=WS(t);return{content:`${e}
564
+ `)}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}},vi=l((r,e)=>new tl(r,e),"createStalenessChecker")});import vp from"node:fs/promises";import sr from"node:path";function LS(r){let e=[],t,s=new RegExp(_d.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function FS(r,e,t){let s;if(r.startsWith("@/"))s=sr.join(t,"src",r.slice(2));else{let n=sr.dirname(sr.join(t,e));s=sr.resolve(n,r)}for(let n of Md){let o=s+n;try{if((await vp.stat(o)).isFile())return sr.relative(t,o)}catch{}}return null}async function US(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async i=>{try{let a=await vp.readFile(sr.join(r,i),"utf-8"),c=LS(a),u=[];for(let d of c){let p=await FS(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function HS(r,e){N.setDoc(r,Tp,e)}function Ti(r){return N.getDoc(r,Tp)}async function Ep(r,e){let t=await US(r);return HS(e,t),t}var Tp,nl=S(()=>{"use strict";Wa();se();B();l(LS,"extractImportSources");l(FS,"resolveImport");l(US,"buildGraph");Tp="import-graph";l(HS,"saveGraph");l(Ti,"loadGraph");l(Ep,"indexImports")});function Cp(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Ti(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Pp(r){let e=new Set;for(let t of r){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 xp=S(()=>{"use strict";nl();l(Cp,"propagateChanges");l(Pp,"affectedDomains")});import Rp from"node:fs/promises";import WS from"node:path";function GS(r){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(r).toString(36)}`;let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function BS(r){let e=await an(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await cn(e,100,async n=>{try{let o=WS.join(r,n),[i,a]=await Promise.all([Rp.readFile(o,"utf-8"),Rp.stat(o)]);return{path:n,hash:GS(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function VS(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function rl(r,e){let t=N.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),N.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function qS(r){let e=new Map;try{let t=N.query(r,"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 ol(r,e){let[t,s]=await Promise.all([BS(r),Promise.resolve(qS(e))]);return{diff:VS(t,s),currentHashes:t}}function Ap(r){return N.hasDoc(r,"file-hashes-meta")}var jp=S(()=>{"use strict";se();B();l(GS,"hashContent");l(BS,"computeHashes");l(VS,"diffHashes");l(rl,"saveHashes");l(qS,"loadHashes");l(ol,"detectChanges");l(Ap,"hasHashRegistry")});async function JS(r,e=100){try{let{stdout:t}=await L(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
565
+ `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&KS(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function KS(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function XS(r,e=100){let t=await JS(r,e),s=new Map,n=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=YS(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,p=s.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(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 YS(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function QS(r,e){N.setDoc(r,$p,e)}function Mp(r){return N.getDoc(r,$p)}async function _p(r,e,t=100){let s=await XS(r,t);return QS(e,s),s}var $p,Op=S(()=>{"use strict";so();se();Ge();l(JS,"parseGitLog");l(KS,"isSourceFile");l(XS,"buildMatrix");l(YS,"pairKey");$p="cochange-index";l(QS,"saveMatrix");l(Mp,"loadMatrix");l(_p,"indexCoChanges")});import Up from"node:fs/promises";import Np from"node:os";import il from"node:path";function eb(){let r=wt("mcp-config.json");if(!r)return{mcpServers:{context7:al}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:al}}}}function Hp(){return eb().mcpServers?.context7||al}function Lp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?il.join(Np.tmpdir(),"prjct-context7-test","mcp.json"):il.join(Np.homedir(),".claude","mcp.json")}async function Fp(r){try{let e=await Up.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(I(e))return{};throw e}}async function tb(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Hp(),e=[...r.args||[],"--help"];await on(r.command||"npx",e,{timeout:15e3})}var al,nr,cl,sb,Zt,rr=S(()=>{"use strict";Ws();Vr();H();Ge();B();al={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},nr=null;l(eb,"parseTemplateConfig");l(Hp,"getContext7Config");l(Lp,"getConfigPath");l(Fp,"readConfig");l(tb,"runSmokeCheck");cl=class{static{l(this,"Context7Service")}async install(){let e=Lp(),t=il.dirname(e);await Up.mkdir(t,{recursive:!0});let s=await Fp(e),n=s.mcpServers||{};return n.context7=Hp(),s.mcpServers=n,await le(e,s),nr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(nr&&Date.now()-nr.at<3e5)return nr.status;let e=Lp(),n=((await Fp(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await tb();let o={installed:!0,verified:!0,configPath:e};return nr={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${k(o)}`};return nr={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}},sb=new cl,Zt=sb});import{execFileSync as Wp,execSync as nb}from"node:child_process";var Ei,ll,Ci,Gp,Bp=S(()=>{"use strict";ln();Qr();Ei={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"}},ll=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=Ei[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Ei[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Ci(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=Ei[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
566
+ `);throw new Ci({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
567
+ ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Ei),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=nb(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:Jn(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:Jn(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Wp(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Wp(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Jn(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ms(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())}},Ci=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}},Gp=new ll});var xi={};we(xi,{installAntigravitySkill:()=>Kp,installCodexSkill:()=>ul,needsAntigravityInstallation:()=>cb,run:()=>Jp,verifyCodexPRouterReady:()=>or});import{execFileSync as rb}from"node:child_process";import re from"node:fs/promises";import Tn from"node:os";import de from"node:path";import Se from"chalk";async function ob(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Gp.isAvailable("npm"))return console.log(`${Se.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${Se.dim(`Install ${r.displayName} using one of:`)}`),console.log(Se.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(Se.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(Se.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(Se.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),rb("npm",["install","-g",e],{stdio:"inherit",timeout:zn("NPM_INSTALL")}),console.log(""),console.log(`${Se.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(Se.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(Se.dim("The npm install took too long. Try:")),console.log(Se.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(Se.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(Se.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(Se.dim("Alternative installation methods:")),console.log(Se.dim(` \u2022 npm: npm install -g ${e}`)),console.log(Se.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(Se.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(Se.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Jp(){let r=await ws(),e=await Qa(),t=Be[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=Be[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await ob(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Oe.detectActiveProvider()){let m=await Oe.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await Oe.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Oe.installDocs(),await mb(),await Zt.ensureReady()}}else if(a==="gemini"){await ib()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await ab();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await Ln()).installed&&(await Kp()).success&&console.log(` ${Se.green("\u2713")} Antigravity skill installed`),(await un()).installed){if(!(await ul()).success)throw new Error("Codex skill installation failed");let c=await or({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${Se.green("\u2713")} Codex skill installed`),console.log(` ${Se.green("\u2713")} Codex p. router ready`)}await Kr.saveConfig(ge,await Oe.getInstallPath(),e.provider),await db();for(let a of s.providers)pb(a,Be[a.provider]);return s}async function ib(){try{let r=de.join(Tn.homedir(),".gemini","commands"),e=de.join(r,"p.toml");try{return await re.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return V.warn(`Gemini router cleanup warning: ${k(r)}`),!1}}async function ab(){try{let r=de.join(Tn.homedir(),".gemini"),e=de.join(r,"GEMINI.md");await re.mkdir(r,{recursive:!0});let t=wt("global/GEMINI.md");if(!t){let c=de.join(Ct,"templates","global","GEMINI.md");t=await re.readFile(c,"utf-8")}let s="",n=!1;try{s=await re.readFile(e,"utf-8"),n=!0}catch(c){if(I(c))n=!1;else throw c}let a=fi(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await re.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return V.warn(`Gemini config warning: ${k(r)}`),{success:!1,action:null}}}async function Kp(){try{let r=de.join(Tn.homedir(),".gemini","antigravity","skills"),e=de.join(r,"prjct"),t=de.join(e,"SKILL.md");await re.mkdir(e,{recursive:!0});let s=await E(t),n=wt("antigravity/SKILL.md");if(!n){let o=de.join(Ct,"templates","antigravity","SKILL.md");if(!await E(o))return V.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await re.readFile(o,"utf-8")}return await re.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return V.warn(`Antigravity skill warning: ${k(r)}`),{success:!1,action:null}}}async function cb(){let r=await Ln();return r.installed&&!r.skillInstalled}function Yp(){return de.join(Tn.homedir(),".codex","skills","prjct","SKILL.md")}function lb(r){return`<!-- ${Xp}: ${JSON.stringify({version:ge,templateHash:r})} -->`}function Vp(r){let e=r.match(new RegExp(`<!--\\s*${Xp}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function ub(r){return eo(r)}async function Qp(){let r=wt("codex/SKILL.md");if(r)return r;let e=de.join(Ct,"templates","codex","SKILL.md");return await E(e)?re.readFile(e,"utf-8"):null}function Zp(r){let e=r.trimEnd(),t=ub(e),s=lb(t);return{content:`${e}
564
568
 
565
569
  ${s}
566
- `,templateHash:t}}async function Kc(){try{let r=Mp(),e=ue.dirname(r);await se.mkdir(e,{recursive:!0});let t=await E(r),s=await _p();if(!s)return B.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Op(s);return t&&await se.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await se.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return B.warn(`Codex skill warning: ${k(r)}`),{success:!1,action:null}}}async function tr(r={}){let e=Mp();if(!(await an()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await _p();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 n=Op(s),o=l(async()=>r.autoRepair?(await Kc()).success:!1,"maybeRepair"),i="";if(!await E(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await se.readFile(e,"utf-8").catch(()=>"");let a=Rp(i);if(!(a?.version===me&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await se.readFile(e,"utf-8").catch(()=>""),a=Rp(i),!(a?.version===me&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function BS(){try{let r=ue.join(Sn.homedir(),".prjct-cli","projects");if(!await E(r))return;let e=(await se.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=x.getDoc(s,"project");if(!n)continue;n.cliVersion!==me&&(n.cliVersion=me,x.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${he.green("\u2713")} Updated ${t} project(s) to v${me}`)}catch(r){I(r)||B.warn(`Migration warning: ${k(r)}`)}}async function Ap(r,e){let t={};if(await E(r))try{t=await je(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await ce(r,t)}async function zS(){try{let r=ue.join(Sn.homedir(),".claude"),e=ue.join(r,"settings.json"),t=ue.join(r,"prjct-statusline.sh"),s=ue.join(Sn.homedir(),".prjct-cli","statusline"),n=ue.join(s,"statusline.sh"),o=ue.join(s,"themes"),i=ue.join(s,"lib"),a=ue.join(s,"components"),c=ue.join(s,"config.json"),u=ue.join(Tt,"assets","statusline"),d=ue.join(u,"statusline.sh"),p=ue.join(u,"themes"),m=ue.join(u,"lib"),g=ue.join(u,"components"),w=ue.join(u,"default-config.json");if(await E(r)||await se.mkdir(r,{recursive:!0}),await E(s)||await se.mkdir(s,{recursive:!0}),await E(o)||await se.mkdir(o,{recursive:!0}),await E(i)||await se.mkdir(i,{recursive:!0}),await E(a)||await se.mkdir(a,{recursive:!0}),await E(n)){let b=await se.readFile(n,"utf8");if(b.includes("CLI_VERSION=")){let h=b.match(/CLI_VERSION="([^"]*)"/);if(h&&h[1]!==me){let P=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${me}"`);await se.writeFile(n,P,{mode:493})}await wi(m,i),await wi(g,a),await jp(t,n),await Ap(e,t);return}}if(await E(d)){let b=await se.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${me}"`),await se.writeFile(n,b,{mode:493}),await wi(m,i),await wi(g,a),await E(p)){let h=await se.readdir(p);for(let P of h){let T=ue.join(p,P),$=ue.join(o,P);await se.copyFile(T,$)}}!await E(c)&&await E(w)&&await se.copyFile(w,c)}else{let b=`#!/bin/bash
570
+ `,templateHash:t}}async function ul(){try{let r=Yp(),e=de.dirname(r);await re.mkdir(e,{recursive:!0});let t=await E(r),s=await Qp();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Zp(s);return t&&await re.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await re.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return V.warn(`Codex skill warning: ${k(r)}`),{success:!1,action:null}}}async function or(r={}){let e=Yp();if(!(await un()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Qp();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 n=Zp(s),o=l(async()=>r.autoRepair?(await ul()).success:!1,"maybeRepair"),i="";if(!await E(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await re.readFile(e,"utf-8").catch(()=>"");let a=Vp(i);if(!(a?.version===ge&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await re.readFile(e,"utf-8").catch(()=>""),a=Vp(i),!(a?.version===ge&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function db(){try{let r=de.join(Tn.homedir(),".prjct-cli","projects");if(!await E(r))return;let e=(await re.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=x.getDoc(s,"project");if(!n)continue;n.cliVersion!==ge&&(n.cliVersion=ge,x.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${Se.green("\u2713")} Updated ${t} project(s) to v${ge}`)}catch(r){I(r)||V.warn(`Migration warning: ${k(r)}`)}}async function qp(r,e){let t={};if(await E(r))try{t=await De(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await le(r,t)}async function mb(){try{let r=de.join(Tn.homedir(),".claude"),e=de.join(r,"settings.json"),t=de.join(r,"prjct-statusline.sh"),s=de.join(Tn.homedir(),".prjct-cli","statusline"),n=de.join(s,"statusline.sh"),o=de.join(s,"themes"),i=de.join(s,"lib"),a=de.join(s,"components"),c=de.join(s,"config.json"),u=de.join(Ct,"assets","statusline"),d=de.join(u,"statusline.sh"),p=de.join(u,"themes"),m=de.join(u,"lib"),g=de.join(u,"components"),w=de.join(u,"default-config.json");if(await E(r)||await re.mkdir(r,{recursive:!0}),await E(s)||await re.mkdir(s,{recursive:!0}),await E(o)||await re.mkdir(o,{recursive:!0}),await E(i)||await re.mkdir(i,{recursive:!0}),await E(a)||await re.mkdir(a,{recursive:!0}),await E(n)){let v=await re.readFile(n,"utf8");if(v.includes("CLI_VERSION=")){let h=v.match(/CLI_VERSION="([^"]*)"/);if(h&&h[1]!==ge){let P=v.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ge}"`);await re.writeFile(n,P,{mode:493})}await Pi(m,i),await Pi(g,a),await zp(t,n),await qp(e,t);return}}if(await E(d)){let v=await re.readFile(d,"utf8");if(v=v.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ge}"`),await re.writeFile(n,v,{mode:493}),await Pi(m,i),await Pi(g,a),await E(p)){let h=await re.readdir(p);for(let P of h){let T=de.join(p,P),$=de.join(o,P);await re.copyFile(T,$)}}!await E(c)&&await E(w)&&await re.copyFile(w,c)}else{let v=`#!/bin/bash
567
571
  # prjct Status Line for Claude Code
568
- CLI_VERSION="${me}"
572
+ CLI_VERSION="${ge}"
569
573
  input=$(cat)
570
574
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
571
575
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -594,7 +598,7 @@ if [ -f "$CONFIG" ]; then
594
598
  fi
595
599
  fi
596
600
  echo "prjct"
597
- `;await se.writeFile(n,b,{mode:493})}await jp(t,n),await Ap(e,t)}catch(r){I(r)||B.warn(`Status line warning: ${k(r)}`)}}async function wi(r,e){if(!await E(r))return;let t=await se.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ue.join(r,s),o=ue.join(e,s);await se.copyFile(n,o),await se.chmod(o,493)}}async function jp(r,e){try{if(await E(r)){if((await se.lstat(r)).isSymbolicLink()&&await se.readlink(r)===e)return;await se.unlink(r)}await se.symlink(e,r)}catch{try{await E(e)&&(await se.copyFile(e,r),await se.chmod(r,493))}catch(s){I(s)||B.warn(`Symlink fallback warning: ${s.message}`)}}}function qS(r,e){if(console.log(""),r.cliInstalled?console.log(` ${he.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${he.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${he.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${he.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${he.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${he.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${he.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var $p,JS,sr=S(()=>{"use strict";Fs();er();xp();ee();H();pn();V();wn();bs();nt();st();Es();Fo();xc();l(FS,"installAICLI");l(Dp,"run");l(US,"installGeminiRouter");l(HS,"installGeminiGlobalConfig");l(Ip,"installAntigravitySkill");l(GS,"needsAntigravityInstallation");$p="prjct-codex-router";l(Mp,"getCodexSkillPath");l(WS,"getCodexSkillMetadata");l(Rp,"parseCodexSkillMetadata");l(VS,"hashContent");l(_p,"loadCodexSkillTemplate");l(Op,"buildCodexSkillContent");l(Kc,"installCodexSkill");l(tr,"verifyCodexPRouterReady");l(BS,"migrateProjectsCliVersion");l(Ap,"ensureStatusLineSettings");l(zS,"installStatusLine");l(wi,"installStatusLineModules");l(jp,"ensureStatusLineSymlink");l(qS,"showResults");JS=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");JS&&Dp().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var Xc,Hs,Si=S(()=>{"use strict";ui();K();Ss();Xc=class extends rt{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Om)}getDefault(){return{...Nm}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=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?n:(i.avgCompressionRate*i.syncCount+n)/a,p=[...i.dailyStats],m=p.findIndex(P=>P.date===o);if(m>=0){let P=p[m];p[m]={...P,tokensSaved:P.tokensSaved+s,syncs:P.syncs+1,avgCompressionRate:(P.avgCompressionRate*P.syncs+n)/(P.syncs+1),totalDuration:P.totalDuration+t.duration}}else p.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],b=p.filter(P=>P.date>=w),h=[...i.agentUsage];if(t.agents)for(let P of t.agents){let T=h.findIndex($=>$.agentName===P);T>=0?h[T]={...h[T],usageCount:h[T].usageCount+1,tokensSaved:h[T].tokensSaved+Math.floor(s/t.agents.length)}:h.push({agentName:P,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:h,dailyStats:b,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Lm(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),n=new Date;n.setDate(n.getDate()-t);let o=n.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(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Hs=new Xc});import ne from"node:fs/promises";import Q from"node:path";async function bi(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(x.exists(r)&&x.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=D.getGlobalProjectPath(r),n=Q.join(s,"storage"),o=Q.join(s,"index"),i=Q.join(s,"memory");t.backupDir=await KS(n,o,i),x.getDb(r);for(let{filename:c,key:u}of Zc){let d=Q.join(n,c),p=await Qt(d);if(p===null){t.skippedFiles.push(c);continue}try{x.setDoc(r,u,p),Np(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of Qc){let d=Q.join(o,c),p=await Qt(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{x.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),Lp(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await nb(r,o,t),await rb(r,o,t),await ob(r,i,t),await ib(r,i,t);let a=Q.join(s,"sessions");return await ab(r,a,t),t.errors.length===0&&await cb(n,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 KS(r,e,t){let s=Q.join(r,"backup");return await ne.mkdir(s,{recursive:!0}),await ne.mkdir(Q.join(s,"index"),{recursive:!0}),await ne.mkdir(Q.join(s,"memory"),{recursive:!0}),await Yc(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Yc(e,Q.join(s,"index")),await Yc(t,Q.join(s,"memory")),s}async function Yc(r,e,t){try{let s=await ne.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=Q.join(r,n.name),i=Q.join(e,n.name);await ne.copyFile(o,i)}}catch(s){if(!I(s))throw s}}function Np(r,e,t){switch(e){case"state":XS(r,t);break;case"queue":YS(r,t);break;case"ideas":QS(r,t);break;case"shipped":ZS(r,t);break;case"metrics":eb(r,t);break;case"analysis":tb(r,t);break}}function XS(r,e){let t=x.getDb(r),s=t.prepare(`
601
+ `;await re.writeFile(n,v,{mode:493})}await zp(t,n),await qp(e,t)}catch(r){I(r)||V.warn(`Status line warning: ${k(r)}`)}}async function Pi(r,e){if(!await E(r))return;let t=await re.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=de.join(r,s),o=de.join(e,s);await re.copyFile(n,o),await re.chmod(o,493)}}async function zp(r,e){try{if(await E(r)){if((await re.lstat(r)).isSymbolicLink()&&await re.readlink(r)===e)return;await re.unlink(r)}await re.symlink(e,r)}catch{try{await E(e)&&(await re.copyFile(e,r),await re.chmod(r,493))}catch(s){I(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function pb(r,e){if(console.log(""),r.cliInstalled?console.log(` ${Se.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${Se.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${Se.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${Se.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${Se.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${Se.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${Se.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var Xp,gb,ir=S(()=>{"use strict";Ws();rr();Bp();se();H();hn();B();bn();Ts();ot();rt();Ps();Vo();Wc();l(ob,"installAICLI");l(Jp,"run");l(ib,"installGeminiRouter");l(ab,"installGeminiGlobalConfig");l(Kp,"installAntigravitySkill");l(cb,"needsAntigravityInstallation");Xp="prjct-codex-router";l(Yp,"getCodexSkillPath");l(lb,"getCodexSkillMetadata");l(Vp,"parseCodexSkillMetadata");l(ub,"hashContent");l(Qp,"loadCodexSkillTemplate");l(Zp,"buildCodexSkillContent");l(ul,"installCodexSkill");l(or,"verifyCodexPRouterReady");l(db,"migrateProjectsCliVersion");l(qp,"ensureStatusLineSettings");l(mb,"installStatusLine");l(Pi,"installStatusLineModules");l(zp,"ensureStatusLineSymlink");l(pb,"showResults");gb=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");gb&&Jp().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var dl,Bs,Ri=S(()=>{"use strict";wi();K();vs();dl=class extends it{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Zm)}getDefault(){return{...ep}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=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?n:(i.avgCompressionRate*i.syncCount+n)/a,p=[...i.dailyStats],m=p.findIndex(P=>P.date===o);if(m>=0){let P=p[m];p[m]={...P,tokensSaved:P.tokensSaved+s,syncs:P.syncs+1,avgCompressionRate:(P.avgCompressionRate*P.syncs+n)/(P.syncs+1),totalDuration:P.totalDuration+t.duration}}else p.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],v=p.filter(P=>P.date>=w),h=[...i.agentUsage];if(t.agents)for(let P of t.agents){let T=h.findIndex($=>$.agentName===P);T>=0?h[T]={...h[T],usageCount:h[T].usageCount+1,tokensSaved:h[T].tokensSaved+Math.floor(s/t.agents.length)}:h.push({agentName:P,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:h,dailyStats:v,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:tp(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.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(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Bs=new dl});import oe from"node:fs/promises";import ee from"node:path";async function Ai(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(x.exists(r)&&x.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=j.getGlobalProjectPath(r),n=ee.join(s,"storage"),o=ee.join(s,"index"),i=ee.join(s,"memory");t.backupDir=await fb(n,o,i),x.getDb(r);for(let{filename:c,key:u}of gl){let d=ee.join(n,c),p=await es(d);if(p===null){t.skippedFiles.push(c);continue}try{x.setDoc(r,u,p),eg(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of pl){let d=ee.join(o,c),p=await es(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{x.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),tg(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await Tb(r,o,t),await Eb(r,o,t),await Cb(r,i,t),await Pb(r,i,t);let a=ee.join(s,"sessions");return await xb(r,a,t),t.errors.length===0&&await Rb(n,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 fb(r,e,t){let s=ee.join(r,"backup");return await oe.mkdir(s,{recursive:!0}),await oe.mkdir(ee.join(s,"index"),{recursive:!0}),await oe.mkdir(ee.join(s,"memory"),{recursive:!0}),await ml(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await ml(e,ee.join(s,"index")),await ml(t,ee.join(s,"memory")),s}async function ml(r,e,t){try{let s=await oe.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=ee.join(r,n.name),i=ee.join(e,n.name);await oe.copyFile(o,i)}}catch(s){if(!I(s))throw s}}function eg(r,e,t){switch(e){case"state":hb(r,t);break;case"queue":yb(r,t);break;case"ideas":wb(r,t);break;case"shipped":kb(r,t);break;case"metrics":Sb(r,t);break;case"analysis":bb(r,t);break}}function hb(r,e){let t=x.getDb(r),s=t.prepare(`
598
602
  INSERT OR REPLACE INTO tasks
599
603
  (id, description, type, status, parent_description, branch, linear_id,
600
604
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -605,92 +609,92 @@ echo "prjct"
605
609
  (id, task_id, description, status, domain, agent, sort_order,
606
610
  depends_on, started_at, completed_at, output, summary)
607
611
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
608
- `),o=l((a,c)=>{if(!a||!a.id)return;s.run(_(a.id)??`task-${Date.now()}`,_(a.description??a.parentDescription)??"",_(a.type),_(c??a.status)??"unknown",_(a.parentDescription),_(a.branch),_(a.linearId),_(a.linearUuid),_(a.sessionId),_(a.featureId),_(a.startedAt)??new Date().toISOString(),_(a.completedAt),_(a.shippedAt),_(a.pausedAt),_(a.pauseReason),_(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 p=u[d];n.run(_(p.id)??`subtask-${d}`,_(a.id),_(p.description)??"",_(p.status)??"pending",_(p.domain),_(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,_(p.startedAt),_(p.completedAt),_(p.output),p.summary?JSON.stringify(p.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 YS(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
612
+ `),o=l((a,c)=>{if(!a||!a.id)return;s.run(O(a.id)??`task-${Date.now()}`,O(a.description??a.parentDescription)??"",O(a.type),O(c??a.status)??"unknown",O(a.parentDescription),O(a.branch),O(a.linearId),O(a.linearUuid),O(a.sessionId),O(a.featureId),O(a.startedAt)??new Date().toISOString(),O(a.completedAt),O(a.shippedAt),O(a.pausedAt),O(a.pauseReason),O(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 p=u[d];n.run(O(p.id)??`subtask-${d}`,O(a.id),O(p.description)??"",O(p.status)??"pending",O(p.domain),O(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,O(p.startedAt),O(p.completedAt),O(p.output),p.summary?JSON.stringify(p.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 yb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
609
613
  INSERT OR REPLACE INTO queue_tasks
610
614
  (id, description, type, priority, section, created_at, completed, completed_at,
611
615
  feature_id, feature_name)
612
616
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
613
- `);for(let o of t)n.run(_(o.id)??`queue-${Date.now()}`,_(o.description)??"",_(o.type),_(o.priority),_(o.section),_(o.createdAt)??new Date().toISOString(),o.completed?1:0,_(o.completedAt),_(o.featureId),_(o.featureName))}function QS(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
617
+ `);for(let o of t)n.run(O(o.id)??`queue-${Date.now()}`,O(o.description)??"",O(o.type),O(o.priority),O(o.section),O(o.createdAt)??new Date().toISOString(),o.completed?1:0,O(o.completedAt),O(o.featureId),O(o.featureName))}function wb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
614
618
  INSERT OR REPLACE INTO ideas
615
619
  (id, text, status, priority, tags, added_at, converted_to, details, data)
616
620
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
617
- `);for(let o of t)n.run(_(o.id)??`idea-${Date.now()}`,_(o.text)??"",_(o.status)??"pending",_(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,_(o.addedAt)??new Date().toISOString(),_(o.convertedTo),_(o.details),JSON.stringify(o))}function ZS(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
621
+ `);for(let o of t)n.run(O(o.id)??`idea-${Date.now()}`,O(o.text)??"",O(o.status)??"pending",O(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,O(o.addedAt)??new Date().toISOString(),O(o.convertedTo),O(o.details),JSON.stringify(o))}function kb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
618
622
  INSERT OR REPLACE INTO shipped_features
619
623
  (id, name, shipped_at, version, description, type, duration, data)
620
624
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
621
- `);for(let o of t)n.run(_(o.id)??`ship-${Date.now()}`,_(o.name)??"",_(o.shippedAt)??new Date().toISOString(),_(o.version)??"0.0.0",_(o.description),_(o.type),_(o.duration),JSON.stringify(o))}function eb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
625
+ `);for(let o of t)n.run(O(o.id)??`ship-${Date.now()}`,O(o.name)??"",O(o.shippedAt)??new Date().toISOString(),O(o.version)??"0.0.0",O(o.description),O(o.type),O(o.duration),JSON.stringify(o))}function Sb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
622
626
  INSERT OR REPLACE INTO metrics_daily
623
627
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
624
628
  VALUES (?, ?, ?, ?, ?)
625
- `);for(let o of t)n.run(_(o.date)??new Date().toISOString().slice(0,10),Gs(o.tokensSaved)??0,Gs(o.syncs)??0,Gs(o.avgCompressionRate)??0,Gs(o.totalDuration)??0)}function tb(r,e){let s=x.getDb(r).prepare(`
629
+ `);for(let o of t)n.run(O(o.date)??new Date().toISOString().slice(0,10),Vs(o.tokensSaved)??0,Vs(o.syncs)??0,Vs(o.avgCompressionRate)??0,Vs(o.totalDuration)??0)}function bb(r,e){let s=x.getDb(r).prepare(`
626
630
  INSERT OR REPLACE INTO analysis
627
631
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
628
632
  VALUES (?, ?, ?, ?, ?, ?, ?)
629
- `),n=l((o,i)=>{o&&s.run(i,_(o.status)??"unknown",_(o.commitHash),_(o.signature),_(o.sealedAt),_(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function Lp(r,e,t){e==="categories-cache"&&sb(r,t)}function sb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
633
+ `),n=l((o,i)=>{o&&s.run(i,O(o.status)??"unknown",O(o.commitHash),O(o.signature),O(o.sealedAt),O(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function tg(r,e,t){e==="categories-cache"&&vb(r,t)}function vb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
630
634
  INSERT OR REPLACE INTO index_files
631
635
  (path, categories, domain, score, size, mtime, language)
632
636
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
633
- `);for(let o of t){let i=_(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,_(o.primaryDomain),i)}}async function nb(r,e,t){let s=Q.join(e,"checksums.json"),n=await Qt(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=x.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function rb(r,e,t){let s=Q.join(e,"file-scores.json"),n=await Qt(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=x.getDb(r),a=i.prepare(`
637
+ `);for(let o of t){let i=O(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,O(o.primaryDomain),i)}}async function Tb(r,e,t){let s=ee.join(e,"checksums.json"),n=await es(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=x.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Eb(r,e,t){let s=ee.join(e,"file-scores.json"),n=await es(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=x.getDb(r),a=i.prepare(`
634
638
  INSERT OR REPLACE INTO index_files
635
639
  (path, score, size, mtime, language, categories, domain)
636
640
  VALUES (?, ?, ?, ?, NULL,
637
641
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
638
642
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
639
- `);i.transaction(()=>{for(let c of o){let u=_(c.path);u&&a.run(u,Gs(c.score)??0,Gs(c.size),_(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 ob(r,e,t){let s=Q.join(e,"events.jsonl");try{let o=(await ne.readFile(s,"utf-8")).split(`
640
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=_(u.type??u.action)??"unknown",p=_(u.taskId??u.task_id),m=_(u.timestamp??u.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){I(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function ib(r,e,t){let s=Q.join(e,"learnings.jsonl");try{let o=(await ne.readFile(s,"utf-8")).split(`
641
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${_(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?_(p[0]):null;a.run(d,m,c,1,_(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){I(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function ab(r,e,t){let n=x.getDb(r).prepare(`
643
+ `);i.transaction(()=>{for(let c of o){let u=O(c.path);u&&a.run(u,Vs(c.score)??0,Vs(c.size),O(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 Cb(r,e,t){let s=ee.join(e,"events.jsonl");try{let o=(await oe.readFile(s,"utf-8")).split(`
644
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=O(u.type??u.action)??"unknown",p=O(u.taskId??u.task_id),m=O(u.timestamp??u.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){I(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Pb(r,e,t){let s=ee.join(e,"learnings.jsonl");try{let o=(await oe.readFile(s,"utf-8")).split(`
645
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${O(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?O(p[0]):null;a.run(d,m,c,1,O(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){I(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function xb(r,e,t){let n=x.getDb(r).prepare(`
642
646
  INSERT OR IGNORE INTO sessions
643
647
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
644
648
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
645
- `),o=l(u=>{!u||!u.id||n.run(_(u.id),_(u.projectId)??r,_(u.task)??"",_(u.status)??"completed",_(u.startedAt)??new Date().toISOString(),_(u.pausedAt),_(u.completedAt),Gs(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=Q.join(e,"current.json"),a=await Qt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await ne.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=Q.join(e,"archive");try{let u=await ne.readdir(c);for(let p of u){let m=Q.join(c,p);try{if(!(await ne.stat(m)).isDirectory())continue;let w=await ne.readdir(m);for(let h of w){if(!h.endsWith(".json"))continue;let P=Q.join(m,h),T=await Qt(P);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${p}/${h}`),await ne.unlink(P).catch(()=>{})}catch($){t.errors.push({file:`sessions/archive/${p}/${h}`,error:String($)})}}(await ne.readdir(m)).length===0&&await ne.rmdir(m).catch(()=>{})}catch{}}(await ne.readdir(c).catch(()=>[])).length===0&&await ne.rmdir(c).catch(()=>{})}catch{}try{(await ne.readdir(e)).length===0&&await ne.rmdir(e).catch(()=>{})}catch{}}async function cb(r,e,t,s){let n=l(async(i,a)=>{try{await ne.unlink(i)}catch(c){I(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Zc)await n(Q.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await n(Q.join(e,i),`cleanup:index/${i}`);await n(Q.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(Q.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function _(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function Gs(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function Qt(r){try{let e=await ne.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async function vi(r){let e=D.getGlobalProjectPath(r),t=Q.join(e,"storage"),s=0;x.getDb(r);for(let{filename:w,key:b}of Zc){let h=Q.join(t,w),P=await Qt(h);if(P!==null){x.setDoc(r,b,P),Np(r,b,P);try{await ne.unlink(h)}catch{}s++}}let n=Q.join(e,"project.json"),o=await Qt(n);if(o!==null){x.setDoc(r,"project",o);try{await ne.unlink(n)}catch{}s++}let i=Q.join(e,"memory");for(let w of["events.jsonl","learnings.jsonl"]){let b=Q.join(i,w);try{let P=(await ne.readFile(b,"utf-8")).split(`
646
- `).filter($=>$.trim());if(P.length===0){await ne.unlink(b),s++;continue}let T=x.getDb(r);if(w==="events.jsonl"){let $=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let j of P)try{let y=JSON.parse(j);$.run(_(y.type??y.action)??"unknown",_(y.taskId??y.task_id),j,_(y.timestamp??y.ts)??new Date().toISOString())}catch{}})()}else{let $=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let j of P)try{let y=JSON.parse(j),R=`learning:${_(y.taskId??y.timestamp)??Date.now()}`,O=y.tags;$.run(R,_(O?.[0]),j,1,_(y.timestamp)??new Date().toISOString())}catch{}})()}await ne.unlink(b),s++}catch{}}let a=Q.join(e,"sessions"),c=l(w=>{if(!w||!w.id)return;x.getDb(r).prepare(`
649
+ `),o=l(u=>{!u||!u.id||n.run(O(u.id),O(u.projectId)??r,O(u.task)??"",O(u.status)??"completed",O(u.startedAt)??new Date().toISOString(),O(u.pausedAt),O(u.completedAt),Vs(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=ee.join(e,"current.json"),a=await es(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await oe.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=ee.join(e,"archive");try{let u=await oe.readdir(c);for(let p of u){let m=ee.join(c,p);try{if(!(await oe.stat(m)).isDirectory())continue;let w=await oe.readdir(m);for(let h of w){if(!h.endsWith(".json"))continue;let P=ee.join(m,h),T=await es(P);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${p}/${h}`),await oe.unlink(P).catch(()=>{})}catch($){t.errors.push({file:`sessions/archive/${p}/${h}`,error:String($)})}}(await oe.readdir(m)).length===0&&await oe.rmdir(m).catch(()=>{})}catch{}}(await oe.readdir(c).catch(()=>[])).length===0&&await oe.rmdir(c).catch(()=>{})}catch{}try{(await oe.readdir(e)).length===0&&await oe.rmdir(e).catch(()=>{})}catch{}}async function Rb(r,e,t,s){let n=l(async(i,a)=>{try{await oe.unlink(i)}catch(c){I(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of gl)await n(ee.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await n(ee.join(e,i),`cleanup:index/${i}`);await n(ee.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(ee.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function O(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function Vs(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function es(r){try{let e=await oe.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async function ji(r){let e=j.getGlobalProjectPath(r),t=ee.join(e,"storage"),s=0;x.getDb(r);for(let{filename:w,key:v}of gl){let h=ee.join(t,w),P=await es(h);if(P!==null){x.setDoc(r,v,P),eg(r,v,P);try{await oe.unlink(h)}catch{}s++}}let n=ee.join(e,"project.json"),o=await es(n);if(o!==null){x.setDoc(r,"project",o);try{await oe.unlink(n)}catch{}s++}let i=ee.join(e,"memory");for(let w of["events.jsonl","learnings.jsonl"]){let v=ee.join(i,w);try{let P=(await oe.readFile(v,"utf-8")).split(`
650
+ `).filter($=>$.trim());if(P.length===0){await oe.unlink(v),s++;continue}let T=x.getDb(r);if(w==="events.jsonl"){let $=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let M of P)try{let y=JSON.parse(M);$.run(O(y.type??y.action)??"unknown",O(y.taskId??y.task_id),M,O(y.timestamp??y.ts)??new Date().toISOString())}catch{}})()}else{let $=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let M of P)try{let y=JSON.parse(M),R=`learning:${O(y.taskId??y.timestamp)??Date.now()}`,D=y.tags;$.run(R,O(D?.[0]),M,1,O(y.timestamp)??new Date().toISOString())}catch{}})()}await oe.unlink(v),s++}catch{}}let a=ee.join(e,"sessions"),c=l(w=>{if(!w||!w.id)return;x.getDb(r).prepare(`
647
651
  INSERT OR IGNORE INTO sessions
648
652
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
649
653
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
650
- `).run(_(w.id),_(w.projectId)??r,_(w.task)??"",_(w.status)??"completed",_(w.startedAt)??new Date().toISOString(),_(w.pausedAt),_(w.completedAt),Gs(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=Q.join(a,"current.json"),d=await Qt(u);d!==null&&(c(d),await ne.unlink(u).catch(()=>{}),s++);let p=Q.join(a,"archive");try{let w=await ne.readdir(p);for(let h of w){let P=Q.join(p,h);try{if(!(await ne.stat(P)).isDirectory())continue;let $=await ne.readdir(P);for(let y of $){if(!y.endsWith(".json"))continue;let R=await Qt(Q.join(P,y));R!==null&&(c(R),await ne.unlink(Q.join(P,y)).catch(()=>{}),s++)}(await ne.readdir(P)).length===0&&await ne.rmdir(P).catch(()=>{})}catch{}}(await ne.readdir(p).catch(()=>[])).length===0&&await ne.rmdir(p).catch(()=>{})}catch{}try{(await ne.readdir(a)).length===0&&await ne.rmdir(a).catch(()=>{})}catch{}let m=Q.join(e,"index"),g=[...Qc.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let b=Q.join(m,w),h=await Qt(b);if(h===null)continue;let P=Qc.find(T=>T.filename===w);P&&(x.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",P.key,JSON.stringify(h),new Date().toISOString()),Lp(r,P.key,h));try{await ne.unlink(b)}catch{}s++}return s}var Zc,Qc,el=S(()=>{"use strict";ke();H();ee();Zc=[{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"}],Qc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(bi,"migrateJsonToSqlite");l(KS,"createBackup");l(Yc,"copyFiles");l(Np,"populateNormalized");l(XS,"populateTasksFromState");l(YS,"populateQueueTasks");l(QS,"populateIdeas");l(ZS,"populateShippedFeatures");l(eb,"populateMetricsDaily");l(tb,"populateAnalysis");l(Lp,"populateIndexTables");l(sb,"populateCategoriesIndex");l(nb,"migrateChecksums");l(rb,"migrateFileScores");l(ob,"migrateEventsJsonl");l(ib,"migrateLearningsJsonl");l(ab,"migrateSessionFiles");l(cb,"cleanupJsonFiles");l(_,"toStr");l(Gs,"toNum");l(Qt,"readJsonSafe");l(vi,"sweepLegacyJson")});import{z as ge}from"zod";var lb,ub,Fp,TI,EI,CI,Ws,Up,Zr=S(()=>{"use strict";lb=ge.enum(["improving","stable","declining"]),ub=ge.object({sprintNumber:ge.number(),startDate:ge.string(),endDate:ge.string(),pointsCompleted:ge.number(),tasksCompleted:ge.number(),avgVariance:ge.number(),estimationAccuracy:ge.number()}),Fp=ge.object({category:ge.string(),avgVariance:ge.number(),taskCount:ge.number()}),TI=ge.object({totalPoints:ge.number(),sprints:ge.number(),estimatedDate:ge.string()}),EI=ge.object({sprints:ge.array(ub),averageVelocity:ge.number(),velocityTrend:lb,estimationAccuracy:ge.number(),overEstimated:ge.array(Fp),underEstimated:ge.array(Fp),lastUpdated:ge.string()}),CI=ge.object({sprintLengthDays:ge.number().min(1).max(90).default(7),startDay:ge.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ge.number().min(1).max(52).default(6),accuracyTolerance:ge.number().min(0).max(100).default(20)}),Ws={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Up={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var tl,Ti,sl=S(()=>{"use strict";Zr();Ss();tl=class extends rt{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Up,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}},Ti=new tl});var eo,nl,rl,Hp=S(()=>{"use strict";Jr();K();eo=3,nl=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=eo){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${eo} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=eo){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${eo} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.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(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.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((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=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=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.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 n)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>=eo&&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,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=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:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[Ke.FILE_STRUCTURE,Ke.ARCHITECTURE],tech_stack:[Ke.TECH_STACK],architecture:[Ke.ARCHITECTURE,Ke.CODE_STYLE],estimation:[Ke.SHIP_WORKFLOW],workflow:[Ke.SHIP_WORKFLOW,Ke.CODE_STYLE],gotcha:[Ke.TEST_BEHAVIOR,Ke.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(`
651
- `)}},rl=new nl});import{z as A}from"zod";var Gp,db,mb,Wp,pb,gb,fb,hb,yb,wb,kb,Vp,Sb,bb,NI,Bp,zp,qp,Jp,vb,Ei,Kp=S(()=>{"use strict";Gp=A.number().min(1).max(5),db=A.enum(["exceeded","met","partial","failed"]),mb=A.enum(["definitely","probably","maybe","no"]),Wp=A.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),pb=A.object({estimated:A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),source:A.enum(["prd","manual","historical"]).optional()}),actual:A.object({hours:A.number(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional(),sessions:A.number().optional()}),variance:A.object({hours:A.number(),percentage:A.number(),reason:Wp.optional(),explanation:A.string().optional()})}),gb=A.object({name:A.string(),baseline:A.number().nullable(),target:A.number(),actual:A.number(),unit:A.string(),achieved:A.boolean(),percentOfTarget:A.number()}),fb=A.object({criteria:A.string(),met:A.boolean(),notes:A.string().optional()}),hb=A.object({metrics:A.array(gb),acceptanceCriteria:A.array(fb),overallSuccess:db,successScore:A.number().min(0).max(100)}),yb=A.object({category:A.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:A.string(),actionable:A.boolean(),action:A.string().optional()}),wb=A.object({whatWorked:A.array(A.string()),whatDidnt:A.array(A.string()),surprises:A.array(A.string()),recommendations:A.array(yb)}),kb=A.object({valueDelivered:A.number().min(1).max(10),userImpact:A.enum(["none","low","medium","high","critical"]),businessImpact:A.enum(["none","low","medium","high","critical"]),roiScore:A.number(),worthIt:mb,worthItReason:A.string().optional(),alternativeConsidered:A.string().optional(),betterAlternativeExists:A.boolean().optional()}),Vp=A.object({id:A.string(),taskId:A.string(),description:A.string(),estimatedMinutes:A.number().optional(),actualMinutes:A.number(),completedAsPlanned:A.boolean(),qualityScore:Gp,blockers:A.array(A.string()),agentUsed:A.string().optional(),skillsUsed:A.array(A.string()).optional(),startedAt:A.string(),completedAt:A.string()}),Sb=A.object({id:A.string(),featureId:A.string(),featureName:A.string(),prdId:A.string().nullable(),version:A.string().optional(),branch:A.string().optional(),prUrl:A.string().optional(),effort:pb,success:hb.optional(),learnings:wb,roi:kb,rating:Gp,taskOutcomes:A.array(Vp).optional(),startedAt:A.string(),shippedAt:A.string(),reviewedAt:A.string().optional(),reviewedBy:A.string().optional(),legacy:A.boolean().optional()}),bb=A.object({totalFeatures:A.number(),averageEstimationAccuracy:A.number(),averageSuccessRate:A.number(),averageROI:A.number(),bySuccessLevel:A.object({exceeded:A.number(),met:A.number(),partial:A.number(),failed:A.number()}),variancePatterns:A.array(A.object({reason:Wp,count:A.number(),averageVariance:A.number()})),topLearnings:A.array(A.object({insight:A.string(),frequency:A.number()}))}),NI=A.object({outcomes:A.array(Sb),taskOutcomes:A.array(Vp).optional(),aggregates:bb.optional(),lastUpdated:A.string(),lastAggregated:A.string().optional()}),Bp={outcomes:[],taskOutcomes:[],lastUpdated:""},zp=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),qp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Jp=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),vb=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Ei=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>vb(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,p)=>{let m=p.effort.variance.reason;return d[m]||(d[m]={count:0,totalVariance:0}),d[m].count++,d[m].totalVariance+=p.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,p])=>({reason:d,count:p.count,averageVariance:Math.round(p.totalVariance/p.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,p)=>(d[p]=(d[p]||0)+1,d),{}),u=Object.entries(c).sort((d,p)=>p[1]-d[1]).slice(0,10).map(([d,p])=>({insight:d,frequency:p}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,p)=>d+p,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,p)=>d+p,0)/t.length):0,averageROI:Math.round(s.reduce((d,p)=>d+p,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var ol,Xp,Yp=S(()=>{"use strict";Kp();Ss();K();ol=class extends rt{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Bp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Ei([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((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Ei(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Ei(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&$t(e.duration)||60,s=t/60,n=t/60,o=zp(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=qp(5,n);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:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Jp(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}}},Xp=new ol});import il from"node:fs/promises";import Ci from"node:path";var al,cl,Qp,Zp=S(()=>{"use strict";H();V();al=".prjct/.prjct-state.md",cl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Ci.join(e,al);await il.mkdir(Ci.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await il.writeFile(s,n,"utf-8")}async remove(e){try{await il.unlink(Ci.join(e,al))}catch(t){if(!I(t))throw t}}async exists(e){let t=Ci.join(e,al);return E(t)}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 n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${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(`
652
- `)}},Qp=new cl});var ll,_t,bn=S(()=>{"use strict";ve();ln();ee();ll=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await M.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:n})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await M.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 n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.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 n=await M.getProjectId(e);return n?N.query(n,"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(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await M.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(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.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<=ks.MEMORY_MAX_ENTRIES)return 0;let n=s-ks.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Ht.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),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},_t=new ll});import Tb from"node:path";function Eb(r){return yn(Tb.resolve(r))}function to(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Cb(r){return nc(r,e=>`${to(e.name)}::${to(e.source)}`)}function Pb(r){return nc(r,e=>`${to(e.issue)}::${to(e.file)}::${to(e.source)}`)}var ul,xb,eg,tg=S(()=>{"use strict";ee();rc();wn();l(Eb,"repoHash");l(to,"normalizeKey");l(Cb,"dedupePatterns");l(Pb,"dedupeAntiPatterns");ul=class{static{l(this,"PatternExtractor")}async extract(e){let t=Eb(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=Cb([...s,...n]),a=Pb([...o]),c=`analysis:derived-rules:${t}`;return x.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},xb=new ul,eg=xb});import so from"node:fs/promises";import Rb from"node:os";import no from"node:path";function Ab(r){return`# ${r.projectName}
653
- ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function jb(r){return r.patterns.length===0?"":`
654
+ `).run(O(w.id),O(w.projectId)??r,O(w.task)??"",O(w.status)??"completed",O(w.startedAt)??new Date().toISOString(),O(w.pausedAt),O(w.completedAt),Vs(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=ee.join(a,"current.json"),d=await es(u);d!==null&&(c(d),await oe.unlink(u).catch(()=>{}),s++);let p=ee.join(a,"archive");try{let w=await oe.readdir(p);for(let h of w){let P=ee.join(p,h);try{if(!(await oe.stat(P)).isDirectory())continue;let $=await oe.readdir(P);for(let y of $){if(!y.endsWith(".json"))continue;let R=await es(ee.join(P,y));R!==null&&(c(R),await oe.unlink(ee.join(P,y)).catch(()=>{}),s++)}(await oe.readdir(P)).length===0&&await oe.rmdir(P).catch(()=>{})}catch{}}(await oe.readdir(p).catch(()=>[])).length===0&&await oe.rmdir(p).catch(()=>{})}catch{}try{(await oe.readdir(a)).length===0&&await oe.rmdir(a).catch(()=>{})}catch{}let m=ee.join(e,"index"),g=[...pl.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let v=ee.join(m,w),h=await es(v);if(h===null)continue;let P=pl.find(T=>T.filename===w);P&&(x.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",P.key,JSON.stringify(h),new Date().toISOString()),tg(r,P.key,h));try{await oe.unlink(v)}catch{}s++}return s}var gl,pl,fl=S(()=>{"use strict";Te();H();se();gl=[{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"}],pl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Ai,"migrateJsonToSqlite");l(fb,"createBackup");l(ml,"copyFiles");l(eg,"populateNormalized");l(hb,"populateTasksFromState");l(yb,"populateQueueTasks");l(wb,"populateIdeas");l(kb,"populateShippedFeatures");l(Sb,"populateMetricsDaily");l(bb,"populateAnalysis");l(tg,"populateIndexTables");l(vb,"populateCategoriesIndex");l(Tb,"migrateChecksums");l(Eb,"migrateFileScores");l(Cb,"migrateEventsJsonl");l(Pb,"migrateLearningsJsonl");l(xb,"migrateSessionFiles");l(Rb,"cleanupJsonFiles");l(O,"toStr");l(Vs,"toNum");l(es,"readJsonSafe");l(ji,"sweepLegacyJson")});import{z as he}from"zod";var Ab,jb,sg,KD,XD,YD,qs,ng,ro=S(()=>{"use strict";Ab=he.enum(["improving","stable","declining"]),jb=he.object({sprintNumber:he.number(),startDate:he.string(),endDate:he.string(),pointsCompleted:he.number(),tasksCompleted:he.number(),avgVariance:he.number(),estimationAccuracy:he.number()}),sg=he.object({category:he.string(),avgVariance:he.number(),taskCount:he.number()}),KD=he.object({totalPoints:he.number(),sprints:he.number(),estimatedDate:he.string()}),XD=he.object({sprints:he.array(jb),averageVelocity:he.number(),velocityTrend:Ab,estimationAccuracy:he.number(),overEstimated:he.array(sg),underEstimated:he.array(sg),lastUpdated:he.string()}),YD=he.object({sprintLengthDays:he.number().min(1).max(90).default(7),startDay:he.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:he.number().min(1).max(52).default(6),accuracyTolerance:he.number().min(0).max(100).default(20)}),qs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},ng={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var hl,Ii,yl=S(()=>{"use strict";ro();vs();hl=class extends it{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:ng,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}},Ii=new hl});var oo,wl,kl,rg=S(()=>{"use strict";Zr();K();oo=3,wl=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=oo){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${oo} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=oo){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${oo} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.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(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.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((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=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=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.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 n)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>=oo&&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,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=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:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[Ye.FILE_STRUCTURE,Ye.ARCHITECTURE],tech_stack:[Ye.TECH_STACK],architecture:[Ye.ARCHITECTURE,Ye.CODE_STYLE],estimation:[Ye.SHIP_WORKFLOW],workflow:[Ye.SHIP_WORKFLOW,Ye.CODE_STYLE],gotcha:[Ye.TEST_BEHAVIOR,Ye.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
655
+ `)}},kl=new wl});import{z as A}from"zod";var og,Ib,Db,ig,$b,Mb,_b,Ob,Nb,Lb,Fb,ag,Ub,Hb,l$,cg,lg,ug,dg,Wb,Di,mg=S(()=>{"use strict";og=A.number().min(1).max(5),Ib=A.enum(["exceeded","met","partial","failed"]),Db=A.enum(["definitely","probably","maybe","no"]),ig=A.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),$b=A.object({estimated:A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),source:A.enum(["prd","manual","historical"]).optional()}),actual:A.object({hours:A.number(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional(),sessions:A.number().optional()}),variance:A.object({hours:A.number(),percentage:A.number(),reason:ig.optional(),explanation:A.string().optional()})}),Mb=A.object({name:A.string(),baseline:A.number().nullable(),target:A.number(),actual:A.number(),unit:A.string(),achieved:A.boolean(),percentOfTarget:A.number()}),_b=A.object({criteria:A.string(),met:A.boolean(),notes:A.string().optional()}),Ob=A.object({metrics:A.array(Mb),acceptanceCriteria:A.array(_b),overallSuccess:Ib,successScore:A.number().min(0).max(100)}),Nb=A.object({category:A.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:A.string(),actionable:A.boolean(),action:A.string().optional()}),Lb=A.object({whatWorked:A.array(A.string()),whatDidnt:A.array(A.string()),surprises:A.array(A.string()),recommendations:A.array(Nb)}),Fb=A.object({valueDelivered:A.number().min(1).max(10),userImpact:A.enum(["none","low","medium","high","critical"]),businessImpact:A.enum(["none","low","medium","high","critical"]),roiScore:A.number(),worthIt:Db,worthItReason:A.string().optional(),alternativeConsidered:A.string().optional(),betterAlternativeExists:A.boolean().optional()}),ag=A.object({id:A.string(),taskId:A.string(),description:A.string(),estimatedMinutes:A.number().optional(),actualMinutes:A.number(),completedAsPlanned:A.boolean(),qualityScore:og,blockers:A.array(A.string()),agentUsed:A.string().optional(),skillsUsed:A.array(A.string()).optional(),startedAt:A.string(),completedAt:A.string()}),Ub=A.object({id:A.string(),featureId:A.string(),featureName:A.string(),prdId:A.string().nullable(),version:A.string().optional(),branch:A.string().optional(),prUrl:A.string().optional(),effort:$b,success:Ob.optional(),learnings:Lb,roi:Fb,rating:og,taskOutcomes:A.array(ag).optional(),startedAt:A.string(),shippedAt:A.string(),reviewedAt:A.string().optional(),reviewedBy:A.string().optional(),legacy:A.boolean().optional()}),Hb=A.object({totalFeatures:A.number(),averageEstimationAccuracy:A.number(),averageSuccessRate:A.number(),averageROI:A.number(),bySuccessLevel:A.object({exceeded:A.number(),met:A.number(),partial:A.number(),failed:A.number()}),variancePatterns:A.array(A.object({reason:ig,count:A.number(),averageVariance:A.number()})),topLearnings:A.array(A.object({insight:A.string(),frequency:A.number()}))}),l$=A.object({outcomes:A.array(Ub),taskOutcomes:A.array(ag).optional(),aggregates:Hb.optional(),lastUpdated:A.string(),lastAggregated:A.string().optional()}),cg={outcomes:[],taskOutcomes:[],lastUpdated:""},lg=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),ug=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),dg=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Wb=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Di=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Wb(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,p)=>{let m=p.effort.variance.reason;return d[m]||(d[m]={count:0,totalVariance:0}),d[m].count++,d[m].totalVariance+=p.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,p])=>({reason:d,count:p.count,averageVariance:Math.round(p.totalVariance/p.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,p)=>(d[p]=(d[p]||0)+1,d),{}),u=Object.entries(c).sort((d,p)=>p[1]-d[1]).slice(0,10).map(([d,p])=>({insight:d,frequency:p}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,p)=>d+p,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,p)=>d+p,0)/t.length):0,averageROI:Math.round(s.reduce((d,p)=>d+p,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Sl,pg,gg=S(()=>{"use strict";mg();vs();K();Sl=class extends it{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...cg,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Di([t,...s.outcomes]),lastUpdated:b()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,s=>({...s,taskOutcomes:[t,...s.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Di(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Di(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&_t(e.duration)||60,s=t/60,n=t/60,o=lg(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=ug(5,n);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:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:dg(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}}},pg=new Sl});import bl from"node:fs/promises";import $i from"node:path";var vl,Tl,fg,hg=S(()=>{"use strict";H();B();vl=".prjct/.prjct-state.md",Tl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=$i.join(e,vl);await bl.mkdir($i.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await bl.writeFile(s,n,"utf-8")}async remove(e){try{await bl.unlink($i.join(e,vl))}catch(t){if(!I(t))throw t}}async exists(e){let t=$i.join(e,vl);return E(t)}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 n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${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(`
656
+ `)}},fg=new Tl});var El,Lt,En=S(()=>{"use strict";Ee();mn();se();El=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await _.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:n})}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 n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.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 n=await _.getProjectId(e);return n?N.query(n,"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(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}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(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.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<=bs.MEMORY_MAX_ENTRIES)return 0;let n=s-bs.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Gt.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),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Lt=new El});import Gb from"node:path";function Bb(r){return Sn(Gb.resolve(r))}function io(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Vb(r){return kc(r,e=>`${io(e.name)}::${io(e.source)}`)}function qb(r){return kc(r,e=>`${io(e.issue)}::${io(e.file)}::${io(e.source)}`)}var Cl,zb,yg,wg=S(()=>{"use strict";se();Xo();bn();l(Bb,"repoHash");l(io,"normalizeKey");l(Vb,"dedupePatterns");l(qb,"dedupeAntiPatterns");Cl=class{static{l(this,"PatternExtractor")}async extract(e){let t=Bb(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=Vb([...s,...n]),a=qb([...o]),c=`analysis:derived-rules:${t}`;return x.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},zb=new Cl,yg=zb});import ao from"node:fs/promises";import Jb from"node:os";import co from"node:path";function Kb(r){return`# ${r.projectName}
657
+ ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function Xb(r){return r.patterns.length===0?"":`
654
658
  ## Patterns
655
659
  ${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
656
660
  `)}
657
- `}function Db(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
661
+ `}function Yb(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
658
662
  ## Anti-Patterns
659
663
  ${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
660
664
  `)}
661
- `}function Ib(r){return r.knownGotchas.length===0?"":`
665
+ `}function Qb(r){return r.knownGotchas.length===0?"":`
662
666
  ## Known Gotchas
663
667
  ${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
664
668
  `)}
665
- `}function $b(r){return r.recentShipped.length===0?"":`
669
+ `}function Zb(r){return r.recentShipped.length===0?"":`
666
670
  ## Recent Deliveries
667
671
  ${r.recentShipped.slice(0,5).map(t=>{let s=[`"${t.name}"`,t.type];return t.duration&&s.push(t.duration),t.filesChanged&&s.push(`${t.filesChanged} files`),`- ${s.join(" \u2014 ")}`}).join(`
668
672
  `)}
669
- `}function Mb(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
673
+ `}function ev(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
670
674
  ## Velocity
671
675
  ${e.join(" | ")}
672
- `}function _b(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
676
+ `}function tv(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
673
677
  ## Commands
674
678
  | Action | Command |
675
679
  |--------|---------|
676
680
  ${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
677
681
  `)}
678
- `}function Ob(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
682
+ `}function sv(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
679
683
  ## State
680
684
  ${e.join(`
681
685
  `)}
682
- `}function Nb(r){return r.userPatterns.length===0?"":`
686
+ `}function nv(r){return r.userPatterns.length===0?"":`
683
687
  ## User Patterns
684
688
  ${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
685
689
  `)}
686
- `}function Lb(r){return[jb(r),Db(r),Ib(r),$b(r),Mb(r),_b(r.commands),Ob(r),Nb(r)].filter(Boolean).join("")}function Fb(r,e){let t=r.userInvocable!==!1;return`---
690
+ `}function rv(r){return[Xb(r),Yb(r),Qb(r),Zb(r),ev(r),tv(r.commands),sv(r),nv(r)].filter(Boolean).join("")}function ov(r,e){let t=r.userInvocable!==!1;return`---
687
691
  description: "${r.description} (${e.projectName}, ${e.stack})"
688
692
  allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
689
693
  user-invocable: ${t}
690
- ---`}function Ub(r,e){return`${Fb(r,e)}
694
+ ---`}function iv(r,e){return`${ov(r,e)}
691
695
 
692
- ${r.body(e)}`}var dl,ml,sg,ng=S(()=>{"use strict";ys();bs();l(Ab,"formatProjectHeader");l(jb,"formatPatterns");l(Db,"formatAntiPatterns");l(Ib,"formatGotchas");l($b,"formatRecentShipped");l(Mb,"formatVelocity");l(_b,"formatCommands");l(Ob,"formatState");l(Nb,"formatUserPatterns");l(Lb,"formatRichContext");dl=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Ab(r)}
693
- ${Lb(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
696
+ ${r.body(e)}`}var Pl,xl,kg,Sg=S(()=>{"use strict";ks();Ts();l(Kb,"formatProjectHeader");l(Xb,"formatPatterns");l(Yb,"formatAntiPatterns");l(Qb,"formatGotchas");l(Zb,"formatRecentShipped");l(ev,"formatVelocity");l(tv,"formatCommands");l(sv,"formatState");l(nv,"formatUserPatterns");l(rv,"formatRichContext");Pl=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Kb(r)}
697
+ ${rv(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
694
698
  Active task: **${r.activeTaskDescription}**`),e.push('\n```bash\nprjct done "$ARGUMENTS" --md\n```\nRead CLI output for completion summary and next steps.\n'),e.join(`
695
699
  `)},"body")},{name:"prjct-ship",description:"Ship feature: PR, version bump, changelog. Auto-completes active task if one exists before shipping.",allowedTools:["Bash","Read","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
696
700
 
@@ -773,29 +777,29 @@ prjct tokens <input_tokens> <output_tokens>
773
777
 
774
778
  Tokens accumulate \u2014 call multiple times during a task and they add up.
775
779
  Token totals are saved to task history on completion for cost comparison across tasks.
776
- `,"body")}];l(Fb,"buildFrontmatter");l(Ub,"buildSkillContent");ml=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=no.join(Rb.homedir(),".claude","skills");for(let c of dl){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await so.rm(no.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Ub(c,o),d=no.join(i,c.name),p=no.join(d,"SKILL.md");await so.mkdir(d,{recursive:!0}),await so.writeFile(p,u,"utf-8"),n.generated.push({name:c.name,path:p})}catch(u){B.debug(`Failed to generate skill ${c.name}`,{error:de(u)}),n.skipped.push({name:c.name,reason:de(u)})}}let a=new Set(dl.map(c=>c.name));try{let c=await so.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await so.rm(no.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&B.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return dl}},sg=new ml});var rg=S(()=>{"use strict"});import Hb from"node:fs/promises";import og from"node:path";var Pi,ig=S(()=>{"use strict";V();Pi=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(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(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.fileExistsInProject(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=og.join(this.projectPath,"package.json"),t=await Hb.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return E(og.join(this.projectPath,e))}}});import pl from"node:path";async function ag(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await F("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await F("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await F("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await F("git status --porcelain",{cwd:r}),i=o.trim().split(`
777
- `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await F('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
778
- `).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await F('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:de(t)})}return e}async function Zt(r,e){let t=await E(pl.join(r,e));return t||B.debug("File not found",{filename:e}),t}async function cg(r){let e={fileCount:0,version:"0.0.0",name:pl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await F('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){B.debug("File count failed",{path:r,error:de(t)}),e.fileCount=0}try{let t=pl.join(r,"package.json"),s=await je(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await Zt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:de(t)})}return await Zt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Zt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Zt(r,"requirements.txt")||await Zt(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function lg(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Zt(r,"bun.lockb")||await Zt(r,"bun.lock")?(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(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Zt(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Zt(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Zt(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function ug(r){return new Pi(r).detect()}var dg=S(()=>{"use strict";ys();rg();ze();V();bs();ig();l(ag,"analyzeGit");l(Zt,"fileExistsInProject");l(cg,"gatherStats");l(lg,"detectCommands");l(ug,"detectStack")});import mg from"node:fs/promises";import xi from"node:path";var gl,fl,pg,gg=S(()=>{"use strict";xt();H();ze();V();gl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=xi.join(r,n);await E(o)||s.push(n)}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(r){let e=Date.now(),t=[],s=xi.basename(r);try{await L.read(s)}catch(n){I(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=xi.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await mg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await mg.readFile(xi.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!I(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},fl=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[gl.contextFilesExist(t),gl.jsonFilesValid(t),gl.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let w=s.checks.slice(s.checks.indexOf(m)+1);a+=w.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await F(n,{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}}}},pg=new fl});import fg from"node:fs/promises";import hl from"node:path";var yl,Ps,Ri=S(()=>{"use strict";bc();Ic();up();pp();kp();Gc();ys();st();Es();ve();ke();sr();Xn();ln();ee();_s();Qr();Si();el();is();un();xt();sl();K();V();bs();Hp();Yp();er();Zp();bn();tg();ng();dg();gg();yl=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(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await M.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=D.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await fg.rm(hl.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await an()).installed){let y=await tr({autoRepair:!0});y.verified||B.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await Yt.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:de(y)},error:`Context7 MCP is required but not ready: ${de(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await bi(this.projectId);try{let y=await vi(this.projectId);y>0&&B.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){B.debug("Legacy JSON sweep failed (non-critical)",{error:de(y)})}let[a,c,u,d]=await Promise.all([ag(this.projectPath),cg(this.projectPath),lg(this.projectPath),ug(this.projectPath)]),p=t.full===!0,m,g=!0,w=new Set;if(!p&&mp(this.projectId))try{let{diff:y,currentHashes:R}=await Vc(this.projectPath,this.projectId),O=y.added.length+y.modified.length+y.deleted.length;if(O===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=cp(y,this.projectId);w=lp(G.allAffected);let oe=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(Ie=>{let Pt=Ie.substring(Ie.lastIndexOf("."));return oe.has(Pt)}),m={isIncremental:!0,filesChanged:O,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}Wc(this.projectId,R)}catch(y){B.debug("Incremental detection failed, falling back to full sync",{error:de(y)})}else try{let{currentHashes:y}=await Vc(this.projectPath,this.projectId);Wc(this.projectId,y)}catch(y){B.debug("Hash computation failed (non-critical)",{error:de(y)})}if(g)try{await Promise.all([zm(this.projectPath,this.projectId),ap(this.projectPath,this.projectId),wp(this.projectPath,this.projectId)])}catch(y){B.debug("File ranking index build failed (non-critical)",{error:de(y)})}let b;try{let[y,R,O,G,oe,gt,Ie,Pt,Or,va,Ta]=await Promise.all([Promise.resolve(Xt.getActive(this.projectId)).catch(()=>null),it.getActive(this.projectId).catch(()=>null),lt.getRecent(this.projectId,3).catch(()=>[]),Ti.getMetrics(this.projectId).catch(()=>null),Ee.getBacklog(this.projectId).catch(()=>[]),L.getTaskHistory(this.projectId).catch(()=>[]),L.getAllPausedTasks(this.projectId).catch(()=>[]),L.getAggregatedFeedback(this.projectId).catch(()=>null),L.getCurrentTask(this.projectId).catch(()=>null),qe.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),lt.getCount(this.projectId).catch(()=>0)]),Ea={backlogCount:oe.length,completedTaskCount:gt.length,pausedTaskCount:Ie.length,hasActiveTask:!!Or},Ca=y?y.patterns.map(ae=>({name:ae.name,description:ae.description,location:ae.locations?.[0]})):(R?.patterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({name:ae.name,description:ae.description,location:ae.location})),Be=y?y.antiPatterns.map(ae=>({issue:ae.issue,file:ae.files?.[0]??"multiple",suggestion:ae.suggestion,severity:ae.severity??"medium"})):(R?.antiPatterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({issue:ae.issue,file:ae.file,suggestion:ae.suggestion,severity:ae.severity??"medium"})),zt=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,Nr={version:c.version,fileCount:c.fileCount,patterns:Ca,antiPatterns:Be,recentShipped:O.map(ae=>({name:ae.name,type:ae.type??"feature",duration:ae.duration,filesChanged:ae.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:oe.length,completedTaskCount:gt.length,pausedTaskCount:Ie.length,knownGotchas:Pt?.knownGotchas??[],userPatterns:Pt?.patternsDiscovered??[],hasActiveTask:!!Or,activeTaskDescription:Or?.description??"",pausedTasks:Ie.map(ae=>({description:ae.description,pausedAt:ae.pausedAt??""})),topBacklog:oe.slice(0,3).map(ae=>({description:ae.description,priority:ae.priority??"medium"})),ideasCount:va?.pending??0,shippedCount:Ta};b=await sg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:zt,stack:d},Ea,Nr)}catch(y){B.debug("Native skill generation failed (non-critical)",{error:de(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await it.getActive(this.projectId),P={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,$=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Me.installGlobalConfig(),await Me.syncCommands();let j;try{let y=await M.readConfig(this.projectPath);j=await pg.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){B.debug("Verification failed (non-critical)",{error:de(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:P,syncMetrics:$,verification:j,incremental:m,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:de(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>fg.mkdir(hl.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=x.getDoc(this.projectId,"project")||{},n={...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",n)}async updateStateJson(e,t){let n={...await L.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=v(),n.lastUpdated=v(),n.context={...n.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,n);try{await Qp.generate(this.projectPath,n)}catch(o){B.debug("Local state generation failed (optional)",{error:de(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){let s=0;try{let a=di(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){B.debug("Could not load BM25 index for metrics",{error:de(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Hs.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){B.debug("Failed to record sync metrics",{error:de(a)})}let i={};try{let a=di(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=fi(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=yp(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){B.debug("Could not load index stats",{error:de(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await L.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 eg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await it.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){B.debug("Failed to save draft analysis (non-critical)",{error:de(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([lt.archiveOldShipped(this.projectId).catch(()=>0),qe.markDormantIdeas(this.projectId).catch(()=>0),Ee.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),_t.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Ht.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:de(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new qn,s=await rl.learnFromTaskHistory(this.projectId,e,t);try{let n=await Xp.getFeatureOutcomes(this.projectId);n.length>0&&await rl.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:de(e)})}}async getCliVersion(){try{let e=hl.join(__dirname,"..","..","package.json");return(await je(e))?.version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:de(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:[]}}},Ps=new yl});function Gb(){return"---"}function Wb(){return`---
779
- prjct v${cn()}`}function U(...r){return Sl(Gb(),...r.filter(Boolean),Wb())}function ro(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
780
- `)}function hg(r,e=""){return`\`\`\`${e}
780
+ `,"body")}];l(ov,"buildFrontmatter");l(iv,"buildSkillContent");xl=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=co.join(Jb.homedir(),".claude","skills");for(let c of Pl){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await ao.rm(co.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=iv(c,o),d=co.join(i,c.name),p=co.join(d,"SKILL.md");await ao.mkdir(d,{recursive:!0}),await ao.writeFile(p,u,"utf-8"),n.generated.push({name:c.name,path:p})}catch(u){V.debug(`Failed to generate skill ${c.name}`,{error:pe(u)}),n.skipped.push({name:c.name,reason:pe(u)})}}let a=new Set(Pl.map(c=>c.name));try{let c=await ao.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await ao.rm(co.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&V.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return Pl}},kg=new xl});var bg=S(()=>{"use strict"});import av from"node:fs/promises";import vg from"node:path";var Mi,Tg=S(()=>{"use strict";B();Mi=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(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(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.fileExistsInProject(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=vg.join(this.projectPath,"package.json"),t=await av.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return E(vg.join(this.projectPath,e))}}});import Rl from"node:path";async function Eg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await L("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await L("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await L("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await L("git status --porcelain",{cwd:r}),i=o.trim().split(`
781
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await L('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
782
+ `).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await L('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:pe(t)})}return e}async function ts(r,e){let t=await E(Rl.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Cg(r){let e={fileCount:0,version:"0.0.0",name:Rl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await L('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){V.debug("File count failed",{path:r,error:pe(t)}),e.fileCount=0}try{let t=Rl.join(r,"package.json"),s=await De(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await ts(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:pe(t)})}return await ts(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await ts(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await ts(r,"requirements.txt")||await ts(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Pg(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await ts(r,"bun.lockb")||await ts(r,"bun.lock")?(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 ts(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await ts(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await ts(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await ts(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function xg(r){return new Mi(r).detect()}var Rg=S(()=>{"use strict";ks();bg();Ge();B();Ts();Tg();l(Eg,"analyzeGit");l(ts,"fileExistsInProject");l(Cg,"gatherStats");l(Pg,"detectCommands");l(xg,"detectStack")});import Ag from"node:fs/promises";import _i from"node:path";var Al,jl,jg,Ig=S(()=>{"use strict";Pt();H();Ge();B();Al={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=_i.join(r,n);await E(o)||s.push(n)}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(r){let e=Date.now(),t=[],s=_i.basename(r);try{await F.read(s)}catch(n){I(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=_i.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await Ag.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Ag.readFile(_i.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!I(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},jl=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Al.contextFilesExist(t),Al.jsonFilesValid(t),Al.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let w=s.checks.slice(s.checks.indexOf(m)+1);a+=w.filter(v=>v.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await L(n,{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}}}},jg=new jl});import Dg from"node:fs/promises";import Il from"node:path";var Dl,Rs,Oi=S(()=>{"use strict";Oc();zc();xp();jp();Op();nl();ks();rt();Ps();Ee();Te();ir();er();mn();se();Ls();no();Ri();fl();Kt();pn();Pt();yl();K();B();Ts();rg();gg();rr();hg();En();wg();Sg();Rg();Ig();Dl=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(),n={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(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Dg.rm(Il.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await un()).installed){let y=await or({autoRepair:!0});y.verified||V.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await Zt.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:pe(y)},error:`Context7 MCP is required but not ready: ${pe(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Ai(this.projectId);try{let y=await ji(this.projectId);y>0&&V.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){V.debug("Legacy JSON sweep failed (non-critical)",{error:pe(y)})}let[a,c,u,d]=await Promise.all([Eg(this.projectPath),Cg(this.projectPath),Pg(this.projectPath),xg(this.projectPath)]),p=t.full===!0,m,g=!0,w=new Set;if(!p&&Ap(this.projectId))try{let{diff:y,currentHashes:R}=await ol(this.projectPath,this.projectId),D=y.added.length+y.modified.length+y.deleted.length;if(D===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=Cp(y,this.projectId);w=Pp(G.allAffected);let Y=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(me=>{let Me=me.substring(me.lastIndexOf("."));return Y.has(Me)}),m={isIncremental:!0,filesChanged:D,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}rl(this.projectId,R)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:pe(y)})}else try{let{currentHashes:y}=await ol(this.projectPath,this.projectId);rl(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:pe(y)})}if(g)try{await Promise.all([lp(this.projectPath,this.projectId),Ep(this.projectPath,this.projectId),_p(this.projectPath,this.projectId)])}catch(y){V.debug("File ranking index build failed (non-critical)",{error:pe(y)})}let v;try{let[y,R,D,G,Y,We,me,Me,$s,Ia,Da]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),ct.getActive(this.projectId).catch(()=>null),dt.getRecent(this.projectId,3).catch(()=>[]),Ii.getMetrics(this.projectId).catch(()=>null),ke.getBacklog(this.projectId).catch(()=>[]),F.getTaskHistory(this.projectId).catch(()=>[]),F.getAllPausedTasks(this.projectId).catch(()=>[]),F.getAggregatedFeedback(this.projectId).catch(()=>null),F.getCurrentTask(this.projectId).catch(()=>null),Xe.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),dt.getCount(this.projectId).catch(()=>0)]),$a={backlogCount:Y.length,completedTaskCount:We.length,pausedTaskCount:me.length,hasActiveTask:!!$s},Ma=y?y.patterns.map(ae=>({name:ae.name,description:ae.description,location:ae.locations?.[0]})):(R?.patterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({name:ae.name,description:ae.description,location:ae.location})),_a=y?y.antiPatterns.map(ae=>({issue:ae.issue,file:ae.files?.[0]??"multiple",suggestion:ae.suggestion,severity:ae.severity??"medium"})):(R?.antiPatterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({issue:ae.issue,file:ae.file,suggestion:ae.suggestion,severity:ae.severity??"medium"})),Oa=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,Na={version:c.version,fileCount:c.fileCount,patterns:Ma,antiPatterns:_a,recentShipped:D.map(ae=>({name:ae.name,type:ae.type??"feature",duration:ae.duration,filesChanged:ae.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:Y.length,completedTaskCount:We.length,pausedTaskCount:me.length,knownGotchas:Me?.knownGotchas??[],userPatterns:Me?.patternsDiscovered??[],hasActiveTask:!!$s,activeTaskDescription:$s?.description??"",pausedTasks:me.map(ae=>({description:ae.description,pausedAt:ae.pausedAt??""})),topBacklog:Y.slice(0,3).map(ae=>({description:ae.description,priority:ae.priority??"medium"})),ideasCount:Ia?.pending??0,shippedCount:Da};v=await kg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Oa,stack:d},$a,Na)}catch(y){V.debug("Native skill generation failed (non-critical)",{error:pe(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await ct.getActive(this.projectId),P={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,$=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Oe.installGlobalConfig(),await Oe.syncCommands();let M;try{let y=await _.readConfig(this.projectPath);M=await jg.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){V.debug("Verification failed (non-critical)",{error:pe(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:P,syncMetrics:$,verification:M,incremental:m,generatedSkills:v}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:pe(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Dg.mkdir(Il.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=x.getDoc(this.projectId,"project")||{},n={...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||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};x.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await F.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=b(),n.lastUpdated=b(),n.context={...n.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,n);try{await fg.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:pe(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){let s=0;try{let a=ki(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:pe(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Bs.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:pe(a)})}let i={};try{let a=ki(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Ti(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Mp(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:pe(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){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 yg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await ct.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){V.debug("Failed to save draft analysis (non-critical)",{error:pe(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([dt.archiveOldShipped(this.projectId).catch(()=>0),Xe.markDormantIdeas(this.projectId).catch(()=>0),ke.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),Lt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Gt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:pe(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Yn,s=await kl.learnFromTaskHistory(this.projectId,e,t);try{let n=await pg.getFeatureOutcomes(this.projectId);n.length>0&&await kl.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:pe(e)})}}async getCliVersion(){try{let e=Il.join(__dirname,"..","..","package.json");return(await De(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:pe(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:[]}}},Rs=new Dl});function cv(){return"---"}function lv(){return`---
783
+ prjct v${dn()}`}function U(...r){return Ml(cv(),...r.filter(Boolean),lv())}function lo(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
784
+ `)}function $g(r,e=""){return`\`\`\`${e}
781
785
  ${r}
782
- \`\`\``}function wl(r,e){return`**${r}**: \`${e}\``}function kl(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function Z(r,e,t=3){return`### ${r}
783
- ${e}`}function Ge(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
784
- `)}function oo(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
785
- > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function yg(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
786
- ${ro(t,s)}`}function wg(r){return r.length===0?"":`### Relevant Files
786
+ \`\`\``}function $l(r,e){return`**${r}**: \`${e}\``}function Ni(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function te(r,e,t=3){return`### ${r}
787
+ ${e}`}function ze(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
788
+ `)}function uo(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
789
+ > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Mg(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
790
+ ${lo(t,s)}`}function _g(r){return r.length===0?"":`### Relevant Files
787
791
  ${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
788
- `)}`}function fe(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
789
- ${ro(e,t)}`}function yt(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return ro(t,s)}function Te(r,e){return e?`## ${r}
790
- > ${e}`:`## ${r}`}function kg(r){return`> **WARNING:** ${r}`}function Sl(...r){return r.filter(Boolean).join(`
791
-
792
- `)}function Ot(r,e,t,s){let n=e.replace(/_/g," "),o=[`> **${r}**: ${n}`];if(s)for(let[i,a]of Object.entries(s))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
793
- `))}var vn=S(()=>{"use strict";nt();l(Gb,"mdHeader");l(Wb,"mdFooter");l(U,"mdOutput");l(ro,"mdTable");l(hg,"mdCodeBlock");l(wl,"mdBadge");l(kl,"mdCallout");l(Z,"mdSection");l(Ge,"mdList");l(oo,"mdTaskHeader");l(yg,"mdSubtasks");l(wg,"mdRelevantFiles");l(fe,"mdNextSteps");l(yt,"mdStats");l(Te,"mdDone");l(kg,"mdWarn");l(Sl,"mdJoin");l(Ot,"mdActionRequired")});import io from"chalk";function Nt(r,e={}){if(e.quiet)return;let t=bg[r]||"idle",s=dn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Sg[o]||o}));console.log(io.dim(`
794
- Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` ${i} \u2192 ${o.desc}`))}}function Ai(r,e=!1){let t=bg[r]||"idle";return dn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Sg[n]||n}))}function ao(r){let e=dn.getStateInfo(r);console.log(io.dim(`\u{1F4CD} State: ${io.white(r.toUpperCase())} - ${e.description}`))}var Sg,bg,nr=S(()=>{"use strict";cc();Sg={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"},bg={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(Nt,"showNextSteps");l(Ai,"getNextSteps");l(ao,"showStateInfo")});import Vb from"node:path";async function bl(r,e){let t=Date.now()-e;await Me.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${rr(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
795
- `));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Nt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function vg(r){try{let e=await _t.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];n=vt(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:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function rr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function vl(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Tg(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function Eg(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.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("## 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("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${rr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${li(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${vl(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${rr(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
796
- `)}function Cg(r,e){let t=[];t.push(`# Repository Analysis
792
+ `)}`}function ye(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
793
+ ${lo(e,t)}`}function kt(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return lo(t,s)}function Pe(r,e){return e?`## ${r}
794
+ > ${e}`:`## ${r}`}function Og(r){return`> **WARNING:** ${r}`}function Ml(...r){return r.filter(Boolean).join(`
795
+
796
+ `)}function At(r,e,t,s){let n=e.replace(/_/g," "),o=[`> **${r}**: ${n}`];if(s)for(let[i,a]of Object.entries(s))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
797
+ `))}var Cn=S(()=>{"use strict";ot();l(cv,"mdHeader");l(lv,"mdFooter");l(U,"mdOutput");l(lo,"mdTable");l($g,"mdCodeBlock");l($l,"mdBadge");l(Ni,"mdCallout");l(te,"mdSection");l(ze,"mdList");l(uo,"mdTaskHeader");l(Mg,"mdSubtasks");l(_g,"mdRelevantFiles");l(ye,"mdNextSteps");l(kt,"mdStats");l(Pe,"mdDone");l(Og,"mdWarn");l(Ml,"mdJoin");l(At,"mdActionRequired")});import mo from"chalk";function Ft(r,e={}){if(e.quiet)return;let t=Lg[r]||"idle",s=gn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Ng[o]||o}));console.log(mo.dim(`
798
+ Next:`));for(let o of n){let i=mo.cyan(o.cmd.padEnd(12));console.log(mo.dim(` ${i} \u2192 ${o.desc}`))}}function Li(r,e=!1){let t=Lg[r]||"idle";return gn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Ng[n]||n}))}function po(r){let e=gn.getStateInfo(r);console.log(mo.dim(`\u{1F4CD} State: ${mo.white(r.toUpperCase())} - ${e.description}`))}var Ng,Lg,ar=S(()=>{"use strict";Tc();Ng={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"},Lg={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(Ft,"showNextSteps");l(Li,"getNextSteps");l(po,"showStateInfo")});import uv from"node:path";async function _l(r,e){let t=Date.now()-e;await Oe.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${cr(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
799
+ `));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Ft("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function Fg(r){try{let e=await Lt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];n=Et(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:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function cr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Ol(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Ug(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function Hg(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.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("## 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("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${cr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${yi(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Ol(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${cr(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
800
+ `)}function Wg(r,e){let t=[];t.push(`# Repository Analysis
797
801
  `),t.push(`Generated: ${new Date().toLocaleString()}
798
- `);let s=Vb.basename(e);if(t.push(`## Project: ${s}
802
+ `);let s=uv.basename(e);if(t.push(`## Project: ${s}
799
803
  `),t.push(`## Stack Detected
800
804
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
801
805
  `),t.push("- **Package Manager**: npm/yarn/pnpm"),i.dependencies){let a=Object.keys(i.dependencies);a.length>0&&t.push(`- **Dependencies**: ${a.slice(0,10).join(", ")}${a.length>10?` (+${a.length-10} more)`:""}`)}r.hasNextConfig&&t.push("- **Framework**: Next.js detected"),r.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),r.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}r.cargoToml&&(t.push(`### Rust
@@ -811,10 +815,10 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
811
815
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
812
816
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
813
817
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
814
- `)}var Pg=S(()=>{"use strict";Es();ui();bn();K();nr();Je();l(bl,"showSyncResult");l(vg,"getSessionActivity");l(rr,"formatTokens");l(vl,"formatDuration");l(Tg,"generateSparkline");l(Eg,"generateStatsMarkdown");l(Cg,"generateAnalysisSummary")});var xg,Rg,Ag=S(()=>{"use strict";xg=["task","done","ship","resume","bug","enrich"],Rg=["init","sync","pause","next","dash","history","undo","redo"]});import as from"chalk";function Bb(r){return jg[r.toLowerCase()]||jg.default}var jg,Tl,Dg,Ig=S(()=>{"use strict";jg={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(Bb,"getIcon");Tl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(as.cyan(`
818
+ `)}var Gg=S(()=>{"use strict";Ps();wi();En();K();ar();Ve();l(_l,"showSyncResult");l(Fg,"getSessionActivity");l(cr,"formatTokens");l(Ol,"formatDuration");l(Ug,"generateSparkline");l(Hg,"generateStatsMarkdown");l(Wg,"generateAnalysisSummary")});var Bg,Vg,qg=S(()=>{"use strict";Bg=["task","done","ship","resume","bug","enrich"],Vg=["init","sync","pause","next","dash","history","undo","redo"]});import ls from"chalk";function dv(r){return zg[r.toLowerCase()]||zg.default}var zg,Nl,Jg,Kg=S(()=>{"use strict";zg={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(dv,"getIcon");Nl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(ls.cyan(`
815
819
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
816
- `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Bb(t);console.log(as.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(as.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(as.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(as.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),n=e?as.green("\u2713"):as.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${as.dim(`(${s})`)}
817
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${as.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(as.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Dg=new Tl});import $g from"node:fs";import ji from"node:path";function zb(r){if(tn()){let{Database:n}=jt("bun:sqlite");return new n(r,{create:!0})}let e=jt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var El,Di,Mg=S(()=>{"use strict";Fr();l(zb,"openDatabase");El=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?ji.resolve(e):ji.join(jt("node:os").homedir(),".prjct-cli");this.dbPath=ji.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=ji.dirname(this.dbPath);$g.existsSync(e)||$g.mkdirSync(e,{recursive:!0});let t=zb(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(`
820
+ `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=dv(t);console.log(ls.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(ls.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(ls.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(ls.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),n=e?ls.green("\u2713"):ls.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${ls.dim(`(${s})`)}
821
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${ls.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(ls.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Jg=new Nl});import Xg from"node:fs";import Fi from"node:path";function mv(r){if(rn()){let{Database:n}=Dt("bun:sqlite");return new n(r,{create:!0})}let e=Dt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Ll,Ui,Yg=S(()=>{"use strict";Gr();l(mv,"openDatabase");Ll=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Fi.resolve(e):Fi.join(Dt("node:os").homedir(),".prjct-cli");this.dbPath=Fi.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Fi.dirname(this.dbPath);Xg.existsSync(e)||Xg.mkdirSync(e,{recursive:!0});let t=mv(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(`
818
822
  CREATE TABLE IF NOT EXISTS _system_migrations (
819
823
  version INTEGER PRIMARY KEY,
820
824
  name TEXT NOT NULL,
@@ -835,14 +839,14 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
835
839
  INSERT OR REPLACE INTO mcp_health
836
840
  (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
837
841
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
838
- `).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},Di=new El});import es from"node:fs/promises";import co from"node:os";import at from"node:path";function qb(){try{let r=at.dirname(jt.resolve("prjct-cli/package.json"));return{command:"node",args:[at.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function _g(){return lo.split("@")[1]}function cs(){return process.env.PRJCT_TEST_MODE==="1"?at.join(co.tmpdir(),"prjct-context7-test","mcp.json"):at.join(co.homedir(),".claude","mcp.json")}async function Og(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:cs(),mergeIntoExisting:!1}];let r=co.homedir(),e=[],t=at.join(r,".claude");await qt(t)&&e.push({provider:"claude",configPath:at.join(t,"mcp.json"),mergeIntoExisting:!1});let s=at.join(r,".gemini");return await qt(s)&&e.push({provider:"gemini",configPath:at.join(s,"settings.json"),mergeIntoExisting:!0}),e}async function Ng(r){let e=await Og(),t=await Promise.all(e.map(async s=>({provider:s.provider,configured:await Vs(r,s.configPath),path:s.configPath})));return{configured:t.some(s=>s.configured),providers:t}}async function Ii(r){let e;try{e=await es.readdir(r)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let t=e.filter(s=>s.endsWith("_tokens.json")||s.endsWith(".json"));if(t.length===0)return{valid:!1,reason:"no token files found"};for(let s of t){let n=at.join(r,s);try{let o=await es.readFile(n,"utf-8"),i=JSON.parse(o);if(i.access_token||i.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${s}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}async function Jb(){let r=_g(),e=at.join(co.homedir(),".mcp-auth"),t=at.join(e,`mcp-remote-${r}`);if((await Ii(t)).valid)return{migrated:!1,from:null,to:t};let n;try{n=await es.readdir(e)}catch{return{migrated:!1,from:null,to:t}}let o=n.filter(i=>i.startsWith("mcp-remote-")&&i!==`mcp-remote-${r}`).sort().reverse();for(let i of o){let a=at.join(e,i);if((await Ii(a)).valid){await es.mkdir(t,{recursive:!0});let u=await es.readdir(a);for(let d of u)await es.copyFile(at.join(a,d),at.join(t,d));return{migrated:!0,from:a,to:t}}}return{migrated:!1,from:null,to:t}}async function Kb(r){if((await Ii(r)).valid)return!1;try{let t=await es.readdir(r);for(let s of t)await es.unlink(at.join(r,s));return await es.rmdir(r),!0}catch{return!1}}async function Lg(r){let e=[],t=!1,s=await Og();for(let n of s){let o=await Pl(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=$i[r];if(i.command!==a.command||JSON.stringify(i.args)!==JSON.stringify(a.args)){e.push(`${n.provider}: ${r} config doesn't match preset (stale version?)`);let c={...o.mcpServers||{}};c[r]=a,o.mcpServers=c,await Ug(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function Fg(r){let e=_g(),t=at.join(co.homedir(),".mcp-auth"),s=at.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await Ii(s);if(i.valid)return Di.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};i.reason&&i.reason!=="directory not found"&&i.reason!=="directory empty"&&(o=await Kb(s));let a=await Jb();if(a.migrated)return n=!0,Di.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:`Tokens migrated from ${at.basename(a.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:o};let c=[];try{c=(await es.readdir(t)).filter(p=>p.startsWith("mcp-remote-")&&p!==`mcp-remote-${e}`)}catch{}let u=o?`Previous tokens were invalid and cleaned. Run in a terminal: ${Cl[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${Cl[r]}`:`OAuth not completed. Run in a terminal: ${Cl[r]}`;return Di.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function Pl(r=cs()){try{let e=await es.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=k(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${k(e)}`)}}async function Ug(r,e=cs()){await ce(e,r)}async function xl(r,e,t=cs()){let s=await Pl(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await Ug(s,t),{path:t,changed:i}}async function Vs(r,e=cs()){return!!(await Pl(e)).mcpServers?.[r]}var lo,$i,Cl,uo=S(()=>{"use strict";Mg();H();V();lo="mcp-remote@0.1.38";l(qb,"getPrjctMcpConfig");$i={prjct:qb(),linear:{command:"npx",args:["-y",lo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",lo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},Cl={linear:`npx -y ${lo} https://mcp.linear.app/mcp`,jira:`npx -y ${lo} https://mcp.atlassian.com/v1/mcp`};l(_g,"getMcpRemoteVersion");l(cs,"getClaudeMcpConfigPath");l(Og,"getActiveMcpConfigPaths");l(Ng,"hasMcpServerAny");l(Ii,"validateTokenFiles");l(Jb,"migrateOAuthTokens");l(Kb,"cleanCorruptedTokens");l(Lg,"validateMcpConfig");l(Fg,"checkOAuthTokens");l(Pl,"readMcpConfig");l(Ug,"writeMcpConfig");l(xl,"upsertMcpServer");l(Vs,"hasMcpServer")});import dt from"chalk";function Xb(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Hg.length;return Hg[t]}function Yb(r,e,t="\u25B6"){let s=dt.dim(String(r+1).padStart(2)),o=Xb(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=dt.green("\u2713 Complete");break;case"in_progress":a=dt.yellow(`${t} Working...`);break;case"pending":a=dt.gray("\u25CB Pending");break;case"failed":a=dt.red("\u2717 Failed");break;case"blocked":a=dt.gray("\u2298 Blocked");break;default:a=dt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function Qb(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${dt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${dt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Yb(t,r[t]));return e.push(""),e.join(`
839
- `)}function Gg(r){console.log(Qb(r))}var Hg,Wg=S(()=>{"use strict";Hg=[dt.cyan,dt.magenta,dt.yellow,dt.blue,dt.green,dt.redBright,dt.magentaBright,dt.cyanBright];l(Xb,"getDomainColor");l(Yb,"formatSubtaskLine");l(Qb,"renderSubtaskProgress");l(Gg,"printSubtaskProgress")});function ev(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function tv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Zb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:ev(t)};return{detected:!1}}function sv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function nv(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function rv(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function ov(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var Zb,Rl,iv,or,Vg=S(()=>{"use strict";Zb=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(ev,"getHallucinationSuggestion");l(tv,"detectHallucination");l(sv,"isSimilarError");l(nv,"analyzeErrorPattern");l(rv,"generateEscalationMessage");l(ov,"generateSuggestion");Rl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);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(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>sv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=nv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:rv(e,o,this.maxAttempts),suggestion:ov(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}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 tv(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}}},iv=new Rl,or=iv});function Al(r,e){let t=mo(e),s=Hm[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function av(r,e){let t=mo(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function cv(r,e,t){let s=mo(t),n=Al(r,t),o=Al(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Mi(r,e=Ws){let t=mo(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=lv(r,e),n=uv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=pv(o),a=dv(o),c=mv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=gv(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function zg(r,e,t=Ws){let s=mo(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function lv(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=cv(i,n,e);if(!t.has(a)){let c=Al(i,e),u=av(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function uv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+fv(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>jl(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:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function dv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function mv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=jl(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function pv(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function gv(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=jl(n),i=n.tags&&n.tags.length>0?n.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[n,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:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function jl(r){if(!r.variance)return 0;let e=$t(r.estimatedDuration),t=$t(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function qg(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
840
- `)}function fv(r){if(!r.estimatedDuration)return 0;let e=$t(r.estimatedDuration);if(e<=0)return 0;let t=Bg[0],s=Number.POSITIVE_INFINITY;for(let n of Bg){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function mo(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Bg,Dl=S(()=>{"use strict";Yr();Zr();K();l(Al,"getSprintStart");l(av,"getSprintEnd");l(cv,"getSprintNumber");l(Mi,"calculateVelocity");l(zg,"projectCompletion");l(lv,"bucketBySprint");l(uv,"buildSprintVelocities");l(dv,"detectTrend");l(mv,"calculateOverallAccuracy");l(pv,"calculateAverageVelocity");l(gv,"detectEstimationPatterns");l(jl,"parseVariancePercent");l(qg,"formatVelocityContext");Bg=[{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(fv,"derivePoints");l(mo,"resolveConfig")});import hv from"node:fs/promises";import _i from"node:path";async function xs(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Il(r),c=await Sv(e),u=await bv(e),d=[];for(let m of c){if(!i&&Tv(m))continue;let g=vv(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,n);return{files:p,metrics:{filesScanned:c.length,filesReturned:p.length,scanDuration:Date.now()-s}}}function Il(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function Sv(r){let e=[];async function t(s,n=""){try{let o=await hv.readdir(s,{withFileTypes:!0});for(let i of o){let a=_i.join(s,i.name),c=_i.join(n,i.name);if(i.isDirectory()){if(kv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=_i.extname(i.name).toLowerCase();wv.has(u)&&e.push(c)}}}catch(o){I(o)}}return l(t,"walk"),await t(r),e}async function bv(r){let e=new Map;try{let{stdout:t}=await F(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
842
+ `).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},Ui=new Ll});import ss from"node:fs/promises";import go from"node:os";import lt from"node:path";function pv(){try{let r=lt.dirname(Dt.resolve("prjct-cli/package.json"));return{command:"node",args:[lt.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function Qg(){return fo.split("@")[1]}function us(){return process.env.PRJCT_TEST_MODE==="1"?lt.join(go.tmpdir(),"prjct-context7-test","mcp.json"):lt.join(go.homedir(),".claude","mcp.json")}async function Zg(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:us(),mergeIntoExisting:!1}];let r=go.homedir(),e=[],t=lt.join(r,".claude");await zt(t)&&e.push({provider:"claude",configPath:lt.join(t,"mcp.json"),mergeIntoExisting:!1});let s=lt.join(r,".gemini");return await zt(s)&&e.push({provider:"gemini",configPath:lt.join(s,"settings.json"),mergeIntoExisting:!0}),e}async function ef(r){let e=await Zg(),t=await Promise.all(e.map(async s=>({provider:s.provider,configured:await zs(r,s.configPath),path:s.configPath})));return{configured:t.some(s=>s.configured),providers:t}}async function Hi(r){let e;try{e=await ss.readdir(r)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let t=e.filter(s=>s.endsWith("_tokens.json")||s.endsWith(".json"));if(t.length===0)return{valid:!1,reason:"no token files found"};for(let s of t){let n=lt.join(r,s);try{let o=await ss.readFile(n,"utf-8"),i=JSON.parse(o);if(i.access_token||i.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${s}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}async function gv(){let r=Qg(),e=lt.join(go.homedir(),".mcp-auth"),t=lt.join(e,`mcp-remote-${r}`);if((await Hi(t)).valid)return{migrated:!1,from:null,to:t};let n;try{n=await ss.readdir(e)}catch{return{migrated:!1,from:null,to:t}}let o=n.filter(i=>i.startsWith("mcp-remote-")&&i!==`mcp-remote-${r}`).sort().reverse();for(let i of o){let a=lt.join(e,i);if((await Hi(a)).valid){await ss.mkdir(t,{recursive:!0});let u=await ss.readdir(a);for(let d of u)await ss.copyFile(lt.join(a,d),lt.join(t,d));return{migrated:!0,from:a,to:t}}}return{migrated:!1,from:null,to:t}}async function fv(r){if((await Hi(r)).valid)return!1;try{let t=await ss.readdir(r);for(let s of t)await ss.unlink(lt.join(r,s));return await ss.rmdir(r),!0}catch{return!1}}async function tf(r){let e=[],t=!1,s=await Zg();for(let n of s){let o=await Ul(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=Wi[r];if(i.command!==a.command||JSON.stringify(i.args)!==JSON.stringify(a.args)){e.push(`${n.provider}: ${r} config doesn't match preset (stale version?)`);let c={...o.mcpServers||{}};c[r]=a,o.mcpServers=c,await nf(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function sf(r){let e=Qg(),t=lt.join(go.homedir(),".mcp-auth"),s=lt.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await Hi(s);if(i.valid)return Ui.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};i.reason&&i.reason!=="directory not found"&&i.reason!=="directory empty"&&(o=await fv(s));let a=await gv();if(a.migrated)return n=!0,Ui.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:`Tokens migrated from ${lt.basename(a.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:o};let c=[];try{c=(await ss.readdir(t)).filter(p=>p.startsWith("mcp-remote-")&&p!==`mcp-remote-${e}`)}catch{}let u=o?`Previous tokens were invalid and cleaned. Run in a terminal: ${Fl[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${Fl[r]}`:`OAuth not completed. Run in a terminal: ${Fl[r]}`;return Ui.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function Ul(r=us()){try{let e=await ss.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=k(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${k(e)}`)}}async function nf(r,e=us()){await le(e,r)}async function Hl(r,e,t=us()){let s=await Ul(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await nf(s,t),{path:t,changed:i}}async function zs(r,e=us()){return!!(await Ul(e)).mcpServers?.[r]}var fo,Wi,Fl,ho=S(()=>{"use strict";Yg();H();B();fo="mcp-remote@0.1.38";l(pv,"getPrjctMcpConfig");Wi={prjct:pv(),linear:{command:"npx",args:["-y",fo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",fo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},Fl={linear:`npx -y ${fo} https://mcp.linear.app/mcp`,jira:`npx -y ${fo} https://mcp.atlassian.com/v1/mcp`};l(Qg,"getMcpRemoteVersion");l(us,"getClaudeMcpConfigPath");l(Zg,"getActiveMcpConfigPaths");l(ef,"hasMcpServerAny");l(Hi,"validateTokenFiles");l(gv,"migrateOAuthTokens");l(fv,"cleanCorruptedTokens");l(tf,"validateMcpConfig");l(sf,"checkOAuthTokens");l(Ul,"readMcpConfig");l(nf,"writeMcpConfig");l(Hl,"upsertMcpServer");l(zs,"hasMcpServer")});import pt from"chalk";function hv(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%rf.length;return rf[t]}function yv(r,e,t="\u25B6"){let s=pt.dim(String(r+1).padStart(2)),o=hv(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=pt.green("\u2713 Complete");break;case"in_progress":a=pt.yellow(`${t} Working...`);break;case"pending":a=pt.gray("\u25CB Pending");break;case"failed":a=pt.red("\u2717 Failed");break;case"blocked":a=pt.gray("\u2298 Blocked");break;default:a=pt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function wv(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${pt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${pt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(yv(t,r[t]));return e.push(""),e.join(`
843
+ `)}function of(r){console.log(wv(r))}var rf,af=S(()=>{"use strict";rf=[pt.cyan,pt.magenta,pt.yellow,pt.blue,pt.green,pt.redBright,pt.magentaBright,pt.cyanBright];l(hv,"getDomainColor");l(yv,"formatSubtaskLine");l(wv,"renderSubtaskProgress");l(of,"printSubtaskProgress")});function Sv(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function bv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of kv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Sv(t)};return{detected:!1}}function vv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function Tv(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function Ev(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function Cv(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var kv,Wl,Pv,lr,cf=S(()=>{"use strict";kv=[{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(Sv,"getHallucinationSuggestion");l(bv,"detectHallucination");l(vv,"isSimilarError");l(Tv,"analyzeErrorPattern");l(Ev,"generateEscalationMessage");l(Cv,"generateSuggestion");Wl=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 n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);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(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>vv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=Tv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Ev(e,o,this.maxAttempts),suggestion:Cv(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}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 bv(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}}},Pv=new Wl,lr=Pv});function Gl(r,e){let t=yo(e),s=rp[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function xv(r,e){let t=yo(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Rv(r,e,t){let s=yo(t),n=Gl(r,t),o=Gl(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Gi(r,e=qs){let t=yo(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Av(r,e),n=jv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=$v(o),a=Iv(o),c=Dv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Mv(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function uf(r,e,t=qs){let s=yo(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function Av(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=Rv(i,n,e);if(!t.has(a)){let c=Gl(i,e),u=xv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function jv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+_v(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Bl(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:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function Iv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function Dv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Bl(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function $v(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function Mv(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Bl(n),i=n.tags&&n.tags.length>0?n.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[n,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:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function Bl(r){if(!r.variance)return 0;let e=_t(r.estimatedDuration),t=_t(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function df(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
844
+ `)}function _v(r){if(!r.estimatedDuration)return 0;let e=_t(r.estimatedDuration);if(e<=0)return 0;let t=lf[0],s=Number.POSITIVE_INFINITY;for(let n of lf){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function yo(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var lf,Vl=S(()=>{"use strict";so();ro();K();l(Gl,"getSprintStart");l(xv,"getSprintEnd");l(Rv,"getSprintNumber");l(Gi,"calculateVelocity");l(uf,"projectCompletion");l(Av,"bucketBySprint");l(jv,"buildSprintVelocities");l(Iv,"detectTrend");l(Dv,"calculateOverallAccuracy");l($v,"calculateAverageVelocity");l(Mv,"detectEstimationPatterns");l(Bl,"parseVariancePercent");l(df,"formatVelocityContext");lf=[{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(yo,"resolveConfig")});import Ov from"node:fs/promises";import Bi from"node:path";async function As(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=ql(r),c=await Uv(e),u=await Hv(e),d=[];for(let m of c){if(!i&&Gv(m))continue;let g=Wv(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,n);return{files:p,metrics:{filesScanned:c.length,filesReturned:p.length,scanDuration:Date.now()-s}}}function ql(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function Uv(r){let e=[];async function t(s,n=""){try{let o=await Ov.readdir(s,{withFileTypes:!0});for(let i of o){let a=Bi.join(s,i.name),c=Bi.join(n,i.name);if(i.isDirectory()){if(Fv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Bi.extname(i.name).toLowerCase();Lv.has(u)&&e.push(c)}}}catch(o){I(o)}}return l(t,"walk"),await t(r),e}async function Hv(r){let e=new Map;try{let{stdout:t}=await L(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
841
845
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
842
846
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
843
847
  END { for (f in files) print files[f], lastmod[f], f }
844
848
  '`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
845
- `).filter(Boolean);for(let o of n){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(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let h of e){d.includes(h)&&(o+=.3,n.push(`keyword:${h}`));for(let P of p)if(P.includes(h)||h.includes(P)){o+=.15;break}}o=Math.min(1,o);for(let[h,P]of Object.entries(yv))for(let T of P)if(d.includes(T)&&e.some(j=>P.includes(j)||j.includes(h)||h.includes(j))){i+=.4,n.push(`domain:${h}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,n.push("recent:1d")):m.daysAgo<=3?(a=.8,n.push("recent:3d")):m.daysAgo<=7?(a=.6,n.push("recent:1w")):m.daysAgo<=30&&(a=.3,n.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=_i.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(h=>h.startsWith("import:"))||n.push("import:1")),s){let h=s.get(r);h!==void 0&&(u=(h+1)/2,h>0?n.push("history:boosted"):h<0&&n.push("history:penalized"))}let b=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,b),reasons:[...new Set(n)]}}function Tv(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var yv,wv,kv,po=S(()=>{"use strict";H();ze();yv={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"]},wv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),kv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(xs,"findRelevantFiles");l(Il,"extractKeywords");l(Sv,"getAllCodeFiles");l(bv,"getGitRecency");l(vv,"scoreFile");l(Tv,"isTestFile")});async function go(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await Pv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Cv(r,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 Cv(r,e){let{stdout:t}=await F(`git log -${e} --pretty=format:"%ct" --name-only | awk '
849
+ `).filter(Boolean);for(let o of n){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 Wv(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let h of e){d.includes(h)&&(o+=.3,n.push(`keyword:${h}`));for(let P of p)if(P.includes(h)||h.includes(P)){o+=.15;break}}o=Math.min(1,o);for(let[h,P]of Object.entries(Nv))for(let T of P)if(d.includes(T)&&e.some(M=>P.includes(M)||M.includes(h)||h.includes(M))){i+=.4,n.push(`domain:${h}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,n.push("recent:1d")):m.daysAgo<=3?(a=.8,n.push("recent:3d")):m.daysAgo<=7?(a=.6,n.push("recent:1w")):m.daysAgo<=30&&(a=.3,n.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=Bi.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(h=>h.startsWith("import:"))||n.push("import:1")),s){let h=s.get(r);h!==void 0&&(u=(h+1)/2,h>0?n.push("history:boosted"):h<0&&n.push("history:penalized"))}let v=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,v),reasons:[...new Set(n)]}}function Gv(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var Nv,Lv,Fv,wo=S(()=>{"use strict";H();Ge();Nv={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"]),Fv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(As,"findRelevantFiles");l(ql,"extractKeywords");l(Uv,"getAllCodeFiles");l(Hv,"getGitRecency");l(Wv,"scoreFile");l(Gv,"isTestFile")});async function ko(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await qv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Vv(r,t);return o=o.filter(c=>!zv(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 Vv(r,e){let{stdout:t}=await L(`git log -${e} --pretty=format:"%ct" --name-only | awk '
846
850
  /^[0-9]+$/ { timestamp=$1; next }
847
851
  NF {
848
852
  count[$0]++
@@ -852,8 +856,8 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
852
856
  for (f in count) print count[f], lastmod[f], f
853
857
  }
854
858
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
855
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),w=Math.floor(m/3600),b=Math.max(0,1-g/30),h=u/i,P=b*.6+h*.4,T;w<1?T="just now":w<24?T=`${w}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:p,changes:u,heatScore:Math.round(P*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function Pv(r){let e="main";try{await F("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await F(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
856
- `).filter(Boolean),{stdout:n}=await F(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
859
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),w=Math.floor(m/3600),v=Math.max(0,1-g/30),h=u/i,P=v*.6+h*.4,T;w<1?T="just now":w<24?T=`${w}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:p,changes:u,heatScore:Math.round(P*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function qv(r){let e="main";try{await L("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await L(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
860
+ `).filter(Boolean),{stdout:n}=await L(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
857
861
  /^[0-9]+$/ { timestamp=$1; next }
858
862
  NF {
859
863
  count[$0]++
@@ -863,15 +867,15 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
863
867
  for (f in count) print count[f], lastmod[f], f
864
868
  }
865
869
  '`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
866
- `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],w=a-m,b=Math.floor(w/86400),h=Math.floor(w/3600),P=Math.max(0,1-b/14),T=p/c,$=P*.5+T*.5,j;h<1?j="just now":h<24?j=`${h}h ago`:j=`${b}d ago`,o.push({path:g,changes:p,heatScore:Math.round($*100)/100,lastChanged:j,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function xv(r){let e=r.split("/").pop()||"";for(let t of Ev)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Ev,$l=S(()=>{"use strict";ze();Ev=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(go,"getRecentFiles");l(Cv,"getHotFilesFromCommits");l(Pv,"getBranchOnlyFiles");l(xv,"shouldIgnore")});function Ml(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Jg(r,e){let t=Rv[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Kg(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Oi(r,e){let t=Ml(r),s=Ml(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=Jg(n,Av),a=_l.map(c=>({model:c,...Jg(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Kg(i.total),byModel:a}}}function Tn(r){let e=Ml(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:_l.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Ol(r){if(r.length===0)return Tn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),s=r.reduce((a,c)=>a+c.tokens.saved,0),n=e>0?(e-t)/e:0,o=_l.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:s},compression:n,cost:{saved:i,formatted:Kg(i),byModel:o}}}var Rv,Av,_l,Ni=S(()=>{"use strict";pi();Rv={"claude-opus-4.5":{input:.005,output:.025},"claude-sonnet-4.5":{input:.003,output:.015},"claude-haiku-4.5":{input:.001,output:.005},"claude-opus-4":{input:.015,output:.075},"claude-opus-4-6":{input:.015,output:.075},"gpt-4o":{input:.0025,output:.01},"gpt-4-turbo":{input:.01,output:.03},"gpt-4o-mini":{input:15e-5,output:6e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4}},Av="claude-sonnet-4.5";l(Ml,"countTokens");_l=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Jg,"calculateModelCost");l(Kg,"formatCostSaved");l(Oi,"measureCompression");l(Tn,"noCompression");l(Ol,"combineMetrics")});import Qg from"node:fs/promises";import ts from"node:path";async function Bs(r,e=process.cwd()){let t=ts.isAbsolute(r)?r:ts.join(e,r),s=ts.resolve(e),n=ts.resolve(t);if(!n.startsWith(s+ts.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Tn("")};let o;try{o=await Qg.readFile(t,"utf-8")}catch(p){if(I(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Tn("")};throw p}let i=ts.extname(r).toLowerCase(),a=Zg[i]||"unknown",c=$v[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Tn(o)};let u=Mv(o,c),d=u.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
867
- `);return{file:r,language:a,signatures:u,fallback:!1,metrics:Oi(o,d)}}async function Nl(r,e=process.cwd(),t={}){let s=ts.isAbsolute(r)?r:ts.join(e,r),n=[];async function o(i){let a=await Qg.readdir(i,{withFileTypes:!0});for(let c of a){let u=ts.join(i,c.name),d=ts.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=ts.extname(c.name).toLowerCase();if(Zg[p]){let m=await Bs(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function Mv(r,e){let t=[],s=r.split(`
870
+ `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],w=a-m,v=Math.floor(w/86400),h=Math.floor(w/3600),P=Math.max(0,1-v/14),T=p/c,$=P*.5+T*.5,M;h<1?M="just now":h<24?M=`${h}h ago`:M=`${v}d ago`,o.push({path:g,changes:p,heatScore:Math.round($*100)/100,lastChanged:M,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function zv(r){let e=r.split("/").pop()||"";for(let t of Bv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Bv,zl=S(()=>{"use strict";Ge();Bv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(ko,"getRecentFiles");l(Vv,"getHotFilesFromCommits");l(qv,"getBranchOnlyFiles");l(zv,"shouldIgnore")});function Jl(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function mf(r,e){let t=Jv[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function pf(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Vi(r,e){let t=Jl(r),s=Jl(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=mf(n,Kv),a=Kl.map(c=>({model:c,...mf(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:pf(i.total),byModel:a}}}function Pn(r){let e=Jl(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Kl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Xl(r){if(r.length===0)return Pn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),s=r.reduce((a,c)=>a+c.tokens.saved,0),n=e>0?(e-t)/e:0,o=Kl.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:s},compression:n,cost:{saved:i,formatted:pf(i),byModel:o}}}var Jv,Kv,Kl,qi=S(()=>{"use strict";bi();Jv={"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}},Kv="claude-sonnet-4.5";l(Jl,"countTokens");Kl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(mf,"calculateModelCost");l(pf,"formatCostSaved");l(Vi,"measureCompression");l(Pn,"noCompression");l(Xl,"combineMetrics")});import hf from"node:fs/promises";import ns from"node:path";async function Js(r,e=process.cwd()){let t=ns.isAbsolute(r)?r:ns.join(e,r),s=ns.resolve(e),n=ns.resolve(t);if(!n.startsWith(s+ns.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Pn("")};let o;try{o=await hf.readFile(t,"utf-8")}catch(p){if(I(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Pn("")};throw p}let i=ns.extname(r).toLowerCase(),a=yf[i]||"unknown",c=Zv[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Pn(o)};let u=eT(o,c),d=u.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
871
+ `);return{file:r,language:a,signatures:u,fallback:!1,metrics:Vi(o,d)}}async function Yl(r,e=process.cwd(),t={}){let s=ns.isAbsolute(r)?r:ns.join(e,r),n=[];async function o(i){let a=await hf.readdir(i,{withFileTypes:!0});for(let c of a){let u=ns.join(i,c.name),d=ns.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=ns.extname(c.name).toLowerCase();if(yf[p]){let m=await Js(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function eT(r,e){let t=[],s=r.split(`
868
872
  `),n=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(n.has(c))continue;n.add(c);let u=i.index,d=r.substring(0,u).split(`
869
- `).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:_v(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function _v(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Zg,Xg,jv,Dv,Iv,Yg,$v,Li=S(()=>{"use strict";H();Ni();Zg={".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"},Xg=[{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}],jv=[{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}],Dv=[{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}],Iv=[{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}],Yg=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],$v={typescript:Xg,javascript:Xg,python:jv,go:Dv,rust:Iv,java:Yg,csharp:Yg,php:[],ruby:[],unknown:[]};l(Bs,"extractSignatures");l(Nl,"extractDirectorySignatures");l(Mv,"extractFromContent");l(_v,"cleanSignature")});import Ll from"node:path";var Ov,Nv,Fl,Lv,Rt,ir=S(()=>{"use strict";ke();Ut();K();V();Ov="outcomes",Nv="outcomes.jsonl",Fl=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=D.getGlobalProjectPath(e);return Ll.join(t,Ov)}getOutcomesPath(e){return Ll.join(this.getOutcomesDir(e),Nv)}async record(e,t){let s={...t,id:Se()},n=this.getOutcomesPath(e);return await Qe(Ll.dirname(n)),await Da(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await E(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await De(t);if(!a.trim())return[];let c=a.trim().split(`
870
- `).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await De(t);return s.trim()?s.trim().split(`
871
- `).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.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(n=>{if(!n.variance)return!1;let o=Nn(n.variance),i=$t(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},Lv=new Fl,Rt=Lv});import{z as We}from"zod";var Fi,ar,Fv,N_,Ul,ef,Ui=S(()=>{"use strict";Fi=We.string(),ar=We.object({primaryDomain:Fi,secondaryDomains:We.array(Fi),confidence:We.number().min(0).max(1),filePatterns:We.array(We.string()),relevantAgents:We.array(We.string())}),Fv=We.object({classification:ar,classifiedAt:We.string(),source:We.enum(["cache","history","llm","heuristic"]),descriptionHash:We.string(),projectId:We.string()}),N_=We.object({entries:We.record(We.string(),Fv),confirmedPatterns:We.array(We.object({descriptionHash:We.string(),classification:ar,confirmedAt:We.string(),taskDescription:We.string()}))}),Ul={entries:{},confirmedPatterns:[]},ef={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import Hv from"node:fs/promises";import nf from"node:path";function tf(r){return yn(r.toLowerCase().trim())}async function sf(r){try{let e=nf.join(r,"storage","classification-cache.json"),t=await Hv.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return I(e)?Ul:(console.warn("[classifier] Failed to load cache:",k(e)),Ul)}}async function Gv(r,e){try{let t=nf.join(r,"storage","classification-cache.json");await ce(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function Wv(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Ds(s.classifiedAt,36e5)?null:s.classification}function Vv(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Hl,Bv,rf,of=S(()=>{"use strict";Hr();Ui();H();on();V();wn();l(tf,"hashDescription");l(sf,"loadCache");l(Gv,"saveCache");l(Wv,"lookupCache");l(Vv,"lookupPatterns");Hl=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=tf(e),o=await sf(s),i=Wv(o,n,t);if(i)return{classification:i,source:"cache"};let a=Vv(o,n);return a?{classification:a,source:"history"}:{classification:ef,source:"heuristic"}}async confirmClassification(e,t,s){let n=tf(e),o=await sf(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Gv(s,o))}},Bv=new Hl,rf=Bv});import zv from"node:fs/promises";import qv from"node:path";var Gl,Jv,Hi,Wl=S(()=>{"use strict";Dl();ve();ke();Zr();Xn();Qr();xt();po();$l();Li();H();ze();ir();of();Gl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await M.getProjectId(s),o=D.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=u.map((j,y)=>{if(j.status==="fulfilled")return j.value;p.push(d[y]),console.warn(`Context tool "${d[y]}" failed: ${k(j.reason)}`)}),[g,w,b]=m,h={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},P=this.shouldFragment(a,t),T=null;P&&e==="task"&&(T=await this.createSubtasks(t,a,[],n));let $=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:P,subtasks:T,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:w??null,velocityContext:b??null,contextDegradation:h,rpiContext:$}}resolveRpiPhase(e){try{let{prjctDb:t}=(ee(),St(Ho)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),xs(e,t,{maxFiles:10,minScore:.15}),go(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Bs(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
872
- `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.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([F("git branch --show-current",{cwd:e}),F("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
873
- `).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[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:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Xt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await it.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await Rt.getAll(e);if(t.length===0)return null;let s=Mi(t,Ws);return s.sprints.length===0?null:qg(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=qv.join(e,"analysis","repo-analysis.json"),s=await zv.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return I(t)||console.warn("Failed to load repo-analysis.json:",k(t)),null}}async detectDomains(e,t,s){let n=D.getGlobalProjectPath(t),{classification:o}=await rf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}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"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=o.map((a,c)=>{let u=`${a}.md`,d=o.slice(0,c).map((p,m)=>`subtask-${m+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:u,status:c===0?"in_progress":"pending",dependsOn:d,order:c+1}});return await L.createSubtasks(n,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Jv=new Gl,Hi=Jv});function Kv(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var Vl,Xv,Xe,af=S(()=>{"use strict";Ut();K();pn();pn();l(Kv,"generateApprovalPrompt");Vl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return mc.includes(e)}isDestructive(e){return pc.includes(e)}isToolAllowedInPlanning(e){return qo.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>qo.includes(s)):t}startPlanning(e,t,s){let n={id:Se(),projectId:e,command:t,params:s,status:le.GATHERING,startedAt:v(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[le.GATHERING,le.ANALYZING,le.PROPOSING,le.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===le.APPROVED?s.approvedAt=v():t===le.EXECUTING?s.executionStartedAt=v():(t===le.COMPLETED||t===le.ABORTED)&&(s.completedAt=v()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=le.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=le.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!==le.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=le.APPROVED,s.approvedAt=v(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.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=le.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!==le.APPROVED?null:(t.status=le.EXECUTING,t.executionStartedAt=v(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==le.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!==le.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=le.COMPLETED,t.completedAt=v();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.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=le.ABORTED,s.completedAt=v(),s.abortReason=t;let n={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),n}generateApprovalPrompt(e,t){return Kv(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[le.GATHERING]:"\u{1F50D}",[le.ANALYZING]:"\u{1F9E0}",[le.PROPOSING]:"\u{1F4DD}",[le.PENDING_APPROVAL]:"\u23F3",[le.APPROVED]:"\u2705",[le.EXECUTING]:"\u26A1",[le.COMPLETED]:"\u{1F389}",[le.REJECTED]:"\u274C",[le.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===le.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
874
- `)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},Xv=new Vl,Xe=Xv});var Bl,Yv,cf,lf=S(()=>{"use strict";K();ir();Bl=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await Rt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((p,m)=>p+m.qualityScore,0)/t.length,n=await Rt.getEstimateAccuracy(e),o=new Map;for(let p of t)for(let m of p.blockers||[])o.set(m,(o.get(m)||0)+1);let i=[...o.entries()].sort((p,m)=>m[1]-p[1]).slice(0,5).map(([p])=>p),c=(await this.getAgentMetrics(e)).sort((p,m)=>m.successRate-p.successRate).slice(0,3).map(p=>p.agent),d=(await this.detectPatterns(e)).map(p=>p.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await Rt.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 n=[];for(let[o,i]of s){let a=i.length,c=i.filter(b=>b.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((b,h)=>b+h.qualityScore,0)/a,p=i.filter(b=>{if(!b.variance)return!1;let h=Nn(b.variance),P=$t(b.estimatedDuration);return P===0?!1:Math.abs(h)/P<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let b of i.filter(h=>h.completedAsPlanned))for(let h of b.tags||[])g.set(h,(g.get(h)||0)+1);let w=[...g.entries()].sort((b,h)=>h[1]-b[1]).slice(0,3).map(([b])=>b);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:w})}return n}async detectPatterns(e){let t=await Rt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>Nn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>Nn(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 n=(await Rt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+$t(c.actualDuration),0),i=Math.round(o/n.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 n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},Yv=new Bl,cf=Yv});var gf={};we(gf,{AgentAssignmentSchema:()=>uf,OUTPUT_SCHEMAS:()=>mf,SubtaskBreakdownSchema:()=>df,TaskClassificationSchema:()=>ar,renderSchemaForPrompt:()=>Qv});import{z as ct}from"zod";function Qv(r){let e=mf[r];return e?`## OUTPUT FORMAT
873
+ `).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:tT(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function tT(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var yf,gf,Xv,Yv,Qv,ff,Zv,zi=S(()=>{"use strict";H();qi();yf={".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"},gf=[{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}],Xv=[{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}],Yv=[{type:"function",pattern:/^func\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"method",pattern:/^func\s+\([^)]+\)\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/gm,nameIndex:1}],Qv=[{type:"function",pattern:/^pub\s+(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1},{type:"class",pattern:/^pub\s+struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1},{type:"interface",pattern:/^pub\s+trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1},{type:"enum",pattern:/^pub\s+enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1}],ff=[{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}],Zv={typescript:gf,javascript:gf,python:Xv,go:Yv,rust:Qv,java:ff,csharp:ff,php:[],ruby:[],unknown:[]};l(Js,"extractSignatures");l(Yl,"extractDirectorySignatures");l(eT,"extractFromContent");l(tT,"cleanSignature")});import Ql from"node:path";var sT,nT,Zl,rT,jt,ur=S(()=>{"use strict";Te();Nt();K();B();sT="outcomes",nT="outcomes.jsonl",Zl=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=j.getGlobalProjectPath(e);return Ql.join(t,sT)}getOutcomesPath(e){return Ql.join(this.getOutcomesDir(e),nT)}async record(e,t){let s={...t,id:Q()},n=this.getOutcomesPath(e);return await et(Ql.dirname(n)),await Ba(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await E(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await $e(t);if(!a.trim())return[];let c=a.trim().split(`
874
+ `).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await $e(t);return s.trim()?s.trim().split(`
875
+ `).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.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(n=>{if(!n.variance)return!1;let o=Hn(n.variance),i=_t(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},rT=new Zl,jt=rT});import{z as Je}from"zod";var Ji,dr,oT,lO,eu,wf,Ki=S(()=>{"use strict";Ji=Je.string(),dr=Je.object({primaryDomain:Ji,secondaryDomains:Je.array(Ji),confidence:Je.number().min(0).max(1),filePatterns:Je.array(Je.string()),relevantAgents:Je.array(Je.string())}),oT=Je.object({classification:dr,classifiedAt:Je.string(),source:Je.enum(["cache","history","llm","heuristic"]),descriptionHash:Je.string(),projectId:Je.string()}),lO=Je.object({entries:Je.record(Je.string(),oT),confirmedPatterns:Je.array(Je.object({descriptionHash:Je.string(),classification:dr,confirmedAt:Je.string(),taskDescription:Je.string()}))}),eu={entries:{},confirmedPatterns:[]},wf={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import aT from"node:fs/promises";import bf from"node:path";function kf(r){return Sn(r.toLowerCase().trim())}async function Sf(r){try{let e=bf.join(r,"storage","classification-cache.json"),t=await aT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return I(e)?eu:(console.warn("[classifier] Failed to load cache:",k(e)),eu)}}async function cT(r,e){try{let t=bf.join(r,"storage","classification-cache.json");await le(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function lT(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Ms(s.classifiedAt,36e5)?null:s.classification}function uT(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var tu,dT,vf,Tf=S(()=>{"use strict";Vr();Ki();H();ln();B();bn();l(kf,"hashDescription");l(Sf,"loadCache");l(cT,"saveCache");l(lT,"lookupCache");l(uT,"lookupPatterns");tu=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=kf(e),o=await Sf(s),i=lT(o,n,t);if(i)return{classification:i,source:"cache"};let a=uT(o,n);return a?{classification:a,source:"history"}:{classification:wf,source:"heuristic"}}async confirmClassification(e,t,s){let n=kf(e),o=await Sf(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await cT(s,o))}},dT=new tu,vf=dT});import mT from"node:fs/promises";import pT from"node:path";var su,gT,Xi,nu=S(()=>{"use strict";Vl();Ee();Te();ro();er();no();Pt();wo();zl();zi();H();Ge();ur();Tf();su=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await _.getProjectId(s),o=j.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=u.map((M,y)=>{if(M.status==="fulfilled")return M.value;p.push(d[y]),console.warn(`Context tool "${d[y]}" failed: ${k(M.reason)}`)}),[g,w,v]=m,h={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},P=this.shouldFragment(a,t),T=null;P&&e==="task"&&(T=await this.createSubtasks(t,a,[],n));let $=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:P,subtasks:T,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:w??null,velocityContext:v??null,contextDegradation:h,rpiContext:$}}resolveRpiPhase(e){try{let{prjctDb:t}=(se(),vt(zo)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),As(e,t,{maxFiles:10,minScore:.15}),ko(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Js(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
876
+ `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.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([L("git branch --show-current",{cwd:e}),L("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
877
+ `).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[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:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Qt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await ct.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 jt.getAll(e);if(t.length===0)return null;let s=Gi(t,qs);return s.sprints.length===0?null:df(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=pT.join(e,"analysis","repo-analysis.json"),s=await mT.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return I(t)||console.warn("Failed to load repo-analysis.json:",k(t)),null}}async detectDomains(e,t,s){let n=j.getGlobalProjectPath(t),{classification:o}=await vf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}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"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,p=i.get(c)||[],m=p.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:m?"in_progress":"pending",dependsOn:p,order:u+1}});return await F.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let u=s[c];if(e.includes(u)){let d=n.get(u);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(u=>!n.has(u.id)&&u.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},gT=new su,Xi=gT});function fT(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var ru,hT,Qe,Ef=S(()=>{"use strict";Nt();K();hn();hn();l(fT,"generateApprovalPrompt");ru=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return xc.includes(e)}isDestructive(e){return Rc.includes(e)}isToolAllowedInPlanning(e){return ti.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>ti.includes(s)):t}startPlanning(e,t,s){let n={id:Q(),projectId:e,command:t,params:s,status:ue.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[ue.GATHERING,ue.ANALYZING,ue.PROPOSING,ue.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===ue.APPROVED?s.approvedAt=b():t===ue.EXECUTING?s.executionStartedAt=b():(t===ue.COMPLETED||t===ue.ABORTED)&&(s.completedAt=b()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=ue.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=ue.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!==ue.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=ue.APPROVED,s.approvedAt=b(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.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=ue.REJECTED,s.userFeedback=t,s.completedAt=b(),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!==ue.APPROVED?null:(t.status=ue.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==ue.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!==ue.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=b(),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=ue.COMPLETED,t.completedAt=b();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.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=ue.ABORTED,s.completedAt=b(),s.abortReason=t;let n={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),n}generateApprovalPrompt(e,t){return fT(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[ue.GATHERING]:"\u{1F50D}",[ue.ANALYZING]:"\u{1F9E0}",[ue.PROPOSING]:"\u{1F4DD}",[ue.PENDING_APPROVAL]:"\u23F3",[ue.APPROVED]:"\u2705",[ue.EXECUTING]:"\u26A1",[ue.COMPLETED]:"\u{1F389}",[ue.REJECTED]:"\u274C",[ue.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===ue.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
878
+ `)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},hT=new ru,Qe=hT});var ou,yT,Cf,Pf=S(()=>{"use strict";K();ur();ou=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await jt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((p,m)=>p+m.qualityScore,0)/t.length,n=await jt.getEstimateAccuracy(e),o=new Map;for(let p of t)for(let m of p.blockers||[])o.set(m,(o.get(m)||0)+1);let i=[...o.entries()].sort((p,m)=>m[1]-p[1]).slice(0,5).map(([p])=>p),c=(await this.getAgentMetrics(e)).sort((p,m)=>m.successRate-p.successRate).slice(0,3).map(p=>p.agent),d=(await this.detectPatterns(e)).map(p=>p.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await jt.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 n=[];for(let[o,i]of s){let a=i.length,c=i.filter(v=>v.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((v,h)=>v+h.qualityScore,0)/a,p=i.filter(v=>{if(!v.variance)return!1;let h=Hn(v.variance),P=_t(v.estimatedDuration);return P===0?!1:Math.abs(h)/P<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let v of i.filter(h=>h.completedAsPlanned))for(let h of v.tags||[])g.set(h,(g.get(h)||0)+1);let w=[...g.entries()].sort((v,h)=>h[1]-v[1]).slice(0,3).map(([v])=>v);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:w})}return n}async detectPatterns(e){let t=await jt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>Hn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>Hn(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 n=(await jt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+_t(c.actualDuration),0),i=Math.round(o/n.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 n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},yT=new ou,Cf=yT});var If={};we(If,{AgentAssignmentSchema:()=>xf,OUTPUT_SCHEMAS:()=>Af,SubtaskBreakdownSchema:()=>Rf,TaskClassificationSchema:()=>dr,renderSchemaForPrompt:()=>wT});import{z as ut}from"zod";function wT(r){let e=Af[r];return e?`## OUTPUT FORMAT
875
879
 
876
880
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
877
881
 
@@ -880,10 +884,10 @@ ${e.example}
880
884
  \`\`\`
881
885
 
882
886
  Fields:
883
- ${Zv(e.schema)}`:null}function Zv(r){if(r instanceof ct.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${pf(s)}`).join(`
884
- `)}return"(see example above)"}function pf(r){return r instanceof ct.ZodString?"string":r instanceof ct.ZodNumber?"number":r instanceof ct.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ct.ZodArray?`array of ${pf(r.element)}`:r instanceof ct.ZodObject?"object":"any"}var uf,df,mf,ff=S(()=>{"use strict";Ui();Ui();uf=ct.object({agentName:ct.string(),reasoning:ct.string(),confidence:ct.number().min(0).max(1)}),df=ct.object({subtasks:ct.array(ct.object({description:ct.string(),domain:Fi,agent:ct.string(),dependsOn:ct.array(ct.number())})),effort:ct.enum(["low","medium","high"])}),mf={classification:{schema:ar,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:uf,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:df,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(Qv,"renderSchemaForPrompt");l(Zv,"describeSchema");l(pf,"describeField")});import hf from"node:fs/promises";import cr from"node:path";function Gi(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
885
- ... (truncated to ~${e} tokens)`}function yf(r){return Math.ceil(r.length/4)}var zl,ql,Jl,eT,wf,kf=S(()=>{"use strict";pi();is();xt();H();V();nt();lf();Fs();zl={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Gi,"truncateToTokenBudget");l(yf,"estimateTokens");ql=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...zl,...e}}addSection(e,t){let s=Gi(e,t),n=yf(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Gi(s,o);return this.used+=yf(i),i}return this.used+=n,s}},Jl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;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 E(e)){let n=await hf.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){I(n)||console.error(`Template loading warning: ${k(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=ht(`global/modules/${e}`);if(t)return t;let s=cr.join(Tt,"templates/global/modules",e);return this.getTemplate(s)}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=Ls("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=ht(n);if(o){let i=cr.basename(n,".md");t[i]=o}}}else{let n=cr.join(Tt,"templates","checklists");if(await E(n)){let o=(await hf.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=cr.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){I(s)||console.error(`Checklist loading warning: ${k(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,n]=await Promise.all([L.read(e),Ee.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(I(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 cf.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){!I(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${k(o)}`)}s.push("---"),s.push("");let n=s.join(`
886
- `);return Gi(n,zl.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/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=cr.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,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&u.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let p=d?.skipNativeContext??!1,m=d?.mcpActive??!1,g=[],w=e.frontmatter?.name?.replace("p:","")||"",b={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&b.agents&&(g.push(`# AGENT: ${n.name}
887
+ ${kT(e.schema)}`:null}function kT(r){if(r instanceof ut.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${jf(s)}`).join(`
888
+ `)}return"(see example above)"}function jf(r){return r instanceof ut.ZodString?"string":r instanceof ut.ZodNumber?"number":r instanceof ut.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ut.ZodArray?`array of ${jf(r.element)}`:r instanceof ut.ZodObject?"object":"any"}var xf,Rf,Af,Df=S(()=>{"use strict";Ki();Ki();xf=ut.object({agentName:ut.string(),reasoning:ut.string(),confidence:ut.number().min(0).max(1)}),Rf=ut.object({subtasks:ut.array(ut.object({description:ut.string(),domain:Ji,agent:ut.string(),dependsOn:ut.array(ut.number())})),effort:ut.enum(["low","medium","high"])}),Af={classification:{schema:dr,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:xf,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Rf,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(wT,"renderSchemaForPrompt");l(kT,"describeSchema");l(jf,"describeField")});import $f from"node:fs/promises";import mr from"node:path";function Yi(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
889
+ ... (truncated to ~${e} tokens)`}function Mf(r){return Math.ceil(r.length/4)}var iu,au,cu,ST,_f,Of=S(()=>{"use strict";bi();Kt();Pt();H();B();ot();Pf();Ws();iu={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Yi,"truncateToTokenBudget");l(Mf,"estimateTokens");au=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...iu,...e}}addSection(e,t){let s=Yi(e,t),n=Mf(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Yi(s,o);return this.used+=Mf(i),i}return this.used+=n,s}},cu=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;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 E(e)){let n=await $f.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){I(n)||console.error(`Template loading warning: ${k(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=wt(`global/modules/${e}`);if(t)return t;let s=mr.join(Ct,"templates/global/modules",e);return this.getTemplate(s)}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=Hs("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=wt(n);if(o){let i=mr.basename(n,".md");t[i]=o}}}else{let n=mr.join(Ct,"templates","checklists");if(await E(n)){let o=(await $f.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=mr.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){I(s)||console.error(`Checklist loading warning: ${k(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,n]=await Promise.all([F.read(e),ke.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(I(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 Cf.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){!I(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${k(o)}`)}s.push("---"),s.push("");let n=s.join(`
890
+ `);return Yi(n,iu.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/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=mr.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,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&u.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let p=d?.skipNativeContext??!1,m=d?.mcpActive??!1,g=[],w=e.frontmatter?.name?.replace("p:","")||"",v={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&v.agents&&(g.push(`# AGENT: ${n.name}
887
891
  `),n.role&&g.push(`Role: ${n.role}
888
892
  `),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
889
893
  `),g.push(`
@@ -892,7 +896,7 @@ Apply specialized expertise. Read agent file for details if needed.
892
896
  `)),g.push(`TASK: ${e.frontmatter.description}
893
897
  `),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
894
898
  `);let h=t;(h.params?.task||h.params?.description)&&g.push(`INPUT: ${h.params.task||h.params.description}
895
- `);let P=t.projectPath;if(P){let R=[`project: ${cr.basename(P)}`,`path: ${P}`,"git: true"];u?.realContext?.gitBranch&&R.push(`branch: ${u.realContext.gitBranch}`),R.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
899
+ `);let P=t.projectPath;if(P){let R=[`project: ${mr.basename(P)}`,`path: ${P}`,"git: true"];u?.realContext?.gitBranch&&R.push(`branch: ${u.realContext.gitBranch}`),R.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
896
900
  <env>
897
901
  ${R.join(`
898
902
  `)}
@@ -916,14 +920,14 @@ ${R.join(`
916
920
  ### Anti-Patterns (Avoid These)
917
921
  `);for(let R of y.antiPatterns)g.push(`- **${R.issue}** in \`${R.file}\` \u2014 ${R.suggestion}
918
922
  `)}}g.push(`
919
- `)}if(!p){let y=s?.codePatterns||"";if(b.patterns&&y&&y.trim()){let O=this.extractPatternSummary(y);O&&(g.push(`## CODE PATTERNS
920
- `),g.push(O),g.push(`
923
+ `)}if(!p){let y=s?.codePatterns||"";if(v.patterns&&y&&y.trim()){let D=this.extractPatternSummary(y);D&&(g.push(`## CODE PATTERNS
924
+ `),g.push(D),g.push(`
921
925
  Full patterns: Read analysis/patterns.md
922
- `))}let R=s?.analysis||"";if(b.patterns&&R&&R.trim()){let O=R.match(/Stack[:\s]+([^\n]+)/i)||R.match(/Technology[:\s]+([^\n]+)/i),G=O?O[1].trim():"detected";g.push(`
926
+ `))}let R=s?.analysis||"";if(v.patterns&&R&&R.trim()){let D=R.match(/Stack[:\s]+([^\n]+)/i)||R.match(/Technology[:\s]+([^\n]+)/i),G=D?D[1].trim():"detected";g.push(`
923
927
  ## STACK
924
928
  Stack: ${G}
925
929
  `),y||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
926
- `)}}if(b.modules.length>0)for(let y of b.modules){let R=await this.loadModule(y);R&&(g.push(`
930
+ `)}}if(v.modules.length>0)for(let y of v.modules){let R=await this.loadModule(y);R&&(g.push(`
927
931
  `),g.push(R))}if(c?.isPlanning&&(g.push(`
928
932
  ## PLAN MODE
929
933
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
@@ -959,7 +963,7 @@ SCOPE: Only files in \`${P}\` are accessible.
959
963
  ${R.content}
960
964
  \`\`\`
961
965
  `);g.push(`
962
- `)}if(y.recentFiles.length>0){g.push("**Recently Changed**: ");let R=y.recentFiles.slice(0,5).map(O=>`${O.path} (${O.lastChanged})`).join(", ");g.push(`${R}
966
+ `)}if(y.recentFiles.length>0){g.push("**Recently Changed**: ");let R=y.recentFiles.slice(0,5).map(D=>`${D.path} (${D.lastChanged})`).join(", ");g.push(`${R}
963
967
 
964
968
  `)}}let T=t.files||[];if(T.length>0){let y=T.slice(0,5).join(", ");g.push(`
965
969
  ## FILES: ${T.length} available. Top: ${y}
@@ -1015,7 +1019,7 @@ ${y.planDoc}
1015
1019
 
1016
1020
  `),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
1017
1021
  `),g.push(`|---|--------|-------------|--------|
1018
- `);for(let R of u.subtasks){let O=R.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":R.status==="completed"?"\u2705 Done":R.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${R.order} | ${R.domain} | ${R.description} | ${O} |
1022
+ `);for(let R of u.subtasks){let D=R.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":R.status==="completed"?"\u2705 Done":R.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${R.order} | ${R.domain} | ${R.description} | ${D} |
1019
1023
  `)}let y=u.subtasks.find(R=>R.status==="in_progress");if(y&&(g.push(`
1020
1024
  **FOCUS ON SUBTASK #${y.order}**: ${y.description}
1021
1025
  `),g.push(`Agent: ${y.agent} | Domain: ${y.domain}
@@ -1026,17 +1030,17 @@ ${y.planDoc}
1026
1030
  `),g.push(`**From:** ${R.fromSubtask}
1027
1031
 
1028
1032
  `),g.push(`**What was done:**
1029
- `);for(let O of R.whatWasDone)g.push(`- ${O}
1033
+ `);for(let D of R.whatWasDone)g.push(`- ${D}
1030
1034
  `);if(R.filesChanged.length>0){g.push(`
1031
1035
  **Files changed:**
1032
- `);for(let O of R.filesChanged)g.push(`- \`${O.path}\` (${O.action})
1036
+ `);for(let D of R.filesChanged)g.push(`- \`${D.path}\` (${D.action})
1033
1037
  `)}g.push(`
1034
1038
  **Context for this subtask:**
1035
1039
  ${R.outputForNextAgent}
1036
1040
  `)}g.push(`
1037
- `)}let j=this.getSchemaTypeForCommand(w);if(j){let{renderSchemaForPrompt:y}=await Promise.resolve().then(()=>(ff(),gf)),R=y(j);R&&g.push(`
1041
+ `)}let M=this.getSchemaTypeForCommand(w);if(M){let{renderSchemaForPrompt:y}=await Promise.resolve().then(()=>(Df(),If)),R=y(M);R&&g.push(`
1038
1042
  ${R}
1039
- `)}if(b.checklist){let y=await this.loadChecklistRouting(),R=await this.loadChecklists();y&&Object.keys(R).length>0&&(g.push(`
1043
+ `)}if(v.checklist){let y=await this.loadChecklistRouting(),R=await this.loadChecklists();y&&Object.keys(R).length>0&&(g.push(`
1040
1044
  ## QUALITY CHECKLISTS
1041
1045
  `),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
1042
1046
  `),g.push(`Available: ${Object.keys(R).join(", ")}
@@ -1047,7 +1051,7 @@ ${R}
1047
1051
  `),g.push(`- Be concise. No preamble, no filler.
1048
1052
  `),g.push(`- Use sub-agents for exploration that produces >5 file reads.
1049
1053
  `),g.push(`- Prefer file:line references over dumping full file contents.
1050
- `),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new ql({totalPrompt:zl.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
1054
+ `),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new au({totalPrompt:iu.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
1051
1055
  ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
1052
1056
 
1053
1057
  `):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
@@ -1064,13 +1068,13 @@ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
1064
1068
  `);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
1065
1069
  Avoid:
1066
1070
  ${a}`)}let o=t.join(`
1067
- `);return Gi(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},eT=new Jl,wf=eT});import Kl from"node:fs/promises";import tT from"node:os";import Xl from"node:path";function Sf(){let r=process.env.PRJCT_CLI_HOME?.trim()||Xl.join(tT.homedir(),".prjct-cli");return Xl.join(r,".running")}async function sT(r){try{let e=Sf(),t=Xl.dirname(e);await E(t)||await Kl.mkdir(t,{recursive:!0}),await Kl.writeFile(e,`/p:${r}`)}catch{}}async function nT(){try{let r=Sf();await E(r)&&await Kl.unlink(r)}catch{}}var Yl,rT,Wi,Ql=S(()=>{"use strict";Ag();H();Ig();V();uo();Wg();Zo();Vg();oi();Wl();af();kf();Fs();l(Sf,"getRunningFilePath");l(sT,"signalStart");l(nT,"signalEnd");Yl=class{static{l(this,"CommandExecutor")}async signalStart(e){await sT(e)}async signalEnd(){await nT()}requiresOrchestration(e){return xg.includes(e)?!0:!Rg.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(or.shouldEscalate(e,n)){let o=or.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Im.load(e),i=await hn.build(s,t),a=Xe.requiresPlanning(e),c=Xe.isDestructive(e),u=Xe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Xe.startPlanning(i.projectId,e,t):u&&(d=Xe.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await Hi.execute(e,p,s),m.detectedDomains.length>0&&Dg.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let O=m.subtasks.map(G=>({id:G.id,domain:G.domain,description:G.description,status:G.status}));Gg(O)}}catch(O){console.warn(`\u26A0\uFE0F Orchestrator warning: ${k(O)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},w=await hn.loadState(i),b=await Vs("prjct"),h=null,P=null;i.projectId&&(h={commit_footer:await ft.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await ft.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await ft.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await ft.getSmartDecision(i.projectId,`preferred_agent_${e}`)},b||(P=await ft.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let T={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Xe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},y=(await(st(),St(It)).getActiveProvider()).name==="claude",R=await wf.build(o,g,w,null,h,null,P,T,m,{skipNativeContext:y,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),or.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:w,prompt:R,agenticDelegation:!0,agenticMode:!0,learnedPatterns:h,relevantMemories:P,orchestratorContext:m,memory:{create:l(O=>ft.createMemory(i.projectId,O),"create"),autoRemember:l((O,G,oe)=>ft.autoRemember(i.projectId,O,G,oe),"autoRemember"),search:l(O=>ft.searchMemories(i.projectId,O),"search"),findByTags:l(O=>ft.findByTags(i.projectId,O),"findByTags"),getStats:l(()=>ft.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(O=>Xe.recordGatheredInfo(i.projectId,O),"recordInfo"),setAnalysis:l(O=>Xe.setAnalysis(i.projectId,O),"setAnalysis"),propose:l(O=>Xe.proposePlan(i.projectId,O),"propose"),approve:l(O=>Xe.approvePlan(i.projectId,O),"approve"),reject:l(O=>Xe.rejectPlan(i.projectId,O),"reject"),getApprovalPrompt:l(()=>Xe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Xe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Xe.getNextStep(i.projectId),"getNextStep"),completeStep:l(O=>Xe.completeStep(i.projectId,O),"completeStep"),failStep:l(O=>Xe.failStep(i.projectId,O),"failStep"),abort:l(O=>Xe.abortPlan(i.projectId,O),"abort"),getStatus:l(()=>Xe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Xe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=or.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=or.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:k(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},rT=new Yl,Wi=rT});import oT from"node:https";import iT from"node:os";import Zl from"node:path";import ss from"chalk";var eu,Vi,tu=S(()=>{"use strict";H();V();eu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Zl.join(iT.homedir(),".prjct-cli","config"),this.cacheFile=Zl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Zl.join(__dirname,"..","..","package.json");return(await je(e))?.version??null}catch(e){return console.error("Error reading package version:",k(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"}},n=oT.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)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await E(this.cacheFile))return await je(this.cacheFile)}catch{}return null}async writeCache(e){try{await ce(this.cacheFile,e)}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 n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
1068
- `+ss.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")+`
1069
- `+ss.yellow("\u2502")+" "+ss.bold("Update available!")+" "+ss.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+ss.yellow("\u2502")+`
1070
- `+ss.yellow("\u2502")+" "+ss.yellow("\u2502")+`
1071
- `+ss.yellow("\u2502")+" Run: "+ss.cyan("npm update -g prjct-cli")+" "+ss.yellow("\u2502")+`
1072
- `+ss.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")+`
1073
- `}},Vi=eu});import bf from"node:path";async function lT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await E(bf.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await E(bf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function uT(){return{...aT}}function dT(){return{...cT}}async function vf(){return Bi||(Bi=await lT()?uT():dT(),Bi)}var Bi,aT,cT,Tf=S(()=>{"use strict";V();Bi=null,aT={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",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},cT={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",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(lT,"isClaudeEnvironment");l(uT,"getClaudeAgent");l(dT,"getTerminalAgent");l(vf,"detect")});import zi from"node:fs/promises";var su,Ef,Cf=S(()=>{"use strict";H();V();su=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: ${k(t)}`)}return await zi.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: ${k(s)}`)}await zi.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: ${k(t)}`)}return await zi.readdir(e)}async fileExists(e){return E(e)}async createDirectory(e){await zi.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1071
+ `);return Yi(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},ST=new cu,_f=ST});import lu from"node:fs/promises";import bT from"node:os";import uu from"node:path";function Nf(){let r=process.env.PRJCT_CLI_HOME?.trim()||uu.join(bT.homedir(),".prjct-cli");return uu.join(r,".running")}async function vT(r){try{let e=Nf(),t=uu.dirname(e);await E(t)||await lu.mkdir(t,{recursive:!0}),await lu.writeFile(e,`/p:${r}`)}catch{}}async function TT(){try{let r=Nf();await E(r)&&await lu.unlink(r)}catch{}}var du,ET,Qi,mu=S(()=>{"use strict";qg();H();Kg();B();ho();af();ai();cf();pi();nu();Ef();Of();Ws();l(Nf,"getRunningFilePath");l(vT,"signalStart");l(TT,"signalEnd");du=class{static{l(this,"CommandExecutor")}async signalStart(e){await vT(e)}async signalEnd(){await TT()}requiresOrchestration(e){return Bg.includes(e)?!0:!Vg.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(lr.shouldEscalate(e,n)){let o=lr.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Km.load(e),i=await kn.build(s,t),a=Qe.requiresPlanning(e),c=Qe.isDestructive(e),u=Qe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Qe.startPlanning(i.projectId,e,t):u&&(d=Qe.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await Xi.execute(e,p,s),m.detectedDomains.length>0&&Jg.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let D=m.subtasks.map(G=>({id:G.id,domain:G.domain,description:G.description,status:G.status}));of(D)}}catch(D){console.warn(`\u26A0\uFE0F Orchestrator warning: ${k(D)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},w=await kn.loadState(i),v=await zs("prjct"),h=null,P=null;i.projectId&&(h={commit_footer:await yt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await yt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await yt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await yt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},v||(P=await yt.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let T={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Qe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},y=(await(rt(),vt(Mt)).getActiveProvider()).name==="claude",R=await _f.build(o,g,w,null,h,null,P,T,m,{skipNativeContext:y,mcpActive:v});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),lr.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:w,prompt:R,agenticDelegation:!0,agenticMode:!0,learnedPatterns:h,relevantMemories:P,orchestratorContext:m,memory:{create:l(D=>yt.createMemory(i.projectId,D),"create"),autoRemember:l((D,G,Y)=>yt.autoRemember(i.projectId,D,G,Y),"autoRemember"),search:l(D=>yt.searchMemories(i.projectId,D),"search"),findByTags:l(D=>yt.findByTags(i.projectId,D),"findByTags"),getStats:l(()=>yt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(D=>Qe.recordGatheredInfo(i.projectId,D),"recordInfo"),setAnalysis:l(D=>Qe.setAnalysis(i.projectId,D),"setAnalysis"),propose:l(D=>Qe.proposePlan(i.projectId,D),"propose"),approve:l(D=>Qe.approvePlan(i.projectId,D),"approve"),reject:l(D=>Qe.rejectPlan(i.projectId,D),"reject"),getApprovalPrompt:l(()=>Qe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Qe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Qe.getNextStep(i.projectId),"getNextStep"),completeStep:l(D=>Qe.completeStep(i.projectId,D),"completeStep"),failStep:l(D=>Qe.failStep(i.projectId,D),"failStep"),abort:l(D=>Qe.abortPlan(i.projectId,D),"abort"),getStatus:l(()=>Qe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Qe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=lr.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=lr.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:k(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},ET=new du,Qi=ET});import CT from"node:https";import PT from"node:os";import pu from"node:path";import rs from"chalk";var gu,Zi,fu=S(()=>{"use strict";H();B();gu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=pu.join(PT.homedir(),".prjct-cli","config"),this.cacheFile=pu.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=pu.join(__dirname,"..","..","package.json");return(await De(e))?.version??null}catch(e){return console.error("Error reading package version:",k(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"}},n=CT.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)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await E(this.cacheFile))return await De(this.cacheFile)}catch{}return null}async writeCache(e){try{await le(this.cacheFile,e)}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 n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
1072
+ `+rs.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")+`
1073
+ `+rs.yellow("\u2502")+" "+rs.bold("Update available!")+" "+rs.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+rs.yellow("\u2502")+`
1074
+ `+rs.yellow("\u2502")+" "+rs.yellow("\u2502")+`
1075
+ `+rs.yellow("\u2502")+" Run: "+rs.cyan("npm update -g prjct-cli")+" "+rs.yellow("\u2502")+`
1076
+ `+rs.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")+`
1077
+ `}},Zi=gu});import Lf from"node:path";async function AT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await E(Lf.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await E(Lf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function jT(){return{...xT}}function IT(){return{...RT}}async function Ff(){return ea||(ea=await AT()?jT():IT(),ea)}var ea,xT,RT,Uf=S(()=>{"use strict";B();ea=null,xT={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",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},RT={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",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(AT,"isClaudeEnvironment");l(jT,"getClaudeAgent");l(IT,"getTerminalAgent");l(Ff,"detect")});import ta from"node:fs/promises";var hu,Hf,Wf=S(()=>{"use strict";H();B();hu=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: ${k(t)}`)}return await ta.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: ${k(s)}`)}await ta.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: ${k(t)}`)}return await ta.readdir(e)}async fileExists(e){return E(e)}async createDirectory(e){await ta.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1074
1078
  ${e.map((t,s)=>`${s+1}. ${t}`).join(`
1075
1079
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
1076
1080
 
@@ -1115,10 +1119,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
1115
1119
 
1116
1120
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
1117
1121
 
1118
- 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}}},Ef=su});function Pf(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&pT.has(e.code))return!0;if(e.code&&Rf.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 gT(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Rf.has(e.code))}function xf(r,e,t){let s=zs.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(zs.delete(r),!1):!0:!1}function nu(r,e){let t=zs.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),zs.set(r,t)}function fT(r){zs.delete(r)}var pT,Rf,zs,qi,Af,kN,jf=S(()=>{"use strict";pT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Rf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Pf,"isTransientError");l(gT,"isPermanentError");zs=new Map;l(xf,"isCircuitOpen");l(nu,"recordFailure");l(fT,"recordSuccess");qi=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(xf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return fT(t),o}catch(o){if(s=o,n++,gT(o))throw nu(t,this.options.circuitBreakerThreshold),o;if(!(Pf(o)&&n<this.options.maxAttempts))throw nu(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw nu(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return Pf(e)}isCircuitOpen(e){return xf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return zs.get(e)}resetCircuit(e){zs.delete(e)}resetAllCircuits(){zs.clear()}},Af=new qi({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),kN=new qi({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var hT,ru,Ji,Df=S(()=>{"use strict";ys();Tf();Cf();jf();hT=["claude"],ru=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Af.execute(async()=>{if(this.agentInfo=await vf(),!this.agentInfo?.isSupported)throw Gr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!hT.includes(e))throw Gr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Ef,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Ji=new ru});var ou,lr,iu=S(()=>{"use strict";ou=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},lr=new ou});var au,mt,cu=S(()=>{"use strict";ee();au=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)
1119
- VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.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}}},mt=new au});function lu(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var uu,_e,Ki=S(()=>{"use strict";cu();ee();l(lu,"rowToRule");uu=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),n=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)
1120
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),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 p=u;a.push(d.transform?d.transform(p):p)}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?lu(s):null}getRulesForCommand(e,t){let s=mt.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(lu)}getAllRules(e){return x.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(lu)}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}},_e=new uu});import wt from"node:path";async function yT(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await E(wt.join(r,"pnpm-lock.yaml"))?"pnpm":await E(wt.join(r,"yarn.lock"))?"yarn":await E(wt.join(r,"bun.lockb"))||await E(wt.join(r,"bun.lock"))?"bun":(await E(wt.join(r,"package-lock.json")),"npm")}function If(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function wT(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function ur(r,e){for(let n of kT)if(await E(wt.join(r,n)))return n;let s=(e??await fs(r)).find(n=>n.endsWith(ST));if(s)return s}async function Rs(r){for(let e of bT)if(await E(wt.join(r,e)))return e}async function Xi(r){let e=wt.join(r,"package.json"),t=await je(e,null);if(t){let a=await yT(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:If(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:If(a,"typecheck")}),c.test&&(u.test={tool:a,command:wT(a)}),u.versionFile=await ur(r),u.changelogFile=await Rs(r),u}if(await E(wt.join(r,"pytest.ini"))){let a=await ur(r),c=await Rs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await De(wt.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await ur(r),c=await Rs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await E(wt.join(r,"Cargo.toml"))){let a=await Rs(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await E(wt.join(r,"go.mod"))){let a=await ur(r),c=await Rs(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await fs(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await ur(r,n),c=await Rs(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await E(wt.join(r,"pom.xml"))){let a=await Rs(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await E(wt.join(r,"gradlew"))&&(await E(wt.join(r,"build.gradle"))||await E(wt.join(r,"build.gradle.kts")))){let a=await Rs(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await ur(r),i=await Rs(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var kT,ST,bT,du=S(()=>{"use strict";V();l(yT,"detectPackageManager");l(If,"pmRun");l(wT,"pmTest");kT=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],ST=".csproj",bT=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(ur,"detectVersionFile");l(Rs,"detectChangelogFile");l(Xi,"detectProjectCommands")});import*as pe from"@clack/prompts";import En from"chalk";var Yi,$f,fo,Mf=S(()=>{"use strict";V();Je();Yi=[{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."}],$f=[{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"}],fo=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(){pe.intro(En.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 pe.outro(En.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.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,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=Yi.findIndex(s=>s.value===this.detectedType),t=await pe.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Yi.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?Yi[e].value:void 0});return pe.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await pe.multiselect({message:"Which AI agents do you use?",options:$f.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return pe.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);pe.note(e,"Detected stack");let t=await pe.confirm({message:"Is this stack correct?",initialValue:!0});if(pe.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await pe.group({language:l(()=>pe.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>pe.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 pe.group({verbosity:l(()=>pe.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(()=>pe.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=[`${En.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${En.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${En.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${En.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${En.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1121
- `);pe.note(e,"Configuration Summary");let t=await pe.confirm({message:"Generate configuration with these settings?",initialValue:!0});return pe.isCancel(t)||!t?(pe.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 n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"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:path"),t=await import("node:os"),s=[];await qt(e.join(t.homedir(),".claude"))&&s.push("claude"),await E(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await E(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await E(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await qt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(ze(),fd));await n("which codex"),s.push("codex")}catch{await qt(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.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",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.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 n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,pe.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Yi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return $f.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 _f={};we(_f,{PlanningCommands:()=>Pn});import Qi from"node:fs/promises";import Cn from"node:path";async function vT(){if(!mu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(ea(),Of));mu=new r}return mu}var mu,Pn,Zi=S(()=>{"use strict";No();Es();ve();ke();Ut();_s();is();Ki();H();K();V();vn();nr();Je();du();Mf();Bt();mu=null;l(vT,"getAnalysisCommands");Pn=class extends xe{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 M.isConfigured(t))return f.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 fo(t).runNonInteractive());else if(a=await new fo(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Fn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await M.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await D.ensureProjectStructure(p);let m=D.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
1122
+ 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}}},Hf=hu});function Gf(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&$T.has(e.code))return!0;if(e.code&&Vf.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 MT(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Vf.has(e.code))}function Bf(r,e,t){let s=Ks.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Ks.delete(r),!1):!0:!1}function yu(r,e){let t=Ks.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Ks.set(r,t)}function _T(r){Ks.delete(r)}var $T,Vf,Ks,sa,qf,VN,zf=S(()=>{"use strict";$T=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Vf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Gf,"isTransientError");l(MT,"isPermanentError");Ks=new Map;l(Bf,"isCircuitOpen");l(yu,"recordFailure");l(_T,"recordSuccess");sa=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(Bf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return _T(t),o}catch(o){if(s=o,n++,MT(o))throw yu(t,this.options.circuitBreakerThreshold),o;if(!(Gf(o)&&n<this.options.maxAttempts))throw yu(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw yu(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return Gf(e)}isCircuitOpen(e){return Bf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Ks.get(e)}resetCircuit(e){Ks.delete(e)}resetAllCircuits(){Ks.clear()}},qf=new sa({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),VN=new sa({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var OT,wu,na,Jf=S(()=>{"use strict";ks();Uf();Wf();zf();OT=["claude"],wu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await qf.execute(async()=>{if(this.agentInfo=await Ff(),!this.agentInfo?.isSupported)throw qr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!OT.includes(e))throw qr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Hf,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},na=new wu});var ku,pr,Su=S(()=>{"use strict";ku=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},pr=new ku});var bu,gt,vu=S(()=>{"use strict";se();bu=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)
1123
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.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}}},gt=new bu});function Tu(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Eu,Ne,ra=S(()=>{"use strict";vu();se();l(Tu,"rowToRule");Eu=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),n=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)
1124
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),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 p=u;a.push(d.transform?d.transform(p):p)}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?Tu(s):null}getRulesForCommand(e,t){let s=gt.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(Tu)}getAllRules(e){return x.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Tu)}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}},Ne=new Eu});import St from"node:path";async function NT(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await E(St.join(r,"pnpm-lock.yaml"))?"pnpm":await E(St.join(r,"yarn.lock"))?"yarn":await E(St.join(r,"bun.lockb"))||await E(St.join(r,"bun.lock"))?"bun":(await E(St.join(r,"package-lock.json")),"npm")}function Kf(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function LT(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function gr(r,e){for(let n of FT)if(await E(St.join(r,n)))return n;let s=(e??await ys(r)).find(n=>n.endsWith(UT));if(s)return s}async function js(r){for(let e of HT)if(await E(St.join(r,e)))return e}async function oa(r){let e=St.join(r,"package.json"),t=await De(e,null);if(t){let a=await NT(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Kf(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Kf(a,"typecheck")}),c.test&&(u.test={tool:a,command:LT(a)}),u.versionFile=await gr(r),u.changelogFile=await js(r),u}if(await E(St.join(r,"pytest.ini"))){let a=await gr(r),c=await js(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await $e(St.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await gr(r),c=await js(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await E(St.join(r,"Cargo.toml"))){let a=await js(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await E(St.join(r,"go.mod"))){let a=await gr(r),c=await js(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await ys(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await gr(r,n),c=await js(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await E(St.join(r,"pom.xml"))){let a=await js(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await E(St.join(r,"gradlew"))&&(await E(St.join(r,"build.gradle"))||await E(St.join(r,"build.gradle.kts")))){let a=await js(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await gr(r),i=await js(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var FT,UT,HT,Cu=S(()=>{"use strict";B();l(NT,"detectPackageManager");l(Kf,"pmRun");l(LT,"pmTest");FT=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],UT=".csproj",HT=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(gr,"detectVersionFile");l(js,"detectChangelogFile");l(oa,"detectProjectCommands")});import*as fe from"@clack/prompts";import xn from"chalk";var ia,Xf,So,Yf=S(()=>{"use strict";B();Ve();ia=[{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."}],Xf=[{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"}],So=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(){fe.intro(xn.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 fe.outro(xn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.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,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=ia.findIndex(s=>s.value===this.detectedType),t=await fe.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ia.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?ia[e].value:void 0});return fe.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await fe.multiselect({message:"Which AI agents do you use?",options:Xf.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return fe.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);fe.note(e,"Detected stack");let t=await fe.confirm({message:"Is this stack correct?",initialValue:!0});if(fe.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await fe.group({language:l(()=>fe.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>fe.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 fe.group({verbosity:l(()=>fe.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(()=>fe.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=[`${xn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${xn.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${xn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${xn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${xn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1125
+ `);fe.note(e,"Configuration Summary");let t=await fe.confirm({message:"Generate configuration with these settings?",initialValue:!0});return fe.isCancel(t)||!t?(fe.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 n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"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:path"),t=await import("node:os"),s=[];await zt(e.join(t.homedir(),".claude"))&&s.push("claude"),await E(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await E(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await E(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await zt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Ge(),Dd));await n("which codex"),s.push("codex")}catch{await zt(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.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",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.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 n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,fe.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ia.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Xf.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 Qf={};we(Qf,{PlanningCommands:()=>An});import aa from"node:fs/promises";import Rn from"node:path";async function WT(){if(!Pu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(la(),Zf));Pu=new r}return Pu}var Pu,An,ca=S(()=>{"use strict";Wo();Ps();Ee();Te();Nt();Ls();Kt();ra();H();K();B();Cn();ar();Ve();Cu();Yf();Ut();Pu=null;l(WT,"getAnalysisCommands");An=class extends xe{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 f.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 So(t).runNonInteractive());else if(a=await new So(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Gn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await _.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await j.ensureProjectStructure(p);let m=j.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
1122
1126
 
1123
1127
  No current task. Use \`/p:now\` to set focus.
1124
1128
  `,"core/next.md":`# NEXT
@@ -1138,7 +1142,7 @@ No current task. Use \`/p:now\` to set focus.
1138
1142
  `,"planning/roadmap.md":`# ROADMAP
1139
1143
 
1140
1144
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
1141
- `,"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[P,T]of Object.entries(g))await Qi.writeFile(Cn.join(m,P),T);let w=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!w){f.step(3,4,"Analyzing project...");let P=await vT();if((await P.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await P.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let h=s.idea;if(w&&!b){if(!h)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let P=Cn.join(m,"planning","architect-session.md"),T=`# Architect Session
1145
+ `,"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[P,T]of Object.entries(g))await aa.writeFile(Rn.join(m,P),T);let w=await this._detectEmptyDirectory(t),v=await this._detectExistingCode(t);if(v||!w){f.step(3,4,"Analyzing project...");let P=await WT();if((await P.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await P.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let h=s.idea;if(w&&!v){if(!h)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let P=Rn.join(m,"planning","architect-session.md"),T=`# Architect Session
1142
1146
 
1143
1147
  ## Idea
1144
1148
  ${h}
@@ -1147,8 +1151,8 @@ ${h}
1147
1151
  Initialized - awaiting stack recommendation
1148
1152
 
1149
1153
  Generated: ${new Date().toLocaleString()}
1150
- `;return await Qi.writeFile(P,T),await Me.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:h,wizard:a}}return await Me.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(s){return f.fail(k(s)),{success:!1,error:k(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 f.fail("description required"),{success:!1,error:"Description required"};let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=Se();return await Ee.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:v()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await M.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await Ee.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:v()}),s.md?console.log(U(Z("Bug Reported",e),yt({Severity:i,Priority:c}),fe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Nt("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}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
1151
- `);let n=await this.getGlobalProjectPath(t),o=Cn.join(n,"planning","architect-session.md"),i;try{i=await De(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1154
+ `;return await aa.writeFile(P,T),await Oe.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:h,wizard:a}}return await Oe.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(s){return f.fail(k(s)),{success:!1,error:k(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 f.fail("description required"),{success:!1,error:"Description required"};let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=Q();return await ke.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:b()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await _.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await ke.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:b()}),s.md?console.log(U(te("Bug Reported",e),kt({Severity:i,Priority:c}),ye([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Ft("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}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
1155
+ `);let n=await this.getGlobalProjectPath(t),o=Rn.join(n,"planning","architect-session.md"),i;try{i=await $e(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1152
1156
 
1153
1157
  Create a plan first:
1154
1158
  1. Run /p:init in an empty directory
@@ -1169,7 +1173,7 @@ The architect plan is ready. Claude will now:
1169
1173
  4. Create starter files with boilerplate
1170
1174
  `),console.log(`
1171
1175
  \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.
1172
- `),await this.logToMemory(t,"architect_executed",{timestamp:v(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await M.getProjectId(t);if(!o)return s.md||f.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||f.spin("analyzing idea...");let c=D.getGlobalProjectPath(o),u=Cn.join(c,"planning","architect-session.md"),d=`# Architect Session
1176
+ `),await this.logToMemory(t,"architect_executed",{timestamp:b(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await _.getProjectId(t);if(!o)return s.md||f.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||f.spin("analyzing idea...");let c=j.getGlobalProjectPath(o),u=Rn.join(c,"planning","architect-session.md"),d=`# Architect Session
1173
1177
 
1174
1178
  ## Idea
1175
1179
  ${e}
@@ -1184,14 +1188,14 @@ Initialized - awaiting architecture design
1184
1188
  4. Generate roadmap
1185
1189
 
1186
1190
  Generated: ${new Date().toLocaleString()}
1187
- `;return await Qi.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:v()}),s.md?console.log(U(Z("Idea Captured",e),yt({Mode:"architecture"}),fe([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1191
+ `;return await aa.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:b()}),s.md?console.log(U(te("Idea Captured",e),kt({Mode:"architecture"}),ye([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1188
1192
  \u{1F4A1} Use /p:architect execute to continue planning
1189
- `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await qe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:v()}),s.md?console.log(U(Z("Idea Captured",e),yt({Mode:"capture"}),fe([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),Nt("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=D.getGlobalProjectPath(n),p=Cn.join(d,"planning","specs");try{let w=(await(await import("node:fs/promises")).readdir(p)).filter(b=>b.endsWith(".md")&&b!==".gitkeep");return w.length===0?(f.warn("no specs yet"),console.log(`
1193
+ `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Xe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:b()}),s.md?console.log(U(te("Idea Captured",e),kt({Mode:"capture"}),ye([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),Ft("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=j.getGlobalProjectPath(n),p=Rn.join(d,"planning","specs");try{let w=(await(await import("node:fs/promises")).readdir(p)).filter(v=>v.endsWith(".md")&&v!==".gitkeep");return w.length===0?(f.warn("no specs yet"),console.log(`
1190
1194
  \u{1F4A1} Create one with /p:spec "feature name"
1191
1195
  `),{success:!0,specs:[]}):(console.log(`
1192
1196
  \u{1F4CB} SPECIFICATIONS
1193
- `),console.log("\u2550".repeat(50)),w.forEach((b,h)=>{let P=b.replace(".md","").replace(/-/g," ");console.log(` ${h+1}. ${P}`)}),console.log(`${"\u2550".repeat(50)}
1194
- `),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=D.getGlobalProjectPath(n),i=Cn.join(o,"planning","specs");await Qe(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Cn.join(i,`${a}.md`),u=`# Specification: ${e}
1197
+ `),console.log("\u2550".repeat(50)),w.forEach((v,h)=>{let P=v.replace(".md","").replace(/-/g," ");console.log(` ${h+1}. ${P}`)}),console.log(`${"\u2550".repeat(50)}
1198
+ `),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=j.getGlobalProjectPath(n),i=Rn.join(o,"planning","specs");await et(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Rn.join(i,`${a}.md`),u=`# Specification: ${e}
1195
1199
 
1196
1200
  ## Overview
1197
1201
  [Brief description of the feature]
@@ -1221,38 +1225,38 @@ Generated: ${new Date().toLocaleString()}
1221
1225
  ---
1222
1226
  Created: ${new Date().toLocaleString()}
1223
1227
  Status: Draft
1224
- `;return await Qi.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:v()}),f.done(`spec created: ${a}.md`),console.log(`
1228
+ `;return await aa.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:b()}),f.done(`spec created: ${a}.md`),console.log(`
1225
1229
  \u{1F4DD} Edit: ~/.prjct-cli/projects/${n}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
1226
- `),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await Xi(t),n=0;_e.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:n++,createdAt:new Date().toISOString()}),s.lint&&_e.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&_e.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var pu,xn,Nf=S(()=>{"use strict";ys();No();ve();ke();H();V();Je();pu=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await M.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Zi(),_f)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await M.getProjectId(e);if(!t)throw Io.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await D.ensureProjectStructure(t),D.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Fn();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 fs(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return I(t)||console.error(`Directory check error: ${k(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await fs(e)).some(n=>t.includes(n))}catch(t){return I(t)||console.error(`Code check error: ${k(t)}`),!1}}async isConfigured(e){return await M.isConfigured(e)}async needsMigration(e){return await M.needsMigration(e)}},xn=new pu});var xe,Bt=S(()=>{"use strict";Ql();tu();Df();iu();bn();Nf();xe=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Vi,this.updateNotificationShown=!1,this.commandExecutor=Wi}get agent(){return Ji.getAgent()}get agentInfo(){return Ji.getInfo()}get currentAuthor(){return xn.getCurrentAuthor()}async initializeAgent(){return Ji.initialize()}async ensureProjectInit(e){return xn.ensureInit(e)}async ensureAuthor(){return xn.ensureAuthor()}async getGlobalProjectPath(e){return xn.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return _t.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return xn.isEmptyDirectory(e)}async _detectExistingCode(e){return xn.hasExistingCode(e)}_breakdownFeatureTasks(e){return lr.breakdownFeature(e)}_detectBugSeverity(e){return lr.detectBugSeverity(e)}}});var Of={};we(Of,{AnalysisCommands:()=>An});import ta from"node:fs/promises";import Lf from"node:path";import*as Rn from"@clack/prompts";var An,ea=S(()=>{"use strict";Zo();oi();Rm();Es();ve();ke();ui();Ac();Qm();rp();Hc();Ri();Xn();ee();Qr();Si();H();K();vn();nr();Je();Pg();Bt();An=class extends xe{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1227
- `),ot.init(t);let s=await hn.build(t,e),n={packageJson:await ot.readPackageJson(),cargoToml:await ot.readCargoToml(),goMod:await ot.readGoMod(),requirements:await ot.readRequirements(),directories:await ot.listDirectories(),fileCount:await ot.countFiles(),gitStats:await ot.getGitStats(),gitLog:await ot.getGitLog(20),hasDockerfile:await ot.fileExists("Dockerfile"),hasDockerCompose:await ot.fileExists("docker-compose.yml"),hasReadme:await ot.fileExists("README.md"),hasTsconfig:await ot.fileExists("tsconfig.json"),hasViteConfig:await ot.fileExists("vite.config.ts")||await ot.fileExists("vite.config.js"),hasNextConfig:await ot.fileExists("next.config.js")||await ot.fileExists("next.config.mjs")},o=Cg(n,t),i=await M.getProjectId(t),a=s.paths.analysis||D.getFilePath(i,"analysis","repo-summary.md");await ta.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:v(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(st(),St(It)).getActiveProvider(),d=await Me.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${D.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1228
- `),console.log(`\u{1F4C4} Full report: ${D.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1229
- `),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:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=D.getGlobalProjectPath(n),i=Date.now();if(t.package){let p=await D.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!m){let w=p.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await Ps.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:g.success,package:m.name,path:m.relativePath})):t.md?console.log(U(Te(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=Lf.join(o,"context","CLAUDE.md"),c=null;try{c=await ta.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let p=await Ps.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(U("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(f.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await ta.readFile(a,"utf-8")}catch{m=""}let g=tp(c,m);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(U(Te("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"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let w=l(async()=>{c!=null&&await ta.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await w();let h=[];for(let T of g.added)h.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)h.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)h.push(`Removed: ${T.name} (${T.lineCount} lines)`);let P=U("## Sync Preview",h.length>0?Z("Changes",Ge(h)):"No section changes.",yt({"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(P),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await w();let h={added:g.added.map(P=>({name:P.name,lineCount:P.lineCount})),modified:g.modified.map(P=>({name:P.name,lineCount:P.lineCount})),removed:g.removed.map(P=>({name:P.name,lineCount:P.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:h,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(sp(g)),t.preview)return await w(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await Rn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Rn.isCancel(b)||b==="cancel")return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(b==="diff"){console.log(`
1230
- ${np(g)}`);let h=await Rn.confirm({message:"Apply these changes?",initialValue:!0});if(Rn.isCancel(h)||!h)return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),bl(p,i)}t.md||f.spin("Syncing project...");let d=await Ps.sync(e,{full:t.full});if(!d.success)return t.md?console.log(U("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,g=null;try{let y=await it.diff(n);y?.hasChanges&&(g=Rc(y))}catch{}let w=d.git.recentCommits[0]?.hash??null,b=w&&Xt.isCurrent(n,w),h=null;if(!b)try{let y=await Lc(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(y,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1231
- `)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let P=Ai("sync",!0),T=d.syncMetrics?.indexes,$={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(T?.bm25Files){let y=T.bm25Files*(T.bm25AvgTokens||0);$["Tokens indexed"]=`${Math.round(y/1e3)}K`,$["Import edges"]=T.importEdges||0,$["Co-change commits"]=T.cochangeCommits||0}let j=U(Te("Sync Complete"),yt($),g,d.git.hasChanges?kg("Uncommitted changes detected"):null,h,fe(P.map(y=>({label:y.desc,command:y.cmd}))));return console.log(j),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return bl(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ps.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Xt.isCurrent(n,i))return t.md?console.log(U(Te("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 Lc(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.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."}:(Xt.save(o,i),s.md?console.log(U(Te("LLM Analysis Saved"),yt({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(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Xt.getActive(n);if(!o)return t.md?console.log(U("## 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=[Te(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Z("Architecture Insights",Ge(o.architecture.insights))),o.patterns.length>0&&i.push(Z("Patterns",Ge(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Z("Anti-Patterns",Ge(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Z("Tech Debt",Ge(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Z("Conventions",Ge(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Hs.getSummary(n),i=await Hs.getDailyStats(n,30),a=await vg(n),c=await ft.getPatternsSummary(n);if(t.json){let m={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(m,null,2)),{success:!0,data:m}}let u="Unknown";try{u=x.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Hs.read(n),p=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: ${p.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 m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}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: ${rr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${li(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=Tg(i);if(console.log(` ${m} ${rr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${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 m=Eg(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=gi(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await it.getStatus(n);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=Lf.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=U(`## Status: ${u}`,yt({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?Z("Analysis",Ge(m)):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 n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await it.diff(n);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(U("## Analysis Diff",`> ${i}`)):f.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(U(Rc(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Um(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`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await it.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await it.rollback(n);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(U(Te("Analysis Rolled Back"),yt({"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(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.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}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}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 n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await it.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=x.getDoc(n,"project")?.repoPath||e}catch{}let i=await it.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.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 n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var gu,Ff,Uf=S(()=>{"use strict";ee();gu=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){x.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
1230
+ `),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await oa(t),n=0;Ne.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:n++,createdAt:new Date().toISOString()}),s.lint&&Ne.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&Ne.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var xu,jn,eh=S(()=>{"use strict";ks();Wo();Ee();Te();H();B();Ve();xu=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await _.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ca(),Qf)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await _.getProjectId(e);if(!t)throw No.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await j.ensureProjectStructure(t),j.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Gn();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 ys(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return I(t)||console.error(`Directory check error: ${k(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ys(e)).some(n=>t.includes(n))}catch(t){return I(t)||console.error(`Code check error: ${k(t)}`),!1}}async isConfigured(e){return await _.isConfigured(e)}async needsMigration(e){return await _.needsMigration(e)}},jn=new xu});var xe,Ut=S(()=>{"use strict";mu();fu();Jf();Su();En();eh();xe=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Zi,this.updateNotificationShown=!1,this.commandExecutor=Qi}get agent(){return na.getAgent()}get agentInfo(){return na.getInfo()}get currentAuthor(){return jn.getCurrentAuthor()}async initializeAgent(){return na.initialize()}async ensureProjectInit(e){return jn.ensureInit(e)}async ensureAuthor(){return jn.ensureAuthor()}async getGlobalProjectPath(e){return jn.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Lt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return jn.isEmptyDirectory(e)}async _detectExistingCode(e){return jn.hasExistingCode(e)}_breakdownFeatureTasks(e){return pr.breakdownFeature(e)}_detectBugSeverity(e){return pr.detectBugSeverity(e)}}});var Zf={};we(Zf,{AnalysisCommands:()=>Dn});import ua from"node:fs/promises";import th from"node:path";import*as In from"@clack/prompts";var Dn,la=S(()=>{"use strict";ai();pi();Vm();Ps();Ee();Te();wi();Bc();fp();bp();sl();Oi();er();se();no();Ri();H();K();Cn();ar();Ve();Gg();Ut();Dn=class extends xe{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1231
+ `),at.init(t);let s=await kn.build(t,e),n={packageJson:await at.readPackageJson(),cargoToml:await at.readCargoToml(),goMod:await at.readGoMod(),requirements:await at.readRequirements(),directories:await at.listDirectories(),fileCount:await at.countFiles(),gitStats:await at.getGitStats(),gitLog:await at.getGitLog(20),hasDockerfile:await at.fileExists("Dockerfile"),hasDockerCompose:await at.fileExists("docker-compose.yml"),hasReadme:await at.fileExists("README.md"),hasTsconfig:await at.fileExists("tsconfig.json"),hasViteConfig:await at.fileExists("vite.config.ts")||await at.fileExists("vite.config.js"),hasNextConfig:await at.fileExists("next.config.js")||await at.fileExists("next.config.mjs")},o=Wg(n,t),i=await _.getProjectId(t),a=s.paths.analysis||j.getFilePath(i,"analysis","repo-summary.md");await ua.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:b(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(rt(),vt(Mt)).getActiveProvider(),d=await Oe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${j.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1232
+ `),console.log(`\u{1F4C4} Full report: ${j.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1233
+ `),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:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=j.getGlobalProjectPath(n),i=Date.now();if(t.package){let p=await j.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!m){let w=p.packages.map(v=>v.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await Rs.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:g.success,package:m.name,path:m.relativePath})):t.md?console.log(U(Pe(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=th.join(o,"context","CLAUDE.md"),c=null;try{c=await ua.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let p=await Rs.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(U("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(f.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await ua.readFile(a,"utf-8")}catch{m=""}let g=wp(c,m);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(U(Pe("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"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let w=l(async()=>{c!=null&&await ua.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await w();let h=[];for(let T of g.added)h.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)h.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)h.push(`Removed: ${T.name} (${T.lineCount} lines)`);let P=U("## Sync Preview",h.length>0?te("Changes",ze(h)):"No section changes.",kt({"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(P),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await w();let h={added:g.added.map(P=>({name:P.name,lineCount:P.lineCount})),modified:g.modified.map(P=>({name:P.name,lineCount:P.lineCount})),removed:g.removed.map(P=>({name:P.name,lineCount:P.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:h,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(kp(g)),t.preview)return await w(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let v=await In.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(In.isCancel(v)||v==="cancel")return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(v==="diff"){console.log(`
1234
+ ${Sp(g)}`);let h=await In.confirm({message:"Apply these changes?",initialValue:!0});if(In.isCancel(h)||!h)return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),_l(p,i)}t.md||f.spin("Syncing project...");let d=await Rs.sync(e,{full:t.full});if(!d.success)return t.md?console.log(U("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,g=null;try{let y=await ct.diff(n);y?.hasChanges&&(g=Gc(y))}catch{}let w=d.git.recentCommits[0]?.hash??null,v=w&&Qt.isCurrent(n,w),h=null;if(!v)try{let y=await Zc(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(y,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1235
+ `)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let P=Li("sync",!0),T=d.syncMetrics?.indexes,$={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(T?.bm25Files){let y=T.bm25Files*(T.bm25AvgTokens||0);$["Tokens indexed"]=`${Math.round(y/1e3)}K`,$["Import edges"]=T.importEdges||0,$["Co-change commits"]=T.cochangeCommits||0}let M=U(Pe("Sync Complete"),kt($),g,d.git.hasChanges?Og("Uncommitted changes detected"):null,h,ye(P.map(y=>({label:y.desc,command:y.cmd}))));return console.log(M),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return _l(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Rs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Qt.isCurrent(n,i))return t.md?console.log(U(Pe("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 Zc(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;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."}:(Qt.save(o,i),s.md?console.log(U(Pe("LLM Analysis Saved"),kt({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(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Qt.getActive(n);if(!o)return t.md?console.log(U("## 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=[Pe(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(te("Architecture Insights",ze(o.architecture.insights))),o.patterns.length>0&&i.push(te("Patterns",ze(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(te("Anti-Patterns",ze(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(te("Tech Debt",ze(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(te("Conventions",ze(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Bs.getSummary(n),i=await Bs.getDailyStats(n,30),a=await Fg(n),c=await yt.getPatternsSummary(n);if(t.json){let m={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(m,null,2)),{success:!0,data:m}}let u="Unknown";try{u=x.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Bs.read(n),p=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: ${p.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 m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${cr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${yi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Ol(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=Ug(i);if(console.log(` ${m} ${cr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${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 m=Hg(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=vi(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await ct.getStatus(n);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=th.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=U(`## Status: ${u}`,kt({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?te("Analysis",ze(m)):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 n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await ct.diff(n);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(U("## Analysis Diff",`> ${i}`)):f.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(U(Gc(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(np(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`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await ct.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await ct.rollback(n);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(U(Pe("Analysis Rolled Back"),kt({"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(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.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}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}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 n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await ct.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=x.getDoc(n,"project")?.repoPath||e}catch{}let i=await ct.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.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 n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var Ru,sh,nh=S(()=>{"use strict";se();Ru=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){x.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
1232
1236
  VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){x.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
1233
1237
  VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return x.query(e,"SELECT * FROM context_zone_events WHERE project_id = ? ORDER BY id DESC LIMIT ?",e,t).map(n=>({from:n.zone_from,to:n.zone_to,usagePercent:n.usage_percent,timestamp:n.timestamp,action:n.action}))}getSummary(e,t=7){let s=new Date(Date.now()-t*864e5).toISOString(),n=x.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
1234
1238
  WHERE project_id = ? AND timestamp >= ?
1235
1239
  GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let u of n)o[u.zone_to]=u.cnt,i+=u.cnt;let c=x.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
1236
- WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},Ff=new gu});var fu,W,ho=S(()=>{"use strict";ve();ke();H();K();fu=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,n){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,n)}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(n=>n.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),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.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 M.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:D.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:v()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:k(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 n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return n.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()}},W=new fu});import TT from"node:fs/promises";import ET from"node:path";var dr,hu=S(()=>{"use strict";Zo();ve();Hc();Uf();ee();_s();is();un();xt();H();K();vn();Je();Bt();ho();dr=class extends xe{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=ET.basename(t),a=await L.getCurrentTask(o),c=await Ee.getActiveTasks(o),u=await lt.getRecent(o,5),d=await qe.getPending(o);if(e==="compact"){let p=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",m=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=$s(p),g=[];try{let h=m.toISOString();g=x.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",h).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let w={tasksCompleted:g.filter(h=>h.action==="task_completed").length,featuresShipped:g.filter(h=>h.action==="feature_shipped").length,totalActions:g.length};console.log(`
1240
+ WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},sh=new Ru});var Au,W,bo=S(()=>{"use strict";Ee();Te();H();K();Au=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,n){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,n)}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(n=>n.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),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.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:j.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:b()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:k(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 n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},W=new Au});import GT from"node:fs/promises";import BT from"node:path";var fr,ju=S(()=>{"use strict";ai();Ee();sl();nh();se();Ls();Kt();pn();Pt();H();K();Cn();Ve();Ut();bo();fr=class extends xe{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=BT.basename(t),a=await F.getCurrentTask(o),c=await ke.getActiveTasks(o),u=await dt.getRecent(o,5),d=await Xe.getPending(o);if(e==="compact"){let p=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",m=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=Os(p),g=[];try{let h=m.toISOString();g=x.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",h).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let w={tasksCompleted:g.filter(h=>h.action==="task_completed").length,featuresShipped:g.filter(h=>h.action==="feature_shipped").length,totalActions:g.length};console.log(`
1237
1241
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1238
- `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let b=this._generateSparkline(g,p);return console.log(`
1239
- Activity: ${b}
1240
- `),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let p=await hn.build(t),m=null;try{m=await TT.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
1242
+ `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let v=this._generateSparkline(g,p);return console.log(`
1243
+ Activity: ${v}
1244
+ `),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let p=await kn.build(t),m=null;try{m=await GT.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
1241
1245
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1242
1246
  `),console.log("\u2550".repeat(50)),!m||m.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1243
- `);else{let g=m.split("##").filter(w=>w.trim()&&!w.includes("ROADMAP"));g.slice(0,5).forEach((w,b)=>{let h=w.split(`
1244
- `)[0].trim();console.log(` ${b+1}. ${h}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1245
- `),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${ws(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(h=>{let P=h.priority?` [${h.priority}]`:"";return`${h.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${P}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(h=>{let P=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";return`${h.name}${P?` (${P})`:""}`}):["Nothing shipped yet"],w=null;try{let h=Ff.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
1246
- `+ro(["Zone","%"],[["Smart",`${h.smartPercent}%`],["Warning",`${h.warningPercent}%`],["Dumb",`${h.dumbPercent}%`],["Compactions",`${h.compactions}`]]))}catch{}let b=U(`## Dashboard: ${i}`,Z("Current Focus",p),Z(`Queue (${c.length})`,Ge(m,!0)),Z("Recent Ships",Ge(g)),Z("Ideas",`${d.length} pending`),w,fe([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(b)}else{console.log(`
1247
+ `);else{let g=m.split("##").filter(w=>w.trim()&&!w.includes("ROADMAP"));g.slice(0,5).forEach((w,v)=>{let h=w.split(`
1248
+ `)[0].trim();console.log(` ${v+1}. ${h}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1249
+ `),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${Ss(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(h=>{let P=h.priority?` [${h.priority}]`:"";return`${h.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${P}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(h=>{let P=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";return`${h.name}${P?` (${P})`:""}`}):["Nothing shipped yet"],w=null;try{let h=sh.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
1250
+ `+lo(["Zone","%"],[["Smart",`${h.smartPercent}%`],["Warning",`${h.warningPercent}%`],["Dumb",`${h.dumbPercent}%`],["Compactions",`${h.compactions}`]]))}catch{}let v=U(`## Dashboard: ${i}`,te("Current Focus",p),te(`Queue (${c.length})`,ze(m,!0)),te("Recent Ships",ze(g)),te("Ideas",`${d.length} pending`),w,ye([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(v)}else{console.log(`
1247
1251
  \u{1F4CA} DASHBOARD - ${i}
1248
- `),console.log("\u2550".repeat(50));let p=gi(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
1252
+ `),console.log("\u2550".repeat(50));let p=vi(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
1249
1253
  ${g}`),console.log(`
1250
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=ws(new Date(a.startedAt));console.log(` Started: ${w} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1251
- \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((w,b)=>{let h=w.priority?`[${w.priority}]`:"";console.log(` ${b+1}. ${w.description.slice(0,40)} ${h}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1252
- \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(w=>{let b=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${w.name} ${b?`(${b})`:""}`)}),console.log(`
1254
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=Ss(new Date(a.startedAt));console.log(` Started: ${w} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1255
+ \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((w,v)=>{let h=w.priority?`[${w.priority}]`:"";console.log(` ${v+1}. ${w.description.slice(0,40)} ${h}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1256
+ \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(w=>{let v=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${w.name} ${v?`(${v})`:""}`)}),console.log(`
1253
1257
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1254
1258
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1255
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:v()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1259
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:b()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1256
1260
  PRJCT COMMANDS
1257
1261
  `),console.log("=".repeat(50));let i=W.getAllCategories(),a=W.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let p=i.get(u);console.log(`
1258
1262
  ${p?.title||u}:`),d.forEach(m=>{let g=m.params?` ${m.params}`:"";console.log(` ${m.name}${g}`),console.log(` ${m.description}`)})}),console.log(`
@@ -1267,9 +1271,9 @@ ${"\u2550".repeat(50)}
1267
1271
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1268
1272
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1269
1273
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1270
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var Gf={};we(Gf,{ContextCommands:()=>qs,contextCommands:()=>Hf,default:()=>xT});import CT from"node:fs/promises";import PT from"node:path";var qs,Hf,xT,sa=S(()=>{"use strict";Wl();ve();ke();xt();H();vn();qs=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await M.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=D.getGlobalProjectPath(c),d=await L.read(c),p=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(b=>({id:b.id,description:b.description,status:b.status,domain:b.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,m=null;if(i)try{m=await Hi.execute(o,i,t)}catch(b){console.error(`Warning: Orchestrator failed: ${k(b)}`)}let g=await this.loadRepoAnalysis(u),w={projectId:c,globalPath:u,currentTask:p,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,subtasks:m?.subtasks?.map(b=>({id:b.id,description:b.description,domain:b.domain,agent:b.agent,status:b.status,order:b.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(w)):console.log(JSON.stringify(w,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${k(n)}`}}}formatContextMd(e){let t=[];if(t.push(Z("Project",Sl(wl("ID",e.projectId),wl("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(oo({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
1271
- `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(Z("Stack",yt({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),U(...t)}async loadRepoAnalysis(e){try{let t=PT.join(e,"analysis","repo-analysis.json"),s=await CT.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return I(t),null}}},Hf=new qs,xT=Hf});import yu from"node:fs";import Wf from"node:path";async function na(r){let e=await M.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-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}}async function ra(r){let e=await M.getProjectId(r);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}async function wu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await na(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await M.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],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),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await qe.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${k(a)}`)}try{let c=(await Ee.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${k(a)}`)}return await ra(e),await _t.log(e,"cleanup_performed",{items:n.length,timestamp:v()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(k(t)),{success:!1,error:k(t)}}}async function Vf(r){let e=D.getGlobalBasePath(),t=Wf.join(e,"projects");if(!yu.existsSync(t))return{success:!0,message:"No projects directory found"};let s=yu.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=Wf.join(t,a);if(!RT.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),yu.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
1272
- `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var RT,ku=S(()=>{"use strict";ve();ke();bn();ee();_s();is();H();K();Je();l(na,"cleanupMemory");l(ra,"cleanupMemoryInternal");l(wu,"cleanup");RT=[/^qa-/,/^nonexistent-/,/^test-/];l(Vf,"cleanupProjects")});import Bf from"node:path";async function Su(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await M.getProjectId(t),a=Bf.join(D.getGlobalProjectPath(i),"planning","designs");await Qe(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1274
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var oh={};we(oh,{ContextCommands:()=>Xs,contextCommands:()=>rh,default:()=>zT});import VT from"node:fs/promises";import qT from"node:path";var Xs,rh,zT,da=S(()=>{"use strict";nu();Ee();Te();Pt();H();Cn();Xs=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await _.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=j.getGlobalProjectPath(c),d=await F.read(c),p=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(v=>({id:v.id,description:v.description,status:v.status,domain:v.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,m=null;if(i)try{m=await Xi.execute(o,i,t)}catch(v){console.error(`Warning: Orchestrator failed: ${k(v)}`)}let g=await this.loadRepoAnalysis(u),w={projectId:c,globalPath:u,currentTask:p,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,subtasks:m?.subtasks?.map(v=>({id:v.id,description:v.description,domain:v.domain,agent:v.agent,status:v.status,order:v.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(w)):console.log(JSON.stringify(w,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${k(n)}`}}}formatContextMd(e){let t=[];if(t.push(te("Project",Ml($l("ID",e.projectId),$l("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(uo({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
1275
+ `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(te("Stack",kt({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),U(...t)}async loadRepoAnalysis(e){try{let t=qT.join(e,"analysis","repo-analysis.json"),s=await VT.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return I(t),null}}},rh=new Xs,zT=rh});import Iu from"node:fs";import ih from"node:path";async function ma(r){let e=await _.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-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}}async function pa(r){let e=await _.getProjectId(r);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}async function Du(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await ma(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await _.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],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),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await Xe.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${k(a)}`)}try{let c=(await ke.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${k(a)}`)}return await pa(e),await Lt.log(e,"cleanup_performed",{items:n.length,timestamp:b()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(k(t)),{success:!1,error:k(t)}}}async function ah(r){let e=j.getGlobalBasePath(),t=ih.join(e,"projects");if(!Iu.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Iu.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=ih.join(t,a);if(!JT.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),Iu.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
1276
+ `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var JT,$u=S(()=>{"use strict";Ee();Te();En();se();Ls();Kt();H();K();Ve();l(ma,"cleanupMemory");l(pa,"cleanupMemoryInternal");l(Du,"cleanup");JT=[/^qa-/,/^nonexistent-/,/^test-/];l(ah,"cleanupProjects")});import ch from"node:path";async function Mu(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await _.getProjectId(t),a=ch.join(j.getGlobalProjectPath(i),"planning","designs");await et(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1273
1277
 
1274
1278
  *Use templates/design/architecture.md for full design*
1275
1279
  `;break;case"api":c=`# API Design: ${o}
@@ -1284,14 +1288,14 @@ ${"\u2550".repeat(50)}
1284
1288
  `;break;case"flow":c=`# Flow Design: ${o}
1285
1289
 
1286
1290
  *Use templates/design/flow.md for full design*
1287
- `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Bf.join(a,u);return await bt(d,c),await _t.log(t,"design_created",{type:s,target:o,timestamp:v()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}var bu=S(()=>{"use strict";ve();ke();bn();H();K();V();Je();l(Su,"design")});var et,zf=S(()=>{"use strict";et={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var vu,kt,yo,qf=S(()=>{"use strict";ys();ee();zf();pn();bs();vu=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=ym.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(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&B.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(et.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(et.ALL);n&&t.push(...n);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 B.error("Event callback error:",s),s}}async logEvent(e){try{x.appendEvent(this.projectId,e.type,e)}catch(t){B.debug("Failed to log event:",de(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.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())}},kt=new vu,yo={sessionStarted:l(r=>kt.emit(et.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>kt.emit(et.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>kt.emit(et.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>kt.emit(et.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>kt.emit(et.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>kt.emit(et.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>kt.emit(et.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>kt.emit(et.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>kt.emit(et.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>kt.emit(et.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>kt.emit(et.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>kt.emit(et.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>kt.emit(et.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>kt.emit(et.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>kt.emit(et.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>kt.emit(et.ANALYSIS_COMPLETED,r),"analysisCompleted")}});function oa(r){let e=0,t=null;for(let s of r.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&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}function Kf(r){return vt(r*1e3)}var Jf,Xf=S(()=>{"use strict";Ut();K();Jf=Se;l(oa,"calculateDuration");l(Kf,"formatDuration")});function Yf(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}var ia,Qf=S(()=>{"use strict";qf();ve();ee();H();ze();Xf();l(Yf,"rowToSession");ia=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 M.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 Jf()}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?Yf(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(),n={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(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await yo.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}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 yo.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=oa(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await yo.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=oa(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 yo.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return oa(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await F(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await F(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1291
+ `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=ch.join(a,u);return await Tt(d,c),await Lt.log(t,"design_created",{type:s,target:o,timestamp:b()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}var _u=S(()=>{"use strict";Ee();Te();En();H();K();B();Ve();l(Mu,"design")});var st,lh=S(()=>{"use strict";st={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Ou,bt,vo,uh=S(()=>{"use strict";ks();se();lh();hn();Ts();Ou=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Mm.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(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&V.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,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(st.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(st.ALL);n&&t.push(...n);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 V.error("Event callback error:",s),s}}async logEvent(e){try{x.appendEvent(this.projectId,e.type,e)}catch(t){V.debug("Failed to log event:",pe(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.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())}},bt=new Ou,vo={sessionStarted:l(r=>bt.emit(st.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>bt.emit(st.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>bt.emit(st.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>bt.emit(st.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>bt.emit(st.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>bt.emit(st.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>bt.emit(st.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>bt.emit(st.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>bt.emit(st.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>bt.emit(st.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>bt.emit(st.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>bt.emit(st.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>bt.emit(st.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>bt.emit(st.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>bt.emit(st.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>bt.emit(st.ANALYSIS_COMPLETED,r),"analysisCompleted")}});function ga(r){let e=0,t=null;for(let s of r.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&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}function mh(r){return Et(r*1e3)}var dh,ph=S(()=>{"use strict";Nt();K();dh=Q;l(ga,"calculateDuration");l(mh,"formatDuration")});function gh(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}var fa,fh=S(()=>{"use strict";uh();Ee();se();H();Ge();ph();l(gh,"rowToSession");fa=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 dh()}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?gh(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(),n={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(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await vo.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}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 vo.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=ga(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await vo.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=ga(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 vo.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return ga(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await L(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await L(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1288
1292
  `),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){I(s)||console.error(`Metrics calculation warning: ${k(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)
1289
- 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(Yf)}async logEvent(e,t){try{x.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Kf(e)}}});import mr from"node:path";async function Tu(r=process.cwd()){try{if(!await M.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new ia(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1293
+ 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(gh)}async logEvent(e,t){try{x.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return mh(e)}}});import hr from"node:path";async function Nu(r=process.cwd()){try{if(!await _.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new fa(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1290
1294
  Found abandoned session:
1291
- `),console.log(` Task: ${n.task}`),n.startedAt){let o=ws(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1295
+ `),console.log(` Task: ${n.task}`),n.startedAt){let o=Ss(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1292
1296
  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
1293
- `),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Eu(r=process.cwd()){try{f.spin("creating undo point...");let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=mr.join(D.getGlobalProjectPath(e),"snapshots");await Qe(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=mr.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await De(c);u=JSON.parse(d)}catch(d){if(!I(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await bt(c,JSON.stringify(u,null,2)),await _t.log(r,"undo_performed",{snapshotId:a,timestamp:v()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(o)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Cu(r=process.cwd()){try{f.spin("restoring changes...");let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=mr.join(D.getGlobalProjectPath(e),"snapshots"),s=mr.join(t,"history.json"),n;try{let i=await De(s);n=JSON.parse(i)}catch(i){if(I(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1294
- `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await bt(s,JSON.stringify(n,null,2)),await _t.log(r,"redo_performed",{timestamp:v()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(i)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Pu(r=process.cwd()){try{let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=mr.join(D.getGlobalProjectPath(e),"snapshots"),s=mr.join(t,"history.json"),n;try{let o=await De(s);n=JSON.parse(o)}catch(o){if(I(o)||o instanceof SyntaxError)return console.log(`
1297
+ `),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Lu(r=process.cwd()){try{f.spin("creating undo point...");let e=await _.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=hr.join(j.getGlobalProjectPath(e),"snapshots");await et(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=hr.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await $e(c);u=JSON.parse(d)}catch(d){if(!I(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await Tt(c,JSON.stringify(u,null,2)),await Lt.log(r,"undo_performed",{snapshotId:a,timestamp:b()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(o)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Fu(r=process.cwd()){try{f.spin("restoring changes...");let e=await _.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=hr.join(j.getGlobalProjectPath(e),"snapshots"),s=hr.join(t,"history.json"),n;try{let i=await $e(s);n=JSON.parse(i)}catch(i){if(I(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1298
+ `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await Tt(s,JSON.stringify(n,null,2)),await Lt.log(r,"redo_performed",{timestamp:b()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(i)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Uu(r=process.cwd()){try{let e=await _.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=hr.join(j.getGlobalProjectPath(e),"snapshots"),s=hr.join(t,"history.json"),n;try{let o=await $e(s);n=JSON.parse(o)}catch(o){if(I(o)||o instanceof SyntaxError)return console.log(`
1295
1299
  SNAPSHOT HISTORY
1296
1300
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1297
1301
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1299,35 +1303,40 @@ ${"\u2550".repeat(50)}
1299
1303
  `),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1300
1304
  `)):(n.snapshots.forEach((o,i)=>{let a=i===n.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${n.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1301
1305
  `)),console.log(`${"=".repeat(50)}
1302
- `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var xu=S(()=>{"use strict";ve();ke();bn();Qf();H();K();V();Je();l(Tu,"recover");l(Eu,"undo");l(Cu,"redo");l(Pu,"history")});var pr,Ru=S(()=>{"use strict";po();Bt();ku();bu();xu();ku();bu();xu();pr=class extends xe{static{l(this,"MaintenanceCommands")}_cleanupMemory=na;_cleanupMemoryInternal=ra;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?wu(e,t):s}async cleanupProjects(e={}){return Vf(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Su(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Tu(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?Cu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Pu(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;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 xs(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(`
1303
- `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});import Oe from"chalk";function aa(r,e,t){return t==="below"?r<=e?Oe.green("\u2713"):Oe.yellow("\u26A0"):r>=e?Oe.green("\u2713"):Oe.yellow("\u26A0")}var Js,gr,Au=S(()=>{"use strict";ve();Yo();H();Je();Bt();Js={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(aa,"statusIcon");gr=class extends xe{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await fn.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1304
- ${Oe.dim("No performance data yet.")}`),console.log(`${Oe.dim("Metrics are collected automatically as you use the CLI.")}
1306
+ `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var Hu=S(()=>{"use strict";Ee();Te();En();fh();H();K();B();Ve();l(Nu,"recover");l(Lu,"undo");l(Fu,"redo");l(Uu,"history")});var yr,Wu=S(()=>{"use strict";wo();Ut();$u();_u();Hu();$u();_u();Hu();yr=class extends xe{static{l(this,"MaintenanceCommands")}_cleanupMemory=ma;_cleanupMemoryInternal=pa;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?Du(e,t):s}async cleanupProjects(e={}){return ah(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Mu(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Lu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Fu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Uu(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;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 As(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(`
1307
+ `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});var Gu,KT,wr,hh=S(()=>{"use strict";Kt();Xo();Gu=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await ke.getActiveTasks(e),o=t.includeBacklog?await ke.getBacklog(e):[],i=[...n,...o],c=Ko(i).filter(u=>!u.completed).slice(0,s).map(u=>({id:u.id,title:u.description,priority:u.priority,source:"queue",queueTaskId:u.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
1308
+ `)}let n=["assignee = currentUser()",'statusCategory = "To Do"'];return t.sprint?n.push("sprint in openSprints()"):t.backlog&&n.push("sprint is EMPTY"),t.labels?.length&&n.push(`labels in (${t.labels.join(", ")})`),t.priority&&n.push(`priority = "${t.priority}"`),["Use the Jira MCP tool `searchJiraIssuesUsingJql` with:",`- jql: "${`${n.join(" AND ")} ORDER BY priority DESC`}"`,`- maxResults: ${s}`,"","Return the results as a JSON array with fields: key, summary, priority, storyPoints.","I will use this to create parallel worktrees for each ticket."].join(`
1309
+ `)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,p=a[u.priority?.toLowerCase()||"none"]??4;return d-p})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
1310
+ `)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},KT=new Gu,wr=KT});var kr,$n,wU,Bu=S(()=>{"use strict";Ee();Nt();hh();Jr();Pt();H();Ve();Ut();kr=null,$n=class extends xe{static{l(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:k(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t),i=this.slugify(e),a=await Jt.create(t,i,{branch:s.branch});await Jt.setup(a.path,t);let c=Q();return await F.startTaskInWorkspace(o,{id:Q(),description:e,sessionId:Q(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:k(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Jt.create(t,a);await Jt.setup(c.path,t);let u=Q();await F.startTaskInWorkspace(n,{id:Q(),description:i,sessionId:Q(),workspaceId:u,worktreePath:c.path},u),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${k(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:k(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=wr.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=wr.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await wr.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(kr=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(wr.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!kr||kr.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of kr.items){let i=wr.slugify(o);try{let a=await Jt.create(t,i);await Jt.setup(a.path,t);let c=Q();await F.startTaskInWorkspace(e,{id:Q(),description:o.title,sessionId:Q(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:kr.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${k(a)}`)}}kr=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([F.getActiveTasks(e),Jt.list(t)]),o=await F.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
1311
+ Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(m=>m.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",p=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${p}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
1312
+ Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await F.getActiveTasks(e),n=await Jt.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Jt.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},wU=new $n});import Le from"chalk";function ha(r,e,t){return t==="below"?r<=e?Le.green("\u2713"):Le.yellow("\u26A0"):r>=e?Le.green("\u2713"):Le.yellow("\u26A0")}var Ys,Sr,Vu=S(()=>{"use strict";Ee();oi();H();Ve();Ut();Ys={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(ha,"statusIcon");Sr=class extends xe{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await wn.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1313
+ ${Le.dim("No performance data yet.")}`),console.log(`${Le.dim("Metrics are collected automatically as you use the CLI.")}
1305
1314
  `),{success:!0,message:"No data"};if(console.log(`
1306
- ${Oe.cyan("Performance Report")} ${Oe.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=aa(i.startup.avg,Js.startup.max,"below");console.log(` Startup: avg ${Oe.bold(`${i.startup.avg}ms`)} ${Oe.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Oe.dim(`target: <${Js.startup.max}ms`)}`)}if(i.memory){let c=aa(i.memory.peakHeapMB,Js.heapMB.max,"below");console.log(` Memory: avg ${Oe.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Oe.dim(`target: <${Js.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=aa(i.contextCorrectness.rate,Js.contextRate.min,"above");console.log(` Context: ${Oe.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Oe.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Oe.dim(`target: ${Js.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=aa(i.subtaskHandoff.rate,Js.handoffRate.min,"above");console.log(` Handoff: ${Oe.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Oe.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Oe.dim(`target: ${Js.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1307
- ${Oe.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Oe.bold(`${u.avg}ms`)} ${Oe.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}}});import AT from"node:fs/promises";import jT from"node:path";var eh,Zf,ju,DT,Ct,ca=S(()=>{"use strict";ke();V();eh="https://api.prjct.app",Zf={apiKey:null,apiUrl:eh,userId:null,email:null,lastAuth:null},ju=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=D.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await je(this.configPath);return this.cachedConfig=e??{...Zf},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await Qe(jT.dirname(this.configPath)),await ce(this.configPath,s),await AT.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||eh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Zf},await ce(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},DT=new ju,Ct=DT});function $T(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function MT(r){let e={};for(let[t,s]of Object.entries(r))e[$T(t)]=s;return e}function _T(r,e){let[t,s]=e.type.split("."),n=IT[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=MT(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}function th(r,e){return e.map(t=>_T(r,t)).filter(t=>t!==null)}var IT,sh=S(()=>{"use strict";IT={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l($T,"camelToSnake");l(MT,"snakeCaseKeys");l(_T,"mapCliEventToWebFormat");l(th,"mapCliEventsToWebFormat")});var Du,fr,Iu=S(()=>{"use strict";pn();ca();sh();Du=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=th(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Wn("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Ct.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Ct.getApiUrl(),Ct.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),Wn("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Wn("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},fr=new Du});var $u,OT,nh,rh=S(()=>{"use strict";Za();_s();is();un();xt();ca();Iu();$u=class{static{l(this,"SyncManager")}async hasAuth(){return await Ct.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await fr.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Ms.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await fr.pushEvents(e,n);if(o.success)return await Ms.clearPending(e),await Ms.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await Ms.getLastSync(e))?.timestamp,n=await fr.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await Ms.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await L.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await L.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await Ee.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await qe.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await qe.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await lt.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await Ee.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},OT=new $u,nh=OT});import NT from"node:fs/promises";import LT from"node:http";import FT from"node:path";import re from"chalk";var hr,Mu=S(()=>{"use strict";Es();ve();ke();er();ca();Iu();rh();H();ze();V();uo();Je();nt();Bt();hr=class extends xe{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await Ct.write({apiKey:o,...i?{apiUrl:i}:{}}),await fr.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(re.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1315
+ ${Le.cyan("Performance Report")} ${Le.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ha(i.startup.avg,Ys.startup.max,"below");console.log(` Startup: avg ${Le.bold(`${i.startup.avg}ms`)} ${Le.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Le.dim(`target: <${Ys.startup.max}ms`)}`)}if(i.memory){let c=ha(i.memory.peakHeapMB,Ys.heapMB.max,"below");console.log(` Memory: avg ${Le.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Le.dim(`target: <${Ys.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ha(i.contextCorrectness.rate,Ys.contextRate.min,"above");console.log(` Context: ${Le.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Le.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Le.dim(`target: ${Ys.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ha(i.subtaskHandoff.rate,Ys.handoffRate.min,"above");console.log(` Handoff: ${Le.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Le.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Le.dim(`target: ${Ys.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1316
+ ${Le.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Le.bold(`${u.avg}ms`)} ${Le.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}}});import XT from"node:fs/promises";import YT from"node:path";var wh,yh,qu,QT,Rt,ya=S(()=>{"use strict";Te();B();wh="https://api.prjct.app",yh={apiKey:null,apiUrl:wh,userId:null,email:null,lastAuth:null},qu=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=j.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await De(this.configPath);return this.cachedConfig=e??{...yh},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await et(YT.dirname(this.configPath)),await le(this.configPath,s),await XT.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||wh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...yh},await le(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},QT=new qu,Rt=QT});function eE(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function tE(r){let e={};for(let[t,s]of Object.entries(r))e[eE(t)]=s;return e}function sE(r,e){let[t,s]=e.type.split("."),n=ZT[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=tE(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}function kh(r,e){return e.map(t=>sE(r,t)).filter(t=>t!==null)}var ZT,Sh=S(()=>{"use strict";ZT={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l(eE,"camelToSnake");l(tE,"snakeCaseKeys");l(sE,"mapCliEventToWebFormat");l(kh,"mapCliEventsToWebFormat")});var zu,br,Ju=S(()=>{"use strict";hn();ya();Sh();zu=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=kh(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),zn("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Rt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Rt.getApiUrl(),Rt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),zn("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${zn("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},br=new zu});var Ku,nE,bh,vh=S(()=>{"use strict";gc();Ls();Kt();pn();Pt();ya();Ju();Ku=class{static{l(this,"SyncManager")}async hasAuth(){return await Rt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await br.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Ns.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await br.pushEvents(e,n);if(o.success)return await Ns.clearPending(e),await Ns.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await Ns.getLastSync(e))?.timestamp,n=await br.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await Ns.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await F.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await F.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await ke.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Xe.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Xe.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await dt.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await ke.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},nE=new Ku,bh=nE});import rE from"node:fs/promises";import oE from"node:http";import iE from"node:path";import ie from"chalk";var vr,Xu=S(()=>{"use strict";Ps();Ee();Te();rr();ya();Ju();vh();H();Ge();B();ho();Ve();ot();Ut();vr=class extends xe{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await Rt.write({apiKey:o,...i?{apiUrl:i}:{}}),await br.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ie.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1308
1317
  - **Status**: Connected
1309
1318
  - **Key**: \`${o.substring(0,12)}...\`
1310
- - **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(re.dim(`Key: ${o.substring(0,12)}...`)),f.info(re.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
1319
+ - **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(ie.dim(`Key: ${o.substring(0,12)}...`)),f.info(ie.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
1311
1320
  - **Status**: Key saved (server unreachable)
1312
- - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await Ct.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1313
- - **Status**: Logged out`:""};default:{let o=await Ct.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1321
+ - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await Rt.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1322
+ - **Status**: Logged out`:""};default:{let o=await Rt.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1314
1323
  - **Authenticated**: Yes
1315
1324
  - **Email**: ${o.email||"N/A"}
1316
1325
  - **Key**: \`${o.apiKeyPrefix}\`
1317
1326
  - **Last auth**: ${o.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(o.authenticated?f.box("Auth Status",`Email: ${o.email||"N/A"}
1318
1327
  Key: ${o.apiKeyPrefix}
1319
- Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${re.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await Ct.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
1320
- Key: ${t.apiKeyPrefix}`),f.info(`Run ${re.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1328
+ Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${ie.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await Rt.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
1329
+ Key: ${t.apiKeyPrefix}`),f.info(`Run ${ie.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1321
1330
  - **Email**: ${t.email}
1322
1331
  - **Key**: \`${t.apiKeyPrefix}\`
1323
1332
 
1324
- Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=LT.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(u){await Ct.saveAuth(u,p||"",d||"");let m=`${s}/api`;await Ct.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
1333
+ Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=oE.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(u){await Rt.saveAuth(u,p||"",d||"");let m=`${s}/api`;await Rt.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
1325
1334
  Key: ${u.substring(0,12)}...
1326
1335
  Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
1327
1336
  - **Email**: ${d}
1328
1337
  - **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
1329
1338
  Authentication failed: no API key received`:""}));return}a.writeHead(404),a.end("Not found")});o.listen(0,"127.0.0.1",async()=>{let i=o.address();if(!i||typeof i=="string"){o.close(),e.md||f.fail("Failed to start callback server"),n({success:!1,message:e.md?`## Error
1330
- Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(re.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await F(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${re.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await Ct.getStatus()).authenticated?(await Ct.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await M.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await nh.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
1339
+ Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(ie.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await L(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${ie.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await Rt.getStatus()).authenticated?(await Rt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await _.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await bh.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
1331
1340
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
1332
1341
  <title>prjct CLI Connected</title>
1333
1342
  <style>
@@ -1382,31 +1391,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
1382
1391
  <h1>Authentication Failed</h1>
1383
1392
  <div class="msg">${e}</div>
1384
1393
  <p class="hint">Return to your terminal and try again.</p>
1385
- </div></body></html>`}async start(){let e=await Me.checkInstallation(),t=(st(),St(It)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1394
+ </div></body></html>`}async start(){let e=await Oe.checkInstallation(),t=(rt(),vt(Mt)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1386
1395
  `),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1387
1396
 
1388
1397
  Please install one first:
1389
1398
  - Claude Code: https://docs.anthropic.com/claude-code
1390
1399
  - Gemini CLI: https://geminicli.com/docs
1391
- - OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Me.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1400
+ - OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Oe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1392
1401
  \u2705 Installed ${a.installed?.length??0} commands to:
1393
- ${D.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1394
- \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(()=>(sr(),ki));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): ${k(a)}`)}return await this.setupMcpServers(),console.log(`
1402
+ ${j.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1403
+ \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(()=>(ir(),xi));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): ${k(a)}`)}return await this.setupMcpServers(),console.log(`
1395
1404
  \u{1F389} Setup complete!`),console.log(`
1396
1405
  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...
1397
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Me.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Me.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1406
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Oe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Oe.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1398
1407
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1399
1408
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1400
- \u{1F4DD} Installing global configuration...`);let s=await Me.installGlobalConfig(),n=s.path?D.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(st(),St(It)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1401
- \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(()=>(sr(),ki));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): ${k(c)}`)}return await this.setupMcpServers(),console.log(`
1409
+ \u{1F4DD} Installing global configuration...`);let s=await Oe.installGlobalConfig(),n=s.path?j.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(rt(),vt(Mt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1410
+ \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(()=>(ir(),xi));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): ${k(c)}`)}return await this.setupMcpServers(),console.log(`
1402
1411
  \u{1F389} Setup complete!
1403
1412
  `),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
1404
- \u{1F50C} Configuring MCP servers...`);try{await Yt.install();let e=await Yt.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: ${k(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=cs();await Vs("linear",e)?console.log("\u2705 Linear MCP already configured"):(await xl("linear",$i.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: ${k(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=cs();await Vs("jira",e)?console.log("\u2705 Jira MCP already configured"):(await xl("jira",$i.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: ${k(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=D.getClaudeDir(),t=D.getClaudeSettingsPath(),s=FT.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1413
+ \u{1F50C} Configuring MCP servers...`);try{await Zt.install();let e=await Zt.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: ${k(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=us();await zs("linear",e)?console.log("\u2705 Linear MCP already configured"):(await Hl("linear",Wi.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: ${k(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=us();await zs("jira",e)?console.log("\u2705 Jira MCP already configured"):(await Hl("jira",Wi.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: ${k(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=j.getClaudeDir(),t=j.getClaudeSettingsPath(),s=iE.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1405
1414
  # prjct Status Line for Claude Code
1406
1415
  # Shows version update notifications and current task
1407
1416
 
1408
1417
  # Current CLI version (embedded at install time)
1409
- CLI_VERSION="${me}"
1418
+ CLI_VERSION="${ge}"
1410
1419
 
1411
1420
  # Read JSON context from stdin (provided by Claude Code)
1412
1421
  read -r json
@@ -1457,14 +1466,14 @@ fi
1457
1466
 
1458
1467
  # Default: show prjct branding
1459
1468
  echo "\u26A1 prjct"
1460
- `;await NT.writeFile(s,n,{mode:493});let o={};if(await E(t))try{o=await je(t)??{}}catch{}return o.statusLine={type:"command",command:s},await ce(t,o),{success:!0}}catch(e){return{success:!1,error:k(e)}}}showAsciiArt(){console.log(re.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(re.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(re.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(re.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(re.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(re.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(re.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(` ${re.bold.cyan("prjct")}${re.magenta("/")}${re.green("cli")} ${re.dim.white(`v${me} installed`)}`),console.log(""),console.log(` ${re.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${re.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${re.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(re.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(re.bold.cyan("\u{1F680} Quick Start")),console.log(re.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(` ${re.bold("1.")} Initialize your project:`),console.log(` ${re.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${re.bold("2.")} Start your first task:`),console.log(` ${re.green('prjct task "build auth"')}`),console.log(""),console.log(` ${re.bold("3.")} Ship & celebrate:`),console.log(` ${re.green('prjct ship "user login"')}`),console.log(""),console.log(re.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(` ${re.dim("Documentation:")} ${re.cyan("https://prjct.app")}`),console.log(` ${re.dim("Report issues:")} ${re.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(re.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import oh from"node:path";var UT,HT,la,ih=S(()=>{"use strict";K();V();UT=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],HT=`# Changelog
1469
+ `;await rE.writeFile(s,n,{mode:493});let o={};if(await E(t))try{o=await De(t)??{}}catch{}return o.statusLine={type:"command",command:s},await le(t,o),{success:!0}}catch(e){return{success:!1,error:k(e)}}}showAsciiArt(){console.log(ie.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ie.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ie.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ie.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ie.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ie.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ie.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ie.bold.cyan("prjct")}${ie.magenta("/")}${ie.green("cli")} ${ie.dim.white(`v${ge} installed`)}`),console.log(""),console.log(` ${ie.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ie.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ie.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ie.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ie.bold.cyan("\u{1F680} Quick Start")),console.log(ie.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ie.bold("1.")} Initialize your project:`),console.log(` ${ie.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ie.bold("2.")} Start your first task:`),console.log(` ${ie.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ie.bold("3.")} Ship & celebrate:`),console.log(` ${ie.green('prjct ship "user login"')}`),console.log(""),console.log(ie.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ie.dim("Documentation:")} ${ie.cyan("https://prjct.app")}`),console.log(` ${ie.dim("Report issues:")} ${ie.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ie.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import Th from"node:path";var aE,cE,wa,Eh=S(()=>{"use strict";K();B();aE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],cE=`# Changelog
1461
1470
 
1462
1471
  All notable changes to this project will be documented in this file.
1463
1472
 
1464
1473
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
1465
1474
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1466
- `,la=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of UT){let n=oh.join(this.projectPath,s);if(await E(n)){let o=await De(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=oh.join(this.projectPath,e);return await bt(t,`${HT}
1467
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await De(t.filePath),n=e.date||Md(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await bt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
1475
+ `,wa=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of aE){let n=Th.join(this.projectPath,s);if(await E(n)){let o=await $e(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=Th.join(this.projectPath,e);return await Tt(t,`${cE}
1476
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await $e(t.filePath),n=e.date||Yd(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Tt(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 n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
1468
1477
  ${a}`}return`${e.trimEnd()}
1469
1478
 
1470
1479
  ${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
@@ -1474,31 +1483,31 @@ ${a}`}return`${n}
1474
1483
 
1475
1484
  ${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);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(`
1476
1485
  `)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
1477
- `)}}});import yr from"node:path";function ah(r){return/^\d+\.\d+\.\d+/.test(r)}function wr(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function GT(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function WT(r){let e=r.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=r.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}function VT(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var ua,ch=S(()=>{"use strict";ze();V();ua=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=yr.join(this.projectPath,"package.json"),t=await je(e,null);return t?.version?{current:t.version,next:wr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=yr.join(this.projectPath,"Cargo.toml"),t=await De(e,"");if(!t)return null;let s=GT(t);return s?{current:s,next:wr(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=yr.join(this.projectPath,"pyproject.toml"),t=await De(e,"");if(!t)return null;let s=WT(t);return s?{current:s,next:wr(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await fs(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=yr.join(this.projectPath,e[0]),s=await De(t,"");if(!s)return null;let n=VT(s);return n?{current:n,next:wr(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=yr.join(this.projectPath,e),s=await De(t,"");if(!s)return null;let n=s.trim();return ah(n)?{current:n,next:wr(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await F("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1478
- `);for(let s of t){let n=s.trim().replace(/^v/,"");if(ah(n))return{current:n,next:wr(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=yr.join(this.projectPath,"VERSION");return await bt(e,`0.1.0
1479
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await sn("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await bt(e.file,`${e.next}
1480
- `);break}}async writeJsonVersion(e,t){let s=await je(e,{});s&&(s.version=t,await ce(e,s))}async writeTomlVersion(e,t){let s=await De(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await bt(e,n)}async writeXmlVersion(e,t){let s=await De(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await bt(e,n)}};l(ah,"isSemver");l(wr,"bumpPatch");l(GT,"parseTomlVersion");l(WT,"parsePyprojectVersion");l(VT,"parseCsprojVersion")});import Lt from"chalk";async function ns(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=_e.getRulesForCommand(r,e).filter(p=>p.position===t),a=i.filter(p=>p.type==="gate");for(let p of a){let m=p.description||p.action;console.log(`
1481
- ${Lt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let w=Date.now()-g,b=w>1e3?`${(w/1e3).toFixed(1)}s`:`${w}ms`;console.log(`${Lt.green("\u2713")} ${Lt.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${Lt.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
1486
+ `)}}});import Tr from"node:path";function Ch(r){return/^\d+\.\d+\.\d+/.test(r)}function Er(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function lE(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function uE(r){let e=r.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=r.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}function dE(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var ka,Ph=S(()=>{"use strict";Ge();B();ka=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=Tr.join(this.projectPath,"package.json"),t=await De(e,null);return t?.version?{current:t.version,next:Er(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Tr.join(this.projectPath,"Cargo.toml"),t=await $e(e,"");if(!t)return null;let s=lE(t);return s?{current:s,next:Er(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Tr.join(this.projectPath,"pyproject.toml"),t=await $e(e,"");if(!t)return null;let s=uE(t);return s?{current:s,next:Er(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await ys(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Tr.join(this.projectPath,e[0]),s=await $e(t,"");if(!s)return null;let n=dE(s);return n?{current:n,next:Er(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Tr.join(this.projectPath,e),s=await $e(t,"");if(!s)return null;let n=s.trim();return Ch(n)?{current:n,next:Er(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await L("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1487
+ `);for(let s of t){let n=s.trim().replace(/^v/,"");if(Ch(n))return{current:n,next:Er(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Tr.join(this.projectPath,"VERSION");return await Tt(e,`0.1.0
1488
+ `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await on("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 Tt(e.file,`${e.next}
1489
+ `);break}}async writeJsonVersion(e,t){let s=await De(e,{});s&&(s.version=t,await le(e,s))}async writeTomlVersion(e,t){let s=await $e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Tt(e,n)}async writeXmlVersion(e,t){let s=await $e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Tt(e,n)}};l(Ch,"isSemver");l(Er,"bumpPatch");l(lE,"parseTomlVersion");l(uE,"parsePyprojectVersion");l(dE,"parseCsprojVersion")});import Ht from"chalk";async function os(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=Ne.getRulesForCommand(r,e).filter(p=>p.position===t),a=i.filter(p=>p.type==="gate");for(let p of a){let m=p.description||p.action;console.log(`
1490
+ ${Ht.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await L(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let w=Date.now()-g,v=w>1e3?`${(w/1e3).toFixed(1)}s`:`${w}ms`;console.log(`${Ht.green("\u2713")} ${Ht.dim(`gate passed (${v})`)}`)}catch(g){return console.log(`${Ht.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
1482
1491
  ${k(g)}
1483
1492
  `,n}}let c=i.filter(p=>p.type==="instruction");for(let p of c){let m=p.description||p.action;console.log(`
1484
- ${Lt.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let u=i.filter(p=>p.type==="hook");for(let p of u){console.log(`
1485
- ${Lt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Lt.green("\u2713")} ${Lt.dim(`(${w})`)}`)}catch(m){console.log(`${Lt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
1493
+ ${Ht.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let u=i.filter(p=>p.type==="hook");for(let p of u){console.log(`
1494
+ ${Ht.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await L(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Ht.green("\u2713")} ${Ht.dim(`(${w})`)}`)}catch(m){console.log(`${Ht.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
1486
1495
  ${k(m)}
1487
1496
  `}}let d=i.filter(p=>p.type==="step");for(let p of d){console.log(`
1488
- ${Lt.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Lt.green("\u2713")} ${Lt.dim(`step passed (${w})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${Lt.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
1497
+ ${Ht.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await L(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Ht.green("\u2713")} ${Ht.dim(`step passed (${w})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${Ht.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
1489
1498
  ${k(m)}
1490
- `,n}}return n}var _u=S(()=>{"use strict";Ki();H();ze();l(ns,"executeWorkflowRules")});var kr,Ou=S(()=>{"use strict";oi();ve();ih();Ri();ch();un();xt();H();K();ze();vn();nr();Je();_u();Bt();kr=class extends xe{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await L.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await L.completeTask(o)),i||(i="current work");let c=await ns(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||f.step(1,4,"Bumping version...");let d=await new ua(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new la(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let h=await this._gitPush(t);g=h.success?"pushed":h.message}await lt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:v()}),await ft.learnDecision(o,"commit_footer","prjct","ship"),await ft.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let w=await ns(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),b=[...c.instructions,...w.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Ps.sync(t),s.md||f.done("\u2713 AI context updated")}catch(h){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",k(h))}if(s.md){let h=Ai("ship",!0),P=U(Te(`Shipped: ${i}`,`Version: ${d}`),Z("Results",Ge([`Version: ${d}`,`Commit: ${m.success?"created":m.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),b.length>0?Z("Agent Instructions",Ge(b)):null,fe(h.map(T=>({label:T.desc,command:T.cmd}))));console.log(P)}else f.done(`v${d} shipped`),Nt("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async _createShipCommit(e,t){try{await F("git add .");let s=`feat: ${e}
1499
+ `,n}}return n}var Yu=S(()=>{"use strict";ra();H();Ge();l(os,"executeWorkflowRules")});var Cr,Qu=S(()=>{"use strict";pi();Ee();Eh();Oi();Ph();pn();Pt();H();K();Ge();Cn();ar();Ve();Yu();Ut();Cr=class extends xe{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.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 os(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||f.step(1,4,"Bumping version...");let d=await new ka(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new wa(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let h=await this._gitPush(t);g=h.success?"pushed":h.message}await dt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:b()}),await yt.learnDecision(o,"commit_footer","prjct","ship"),await yt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let w=await os(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),v=[...c.instructions,...w.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Rs.sync(t),s.md||f.done("\u2713 AI context updated")}catch(h){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",k(h))}if(s.md){let h=Li("ship",!0),P=U(Pe(`Shipped: ${i}`,`Version: ${d}`),te("Results",ze([`Version: ${d}`,`Commit: ${m.success?"created":m.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),v.length>0?te("Agent Instructions",ze(v)):null,ye(h.map(T=>({label:T.desc,command:T.cmd}))));console.log(P)}else f.done(`v${d} shipped`),Ft("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async _createShipCommit(e,t){try{await L("git add .");let s=`feat: ${e}
1491
1500
 
1492
- Generated with [p/](https://www.prjct.app/)`;return await sn("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return I(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await F("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return I(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import{execSync as ko}from"node:child_process";import da from"node:fs/promises";import wo from"node:path";import Sr from"chalk";function lh(){try{return!!ko("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function uh(){try{let e=ko("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}}var br,Nu=S(()=>{"use strict";Es();Fo();ke();tu();el();H();Je();nt();Bt();l(lh,"isHomebrewInstall");l(uh,"getCurrentVersion");br=class extends xe{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await Vr.updateVersion(me)}catch{}try{await new Vi().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(k(i)),{success:!1,error:k(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=uh();if(e)return lh()?(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(lh()){try{ko("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}ko("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else ko("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=uh();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(n){t.success=!1,t.errors.push(k(n))}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 n=0,o=0;for(let i of s)if(!e)try{let a=await bi(i),c=await vi(i);if(n+=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)}: ${k(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Ts().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${k(n)}`)}try{let o=await new Ts().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${k(n)}`)}try{await new Ts().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${k(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(st(),It)),o=await n(),i=wo.join(jt("node:os").homedir());if(o.gemini.installed){let a=wo.join(i,".gemini","GEMINI.md");try{let c=await da.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=wo.join(wo.dirname(jt.resolve("../../package.json")),"templates","global","GEMINI.md"),m=await da.readFile(p,"utf-8"),g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),w=c.substring(0,c.indexOf(u)),b=c.substring(c.indexOf(d)+d.length),h=w+g+b,P="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",T="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(h.includes(P)&&h.includes(T)){let $=h.substring(0,h.indexOf(P)),j=h.substring(h.indexOf(T)+T.length);h=`${($+j).replace(/\n{3,}/g,`
1501
+ Generated with [p/](https://www.prjct.app/)`;return await on("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return I(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await L("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return I(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import{execSync as Eo}from"node:child_process";import Sa from"node:fs/promises";import To from"node:path";import Pr from"chalk";function xh(){try{return!!Eo("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function Rh(){try{let e=Eo("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}}var xr,Zu=S(()=>{"use strict";Ps();Vo();Te();fu();fl();H();Ve();ot();Ut();l(xh,"isHomebrewInstall");l(Rh,"getCurrentVersion");xr=class extends xe{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await Kr.updateVersion(ge)}catch{}try{await new Zi().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(k(i)),{success:!1,error:k(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=Rh();if(e)return xh()?(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(xh()){try{Eo("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Eo("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Eo("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(n){t.success=!1,t.errors.push(k(n))}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 n=0,o=0;for(let i of s)if(!e)try{let a=await Ai(i),c=await ji(i);if(n+=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)}: ${k(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Cs().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${k(n)}`)}try{let o=await new Cs().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${k(n)}`)}try{await new Cs().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${k(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(rt(),Mt)),o=await n(),i=To.join(Dt("node:os").homedir());if(o.gemini.installed){let a=To.join(i,".gemini","GEMINI.md");try{let c=await Sa.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=To.join(To.dirname(Dt.resolve("../../package.json")),"templates","global","GEMINI.md"),m=await Sa.readFile(p,"utf-8"),g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),w=c.substring(0,c.indexOf(u)),v=c.substring(c.indexOf(d)+d.length),h=w+g+v,P="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",T="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(h.includes(P)&&h.includes(T)){let $=h.substring(0,h.indexOf(P)),M=h.substring(h.indexOf(T)+T.length);h=`${($+M).replace(/\n{3,}/g,`
1493
1502
 
1494
1503
  `).trim()}
1495
- `}await da.writeFile(a,h,"utf-8"),t.details.push("Gemini global config updated")}}catch{}}}catch{}}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:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(ps(),ms));await s()?(await n()||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(k(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...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?Sr.green("\u2713"):c?Sr.red("\u2717"):Sr.yellow("\u26A0");console.log(` ${u} ${Sr.bold(i)}`);for(let d of a.details)console.log(` ${Sr.dim(d)}`);for(let d of a.errors)console.log(` ${Sr.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.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,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.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?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1496
- `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=wo.join(D.getGlobalBasePath(),"projects");try{return(await da.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Ne from"chalk";var vr,Lu=S(()=>{"use strict";Dl();ve();Zr();sl();H();Je();ir();Bt();vr=class extends xe{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await Rt.getAll(n);if(i.length===0)return console.log(`
1497
- ${Ne.dim("No velocity data yet.")}`),console.log(`${Ne.dim("Complete tasks with estimates to build velocity history.")}
1498
- `),{success:!0,message:"No data"};let a=Mi(i,o);await Ti.saveMetrics(n,a),console.log(`
1499
- ${Ne.cyan("Sprint Velocity")} ${Ne.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let p of c){let m=p.estimationAccuracy>=80?Ne.green:p.estimationAccuracy>=60?Ne.yellow:Ne.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${Ne.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ne.green("\u2191"):a.velocityTrend==="declining"?Ne.red("\u2193"):Ne.dim("\u2192");if(console.log(` Average: ${Ne.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ne.bold(`${a.estimationAccuracy}%`)} ${Ne.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1500
- ${Ne.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${Ne.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${Ne.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${Ne.green("\u2713")} ${p.category} tasks estimated within ${Ne.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=zg(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1501
- ${Ne.dim("Projection:")}`),console.log(` Backlog: ${Ne.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ne.bold(m)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async loadVelocityConfig(e){try{let s=await M.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...Ws,...s.velocity}}catch{}return Ws}}});var mh,jn,dh,ph,gh,BT,Fu=S(()=>{"use strict";Yr();K();ir();mh=l(r=>jc.includes(r),"isValidPoint"),jn=l(r=>Dc[r],"pointsToMinutes"),dh=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),ph=l(r=>{let e=jn(r);return`${dh(e.min)}\u2013${dh(e.max)}`},"pointsToTimeRange"),gh=l(async(r,e)=>{let s=(await Rt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+$t(c.actualDuration),0)/s.length;return{points:BT(o),basedOn:s.length}},"suggestFromHistory"),BT=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of jc){let n=Math.abs(Dc[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import Uu from"node:fs/promises";import zT from"node:os";import ma from"node:path";var Hu,Gu,fh=S(()=>{"use strict";H();V();Hu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=ma.join(zT.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Uu.mkdir(this.commandsPath,{recursive:!0});let s=ma.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await Uu.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=ma.join(this.commandsPath,`${e}.md`);return await Uu.unlink(t),{success:!0}}catch(t){return I(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=ma.join(this.commandsPath,`${e}.md`);return E(t)}buildTemplateContent(e,t){return`---
1504
+ `}await Sa.writeFile(a,h,"utf-8"),t.details.push("Gemini global config updated")}}catch{}}}catch{}}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:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(fs(),gs));await s()?(await n()||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(k(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...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?Pr.green("\u2713"):c?Pr.red("\u2717"):Pr.yellow("\u26A0");console.log(` ${u} ${Pr.bold(i)}`);for(let d of a.details)console.log(` ${Pr.dim(d)}`);for(let d of a.errors)console.log(` ${Pr.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.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,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.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?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1505
+ `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=To.join(j.getGlobalBasePath(),"projects");try{return(await Sa.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Fe from"chalk";var Rr,ed=S(()=>{"use strict";Vl();Ee();ro();yl();H();Ve();ur();Ut();Rr=class extends xe{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await jt.getAll(n);if(i.length===0)return console.log(`
1506
+ ${Fe.dim("No velocity data yet.")}`),console.log(`${Fe.dim("Complete tasks with estimates to build velocity history.")}
1507
+ `),{success:!0,message:"No data"};let a=Gi(i,o);await Ii.saveMetrics(n,a),console.log(`
1508
+ ${Fe.cyan("Sprint Velocity")} ${Fe.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let p of c){let m=p.estimationAccuracy>=80?Fe.green:p.estimationAccuracy>=60?Fe.yellow:Fe.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${Fe.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Fe.green("\u2191"):a.velocityTrend==="declining"?Fe.red("\u2193"):Fe.dim("\u2192");if(console.log(` Average: ${Fe.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Fe.bold(`${a.estimationAccuracy}%`)} ${Fe.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1509
+ ${Fe.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${Fe.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${Fe.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${Fe.green("\u2713")} ${p.category} tasks estimated within ${Fe.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=uf(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1510
+ ${Fe.dim("Projection:")}`),console.log(` Backlog: ${Fe.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Fe.bold(m)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async loadVelocityConfig(e){try{let s=await _.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...qs,...s.velocity}}catch{}return qs}}});var jh,Mn,Ah,Ih,Dh,mE,td=S(()=>{"use strict";so();K();ur();jh=l(r=>Vc.includes(r),"isValidPoint"),Mn=l(r=>qc[r],"pointsToMinutes"),Ah=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Ih=l(r=>{let e=Mn(r);return`${Ah(e.min)}\u2013${Ah(e.max)}`},"pointsToTimeRange"),Dh=l(async(r,e)=>{let s=(await jt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+_t(c.actualDuration),0)/s.length;return{points:mE(o),basedOn:s.length}},"suggestFromHistory"),mE=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Vc){let n=Math.abs(qc[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import sd from"node:fs/promises";import pE from"node:os";import ba from"node:path";var nd,rd,$h=S(()=>{"use strict";H();B();nd=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=ba.join(pE.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await sd.mkdir(this.commandsPath,{recursive:!0});let s=ba.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await sd.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=ba.join(this.commandsPath,`${e}.md`);return await sd.unlink(t),{success:!0}}catch(t){return I(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=ba.join(this.commandsPath,`${e}.md`);return E(t)}buildTemplateContent(e,t){return`---
1502
1511
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1503
1512
  ---
1504
1513
 
@@ -1534,61 +1543,61 @@ Suggest relevant actions based on the workflow results:
1534
1543
  - View rules: \`prjct workflow ${e} --md\`
1535
1544
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1536
1545
  - Run again: \`p. ${e}\`
1537
- `}},Gu=new Hu});function qT(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function JT(r,e){let t=lr.detectTaskType(e),s=await gh(r,t);if(s){let a=jn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=lr.estimateComplexity(e),o=qT(n.level),i=jn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var Wu,hh=S(()=>{"use strict";Fu();iu();l(qT,"complexityToPoints");l(JT,"estimateTaskForStart");Wu=JT});async function pa(r){try{let{stdout:e}=await F("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function yh(r,e=20){try{let{stdout:t}=await F("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
1538
- `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var Vu=S(()=>{"use strict";ze();l(pa,"getGitBranch");l(yh,"getModifiedFiles")});var Tr,KT,Bu,Ks,wh=S(()=>{"use strict";ke();ee();K();Vu();Tr="session-snapshot",KT=30,Bu=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await pa(t),o=await yh(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:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:v(),resumeHint:c};return x.setDoc(e,Tr,u),u}getSnapshot(e){try{return x.getDoc(e,Tr)}catch{return null}}clearSnapshot(e){try{x.deleteDoc(e,Tr)}catch{}}async listAllSnapshots(){let e=await D.listProjects(),t=[];for(let s of e)try{if(!x.exists(s))continue;let n=x.getDoc(s,Tr);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=KT){let t=await D.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!x.exists(o))continue;let i=x.getDoc(o,Tr);i&&new Date(i.timestamp).getTime()<s&&(x.deleteDoc(o,Tr),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${vt(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 n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${vt(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1539
- `)}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 ${vt(t*1e3)} of work`),s.join(" ")}},Ks=new Bu});var zu,So,kh=S(()=>{"use strict";ee();zu=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){x.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1546
+ `}},rd=new nd});function gE(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function fE(r,e){let t=pr.detectTaskType(e),s=await Dh(r,t);if(s){let a=Mn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=pr.estimateComplexity(e),o=gE(n.level),i=Mn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var od,Mh=S(()=>{"use strict";td();Su();l(gE,"complexityToPoints");l(fE,"estimateTaskForStart");od=fE});async function va(r){try{let{stdout:e}=await L("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function _h(r,e=20){try{let{stdout:t}=await L("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
1547
+ `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var id=S(()=>{"use strict";Ge();l(va,"getGitBranch");l(_h,"getModifiedFiles")});var Ar,hE,ad,Qs,Oh=S(()=>{"use strict";Te();se();K();id();Ar="session-snapshot",hE=30,ad=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await va(t),o=await _h(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:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return x.setDoc(e,Ar,u),u}getSnapshot(e){try{return x.getDoc(e,Ar)}catch{return null}}clearSnapshot(e){try{x.deleteDoc(e,Ar)}catch{}}async listAllSnapshots(){let e=await j.listProjects(),t=[];for(let s of e)try{if(!x.exists(s))continue;let n=x.getDoc(s,Ar);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=hE){let t=await j.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!x.exists(o))continue;let i=x.getDoc(o,Ar);i&&new Date(i.timestamp).getTime()<s&&(x.deleteDoc(o,Ar),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${Et(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 n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${Et(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1548
+ `)}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 ${Et(t*1e3)} of work`),s.join(" ")}},Qs=new ad});var cd,Co,Nh=S(()=>{"use strict";se();cd=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){x.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1540
1549
  VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=x.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!n)return;let o=new Set(JSON.parse(n.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
1541
1550
  SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
1542
1551
  WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.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 n=x.query(e,`SELECT * FROM context_feedback
1543
1552
  WHERE actual_files IS NOT NULL
1544
- ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(h=>d.has(h)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let w=new Set(JSON.parse(c.suggested_files)),b=new Set(JSON.parse(c.actual_files));for(let h of b){let P=i.get(h)??0;i.set(h,P+g)}for(let h of w)if(!b.has(h)){let P=i.get(h)??0;i.set(h,P-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}},So=new zu});import ga from"node:fs/promises";import Sh from"node:path";function XT(){return{version:Er,lastUpdated:"",checksums:{}}}var Er,qu,bh,vh=S(()=>{"use strict";ke();H();K();wn();ee();Er="1.0.0";l(XT,"getDefaultChecksums");qu=class{static{l(this,"IndexStorage")}getIndexPath(e){return Sh.join(D.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await ga.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Er?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 XT()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await ga.readFile(e);return xm(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))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:Er,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 ga.readdir(t);await Promise.all(s.map(n=>ga.unlink(Sh.join(t,n))))}catch(s){if(!I(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!==Er?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Er)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!==Er?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),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=x.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=x.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},bh=new qu});function Th(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.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&&n.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(p=>p.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)}function Eh(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=bh.readDomainsSync(e);if(n?.domains)for(let o of n.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"]}function Ju(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=Th(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1553
+ ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(h=>d.has(h)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let w=new Set(JSON.parse(c.suggested_files)),v=new Set(JSON.parse(c.actual_files));for(let h of v){let P=i.get(h)??0;i.set(h,P+g)}for(let h of w)if(!v.has(h)){let P=i.get(h)??0;i.set(h,P-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}},Co=new cd});import Ta from"node:fs/promises";import Lh from"node:path";function yE(){return{version:jr,lastUpdated:"",checksums:{}}}var jr,ld,Fh,Uh=S(()=>{"use strict";Te();H();K();bn();se();jr="1.0.0";l(yE,"getDefaultChecksums");ld=class{static{l(this,"IndexStorage")}getIndexPath(e){return Lh.join(j.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Ta.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==jr?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 yE()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Ta.readFile(e);return Bm(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))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:jr,lastUpdated:b(),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 Ta.readdir(t);await Promise.all(s.map(n=>Ta.unlink(Lh.join(t,n))))}catch(s){if(!I(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!==jr?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===jr)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!==jr?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),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=x.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=x.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Fh=new ld});function Hh(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.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&&n.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(p=>p.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)}function Wh(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=Fh.readDomainsSync(e);if(n?.domains)for(let o of n.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"]}function ud(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=Hh(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1545
1554
 
1546
- ${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),m;if(Array.isArray(s))for(let w=0;w<s.length;w++){if(o.has(w))continue;let b=`${s[w].issue} ${s[w].suggestion}`.toLowerCase();if(p.some(h=>b.includes(h))){m=s[w],o.add(w);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
1555
+ ${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),m;if(Array.isArray(s))for(let w=0;w<s.length;w++){if(o.has(w))continue;let v=`${s[w].issue} ${s[w].suggestion}`.toLowerCase();if(p.some(h=>v.includes(h))){m=s[w],o.add(w);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
1547
1556
  `)}).join(`
1548
1557
 
1549
- `)}`}function Ku(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
1550
- `)}var Xu=S(()=>{"use strict";vh();l(Th,"rankPatterns");l(Eh,"detectDomainsFromTask");l(Ju,"buildPatternBriefing");l(Ku,"buildContextContract")});import YT from"node:fs/promises";import QT from"node:path";function eE(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
1551
- `)}function tE(r){try{let{prjctDb:e}=(ee(),St(Ho)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
1552
- `)}catch{return null}}function Ch(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}async function sE(r){try{let e=QT.join(r,"analysis","repo-analysis.json"),t=await YT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return I(e),null}}function nE(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),s=e.filter(m=>m.type==="instruction"&&m.position==="before"),n=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),c=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=l((m,g,w)=>{let b=g.map($=>` ${$.enabled?w:"o"} #${$.id} ${$.action}`),h=[m,...b],T=Math.max(...h.map($=>$.length))+2;u.push(`+${"-".repeat(T)}+`);for(let $ of h)u.push(`| ${$.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"drawBox"),p=l(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(u)),n.length>0&&(d("HOOKS (before)",n,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),c.length>0&&(p(u),d("STEPS (after)",c,">")),u.join(`
1553
- `)}async function rE(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
1558
+ `)}`}function dd(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
1559
+ `)}var md=S(()=>{"use strict";Uh();l(Hh,"rankPatterns");l(Wh,"detectDomainsFromTask");l(ud,"buildPatternBriefing");l(dd,"buildContextContract")});import wE from"node:fs/promises";import kE from"node:path";function bE(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
1560
+ `)}function vE(r){try{let{prjctDb:e}=(se(),vt(zo)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
1561
+ `)}catch{return null}}function Gh(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}async function TE(r){try{let e=kE.join(r,"analysis","repo-analysis.json"),t=await wE.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return I(e),null}}function EE(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),s=e.filter(m=>m.type==="instruction"&&m.position==="before"),n=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),c=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=l((m,g,w)=>{let v=g.map($=>` ${$.enabled?w:"o"} #${$.id} ${$.action}`),h=[m,...v],T=Math.max(...h.map($=>$.length))+2;u.push(`+${"-".repeat(T)}+`);for(let $ of h)u.push(`| ${$.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"drawBox"),p=l(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(u)),n.length>0&&(d("HOOKS (before)",n,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),c.length>0&&(p(u),d("STEPS (after)",c,">")),u.join(`
1562
+ `)}async function CE(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
1554
1563
  `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",n);for(let i of o.split(`
1555
1564
  `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
1556
- `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function oE(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}var ZT,Cr,Yu=S(()=>{"use strict";Ql();Fu();ve();ke();fh();Ut();er();hh();Vu();wh();Xn();kh();cu();is();xt();Ki();po();H();K();uo();vn();nr();Je();du();_u();ir();Bt();Xu();Xu();ZT=[{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}],Cr=class extends xe{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await ns(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 Yt.ensureReady()}catch(Be){return Ot("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:k(Be)}),{success:!1,error:k(Be)}}let m=await Wu(o,c),g=await L.getCurrentTask(o);if(g)return Ot("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:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g};await L.startTask(o,{id:Se(),description:c,sessionId:Se(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let w=D.getGlobalProjectPath(o),b=Il(c),h;try{h=So.getHistoricalBoosts(o,b),h.size===0&&(h=void 0)}catch{}let T=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[$,j,,y]=await Promise.all([pa(t),it.getActive(o).catch(()=>null),sE(w),xs(c,t,{maxFiles:T,minScore:.15,historicalBoosts:h}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),R=null;try{let Be=Ks.getSnapshot(o);Be&&(R=Ks.formatContinuityContext(Be),Ks.clearSnapshot(o))}catch{}let O=null;if(j?.analyzedAt){let Be=new Date(j.analyzedAt),zt=Math.floor((Date.now()-Be.getTime())/(1e3*60*60*24));zt>7&&(O=kl("warn",`Analysis is ${zt} days old. Run \`p. sync\` to refresh patterns and file index.`))}else j||(O=kl("info","No project analysis found. Run `p. sync` for better context targeting."));let G=null;if(h&&h.size>0){let Be=[...h.entries()].filter(([,zt])=>zt>.3).sort((zt,Nr)=>Nr[1]-zt[1]).slice(0,5);Be.length>0&&(G=`### Previously Useful Files
1557
- ${Be.map(([Nr])=>`\`${Nr}\``).join(", ")}`)}let oe=Eh(c,o),gt=oo({description:c,branch:$,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:oe}),Ie=wg(y.files.map(Be=>({path:Be.path,description:Be.reasons.join(", ")}))),Pt=y.files.map(Be=>Be.path),Or=Ju(j,Pt),va=Ku(y.files,j),Ta=fe([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),Ea=eE(),Ca=tE(o);console.log(U(R,O,gt,va,Ie,G,Or,Ca,Ea,Ta));try{let Be=await L.getCurrentTask(o);Be&&So.recordSuggestions(o,Be.id,b,y.files.map(zt=>zt.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:v()}),await ns(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Wi.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let p=await Wu(o,c);return await L.startTask(o,{id:Se(),description:c,sessionId:Se(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),ao("working"),Nt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:v()}),await ns(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:mh,pointsToMinutes:jn,pointsToTimeRange:ph,storeEstimate:l(async m=>{let g=jn(m);return await L.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return s.md?Ot("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?ws(new Date(i.startedAt)):void 0,c=oo({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,p=u.length>0?yg(u,d):"",m=fe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(c,p,m))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=k(n);return s.md?o.includes("Cannot run")||o.includes("working state")?Ot("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})):f.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 n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(n);if(!o)return t.md?Ot("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await ns(n,"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 j=new Date(o.startedAt);c=ws(j),u=Math.round((Date.now()-j.getTime())/6e4)}let d=o.estimatedMinutes,p=o.estimatedPoints,m=o.type||"feature",g=o.linearId;try{await Rt.record(n,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:v(),estimatedDuration:d?Ch(d):"0m",actualDuration:c||"0m",variance:d?oE(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[m,g].filter(Boolean)})}catch{}let w="";if(p&&d){let j=u-d,y=d>0?Math.round((u-d)/d*100):0,R=j>=0?"+":"";w=` | est: ${p}pt (${Ch(d)}) \u2192 ${R}${y}%`}let b=[],h=null,P=null;try{if(b=await rE(e,o.startedAt),b.length>0){So.completeFeedback(n,o.id,b);let j=So.getFeedback(n,o.id);j&&(h=j.precision,P=j.recall)}}catch{}await L.completeTask(n,t.feedback);try{Ks.clearSnapshot(n)}catch{}let T=o.linearId,$=T!=null?await Vs("linear",cs()).catch(()=>!1):!1;if(t.md){let j=c?` (${c})`:"",y=null;if(b.length>0){let G=b.slice(0,20).map(oe=>`\`${oe}\``);y=`### Files Modified (${b.length})
1558
- ${G.join(", ")}`}let R=null;if(h!==null&&P!==null){let G=Math.round(h*100),oe=Math.round(P*100);R=`### Context Accuracy
1565
+ `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function PE(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}var SE,Ir,pd=S(()=>{"use strict";mu();td();Ee();Te();$h();Nt();rr();Mh();id();Oh();er();Nh();vu();Kt();Pt();ra();wo();H();K();ho();Cn();ar();Ve();Cu();Yu();ur();Ut();md();md();SE=[{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}],Ir=class extends xe{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await os(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 Zt.ensureReady()}catch(ve){return At("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:k(ve)}),{success:!1,error:k(ve)}}let m=await od(o,c),g=await F.getCurrentTask(o),w=await F.getActiveTasks(o),{worktreeService:v}=await Promise.resolve().then(()=>(Jr(),Go)),h=await v.detect(t);if(h){let ve=w.find(ht=>ht.worktreePath===h.path);if(ve)return At("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:ve.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:ve}}let P;if(g&&!h){let ve=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let ht=await v.create(t,ve);await v.setup(ht.path,t),P=ht.path,Ni("info",`Parallel session created: \`${ht.branch}\` at \`${ht.path}\``)}catch{return At("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(P||h){let ve=Q();await F.startTaskInWorkspace(o,{id:Q(),description:c,sessionId:Q(),workspaceId:ve,worktreePath:P||h.path,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes},ve)}else await F.startTask(o,{id:Q(),description:c,sessionId:Q(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let $=j.getGlobalProjectPath(o),M=ql(c),y;try{y=Co.getHistoricalBoosts(o,M),y.size===0&&(y=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[G,Y,,We]=await Promise.all([va(t),ct.getActive(o).catch(()=>null),TE($),As(c,t,{maxFiles:D,minScore:.15,historicalBoosts:y}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),me=null;try{let ve=Qs.getSnapshot(o);ve&&(me=Qs.formatContinuityContext(ve),Qs.clearSnapshot(o))}catch{}let Me=null;if(Y?.analyzedAt){let ve=new Date(Y.analyzedAt),ht=Math.floor((Date.now()-ve.getTime())/(1e3*60*60*24));ht>7&&(Me=Ni("warn",`Analysis is ${ht} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Y||(Me=Ni("info","No project analysis found. Run `p. sync` for better context targeting."));let $s=null;if(y&&y.size>0){let ve=[...y.entries()].filter(([,ht])=>ht>.3).sort((ht,La)=>La[1]-ht[1]).slice(0,5);ve.length>0&&($s=`### Previously Useful Files
1566
+ ${ve.map(([La])=>`\`${La}\``).join(", ")}`)}let Ia=Wh(c,o),Da=uo({description:c,branch:G,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:Ia}),$a=_g(We.files.map(ve=>({path:ve.path,description:ve.reasons.join(", ")}))),Ma=We.files.map(ve=>ve.path),_a=ud(Y,Ma),Oa=dd(We.files,Y),Na=ye([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ae=bE(),My=vE(o);console.log(U(me,Me,Da,Oa,$a,$s,_a,My,ae,Na));try{let ve=await F.getCurrentTask(o);ve&&Co.recordSuggestions(o,ve.id,M,We.files.map(ht=>ht.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:b()}),await os(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Qi.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let p=await od(o,c);return await F.startTask(o,{id:Q(),description:c,sessionId:Q(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),po("working"),Ft("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:b()}),await os(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:jh,pointsToMinutes:Mn,pointsToTimeRange:Ih,storeEstimate:l(async m=>{let g=Mn(m);return await F.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return s.md?At("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?Ss(new Date(i.startedAt)):void 0,c=uo({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,p=u.length>0?Mg(u,d):"",m=ye([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(c,p,m))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=k(n);return s.md?o.includes("Cannot run")||o.includes("working state")?At("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})):f.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 n=await _.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(Jr(),Go)),i=await o.detect(e),a=await F.getCurrentTask(n),c;if(i){let G=(await F.getActiveTasks(n)).find(Y=>Y.worktreePath===i.path);G&&(a=G,c=G.workspaceId)}if(!a)return t.md?At("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let u=await os(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!u.success)return{success:!1,error:u.gatesFailed.length>0?`Blocked: ${u.gatesFailed.join(", ")}`:`Hook failed: ${u.hooksFailed.join(", ")}`};let d=a.description,p="",m=0;if(a.startedAt){let D=new Date(a.startedAt);p=Ss(D),m=Math.round((Date.now()-D.getTime())/6e4)}let g=a.estimatedMinutes,w=a.estimatedPoints,v=a.type||"feature",h=a.linearId;try{await jt.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:b(),estimatedDuration:g?Gh(g):"0m",actualDuration:p||"0m",variance:g?PE(m-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[v,h].filter(Boolean)})}catch{}let P="";if(w&&g){let D=m-g,G=g>0?Math.round((m-g)/g*100):0,Y=D>=0?"+":"";P=` | est: ${w}pt (${Gh(g)}) \u2192 ${Y}${G}%`}let T=[],$=null,M=null;try{if(T=await CE(e,a.startedAt),T.length>0){Co.completeFeedback(n,a.id,T);let D=Co.getFeedback(n,a.id);D&&($=D.precision,M=D.recall)}}catch{}c?await F.completeTaskInWorkspace(n,c,t.feedback):await F.completeTask(n,t.feedback);try{Qs.clearSnapshot(n)}catch{}let y=a.linearId,R=y!=null?await zs("linear",us()).catch(()=>!1):!1;if(t.md){let D=p?` (${p})`:"",G=null;if(T.length>0){let me=T.slice(0,20).map(Me=>`\`${Me}\``);G=`### Files Modified (${T.length})
1567
+ ${me.join(", ")}`}let Y=null;if($!==null&&M!==null){let me=Math.round($*100),Me=Math.round(M*100);Y=`### Context Accuracy
1559
1568
  | Metric | Value |
1560
1569
  |--------|-------|
1561
- | Precision | ${G}% of suggested files were used |
1562
- | Recall | ${oe}% of modified files were suggested |`}let O=null;try{let{prjctDb:G}=(ee(),St(Ho)),oe=G.getDoc(n,"rpi:current:research"),gt=G.getDoc(n,"rpi:current:plan");oe?gt||(O=`### RPI Phase: Plan Ready
1563
- Research is available. Create your implementation plan next.`):O="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(Te("Completed",`${a}${j}`),yt({Duration:c||"unknown",...w?{Variance:w.replace(" | ","")}:{}}),y,R,O,fe([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let j=c?` (${c}${w})`:"";T&&$?f.done(`${a}${j} \u2192 Linear linked (update via MCP)`):f.done(`${a}${j}`),ao("completed"),Nt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:p,estimatedMinutes:d,actualMinutes:u,timestamp:v()}),await ns(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Ee.getActiveTasks(n);if(o.length===0)return t.md?Ot("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.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.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(U(Z("Queue",`${o.length} task${o.length!==1?"s":""}`),Ge(i,!0),fe([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Nt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?Ot("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=ws(new Date(i.startedAt))),await L.pauseTask(o,e);try{await Ks.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(U(Te("Task Paused",`**Paused:** ${i.description}`),yt({Reason:e||void 0,"Duration worked":a||void 0}),fe([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),ao("paused"),Nt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:v()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return s.md?Ot("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(s.md?console.log(U(Te("Task Resumed",`**Resumed:** ${a.description}`),fe([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),ao("working"),Nt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:v()}),{success:!0,task:a.description}):(s.md?Ot("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.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(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of ZT){let o=t.match(n);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(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+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[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=mt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=mt.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=_e.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Te("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=mt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=mt.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}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}`):f.warn(d),{success:!1,error:d}}let u=_e.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(U(Te("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.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=mt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=mt.getAllWorkflows(t).map(h=>h.name).join(", "),b=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}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}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=_e.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Te("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!_e.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(Te("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=_e.resetRules(e);return t.md?console.log(U(Te("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=_e.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return _e.updateRule(t,o,{enabled:!1}),s.md?console.log(U(Te("Rule Disabled",`#${o} [${c.type}] ${c.action}`),fe([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=_e.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return _e.updateRule(t,c.id,{enabled:!1}),s.md?console.log(U(Te("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.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(U(Z("Multiple matches",`${a.length} rules match "${n}"`),Ge(c),fe(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \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(U(Z("Workflow Help","Manage hooks, gates, and steps for your workflow"),Z("Commands",Ge(["`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"])),Z("Natural Language (EN/ES)",Ge(['`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 n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=_e.getRulesForCommand(t,e):o=_e.getAllRules(t),o.length===0)return s.md?console.log(U(Z("Workflow Rules","No rules configured"),fe([{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'}]))):(f.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]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(nE(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(Z(c,u),a.length>0?hg(a.join(`
1564
-
1565
- `),""):null,fe([{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 n=_e.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await Xi(t),i=0,a=[],c=_e.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=_e.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=_e.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(U(Te("Workflow Initialized",`Added ${a.length} default ship rules`),Ge(a),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.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,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!mt.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(mt.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(mt.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=mt.createWorkflow(t,{name:i,description:a}),d=await Gu.generateWorkflowTemplate(i,a);if(!d.success){mt.deleteWorkflow(t,i);let p=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}return n.md?console.log(U(Te("Workflow Created",`Created workflow: ${i}`),Z("Description",a),Z("Template",`Installed at ${d.path}`),fe([{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}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1566
- Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=mt.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Z("Built-in Workflows",a.join(`
1567
- `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Z("Custom Workflows",a.join(`
1568
- `)))}console.log(U(...i,fe([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(f.done(`${s.length} workflow${s.length!==1?"s":""}`),n.length>0){console.log(`
1570
+ | Precision | ${me}% of suggested files were used |
1571
+ | Recall | ${Me}% of modified files were suggested |`}let We=null;try{let{prjctDb:me}=(se(),vt(zo)),Me=me.getDoc(n,"rpi:current:research"),$s=me.getDoc(n,"rpi:current:plan");Me?$s||(We=`### RPI Phase: Plan Ready
1572
+ Research is available. Create your implementation plan next.`):We="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(Pe("Completed",`${d}${D}`),kt({Duration:p||"unknown",...P?{Variance:P.replace(" | ","")}:{}}),G,Y,We,ye([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let D=p?` (${p}${P})`:"";y&&R?f.done(`${d}${D} \u2192 Linear linked (update via MCP)`):f.done(`${d}${D}`),po("completed"),Ft("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:p,estimatedPoints:w,estimatedMinutes:g,actualMinutes:m,timestamp:b()}),await os(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:p}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ke.getActiveTasks(n);if(o.length===0)return t.md?At("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.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.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(U(te("Queue",`${o.length} task${o.length!==1?"s":""}`),ze(i,!0),ye([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Ft("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return s.md?At("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=Ss(new Date(i.startedAt))),await F.pauseTask(o,e);try{await Qs.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(U(Pe("Task Paused",`**Paused:** ${i.description}`),kt({Reason:e||void 0,"Duration worked":a||void 0}),ye([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),po("paused"),Ft("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:b()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return s.md?At("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.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(U(Pe("Task Resumed",`**Resumed:** ${a.description}`),ye([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),po("working"),Ft("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:b()}),{success:!0,task:a.description}):(s.md?At("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.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(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of SE){let o=t.match(n);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(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+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[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=gt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=gt.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=Ne.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Pe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=gt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=gt.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}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}`):f.warn(d),{success:!1,error:d}}let u=Ne.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(U(Pe("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.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=gt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=gt.getAllWorkflows(t).map(h=>h.name).join(", "),v=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${v}`):f.warn(v),{success:!1,error:v}}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}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=Ne.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Pe("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!Ne.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(Pe("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=Ne.resetRules(e);return t.md?console.log(U(Pe("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=Ne.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return Ne.updateRule(t,o,{enabled:!1}),s.md?console.log(U(Pe("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ye([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Ne.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Ne.updateRule(t,c.id,{enabled:!1}),s.md?console.log(U(Pe("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.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(U(te("Multiple matches",`${a.length} rules match "${n}"`),ze(c),ye(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \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(U(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",ze(["`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)",ze(['`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 n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=Ne.getRulesForCommand(t,e):o=Ne.getAllRules(t),o.length===0)return s.md?console.log(U(te("Workflow Rules","No rules configured"),ye([{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'}]))):(f.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]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(EE(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(te(c,u),a.length>0?$g(a.join(`
1573
+
1574
+ `),""):null,ye([{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 n=Ne.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await oa(t),i=0,a=[],c=Ne.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=Ne.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=Ne.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(U(Pe("Workflow Initialized",`Added ${a.length} default ship rules`),ze(a),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.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,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!gt.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(gt.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(gt.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=gt.createWorkflow(t,{name:i,description:a}),d=await rd.generateWorkflowTemplate(i,a);if(!d.success){gt.deleteWorkflow(t,i);let p=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}return n.md?console.log(U(Pe("Workflow Created",`Created workflow: ${i}`),te("Description",a),te("Template",`Installed at ${d.path}`),ye([{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}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1575
+ Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=gt.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
1576
+ `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Custom Workflows",a.join(`
1577
+ `)))}console.log(U(...i,ye([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(f.done(`${s.length} workflow${s.length!==1?"s":""}`),n.length>0){console.log(`
1569
1578
  Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1570
- Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!mt.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Gu.deleteWorkflowTemplate(n),s.md?console.log(U(Te("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.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}`):f.warn(u),{success:!1,error:u}}let a=mt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await ns(o,i,"before",{projectPath:t});if(!c.success){if(s.md)Ot("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.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 ns(o,i,"after",{projectPath:t}),s.md?console.log(U(Te(`Workflow: ${i}`,a.description||""),fe([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await Ks.cleanup();return t.md?console.log(Te("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await Ks.listAllSnapshots();if(s.length===0)return t.md?Ot("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let n=s.map(o=>{let i=vt(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(U(Z("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Ge(n),fe([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=vt(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?Ot("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(Z("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await L.addTokens(o,c,u);return d?(s.md?console.log(U(Z("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),yt({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(eE,"buildEfficiencySection");l(tE,"buildRpiSection");l(Ch,"formatMinutesToDuration");l(sE,"loadRepoAnalysis");l(nE,"buildFlowDiagram");l(rE,"getFilesModifiedSinceTaskStart");l(oE,"formatVariance")});var Xs,iW,Qu=S(()=>{"use strict";ea();hu();sa();Ru();Au();Zi();Mu();Ou();Nu();Lu();Yu();Xs=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Cr,this.planning=new Pn,this.shipping=new kr,this.analytics=new dr,this.performanceCmds=new gr,this.maintenance=new pr,this.analysis=new An,this.setupCmds=new hr,this.updateCmds=new br,this.velocityCmds=new vr,this.contextCmds=new qs,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(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}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)}},iW=new Xs});var bo,Pr,Zu=S(()=>{"use strict";bo={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}},Pr=[{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:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{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:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"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"]}]});var jh={};we(jh,{UninstallCommands:()=>To,uninstall:()=>Ah});import{execSync as fa}from"node:child_process";import At from"node:fs/promises";import iE from"node:os";import As from"node:path";import aE from"node:readline";import Re from"chalk";async function xh(r){let e=0;try{let t=await At.readdir(r,{withFileTypes:!0});for(let s of t){let n=As.join(r,s.name);if(s.isDirectory())e+=await xh(n);else try{let o=await At.stat(n);e+=o.size}catch{}}}catch{}return e}function Ph(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function cE(r){try{return(await At.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function lE(){let r={homebrew:!1,npm:!1};try{fa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function uE(){let r=[],e=Mm(),t=D.getGlobalBasePath(),s=await E(t),n=s?await cE(As.join(t,"projects")):0,o=s?await xh(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=As.join(e.claude.config,"CLAUDE.md"),a=await E(i),c=!1;if(a)try{let T=await At.readFile(i,"utf-8");c=T.includes(ha)&&T.includes(vo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await E(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=As.join(e.claude.config,"prjct-statusline.sh"),m=await E(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,w=await E(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let b=As.join(e.gemini.config,"GEMINI.md"),h=await E(b),P=!1;if(h)try{let T=await At.readFile(b,"utf-8");P=T.includes(ha)&&T.includes(vo)}catch{}return h&&P&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function dE(r){try{let e=await At.readFile(r,"utf-8");if(!e.includes(ha)||!e.includes(vo))return!1;let t=e.indexOf(ha),s=e.indexOf(vo)+vo.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1571
-
1572
- `).trim(),!n||n.trim().length===0?await At.unlink(r):await At.writeFile(r,`${n}
1573
- `,"utf-8"),!0}catch{return!1}}async function mE(){let r=iE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=As.join(r,`.prjct-backup-${e}`);try{await At.mkdir(t,{recursive:!0});let s=D.getGlobalBasePath();return await E(s)&&await Rh(s,As.join(t,".prjct-cli")),t}catch{return null}}async function Rh(r,e){await At.mkdir(e,{recursive:!0});let t=await At.readdir(r,{withFileTypes:!0});for(let s of t){let n=As.join(r,s.name),o=As.join(e,s.name);s.isDirectory()?await Rh(n,o):await At.copyFile(n,o)}}async function pE(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await dE(o.path)&&s.push(o.path):o.type==="directory"?(await At.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await At.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${k(i)}`)}try{await new Ts().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||fa(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||fa("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${k(o)}`)}}return{deleted:s,errors:n}}async function gE(r){let e=aE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function Ah(r={},e=process.cwd()){let t=await uE(),s=lE(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Re.yellow(`
1574
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Re.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Re.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=D.getDisplayPath(c.path),d="";c.type==="section"?d=Re.dim("(section only)"):c.size&&(d=Re.dim(`(${Ph(c.size)})`)),console.log(` ${Re.cyan(u.padEnd(35))} ${d}`),console.log(` ${Re.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Re.cyan("Homebrew".padEnd(35))} ${Re.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Re.cyan("npm global".padEnd(35))} ${Re.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Re.dim(` Total size: ${Ph(o)}`)),console.log("")),r.dryRun)return console.log(Re.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Re.blue("Creating backup..."));let c=await mE();c?(console.log(Re.green(`Backup created: ${D.getDisplayPath(c)}`)),console.log("")):console.log(Re.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Re.yellow('Type "uninstall" to confirm:')),!await gE("> ")))return console.log(Re.yellow(`
1575
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Re.blue("Removing prjct..."));let{deleted:i,errors:a}=await pE(t,s,r);if(console.log(""),i.length>0&&console.log(Re.green(`Removed ${i.length} items`)),a.length>0){console.log(Re.yellow(`
1576
- ${a.length} errors:`));for(let c of a)console.log(Re.red(` - ${c}`))}return console.log(""),console.log(Re.green("prjct has been uninstalled.")),console.log(Re.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}}var ha,vo,To,ed=S(()=>{"use strict";Es();ke();H();V();Bt();ha="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",vo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(xh,"getDirectorySize");l(Ph,"formatSize");l(cE,"countDirectoryItems");l(lE,"detectInstallation");l(uE,"gatherUninstallItems");l(dE,"removePrjctSection");l(mE,"createBackup");l(Rh,"copyDirectory");l(pE,"performUninstall");l(gE,"promptConfirmation");l(Ah,"uninstall");To=class extends xe{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Ah(e,t)}}});function bE(){for(let[r,e]of Object.entries(bo))W.registerCategory(r,e)}function vE(){if(W.has("work"))return;bE();let r=l(e=>Pr.find(t=>t.name===e),"getMeta");W.registerMethod("task",Ys,"now",r("task")),W.registerMethod("done",Ys,"done",r("done")),W.registerMethod("next",Ys,"next",r("next")),W.registerMethod("pause",Ys,"pause",r("pause")),W.registerMethod("resume",Ys,"resume",r("resume")),W.registerMethod("workflow",Ys,"workflow",r("workflow")),W.registerMethod("tokens",Ys,"tokens",r("tokens")),W.registerMethod("sessions",Ys,"sessions",r("sessions")),W.registerMethod("init",ya,"init",r("init")),W.registerMethod("bug",ya,"bug",r("bug")),W.registerMethod("idea",ya,"idea",r("idea")),W.registerMethod("spec",ya,"spec",r("spec")),W.registerMethod("ship",fE,"ship",r("ship")),W.registerMethod("dash",Dh,"dash",r("dash")),W.registerMethod("help",Dh,"help",r("help")),W.registerMethod("perf",hE,"perf",r("perf")),W.registerMethod("velocity",wE,"velocity",r("velocity")),W.registerMethod("cleanup",Qs,"cleanup",r("cleanup")),W.registerMethod("cleanup-projects",Qs,"cleanupProjects",r("cleanup-projects")),W.registerMethod("design",Qs,"design",r("design")),W.registerMethod("recover",Qs,"recover",r("recover")),W.registerMethod("undo",Qs,"undo",r("undo")),W.registerMethod("redo",Qs,"redo",r("redo")),W.registerMethod("history",Qs,"history",r("history")),W.registerMethod("enrich",Qs,"enrich",r("enrich")),W.registerMethod("analyze",xr,"analyze",r("analyze")),W.registerMethod("sync",xr,"sync",r("sync")),W.registerMethod("stats",xr,"stats",r("stats")),W.registerMethod("status",xr,"status",r("status")),W.registerMethod("seal",xr,"seal",r("seal")),W.registerMethod("verify",xr,"verify",r("verify")),W.registerMethod("start",Eo,"start",r("start")),W.registerMethod("setup",Eo,"setup",r("setup")),W.registerMethod("login",Eo,"login",r("login")),W.registerMethod("logout",Eo,"logout",r("logout")),W.registerMethod("auth",Eo,"auth",r("auth")),W.registerMethod("uninstall",kE,"uninstall",r("uninstall")),W.registerMethod("update",SE,"update",r("update")),W.registerMethod("context",yE,"context",r("context"))}var Ys,ya,fE,Dh,hE,Qs,xr,Eo,yE,wE,kE,SE,td=S(()=>{"use strict";ea();hu();Zu();sa();Ru();Au();Zi();ho();Mu();Ou();ed();Nu();Lu();Yu();Ys=new Cr,ya=new Pn,fE=new kr,Dh=new dr,hE=new gr,Qs=new pr,xr=new An,Eo=new hr,yE=new qs,wE=new vr,kE=new To,SE=new br;l(bE,"registerCategories");l(vE,"registerAllCommands");vE()});var Mh={};we(Mh,{shutdown:()=>Dn,startDaemon:()=>CE});import Ve from"node:fs";import{createServer as TE}from"node:net";async function CE(r){let e=$e.socket(),t=$e.pid(),s=$e.runDir();if(Ve.mkdirSync(s,{recursive:!0}),Ve.existsSync(t)){let i=parseInt(Ve.readFileSync(t,"utf-8").trim(),10);jE(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ve.unlinkSync(t)}Ve.existsSync(e)&&Ve.unlinkSync(e),$E();let n=DE(),o=null;if(n)try{o=Ve.statSync(n).mtimeMs}catch{}if(Ae={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Pa,idleTimer:null,entryPath:n,entryMtime:o},ye=new Xs,Rr=TE(i=>PE(i)),Rr.listen(e,()=>{Ve.chmodSync(e,384),Ve.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Ih()}),Rr.on("error",i=>{console.error("Daemon socket error:",i.message),Dn(1)}),!r.noHttp)try{let i=process.cwd(),a=await M.getProjectId(i);if(a){let c=r.port||zo;Co=Bo({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Co.start()}}catch{}if(process.on("SIGTERM",()=>Dn(0)),process.on("SIGINT",()=>Dn(0)),process.on("SIGHUP",()=>{ye=new Xs,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function PE(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>xa){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(en(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1577
- `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await xE(o);r.write(en(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(en(i))}}}),r.on("error",()=>{})}async function xE(r){if(!Ae||!ye)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Ih(),Ae.commandsServed++,Ae.lastActivity=Date.now(),Ae.commandsServed%EE===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..."),Dn(0)},200)),r.command==="daemon")return AE(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await RE(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1579
+ Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!gt.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await rd.deleteWorkflowTemplate(n),s.md?console.log(U(Pe("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.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}`):f.warn(u),{success:!1,error:u}}let a=gt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await os(o,i,"before",{projectPath:t});if(!c.success){if(s.md)At("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.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 os(o,i,"after",{projectPath:t}),s.md?console.log(U(Pe(`Workflow: ${i}`,a.description||""),ye([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await Qs.cleanup();return t.md?console.log(Pe("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await Qs.listAllSnapshots();if(s.length===0)return t.md?At("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let n=s.map(o=>{let i=Et(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(U(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),ze(n),ye([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=Et(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return s.md?At("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(te("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await F.addTokens(o,c,u);return d?(s.md?console.log(U(te("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),kt({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(bE,"buildEfficiencySection");l(vE,"buildRpiSection");l(Gh,"formatMinutesToDuration");l(TE,"loadRepoAnalysis");l(EE,"buildFlowDiagram");l(CE,"getFilesModifiedSinceTaskStart");l(PE,"formatVariance")});var Zs,JG,gd=S(()=>{"use strict";la();ju();da();Wu();Bu();Vu();ca();Xu();Qu();Zu();ed();pd();Zs=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ir,this.planning=new An,this.shipping=new Cr,this.analytics=new fr,this.performanceCmds=new Sr,this.maintenance=new yr,this.analysis=new Dn,this.setupCmds=new vr,this.updateCmds=new xr,this.velocityCmds=new Rr,this.contextCmds=new Xs,this.parallelCmds=new $n,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 parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(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(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}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)}},JG=new Zs});var Po,Dr,fd=S(()=>{"use strict";Po={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}},Dr=[{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:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{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:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{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:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"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"]}]});var Jh={};we(Jh,{UninstallCommands:()=>Ro,uninstall:()=>zh});import{execSync as Ea}from"node:child_process";import It from"node:fs/promises";import xE from"node:os";import Is from"node:path";import RE from"node:readline";import je from"chalk";async function Vh(r){let e=0;try{let t=await It.readdir(r,{withFileTypes:!0});for(let s of t){let n=Is.join(r,s.name);if(s.isDirectory())e+=await Vh(n);else try{let o=await It.stat(n);e+=o.size}catch{}}}catch{}return e}function Bh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function AE(r){try{return(await It.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function jE(){let r={homebrew:!1,npm:!1};try{Ea("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ea("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function IE(){let r=[],e=Ym(),t=j.getGlobalBasePath(),s=await E(t),n=s?await AE(Is.join(t,"projects")):0,o=s?await Vh(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=Is.join(e.claude.config,"CLAUDE.md"),a=await E(i),c=!1;if(a)try{let T=await It.readFile(i,"utf-8");c=T.includes(Ca)&&T.includes(xo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await E(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=Is.join(e.claude.config,"prjct-statusline.sh"),m=await E(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,w=await E(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let v=Is.join(e.gemini.config,"GEMINI.md"),h=await E(v),P=!1;if(h)try{let T=await It.readFile(v,"utf-8");P=T.includes(Ca)&&T.includes(xo)}catch{}return h&&P&&r.push({path:v,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function DE(r){try{let e=await It.readFile(r,"utf-8");if(!e.includes(Ca)||!e.includes(xo))return!1;let t=e.indexOf(Ca),s=e.indexOf(xo)+xo.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1580
+
1581
+ `).trim(),!n||n.trim().length===0?await It.unlink(r):await It.writeFile(r,`${n}
1582
+ `,"utf-8"),!0}catch{return!1}}async function $E(){let r=xE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Is.join(r,`.prjct-backup-${e}`);try{await It.mkdir(t,{recursive:!0});let s=j.getGlobalBasePath();return await E(s)&&await qh(s,Is.join(t,".prjct-cli")),t}catch{return null}}async function qh(r,e){await It.mkdir(e,{recursive:!0});let t=await It.readdir(r,{withFileTypes:!0});for(let s of t){let n=Is.join(r,s.name),o=Is.join(e,s.name);s.isDirectory()?await qh(n,o):await It.copyFile(n,o)}}async function ME(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await DE(o.path)&&s.push(o.path):o.type==="directory"?(await It.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await It.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${k(i)}`)}try{await new Cs().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ea(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||Ea("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${k(o)}`)}}return{deleted:s,errors:n}}async function _E(r){let e=RE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function zh(r={},e=process.cwd()){let t=await IE(),s=jE(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(je.yellow(`
1583
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(je.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(je.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=j.getDisplayPath(c.path),d="";c.type==="section"?d=je.dim("(section only)"):c.size&&(d=je.dim(`(${Bh(c.size)})`)),console.log(` ${je.cyan(u.padEnd(35))} ${d}`),console.log(` ${je.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${je.cyan("Homebrew".padEnd(35))} ${je.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${je.cyan("npm global".padEnd(35))} ${je.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(je.dim(` Total size: ${Bh(o)}`)),console.log("")),r.dryRun)return console.log(je.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(je.blue("Creating backup..."));let c=await $E();c?(console.log(je.green(`Backup created: ${j.getDisplayPath(c)}`)),console.log("")):console.log(je.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(je.yellow('Type "uninstall" to confirm:')),!await _E("> ")))return console.log(je.yellow(`
1584
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(je.blue("Removing prjct..."));let{deleted:i,errors:a}=await ME(t,s,r);if(console.log(""),i.length>0&&console.log(je.green(`Removed ${i.length} items`)),a.length>0){console.log(je.yellow(`
1585
+ ${a.length} errors:`));for(let c of a)console.log(je.red(` - ${c}`))}return console.log(""),console.log(je.green("prjct has been uninstalled.")),console.log(je.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}}var Ca,xo,Ro,hd=S(()=>{"use strict";Ps();Te();H();B();Ut();Ca="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",xo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(Vh,"getDirectorySize");l(Bh,"formatSize");l(AE,"countDirectoryItems");l(jE,"detectInstallation");l(IE,"gatherUninstallItems");l(DE,"removePrjctSection");l($E,"createBackup");l(qh,"copyDirectory");l(ME,"performUninstall");l(_E,"promptConfirmation");l(zh,"uninstall");Ro=class extends xe{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return zh(e,t)}}});function WE(){for(let[r,e]of Object.entries(Po))W.registerCategory(r,e)}function GE(){if(W.has("work"))return;WE();let r=l(e=>Dr.find(t=>t.name===e),"getMeta");W.registerMethod("task",en,"now",r("task")),W.registerMethod("done",en,"done",r("done")),W.registerMethod("next",en,"next",r("next")),W.registerMethod("pause",en,"pause",r("pause")),W.registerMethod("resume",en,"resume",r("resume")),W.registerMethod("workflow",en,"workflow",r("workflow")),W.registerMethod("tokens",en,"tokens",r("tokens")),W.registerMethod("sessions",en,"sessions",r("sessions")),W.registerMethod("init",Pa,"init",r("init")),W.registerMethod("bug",Pa,"bug",r("bug")),W.registerMethod("idea",Pa,"idea",r("idea")),W.registerMethod("spec",Pa,"spec",r("spec")),W.registerMethod("ship",OE,"ship",r("ship")),W.registerMethod("dash",Kh,"dash",r("dash")),W.registerMethod("help",Kh,"help",r("help")),W.registerMethod("perf",NE,"perf",r("perf")),W.registerMethod("velocity",FE,"velocity",r("velocity")),W.registerMethod("cleanup",tn,"cleanup",r("cleanup")),W.registerMethod("cleanup-projects",tn,"cleanupProjects",r("cleanup-projects")),W.registerMethod("design",tn,"design",r("design")),W.registerMethod("recover",tn,"recover",r("recover")),W.registerMethod("undo",tn,"undo",r("undo")),W.registerMethod("redo",tn,"redo",r("redo")),W.registerMethod("history",tn,"history",r("history")),W.registerMethod("enrich",tn,"enrich",r("enrich")),W.registerMethod("analyze",$r,"analyze",r("analyze")),W.registerMethod("sync",$r,"sync",r("sync")),W.registerMethod("stats",$r,"stats",r("stats")),W.registerMethod("status",$r,"status",r("status")),W.registerMethod("seal",$r,"seal",r("seal")),W.registerMethod("verify",$r,"verify",r("verify")),W.registerMethod("start",Ao,"start",r("start")),W.registerMethod("setup",Ao,"setup",r("setup")),W.registerMethod("login",Ao,"login",r("login")),W.registerMethod("logout",Ao,"logout",r("logout")),W.registerMethod("auth",Ao,"auth",r("auth")),W.registerMethod("uninstall",UE,"uninstall",r("uninstall")),W.registerMethod("update",HE,"update",r("update")),W.registerMethod("context",LE,"context",r("context")),W.registerMethod("parallel",yd,"parallel",r("parallel")),W.registerMethod("worktree",yd,"parallel",r("worktree")),W.registerMethod("conductor",yd,"parallel",r("conductor"))}var en,Pa,OE,Kh,NE,tn,$r,Ao,LE,FE,yd,UE,HE,wd=S(()=>{"use strict";la();ju();fd();da();Wu();Bu();Vu();ca();bo();Xu();Qu();hd();Zu();ed();pd();en=new Ir,Pa=new An,OE=new Cr,Kh=new fr,NE=new Sr,tn=new yr,$r=new Dn,Ao=new vr,LE=new Xs,FE=new Rr,yd=new $n,UE=new Ro,HE=new xr;l(WE,"registerCategories");l(GE,"registerAllCommands");GE()});var Qh={};we(Qh,{shutdown:()=>_n,startDaemon:()=>qE});import Ke from"node:fs";import{createServer as BE}from"node:net";async function qE(r){let e=_e.socket(),t=_e.pid(),s=_e.runDir();if(Ke.mkdirSync(s,{recursive:!0}),Ke.existsSync(t)){let i=parseInt(Ke.readFileSync(t,"utf-8").trim(),10);YE(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ke.unlinkSync(t)}Ke.existsSync(e)&&Ke.unlinkSync(e),eC();let n=QE(),o=null;if(n)try{o=Ke.statSync(n).mtimeMs}catch{}if(Ie={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Fa,idleTimer:null,entryPath:n,entryMtime:o},be=new Zs,Mr=BE(i=>zE(i)),Mr.listen(e,()=>{Ke.chmodSync(e,384),Ke.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Xh()}),Mr.on("error",i=>{console.error("Daemon socket error:",i.message),_n(1)}),!r.noHttp)try{let i=process.cwd(),a=await _.getProjectId(i);if(a){let c=r.port||ei;jo=Zo({port:c,projectId:a,projectPath:i,enableLogging:!1}),await jo.start()}}catch{}if(process.on("SIGTERM",()=>_n(0)),process.on("SIGINT",()=>_n(0)),process.on("SIGHUP",()=>{be=new Zs,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function zE(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Ua){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(nn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1586
+ `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await JE(o);r.write(nn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(nn(i))}}}),r.on("error",()=>{})}async function JE(r){if(!Ie||!be)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Xh(),Ie.commandsServed++,Ie.lastActivity=Date.now(),Ie.commandsServed%VE===0&&N.checkpointAll(),Yh()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),_n(0)},200)),r.command==="daemon")return XE(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await KE(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1578
1587
  `)||o.message||void 0,stderr:t.join(`
1579
- `)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function RE(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return ye.sync(r.cwd,{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 ye.status(r.cwd,{json:t.json===!0,md:s});case"stats":return ye.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ye.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return ye.seal(r.cwd,{json:t.json===!0});case"rollback":return ye.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return ye.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ye.task(e,r.cwd,{md:s});case"done":return ye.done(r.cwd,{md:s});case"next":return ye.next(r.cwd,{md:s});case"pause":return ye.pause(e||"",r.cwd,{md:s});case"resume":return ye.resume(e,r.cwd,{md:s});case"bug":return ye.bug(e||"",r.cwd,{md:s});case"idea":return ye.idea(e||"",r.cwd,{md:s});case"ship":return ye.ship(e,r.cwd,{md:s});case"dash":return ye.dash(e||"default",r.cwd,{md:s});case"workflow":return ye.workflowPrefs(e,r.cwd,{md:s});case"sessions":return ye.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return ye.design(e||"",t,r.cwd);case"analysis-payload":return ye.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return ye.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return ye.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return ye.analyze(t,r.cwd);case"cleanup":return ye.cleanup(t,r.cwd);case"cleanup-projects":return ye.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return W.execute(r.command,e,r.cwd)}}function AE(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:$e.socket(),uptime:Ae?Date.now()-Ae.startedAt:0,commandsServed:Ae?.commandsServed??0,lastActivity:Ae?new Date(Ae.lastActivity).toISOString():null,registeredCommands:W.list().length,stale:$h()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Dn(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Ih(){Ae&&(Ae.idleTimer&&clearTimeout(Ae.idleTimer),Ae.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ae.idleTimeoutMs/1e3/60} minutes, shutting down`),Dn(0)},Ae.idleTimeoutMs),Ae.idleTimer.unref&&Ae.idleTimer.unref())}function Dn(r){console.log("Daemon shutting down..."),Ae?.idleTimer&&clearTimeout(Ae.idleTimer),Co&&(Co.stop(),Co=null),Rr&&(Rr.close(),Rr=null),N.close();let e=$e.socket(),t=$e.pid();try{Ve.existsSync(e)&&Ve.unlinkSync(e)}catch{}try{Ve.existsSync(t)&&Ve.unlinkSync(t)}catch{}process.exit(r)}function jE(r){try{return process.kill(r,0),!0}catch{return!1}}function DE(){let r=jt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Ve.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ve.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(Ve.existsSync(n))return n;let s=process.argv[1];return s&&Ve.existsSync(s)?s:null}function $E(){let r=$e.log();try{if(Ve.statSync(r).size>IE){let t=`${r}.1`;try{Ve.unlinkSync(t)}catch{}Ve.renameSync(r,t)}}catch{}}function $h(){if(!Ae?.entryPath||Ae.entryMtime===null)return!1;try{return Ve.statSync(Ae.entryPath).mtimeMs!==Ae.entryMtime}catch{return!1}}var EE,Rr,Co,ye,Ae,IE,_h=S(()=>{"use strict";Qu();ho();td();ve();dc();ee();Po();EE=50,Rr=null,Co=null,ye=null,Ae=null;l(CE,"startDaemon");l(PE,"handleConnection");l(xE,"handleRequest");l(RE,"executeCommand");l(AE,"handleDaemonCommand");l(Ih,"resetIdleTimer");l(Dn,"shutdown");l(jE,"isProcessRunning");l(DE,"resolveEntryPath");IE=1024*1024;l($E,"rotateLog");l($h,"isCodeStale")});var Lh={};we(Lh,{runStart:()=>WE});import ls from"node:fs/promises";import Oh from"node:os";import us from"node:path";import J from"chalk";function OE(){console.clear(),console.log(ME),console.log(_E)}function Nh(r,e){console.log(`
1588
+ `)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function KE(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return be.sync(r.cwd,{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 be.status(r.cwd,{json:t.json===!0,md:s});case"stats":return be.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return be.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return be.seal(r.cwd,{json:t.json===!0});case"rollback":return be.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return be.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return be.task(e,r.cwd,{md:s});case"done":return be.done(r.cwd,{md:s});case"next":return be.next(r.cwd,{md:s});case"pause":return be.pause(e||"",r.cwd,{md:s});case"resume":return be.resume(e,r.cwd,{md:s});case"bug":return be.bug(e||"",r.cwd,{md:s});case"idea":return be.idea(e||"",r.cwd,{md:s});case"ship":return be.ship(e,r.cwd,{md:s});case"dash":return be.dash(e||"default",r.cwd,{md:s});case"workflow":return be.workflowPrefs(e,r.cwd,{md:s});case"sessions":return be.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return be.design(e||"",t,r.cwd);case"analysis-payload":return be.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return be.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return be.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return be.analyze(t,r.cwd);case"cleanup":return be.cleanup(t,r.cwd);case"cleanup-projects":return be.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return W.execute(r.command,e,r.cwd)}}function XE(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:_e.socket(),uptime:Ie?Date.now()-Ie.startedAt:0,commandsServed:Ie?.commandsServed??0,lastActivity:Ie?new Date(Ie.lastActivity).toISOString():null,registeredCommands:W.list().length,stale:Yh()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>_n(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Xh(){Ie&&(Ie.idleTimer&&clearTimeout(Ie.idleTimer),Ie.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ie.idleTimeoutMs/1e3/60} minutes, shutting down`),_n(0)},Ie.idleTimeoutMs),Ie.idleTimer.unref&&Ie.idleTimer.unref())}function _n(r){console.log("Daemon shutting down..."),Ie?.idleTimer&&clearTimeout(Ie.idleTimer),jo&&(jo.stop(),jo=null),Mr&&(Mr.close(),Mr=null),N.close();let e=_e.socket(),t=_e.pid();try{Ke.existsSync(e)&&Ke.unlinkSync(e)}catch{}try{Ke.existsSync(t)&&Ke.unlinkSync(t)}catch{}process.exit(r)}function YE(r){try{return process.kill(r,0),!0}catch{return!1}}function QE(){let r=Dt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Ke.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ke.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(Ke.existsSync(n))return n;let s=process.argv[1];return s&&Ke.existsSync(s)?s:null}function eC(){let r=_e.log();try{if(Ke.statSync(r).size>ZE){let t=`${r}.1`;try{Ke.unlinkSync(t)}catch{}Ke.renameSync(r,t)}}catch{}}function Yh(){if(!Ie?.entryPath||Ie.entryMtime===null)return!1;try{return Ke.statSync(Ie.entryPath).mtimeMs!==Ie.entryMtime}catch{return!1}}var VE,Mr,jo,be,Ie,ZE,Zh=S(()=>{"use strict";gd();bo();wd();Ee();Pc();se();Io();VE=50,Mr=null,jo=null,be=null,Ie=null;l(qE,"startDaemon");l(zE,"handleConnection");l(JE,"handleRequest");l(KE,"executeCommand");l(XE,"handleDaemonCommand");l(Xh,"resetIdleTimer");l(_n,"shutdown");l(YE,"isProcessRunning");l(QE,"resolveEntryPath");ZE=1024*1024;l(eC,"rotateLog");l(Yh,"isCodeStale")});var sy={};we(sy,{runStart:()=>uC});import ds from"node:fs/promises";import ey from"node:os";import ms from"node:path";import J from"chalk";function nC(){console.clear(),console.log(tC),console.log(sC)}function ty(r,e){console.log(`
1580
1589
  ${J.bold(" Select AI providers to configure:")}
1581
1590
  `),console.log(` ${J.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1582
- `),r.forEach((t,s)=>{let n=s===e?J.cyan("\u276F"):" ",o=t.selected?J.green("[\u2713]"):J.dim("[ ]"),i=t.installed?J.green("(installed)"):J.yellow("(will install)"),a=s===e?J.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function NE(){let r=await hs(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed},{name:"codex",displayName:"OpenAI Codex",installed:r.codex.installed,selected:r.codex.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let s=0,n=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Nh(e,s)},"render");Nh(e,s),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
1591
+ `),r.forEach((t,s)=>{let n=s===e?J.cyan("\u276F"):" ",o=t.selected?J.green("[\u2713]"):J.dim("[ ]"),i=t.installed?J.green("(installed)"):J.yellow("(will install)"),a=s===e?J.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function rC(){let r=await ws(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed},{name:"codex",displayName:"OpenAI Codex",installed:r.codex.installed,selected:r.codex.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let s=0,n=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),ty(e,s)},"render");ty(e,s),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
1583
1592
  Cancelled.
1584
1593
  `),process.exit(0)),a==="\r"||a===`
1585
1594
  `){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(s=Math.max(0,s-1),n()),a==="\x1B[B"&&(s=Math.min(e.length-1,s+1),n()),a===" "&&(e[s].selected=!e[s].selected,n())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1586
1595
  ${J.bold(" Detected providers:")}
1587
- `),e.forEach(t=>{t.installed&&console.log(` ${J.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function LE(r){let e=Ue[r];if(!e.configDir)return!1;try{let t=us.join(e.configDir,"commands");await ls.mkdir(t,{recursive:!0});let{getPackageRoot:s}=await Promise.resolve().then(()=>(nt(),Ln)),n=s(),o=r==="claude"?"p.md":"p.toml",i=us.join(n,"templates","commands",o),a=us.join(t,o);return await E(i)?(await ls.copyFile(i,a),!0):!1}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function FE(r){let e=Ue[r];if(!e.configDir)return!1;try{let t=r==="gemini"?us.join(e.configDir,"commands"):us.join(e.configDir,"commands","p");await ls.mkdir(t,{recursive:!0});let s=new Set(["p.md","p.toml"]),o=Ls("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!s.has(i));for(let i of o){let a=ht(`commands/${i}`);a&&await ls.writeFile(us.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} subcommands: ${k(t)}`),!1}}async function UE(r){let e=Ue[r];if(!e.configDir)return!1;try{await ls.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(nt(),Ln)),s=t(),n=r==="claude"?"CLAUDE.md":"GEMINI.md",o=us.join(s,"templates","global",n),i=us.join(e.configDir,n);if(await E(o)){let a=await ls.readFile(o,"utf-8");if(await E(i)){let c=await ls.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=c.substring(0,c.indexOf(u)),m=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await ls.writeFile(i,p+g+m)}else await ls.writeFile(i,`${c}
1596
+ `),e.forEach(t=>{t.installed&&console.log(` ${J.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function oC(r){let e=Be[r];if(!e.configDir)return!1;try{let t=ms.join(e.configDir,"commands");await ds.mkdir(t,{recursive:!0});let{getPackageRoot:s}=await Promise.resolve().then(()=>(ot(),Wn)),n=s(),o=r==="claude"?"p.md":"p.toml",i=ms.join(n,"templates","commands",o),a=ms.join(t,o);return await E(i)?(await ds.copyFile(i,a),!0):!1}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function iC(r){let e=Be[r];if(!e.configDir)return!1;try{let t=r==="gemini"?ms.join(e.configDir,"commands"):ms.join(e.configDir,"commands","p");await ds.mkdir(t,{recursive:!0});let s=new Set(["p.md","p.toml"]),o=Hs("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!s.has(i));for(let i of o){let a=wt(`commands/${i}`);a&&await ds.writeFile(ms.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} subcommands: ${k(t)}`),!1}}async function aC(r){let e=Be[r];if(!e.configDir)return!1;try{await ds.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(ot(),Wn)),s=t(),n=r==="claude"?"CLAUDE.md":"GEMINI.md",o=ms.join(s,"templates","global",n),i=ms.join(e.configDir,n);if(await E(o)){let a=await ds.readFile(o,"utf-8");if(await E(i)){let c=await ds.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=c.substring(0,c.indexOf(u)),m=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await ds.writeFile(i,p+g+m)}else await ds.writeFile(i,`${c}
1588
1597
 
1589
- ${a}`)}else await ls.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} config: ${k(t)}`),!1}}async function HE(r){let e=us.join(Oh.homedir(),".prjct-cli","config","installed-editors.json"),t={version:me,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:us.join(Oh.homedir(),`.${r[0]}`,"commands")};await ce(e,t)}function GE(r){console.log(`
1598
+ ${a}`)}else await ds.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} config: ${k(t)}`),!1}}async function cC(r){let e=ms.join(ey.homedir(),".prjct-cli","config","installed-editors.json"),t={version:ge,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:ms.join(ey.homedir(),`.${r[0]}`,"commands")};await le(e,t)}function lC(r){console.log(`
1590
1599
  ${J.green.bold(" \u2713 Setup complete!")}
1591
- `),console.log(` ${J.dim("Configured providers:")}`),r.forEach(e=>{let t=Ue[e];console.log(` ${J.green("\u2713")} ${t.displayName}`)}),console.log(`
1600
+ `),console.log(` ${J.dim("Configured providers:")}`),r.forEach(e=>{let t=Be[e];console.log(` ${J.green("\u2713")} ${t.displayName}`)}),console.log(`
1592
1601
  ${J.bold("Next steps:")}
1593
1602
 
1594
1603
  ${J.cyan("1.")} Navigate to your project directory
@@ -1601,30 +1610,30 @@ ${J.green.bold(" \u2713 Setup complete!")}
1601
1610
  ${J.dim("\u2022")} Use ${J.bold("p. ship")} to create PRs
1602
1611
 
1603
1612
  ${J.dim("Learn more: https://prjct.app/docs")}
1604
- `)}async function WE(){OE();let r=await NE();console.log(`
1613
+ `)}async function uC(){nC();let r=await rC();console.log(`
1605
1614
  ${J.cyan("Setting up...")}
1606
- `);for(let e of r){let t=Ue[e];process.stdout.write(` ${J.dim("\u2022")} ${t.displayName}... `);let s=await LE(e),n=await FE(e),o=await UE(e);console.log(s&&n&&o?J.green("\u2713"):s||o?J.yellow("partial"):J.yellow("skipped"))}await HE(r),GE(r)}var Ar,jr,Dr,Ir,$r,ME,_E,Fh=S(()=>{"use strict";Fs();st();H();V();nt();Ar=J.rgb(180,180,175),jr=J.rgb(200,200,195),Dr=J.rgb(220,220,215),Ir=J.rgb(235,235,230),$r=J.rgb(250,250,245),ME=`
1615
+ `);for(let e of r){let t=Be[e];process.stdout.write(` ${J.dim("\u2022")} ${t.displayName}... `);let s=await oC(e),n=await iC(e),o=await aC(e);console.log(s&&n&&o?J.green("\u2713"):s||o?J.yellow("partial"):J.yellow("skipped"))}await cC(r),lC(r)}var _r,Or,Nr,Lr,Fr,tC,sC,ny=S(()=>{"use strict";Ws();rt();H();B();ot();_r=J.rgb(180,180,175),Or=J.rgb(200,200,195),Nr=J.rgb(220,220,215),Lr=J.rgb(235,235,230),Fr=J.rgb(250,250,245),tC=`
1607
1616
 
1608
- ${Ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${jr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Dr(" \u2588\u2588\u2557")}${Ir(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${$r("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1609
- ${Ar(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${jr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Dr(" \u2588\u2588\u2551")}${Ir("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${$r("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1610
- ${Ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${jr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Dr(" \u2588\u2588\u2551")}${Ir("\u2588\u2588\u2551 ")}${$r(" \u2588\u2588\u2551 ")}
1611
- ${Ar(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${jr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Dr("\u2588\u2588 \u2588\u2588\u2551")}${Ir("\u2588\u2588\u2551 ")}${$r(" \u2588\u2588\u2551 ")}
1612
- ${Ar(" \u2588\u2588\u2551 ")}${jr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Dr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Ir("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${$r(" \u2588\u2588\u2551 ")}
1613
- ${Ar(" \u255A\u2550\u255D ")}${jr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Dr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Ir(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${$r(" \u255A\u2550\u255D ")}
1617
+ ${_r(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Or(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Nr(" \u2588\u2588\u2557")}${Lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Fr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1618
+ ${_r(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Or(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Nr(" \u2588\u2588\u2551")}${Lr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${Fr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1619
+ ${_r(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Or(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Nr(" \u2588\u2588\u2551")}${Lr("\u2588\u2588\u2551 ")}${Fr(" \u2588\u2588\u2551 ")}
1620
+ ${_r(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${Or(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Nr("\u2588\u2588 \u2588\u2588\u2551")}${Lr("\u2588\u2588\u2551 ")}${Fr(" \u2588\u2588\u2551 ")}
1621
+ ${_r(" \u2588\u2588\u2551 ")}${Or(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Nr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Lr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Fr(" \u2588\u2588\u2551 ")}
1622
+ ${_r(" \u255A\u2550\u255D ")}${Or(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Nr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Lr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${Fr(" \u255A\u2550\u255D ")}
1614
1623
 
1615
- `,_E=` ${J.white("Context Layer for AI Agents")} ${J.dim(`v${me}`)}
1624
+ `,sC=` ${J.white("Context Layer for AI Agents")} ${J.dim(`v${ge}`)}
1616
1625
 
1617
1626
  ${J.dim(`Project context layer for AI coding agents.
1618
1627
  Works with Claude Code, Gemini CLI, Codex, and more.`)}
1619
1628
  ${J.cyan("https://prjct.app")}
1620
- `;l(OE,"showBanner");l(Nh,"showProviderSelection");l(NE,"selectProviders");l(LE,"installRouter");l(FE,"installSubcommands");l(UE,"installGlobalConfig");l(HE,"saveSetupConfig");l(GE,"showCompletion");l(WE,"runStart")});import Gh from"node:fs/promises";import js from"node:path";async function Mr(r,e=process.cwd(),t={}){let s=js.isAbsolute(r)?r:js.join(e,r),n;try{n=await Gh.readFile(s,"utf-8")}catch(g){if(I(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=js.extname(r).toLowerCase(),i=qE[o]||"unknown",a=zE[i]||[],c=await JE(n,a,s,e),u=[];t.reverse&&(u=await XE(r,e));let d;t.depth&&t.depth>0&&(d=await Wh(r,e,t.depth));let p=c.filter(g=>g.isExternal).length,m=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:p,internalImports:m,importedByCount:u.length}}}async function JE(r,e,t,s){let n=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let m=a[i.namesIndex];m&&(u=m.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),p=null;d||(p=await KE(c,t,s)),n.push({source:c,resolved:p,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function KE(r,e,t){let s=js.dirname(e);if(r.startsWith("@/")){let o=js.join(t,"src",r.slice(2));return Hh(o,t)}let n=js.resolve(s,r);return Hh(n,t)}async function Hh(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await Gh.stat(n)).isFile())return js.relative(e,n)}catch{}}return null}async function XE(r,e){let t=[],s=js.basename(r,js.extname(r));try{let o=[`from ['"].*${s}['"]`,`from ['"]\\./${s}['"]`,`import\\(['"'].*${s}['"]`,`require\\(['"'].*${s}['"]`].join("|"),{stdout:i}=await F(`grep -r -l -E '${o}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),a=i.trim().split(`
1621
- `).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function Wh(r,e,t,s=0,n=new Set){let o={file:r,imports:[],depth:s};if(s>=t||n.has(r))return o;n.add(r);let i=await Mr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Wh(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var Uh,VE,BE,zE,qE,sd=S(()=>{"use strict";H();ze();Uh=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],VE=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],BE=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],zE={typescript:Uh,javascript:Uh,python:VE,go:BE},qE={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Mr,"analyzeImports");l(JE,"extractImports");l(KE,"resolveImport");l(Hh,"tryResolve");l(XE,"findImportedBy");l(Wh,"buildDependencyTree")});import Vh from"node:fs/promises";import ds from"node:path";async function wa(r,e=process.cwd()){let t=ds.isAbsolute(r)?r:ds.join(e,r),s;try{s=await Vh.readFile(t,"utf-8")}catch(m){if(I(m))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Tn("")};throw m}let n=ds.extname(r).toLowerCase(),o=Bh[n]||"unknown",i=await Bs(r,e),a=await Mr(r,e),c=QE(s,o),u=i.signatures.filter(m=>m.exported).map(m=>({name:m.name,type:m.type,signature:m.signature,description:m.docstring?ZE(m.docstring):void 0})),d=a.imports.filter(m=>!m.isExternal&&m.resolved).map(m=>m.resolved).slice(0,10),p=eC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Oi(s,p)}}async function nd(r,e=process.cwd(),t={}){let s=ds.isAbsolute(r)?r:ds.join(e,r),n=[];async function o(i){let a=await Vh.readdir(i,{withFileTypes:!0});for(let c of a){let u=ds.join(i,c.name),d=ds.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=ds.extname(c.name).toLowerCase();if(Bh[p]){let m=await wa(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function QE(r,e){let t=YE[e]||[],s=r.split(`
1629
+ `;l(nC,"showBanner");l(ty,"showProviderSelection");l(rC,"selectProviders");l(oC,"installRouter");l(iC,"installSubcommands");l(aC,"installGlobalConfig");l(cC,"saveSetupConfig");l(lC,"showCompletion");l(uC,"runStart")});import iy from"node:fs/promises";import Ds from"node:path";async function Ur(r,e=process.cwd(),t={}){let s=Ds.isAbsolute(r)?r:Ds.join(e,r),n;try{n=await iy.readFile(s,"utf-8")}catch(g){if(I(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=Ds.extname(r).toLowerCase(),i=gC[o]||"unknown",a=pC[i]||[],c=await fC(n,a,s,e),u=[];t.reverse&&(u=await yC(r,e));let d;t.depth&&t.depth>0&&(d=await ay(r,e,t.depth));let p=c.filter(g=>g.isExternal).length,m=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:p,internalImports:m,importedByCount:u.length}}}async function fC(r,e,t,s){let n=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let m=a[i.namesIndex];m&&(u=m.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),p=null;d||(p=await hC(c,t,s)),n.push({source:c,resolved:p,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function hC(r,e,t){let s=Ds.dirname(e);if(r.startsWith("@/")){let o=Ds.join(t,"src",r.slice(2));return oy(o,t)}let n=Ds.resolve(s,r);return oy(n,t)}async function oy(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await iy.stat(n)).isFile())return Ds.relative(e,n)}catch{}}return null}async function yC(r,e){let t=[],s=Ds.basename(r,Ds.extname(r));try{let o=[`from ['"].*${s}['"]`,`from ['"]\\./${s}['"]`,`import\\(['"'].*${s}['"]`,`require\\(['"'].*${s}['"]`].join("|"),{stdout:i}=await L(`grep -r -l -E '${o}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),a=i.trim().split(`
1630
+ `).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function ay(r,e,t,s=0,n=new Set){let o={file:r,imports:[],depth:s};if(s>=t||n.has(r))return o;n.add(r);let i=await Ur(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await ay(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var ry,dC,mC,pC,gC,kd=S(()=>{"use strict";H();Ge();ry=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],dC=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],mC=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],pC={typescript:ry,javascript:ry,python:dC,go:mC},gC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Ur,"analyzeImports");l(fC,"extractImports");l(hC,"resolveImport");l(oy,"tryResolve");l(yC,"findImportedBy");l(ay,"buildDependencyTree")});import cy from"node:fs/promises";import ps from"node:path";async function xa(r,e=process.cwd()){let t=ps.isAbsolute(r)?r:ps.join(e,r),s;try{s=await cy.readFile(t,"utf-8")}catch(m){if(I(m))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Pn("")};throw m}let n=ps.extname(r).toLowerCase(),o=ly[n]||"unknown",i=await Js(r,e),a=await Ur(r,e),c=kC(s,o),u=i.signatures.filter(m=>m.exported).map(m=>({name:m.name,type:m.type,signature:m.signature,description:m.docstring?SC(m.docstring):void 0})),d=a.imports.filter(m=>!m.isExternal&&m.resolved).map(m=>m.resolved).slice(0,10),p=bC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Vi(s,p)}}async function Sd(r,e=process.cwd(),t={}){let s=ps.isAbsolute(r)?r:ps.join(e,r),n=[];async function o(i){let a=await cy.readdir(i,{withFileTypes:!0});for(let c of a){let u=ps.join(i,c.name),d=ps.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=ps.extname(c.name).toLowerCase();if(ly[p]){let m=await xa(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function kC(r,e){let t=wC[e]||[],s=r.split(`
1622
1631
  `);for(let o=0;o<Math.min(30,s.length);o++){let i=s[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<s.length&&a.start.test(s[u].trim());)c.push(s[u].trim().replace(a.start,"").trim()),u++;if(c.length>0)return c.slice(0,3).join(" ").trim()}else if(a.end){let c="",u=o;for(;u<s.length&&(c+=`${s[u]}
1623
1632
  `,!a.end.test(s[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
1624
1633
  `).map(p=>p.replace(/^\s*\*\s?/,"").trim()).filter(p=>p.length>0&&!p.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let n=r.split(`
1625
- `)[0]||"";return`Module: ${ds.basename(n,ds.extname(n))}`}function ZE(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1626
- `)[0].trim()}function eC(r,e,t){let s=[];if(s.push(`Purpose: ${r}`),s.push(""),e.length>0){s.push("Public API:");for(let n of e){let o=n.description?` - ${n.description}`:"";s.push(` ${n.type} ${n.name}: ${n.signature}${o}`)}s.push("")}return t.length>0&&s.push(`Dependencies: ${t.join(", ")}`),s.join(`
1627
- `)}var YE,Bh,zh=S(()=>{"use strict";H();sd();Li();Ni();YE={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},Bh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(wa,"summarizeFile");l(nd,"summarizeDirectory");l(QE,"extractFilePurpose");l(ZE,"extractDescriptionFromDocstring");l(eC,"buildSummaryText")});var qh={};we(qh,{analyzeImports:()=>Mr,extractDirectorySignatures:()=>Nl,extractSignatures:()=>Bs,findRelevantFiles:()=>xs,getRecentFiles:()=>go,runContextTool:()=>tC,summarizeDirectory:()=>nd,summarizeFile:()=>wa});async function tC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await sC(o,t);break;case"signatures":i=await nC(o,t);break;case"imports":i=await rC(o,t);break;case"recent":i=await oC(o,t);break;case"summary":i=await iC(o,t);break;case"help":return{tool:"error",result:{error:uC(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-s,c=aC(i),u=cC(i);return await lC(e,{tool:n,timestamp:v(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:k(i),code:"EXECUTION_ERROR"}}}}async function sC(r,e){let t={},s=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:s.push(r[i]);let n=s.join(" ");return n?{tool:"files",result:await xs(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function nC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Nl(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Ol(c.map(p=>p.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(p=>p.signatures.map(m=>({...m,file:p.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await Bs(t,e)}}async function rC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let s={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?s.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(s.depth=parseInt(r[++o],10));return{tool:"imports",result:await Mr(t,e,s)}}async function oC(r,e){let t={};for(let n=0;n<r.length;n++)r[n]==="--branch"||r[n]==="-b"?t.branch=!0:r[n]==="--max"&&r[n+1]?t.maxFiles=parseInt(r[++n],10):/^\d+$/.test(r[n])&&(t.commits=parseInt(r[n],10));return{tool:"recent",result:await go(e,t)}}async function iC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await nd(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(p=>({...p,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Ol(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await wa(t,e)}}function aC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.tokens.saved;case"files":return r.result.metrics.filesScanned*50-r.result.metrics.filesReturned*50;case"imports":return r.result.metrics.totalImports*20;case"recent":return r.result.metrics.totalFilesChanged*30;default:return 0}}function cC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.compression;case"files":{let e=r.result.metrics.filesScanned,t=r.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function lC(r,e){try{await Hs.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function uC(){return`
1634
+ `)[0]||"";return`Module: ${ps.basename(n,ps.extname(n))}`}function SC(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1635
+ `)[0].trim()}function bC(r,e,t){let s=[];if(s.push(`Purpose: ${r}`),s.push(""),e.length>0){s.push("Public API:");for(let n of e){let o=n.description?` - ${n.description}`:"";s.push(` ${n.type} ${n.name}: ${n.signature}${o}`)}s.push("")}return t.length>0&&s.push(`Dependencies: ${t.join(", ")}`),s.join(`
1636
+ `)}var wC,ly,uy=S(()=>{"use strict";H();kd();zi();qi();wC={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},ly={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(xa,"summarizeFile");l(Sd,"summarizeDirectory");l(kC,"extractFilePurpose");l(SC,"extractDescriptionFromDocstring");l(bC,"buildSummaryText")});var dy={};we(dy,{analyzeImports:()=>Ur,extractDirectorySignatures:()=>Yl,extractSignatures:()=>Js,findRelevantFiles:()=>As,getRecentFiles:()=>ko,runContextTool:()=>vC,summarizeDirectory:()=>Sd,summarizeFile:()=>xa});async function vC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await TC(o,t);break;case"signatures":i=await EC(o,t);break;case"imports":i=await CC(o,t);break;case"recent":i=await PC(o,t);break;case"summary":i=await xC(o,t);break;case"help":return{tool:"error",result:{error:IC(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-s,c=RC(i),u=AC(i);return await jC(e,{tool:n,timestamp:b(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:k(i),code:"EXECUTION_ERROR"}}}}async function TC(r,e){let t={},s=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:s.push(r[i]);let n=s.join(" ");return n?{tool:"files",result:await As(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function EC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Yl(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Xl(c.map(p=>p.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(p=>p.signatures.map(m=>({...m,file:p.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await Js(t,e)}}async function CC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let s={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?s.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(s.depth=parseInt(r[++o],10));return{tool:"imports",result:await Ur(t,e,s)}}async function PC(r,e){let t={};for(let n=0;n<r.length;n++)r[n]==="--branch"||r[n]==="-b"?t.branch=!0:r[n]==="--max"&&r[n+1]?t.maxFiles=parseInt(r[++n],10):/^\d+$/.test(r[n])&&(t.commits=parseInt(r[n],10));return{tool:"recent",result:await ko(e,t)}}async function xC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Sd(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(p=>({...p,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Xl(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await xa(t,e)}}function RC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.tokens.saved;case"files":return r.result.metrics.filesScanned*50-r.result.metrics.filesReturned*50;case"imports":return r.result.metrics.totalImports*20;case"recent":return r.result.metrics.totalFilesChanged*30;default:return 0}}function AC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.compression;case"files":{let e=r.result.metrics.filesScanned,t=r.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function jC(r,e){try{await Bs.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function IC(){return`
1628
1637
  Context Tools - Smart context filtering for AI agents
1629
1638
 
1630
1639
  USAGE:
@@ -1685,7 +1694,7 @@ TOOLS:
1685
1694
  OUTPUT:
1686
1695
  All tools output JSON for easy parsing by AI agents.
1687
1696
  Each output includes metrics showing token savings.
1688
- `.trim()}var Jh=S(()=>{"use strict";Si();H();K();po();sd();$l();Li();zh();Ni();l(tC,"runContextTool");l(sC,"runFilesTool");l(nC,"runSignaturesTool");l(rC,"runImportsTool");l(oC,"runRecentTool");l(iC,"runSummaryTool");l(aC,"getTokensSaved");l(cC,"getCompressionRate");l(lC,"recordToolUsage");l(uC,"getHelpText")});var Qh={};we(Qh,{hooksService:()=>yC});import Ye from"node:fs/promises";import Le from"node:path";import Ft from"chalk";function Xh(){return`#!/bin/sh
1697
+ `.trim()}var my=S(()=>{"use strict";Ri();H();K();wo();kd();zl();zi();uy();qi();l(vC,"runContextTool");l(TC,"runFilesTool");l(EC,"runSignaturesTool");l(CC,"runImportsTool");l(PC,"runRecentTool");l(xC,"runSummaryTool");l(RC,"getTokensSaved");l(AC,"getCompressionRate");l(jC,"recordToolUsage");l(IC,"getHelpText")});var hy={};we(hy,{hooksService:()=>LC});import Ze from"node:fs/promises";import Ue from"node:path";import Wt from"chalk";function gy(){return`#!/bin/sh
1689
1698
  # prjct auto-sync hook (post-commit)
1690
1699
  # Syncs project context after each commit
1691
1700
  # Installed by: prjct hooks install
@@ -1706,7 +1715,7 @@ if command -v prjct >/dev/null 2>&1; then
1706
1715
  fi
1707
1716
 
1708
1717
  exit 0
1709
- `}function Yh(){return`#!/bin/sh
1718
+ `}function fy(){return`#!/bin/sh
1710
1719
  # prjct auto-sync hook (post-checkout)
1711
1720
  # Syncs project context after branch switch
1712
1721
  # Installed by: prjct hooks install
@@ -1738,7 +1747,7 @@ if command -v prjct >/dev/null 2>&1; then
1738
1747
  fi
1739
1748
 
1740
1749
  exit 0
1741
- `}async function rd(r){let e=[];return(await E(Le.join(r,"lefthook.yml"))||await E(Le.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await E(Le.join(r,".husky"))||await E(Le.join(r,".husky","_")))&&e.push("husky"),await E(Le.join(r,".git"))&&e.push("direct"),e}function Kh(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function dC(r,e){let t=await E(Le.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",s=Le.join(r,t),n=await Ye.readFile(s,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(n.includes(a))continue;let c=`
1750
+ `}async function bd(r){let e=[];return(await E(Ue.join(r,"lefthook.yml"))||await E(Ue.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await E(Ue.join(r,".husky"))||await E(Ue.join(r,".husky","_")))&&e.push("husky"),await E(Ue.join(r,".git"))&&e.push("direct"),e}function py(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function DC(r,e){let t=await E(Ue.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",s=Ue.join(r,t),n=await Ze.readFile(s,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(n.includes(a))continue;let c=`
1742
1751
  ${i}:
1743
1752
  commands:
1744
1753
  ${a}:
@@ -1749,37 +1758,37 @@ ${i}:
1749
1758
  ${a}:
1750
1759
  run: prjct sync --quiet --yes
1751
1760
  fail_text: "prjct sync failed (non-blocking)"`):n=`${n.trimEnd()}
1752
- ${c}`}return await Ye.writeFile(s,n,"utf-8"),!0}async function mC(r,e){let t=Le.join(r,".husky");for(let s of e){let n=Le.join(t,s),o=s==="post-commit"?Xh():Yh();if(await E(n)){if((await Ye.readFile(n,"utf-8")).includes("prjct sync"))continue;await Ye.appendFile(n,`
1761
+ ${c}`}return await Ze.writeFile(s,n,"utf-8"),!0}async function $C(r,e){let t=Ue.join(r,".husky");for(let s of e){let n=Ue.join(t,s),o=s==="post-commit"?gy():fy();if(await E(n)){if((await Ze.readFile(n,"utf-8")).includes("prjct sync"))continue;await Ze.appendFile(n,`
1753
1762
  # prjct auto-sync
1754
1763
  prjct sync --quiet --yes &
1755
- `)}else await Ye.writeFile(n,o,{mode:493})}return!0}async function pC(r,e){let t=Le.join(r,".git","hooks");await E(t)||await Ye.mkdir(t,{recursive:!0});for(let s of e){let n=Le.join(t,s),o=s==="post-commit"?Xh():Yh();if(await E(n)){if((await Ye.readFile(n,"utf-8")).includes("prjct sync"))continue;await Ye.appendFile(n,`
1764
+ `)}else await Ze.writeFile(n,o,{mode:493})}return!0}async function MC(r,e){let t=Ue.join(r,".git","hooks");await E(t)||await Ze.mkdir(t,{recursive:!0});for(let s of e){let n=Ue.join(t,s),o=s==="post-commit"?gy():fy();if(await E(n)){if((await Ze.readFile(n,"utf-8")).includes("prjct sync"))continue;await Ze.appendFile(n,`
1756
1765
  # prjct auto-sync
1757
1766
  ${o.split(`
1758
1767
  `).slice(1).join(`
1759
- `)}`)}else await Ye.writeFile(n,o,{mode:493})}return!0}async function gC(r){let e=await E(Le.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Le.join(r,e);if(!await E(t))return!1;let s=await Ye.readFile(t,"utf-8");return s=s.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),s=s.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await Ye.writeFile(t,`${s.trimEnd()}
1760
- `,"utf-8"),!0}async function fC(r){let e=Le.join(r,".husky");for(let t of["post-commit","post-checkout"]){let s=Le.join(e,t);if(!await E(s))continue;let n=await Ye.readFile(s,"utf-8");if(!n.includes("prjct sync"))continue;let o=n.split(`
1768
+ `)}`)}else await Ze.writeFile(n,o,{mode:493})}return!0}async function _C(r){let e=await E(Ue.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Ue.join(r,e);if(!await E(t))return!1;let s=await Ze.readFile(t,"utf-8");return s=s.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),s=s.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await Ze.writeFile(t,`${s.trimEnd()}
1769
+ `,"utf-8"),!0}async function OC(r){let e=Ue.join(r,".husky");for(let t of["post-commit","post-checkout"]){let s=Ue.join(e,t);if(!await E(s))continue;let n=await Ze.readFile(s,"utf-8");if(!n.includes("prjct sync"))continue;let o=n.split(`
1761
1770
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1762
- `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await Ye.unlink(s):await Ye.writeFile(s,o,{mode:493})}return!0}async function hC(r){let e=Le.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let s=Le.join(e,t);if(!await E(s))continue;let n=await Ye.readFile(s,"utf-8");if(n.includes("prjct sync"))if(n.includes("Installed by: prjct hooks install"))await Ye.unlink(s);else{let o=n.split(`
1771
+ `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await Ze.unlink(s):await Ze.writeFile(s,o,{mode:493})}return!0}async function NC(r){let e=Ue.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let s=Ue.join(e,t);if(!await E(s))continue;let n=await Ze.readFile(s,"utf-8");if(n.includes("prjct sync"))if(n.includes("Installed by: prjct hooks install"))await Ze.unlink(s);else{let o=n.split(`
1763
1772
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1764
- `);await Ye.writeFile(s,o,{mode:493})}}return!0}var od,yC,Zh=S(()=>{"use strict";ve();ee();H();V();Je();l(Xh,"getPostCommitScript");l(Yh,"getPostCheckoutScript");l(rd,"detectHookManagers");l(Kh,"selectStrategy");l(dC,"installLefthook");l(mC,"installHusky");l(pC,"installDirect");l(gC,"uninstallLefthook");l(fC,"uninstallHusky");l(hC,"uninstallDirect");od=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await rd(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Kh(n);try{let i=!1;switch(o){case"lefthook":i=await dC(e,s);break;case"husky":i=await mC(e,s);break;case"direct":i=await pC(e,s);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:s,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?s:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:k(i)}}}async uninstall(e){try{let s=(await this.getHookConfig(e))?.strategy||"direct",n=!1;switch(s){case"lefthook":n=await gC(e);break;case"husky":n=await fC(e);break;case"direct":n=await hC(e);break}return n&&await this.saveHookConfig(e,{enabled:!1,strategy:s,hooks:[]}),{success:n}}catch(t){return{success:!1,error:k(t)}}}async status(e){let t=await rd(e),s=await this.getHookConfig(e),n=["post-commit","post-checkout"],o=await Promise.all(n.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,s?.strategy||null),path:await this.getHookPath(e,i,s?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:s?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await M.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await rd(e),s=Kh(t);console.log(` Strategy: ${Ft.cyan(s)}`),console.log(` Hooks: ${Ft.dim("post-commit, post-checkout")}`),console.log("");let n=await this.install(e,{strategy:s});if(n.success){f.done(`Hooks installed via ${n.strategy}`),console.log("");for(let o of n.hooksInstalled)console.log(` ${Ft.green("\u2713")} ${o}`);console.log(""),console.log(Ft.dim(" Context will auto-sync on commit and branch switch.")),console.log(Ft.dim(" Remove with: prjct hooks uninstall"))}else f.fail(n.error||"Failed to install hooks");return console.log(""),f.end(),n.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${Ft.green("Active")}`),console.log(` Strategy: ${Ft.cyan(t.strategy)}`)):console.log(` Status: ${Ft.dim("Not installed")}`),console.log("");for(let s of t.hooks){let n=s.installed?Ft.green("\u2713"):Ft.dim("\u25CB"),o=s.installed?s.name:Ft.dim(s.name);console.log(` ${n} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Ft.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Ft.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,s){if(s==="lefthook"){let o=await E(Le.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Le.join(e,o);return await E(i)?(await Ye.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(s==="husky"){let o=Le.join(e,".husky",t);return await E(o)?(await Ye.readFile(o,"utf-8")).includes("prjct sync"):!1}let n=Le.join(e,".git","hooks",t);return await E(n)?(await Ye.readFile(n,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,s){return s==="lefthook"?await E(Le.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":s==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await M.getProjectId(e);if(!t)return null;try{let s=x.getDoc(t,"project");return s&&s.hooks||null}catch{return null}}async saveHookConfig(e,t){let s=await M.getProjectId(e);if(s)try{let n=x.getDoc(s,"project")||{};n.hooks=t,x.setDoc(s,"project",n)}catch{}}},yC=new od});var ty={};we(ty,{DoctorService:()=>ka,doctorService:()=>kC});import{execSync as id}from"node:child_process";import wC from"node:fs/promises";import ey from"node:path";import Zs from"chalk";var ka,kC,sy=S(()=>{"use strict";ve();ke();sr();xt();V();uo();Je();nt();er();ka=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await M.getProjectId(e),this.projectId&&(this.globalPath=D.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),s=await this.checkProject(),n=this.generateRecommendations(t,s),o=[...t,...s].some(a=>a.status==="error"&&!a.optional),i=[...t,...s].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:s,recommendations:n,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,s,n,o){try{let a=id(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(s),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:n}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:n}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e.push(await this.checkMcpProvider("jira")),e.push(await this.checkMcpProvider("linear")),e}async checkPrjctConfig(){let e=ey.join(this.projectPath,".prjct","prjct.config.json");return await E(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=ey.join(this.globalPath,"context","CLAUDE.md");try{let t=await wC.stat(e),s=Date.now()-t.mtimeMs,n=Math.floor(s/(1e3*60*60)),o=Math.floor(n/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:n>0?i=`${n} hour${n>1?"s":""} ago`:i="recently",n>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{id("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=id("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let s=e.trim().split(`
1765
- `).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await Yt.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await tr({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkMcpProvider(e){try{if(!(await Ng(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await Lg(e);if(!s.valid){let o=s.autoFixed?" (auto-fixed)":"";return{name:`${e} mcp`,status:"warn",message:`config issues${o}: ${s.issues.join("; ")}`,optional:!0}}let n=await Fg(e);if(!n.ready){let o=n.cleaned?"corrupted tokens cleaned \u2014 re-run OAuth":n.migrated?"tokens migrated \u2014 restart AI client":"OAuth tokens missing/invalid";return{name:`${e} mcp`,status:"warn",message:o,optional:!0}}return{name:`${e} mcp`,status:"ok",message:`healthy${n.validated?" (validated)":""}`,optional:!0}}catch(t){return{name:`${e} mcp`,status:"error",message:`check failed: ${t instanceof Error?t.message:"unknown error"}`,optional:!0}}}generateRecommendations(e,t){let s=[];e.find(m=>m.name==="gh"&&m.status==="error")&&s.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(m=>m.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&s.push('Run "prjct sync" to update context');let i=t.find(m=>m.name==="prjct config");i?.status==="error"&&s.push('Run "prjct init" to initialize this project'),t.find(m=>m.name==="CLAUDE.md"&&m.status==="error")&&!i?.status?.includes("error")&&s.push('Run "prjct sync" to generate context files');let c=t.find(m=>m.name==="context7 mcp");c&&c.status!=="ok"&&s.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(m=>m.name==="codex p-router");u&&u.status==="error"&&s.push('Run "prjct start" or "prjct setup" to repair Codex p. router');let d=t.find(m=>m.name==="jira mcp");d&&d.status!=="ok"&&s.push('Run "prjct jira setup" to repair Jira MCP configuration');let p=t.find(m=>m.name==="linear mcp");return p&&p.status!=="ok"&&s.push('Run "prjct linear setup" to repair Linear MCP configuration'),s}printHeader(){f.section(`prjct doctor v${me}`)}printSection(e,t){f.section(e);let s=t.map(n=>{let o=this.getStatusIcon(n.status,n.optional),i=n.name.padEnd(14),a=n.version||n.message||"",c=n.optional&&n.status==="error"?Zs.dim(" (optional)"):"";return`${o} ${i} ${Zs.dim(a)}${c}`});for(let n of s)console.log(` ${n}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:Zs.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Zs.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return Zs.green("\u2713");case"warn":return Zs.yellow("\u26A0");case"error":return t?Zs.dim("\u25CB"):Zs.red("\u2717")}}},kC=new ka});var ny={};we(ny,{WatchService:()=>Sa,watchService:()=>EC});import SC from"node:path";import pt from"chalk";import bC from"chokidar";var vC,TC,Sa,EC,ry=S(()=>{"use strict";ve();H();K();Ri();vC=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],TC=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Sa=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await M.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=bC.watch(vC,{cwd:this.projectPath,ignored:TC,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",s=>this.handleChange("add",s)).on("change",s=>this.handleChange("change",s)).on("unlink",s=>this.handleChange("unlink",s)).on("error",s=>this.handleError(s)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(pt.dim(`
1766
- \u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let s=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(pt.dim(` ${s} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let s=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(pt.dim(` \u23F3 Rate limited, waiting ${Math.round(s/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),s);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=v().split("T")[1].split(".")[0];if(!this.options.quiet){let s=e.length===1?e[0]:`${e.length} files`;console.log(`
1767
- ${pt.dim(`[${t}]`)} ${pt.cyan("\u27F3")} ${s} changed \u2192 syncing...`)}try{let s=await Ps.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,s.success?this.options.quiet||console.log(`${pt.dim(`[${t}]`)} ${pt.green("\u2713")} Synced`):console.error(`${pt.dim(`[${t}]`)} ${pt.red("\u2717")} Sync failed: ${s.error}`)}catch(s){console.error(`${pt.dim(`[${t}]`)} ${pt.red("\u2717")} Error: ${k(s)}`)}}handleError(e){console.error(pt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(pt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(pt.dim(` Project: ${SC.basename(this.projectPath)}`)),console.log(pt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(pt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(pt.dim(" Press Ctrl+C to stop")),console.log("")}},EC=new Sa});var dy={};we(dy,{formatAgentCommandHelp:()=>cy,formatCommandHelp:()=>ly,formatCommandList:()=>uy,formatMainHelp:()=>iy,formatTerminalCommandHelp:()=>ay,getHelp:()=>PC});import X from"chalk";function iy(){let r=[];r.push(""),r.push(`${X.cyan.bold("prjct")} v${me} - Context layer for AI coding agents`),r.push(X.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(X.bold("QUICK START")),r.push(X.dim("\u2500".repeat(60))),r.push(` ${X.green("1.")} prjct start ${X.dim("# Configure AI providers")}`),r.push(` ${X.green("2.")} cd my-project && prjct init`),r.push(` ${X.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${X.green("4.")} p. sync ${X.dim("# Analyze project")}`),r.push(""),r.push(X.bold("TERMINAL COMMANDS")),r.push(X.dim("\u2500".repeat(60)));for(let t of oy){let s=`prjct ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(""),r.push(`${X.bold("AI AGENT COMMANDS")} ${X.dim("(inside Claude/Gemini/Cursor)")}`),r.push(X.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${X.dim("\u2500".repeat(56))}`);let e=Pr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let s=`p. ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(` ${X.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(X.bold("FLAGS")),r.push(X.dim("\u2500".repeat(60)));for(let t of CC)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(X.bold("MORE INFO")),r.push(X.dim("\u2500".repeat(60))),r.push(` Documentation: ${X.cyan("https://prjct.app")}`),r.push(` GitHub: ${X.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
1768
- `)}function ay(r){let e=oy.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${X.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(X.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(X.bold("OPTIONS"));for(let s of e.options)t.push(` ${s}`);t.push("")}if(e.subcommands){t.push(X.bold("SUBCOMMANDS"));for(let s of e.subcommands)t.push(` ${s}`);t.push("")}return t.join(`
1769
- `)}function cy(r){let e=Pr.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${X.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(X.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(X.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(X.bold("FEATURES"));for(let n of e.features)t.push(` \u2022 ${n}`);t.push("")}e.blockingRules&&(t.push(X.bold("REQUIREMENTS")),t.push(` ${X.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let s=bo[e.group];return s&&(t.push(X.dim(`Category: ${s.title}`)),e.isOptional&&t.push(X.dim("This is an optional command.")),t.push("")),t.join(`
1770
- `)}function ly(r){let e=ay(r);if(e)return e;let t=cy(r);return t||`
1773
+ `);await Ze.writeFile(s,o,{mode:493})}}return!0}var vd,LC,yy=S(()=>{"use strict";Ee();se();H();B();Ve();l(gy,"getPostCommitScript");l(fy,"getPostCheckoutScript");l(bd,"detectHookManagers");l(py,"selectStrategy");l(DC,"installLefthook");l($C,"installHusky");l(MC,"installDirect");l(_C,"uninstallLefthook");l(OC,"uninstallHusky");l(NC,"uninstallDirect");vd=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await bd(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||py(n);try{let i=!1;switch(o){case"lefthook":i=await DC(e,s);break;case"husky":i=await $C(e,s);break;case"direct":i=await MC(e,s);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:s,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?s:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:k(i)}}}async uninstall(e){try{let s=(await this.getHookConfig(e))?.strategy||"direct",n=!1;switch(s){case"lefthook":n=await _C(e);break;case"husky":n=await OC(e);break;case"direct":n=await NC(e);break}return n&&await this.saveHookConfig(e,{enabled:!1,strategy:s,hooks:[]}),{success:n}}catch(t){return{success:!1,error:k(t)}}}async status(e){let t=await bd(e),s=await this.getHookConfig(e),n=["post-commit","post-checkout"],o=await Promise.all(n.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,s?.strategy||null),path:await this.getHookPath(e,i,s?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:s?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await _.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await bd(e),s=py(t);console.log(` Strategy: ${Wt.cyan(s)}`),console.log(` Hooks: ${Wt.dim("post-commit, post-checkout")}`),console.log("");let n=await this.install(e,{strategy:s});if(n.success){f.done(`Hooks installed via ${n.strategy}`),console.log("");for(let o of n.hooksInstalled)console.log(` ${Wt.green("\u2713")} ${o}`);console.log(""),console.log(Wt.dim(" Context will auto-sync on commit and branch switch.")),console.log(Wt.dim(" Remove with: prjct hooks uninstall"))}else f.fail(n.error||"Failed to install hooks");return console.log(""),f.end(),n.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${Wt.green("Active")}`),console.log(` Strategy: ${Wt.cyan(t.strategy)}`)):console.log(` Status: ${Wt.dim("Not installed")}`),console.log("");for(let s of t.hooks){let n=s.installed?Wt.green("\u2713"):Wt.dim("\u25CB"),o=s.installed?s.name:Wt.dim(s.name);console.log(` ${n} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Wt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Wt.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,s){if(s==="lefthook"){let o=await E(Ue.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Ue.join(e,o);return await E(i)?(await Ze.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(s==="husky"){let o=Ue.join(e,".husky",t);return await E(o)?(await Ze.readFile(o,"utf-8")).includes("prjct sync"):!1}let n=Ue.join(e,".git","hooks",t);return await E(n)?(await Ze.readFile(n,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,s){return s==="lefthook"?await E(Ue.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":s==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await _.getProjectId(e);if(!t)return null;try{let s=x.getDoc(t,"project");return s&&s.hooks||null}catch{return null}}async saveHookConfig(e,t){let s=await _.getProjectId(e);if(s)try{let n=x.getDoc(s,"project")||{};n.hooks=t,x.setDoc(s,"project",n)}catch{}}},LC=new vd});var ky={};we(ky,{DoctorService:()=>Ra,doctorService:()=>UC});import{execSync as Td}from"node:child_process";import FC from"node:fs/promises";import wy from"node:path";import sn from"chalk";var Ra,UC,Sy=S(()=>{"use strict";Ee();Te();ir();Pt();B();ho();Ve();ot();rr();Ra=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await _.getProjectId(e),this.projectId&&(this.globalPath=j.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),s=await this.checkProject(),n=this.generateRecommendations(t,s),o=[...t,...s].some(a=>a.status==="error"&&!a.optional),i=[...t,...s].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:s,recommendations:n,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,s,n,o){try{let a=Td(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(s),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:n}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:n}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e.push(await this.checkMcpProvider("jira")),e.push(await this.checkMcpProvider("linear")),e}async checkPrjctConfig(){let e=wy.join(this.projectPath,".prjct","prjct.config.json");return await E(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=wy.join(this.globalPath,"context","CLAUDE.md");try{let t=await FC.stat(e),s=Date.now()-t.mtimeMs,n=Math.floor(s/(1e3*60*60)),o=Math.floor(n/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:n>0?i=`${n} hour${n>1?"s":""} ago`:i="recently",n>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{Td("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=Td("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let s=e.trim().split(`
1774
+ `).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await F.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await Zt.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await or({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkMcpProvider(e){try{if(!(await ef(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await tf(e);if(!s.valid){let o=s.autoFixed?" (auto-fixed)":"";return{name:`${e} mcp`,status:"warn",message:`config issues${o}: ${s.issues.join("; ")}`,optional:!0}}let n=await sf(e);if(!n.ready){let o=n.cleaned?"corrupted tokens cleaned \u2014 re-run OAuth":n.migrated?"tokens migrated \u2014 restart AI client":"OAuth tokens missing/invalid";return{name:`${e} mcp`,status:"warn",message:o,optional:!0}}return{name:`${e} mcp`,status:"ok",message:`healthy${n.validated?" (validated)":""}`,optional:!0}}catch(t){return{name:`${e} mcp`,status:"error",message:`check failed: ${t instanceof Error?t.message:"unknown error"}`,optional:!0}}}generateRecommendations(e,t){let s=[];e.find(m=>m.name==="gh"&&m.status==="error")&&s.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(m=>m.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&s.push('Run "prjct sync" to update context');let i=t.find(m=>m.name==="prjct config");i?.status==="error"&&s.push('Run "prjct init" to initialize this project'),t.find(m=>m.name==="CLAUDE.md"&&m.status==="error")&&!i?.status?.includes("error")&&s.push('Run "prjct sync" to generate context files');let c=t.find(m=>m.name==="context7 mcp");c&&c.status!=="ok"&&s.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(m=>m.name==="codex p-router");u&&u.status==="error"&&s.push('Run "prjct start" or "prjct setup" to repair Codex p. router');let d=t.find(m=>m.name==="jira mcp");d&&d.status!=="ok"&&s.push('Run "prjct jira setup" to repair Jira MCP configuration');let p=t.find(m=>m.name==="linear mcp");return p&&p.status!=="ok"&&s.push('Run "prjct linear setup" to repair Linear MCP configuration'),s}printHeader(){f.section(`prjct doctor v${ge}`)}printSection(e,t){f.section(e);let s=t.map(n=>{let o=this.getStatusIcon(n.status,n.optional),i=n.name.padEnd(14),a=n.version||n.message||"",c=n.optional&&n.status==="error"?sn.dim(" (optional)"):"";return`${o} ${i} ${sn.dim(a)}${c}`});for(let n of s)console.log(` ${n}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:sn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(sn.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return sn.green("\u2713");case"warn":return sn.yellow("\u26A0");case"error":return t?sn.dim("\u25CB"):sn.red("\u2717")}}},UC=new Ra});var by={};we(by,{WatchService:()=>Aa,watchService:()=>VC});import HC from"node:path";import ft from"chalk";import WC from"chokidar";var GC,BC,Aa,VC,vy=S(()=>{"use strict";Ee();H();K();Oi();GC=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],BC=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Aa=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await _.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=WC.watch(GC,{cwd:this.projectPath,ignored:BC,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",s=>this.handleChange("add",s)).on("change",s=>this.handleChange("change",s)).on("unlink",s=>this.handleChange("unlink",s)).on("error",s=>this.handleError(s)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(ft.dim(`
1775
+ \u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let s=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(ft.dim(` ${s} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let s=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(ft.dim(` \u23F3 Rate limited, waiting ${Math.round(s/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),s);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=b().split("T")[1].split(".")[0];if(!this.options.quiet){let s=e.length===1?e[0]:`${e.length} files`;console.log(`
1776
+ ${ft.dim(`[${t}]`)} ${ft.cyan("\u27F3")} ${s} changed \u2192 syncing...`)}try{let s=await Rs.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,s.success?this.options.quiet||console.log(`${ft.dim(`[${t}]`)} ${ft.green("\u2713")} Synced`):console.error(`${ft.dim(`[${t}]`)} ${ft.red("\u2717")} Sync failed: ${s.error}`)}catch(s){console.error(`${ft.dim(`[${t}]`)} ${ft.red("\u2717")} Error: ${k(s)}`)}}handleError(e){console.error(ft.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(ft.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(ft.dim(` Project: ${HC.basename(this.projectPath)}`)),console.log(ft.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(ft.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(ft.dim(" Press Ctrl+C to stop")),console.log("")}},VC=new Aa});var Ay={};we(Ay,{formatAgentCommandHelp:()=>Py,formatCommandHelp:()=>xy,formatCommandList:()=>Ry,formatMainHelp:()=>Ey,formatTerminalCommandHelp:()=>Cy,getHelp:()=>zC});import X from"chalk";function Ey(){let r=[];r.push(""),r.push(`${X.cyan.bold("prjct")} v${ge} - Context layer for AI coding agents`),r.push(X.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(X.bold("QUICK START")),r.push(X.dim("\u2500".repeat(60))),r.push(` ${X.green("1.")} prjct start ${X.dim("# Configure AI providers")}`),r.push(` ${X.green("2.")} cd my-project && prjct init`),r.push(` ${X.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${X.green("4.")} p. sync ${X.dim("# Analyze project")}`),r.push(""),r.push(X.bold("TERMINAL COMMANDS")),r.push(X.dim("\u2500".repeat(60)));for(let t of Ty){let s=`prjct ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(""),r.push(`${X.bold("AI AGENT COMMANDS")} ${X.dim("(inside Claude/Gemini/Cursor)")}`),r.push(X.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${X.dim("\u2500".repeat(56))}`);let e=Dr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let s=`p. ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(` ${X.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(X.bold("FLAGS")),r.push(X.dim("\u2500".repeat(60)));for(let t of qC)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(X.bold("MORE INFO")),r.push(X.dim("\u2500".repeat(60))),r.push(` Documentation: ${X.cyan("https://prjct.app")}`),r.push(` GitHub: ${X.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
1777
+ `)}function Cy(r){let e=Ty.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${X.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(X.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(X.bold("OPTIONS"));for(let s of e.options)t.push(` ${s}`);t.push("")}if(e.subcommands){t.push(X.bold("SUBCOMMANDS"));for(let s of e.subcommands)t.push(` ${s}`);t.push("")}return t.join(`
1778
+ `)}function Py(r){let e=Dr.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${X.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(X.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(X.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(X.bold("FEATURES"));for(let n of e.features)t.push(` \u2022 ${n}`);t.push("")}e.blockingRules&&(t.push(X.bold("REQUIREMENTS")),t.push(` ${X.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let s=Po[e.group];return s&&(t.push(X.dim(`Category: ${s.title}`)),e.isOptional&&t.push(X.dim("This is an optional command.")),t.push("")),t.join(`
1779
+ `)}function xy(r){let e=Cy(r);if(e)return e;let t=Py(r);return t||`
1771
1780
  ${X.yellow(`Command '${r}' not found.`)}
1772
1781
 
1773
1782
  Run 'prjct help' to see all available commands.
1774
- `}function uy(){let r=[];r.push(""),r.push(X.cyan.bold("All Commands")),r.push("");let e=Object.entries(bo).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=Pr.filter(o=>o.group===t);if(n.length!==0){r.push(`${X.bold(s.title)} ${X.dim(`(${n.length} commands)`)}`),r.push(X.dim(s.description)),r.push("");for(let o of n){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(X.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1775
- `)}function PC(r){return r?r==="commands"||r==="all"?uy():ly(r):iy()}var oy,CC,my=S(()=>{"use strict";Zu();nt();oy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],CC=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(iy,"formatMainHelp");l(ay,"formatTerminalCommandHelp");l(cy,"formatAgentCommandHelp");l(ly,"formatCommandHelp");l(uy,"formatCommandList");l(PC,"getHelp")});var py=by((cB,xC)=>{xC.exports={name:"prjct-cli",version:"1.52.3",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@modelcontextprotocol/sdk":"^1.27.1","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=18.0.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var _C={};import gy from"node:os";import ba from"node:path";import Fe from"chalk";async function RC(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>vy(py()));await $C(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(MC(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=W.getByName(r);if(!s){let m=jC(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(gn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=IC(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=AC(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await M.getProjectId(process.cwd()),c&&(await Ns.expireIfStale(c),await Ns.touch(c))}catch{}let d=new Xs,p;if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth")}[r];if(b)p=await b(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Ns.trackCommand(c,r,m)}catch{}try{await fn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await fn.recordTiming(c,"startup_time",w)}await fn.recordMemory(c,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(ja(s)),t||f.end(),process.exit(1)}}function AC(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return gn("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function jC(r){let e=W.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=DC(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function DC(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function IC(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function $C(r){let e=await hs(),t=ba.join(gy.homedir(),".claude","commands","p.md"),s=ba.join(gy.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([E(t),E(s),E(ba.join(process.cwd(),".cursor","commands","sync.md")),E(ba.join(process.cwd(),".cursor"))]),c=await Mn();if(console.log(`
1776
- ${Fe.cyan("p/")} prjct v${r}
1777
- ${Fe.dim("Context layer for AI coding agents")}
1778
-
1779
- ${Fe.dim("Providers:")}`),e.claude.installed){let u=n?Fe.green("\u2713 ready"):Fe.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${Fe.dim(d)}`)}else console.log(` Claude Code ${Fe.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?Fe.green("\u2713 ready"):Fe.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${Fe.dim(d)}`)}else console.log(` Gemini CLI ${Fe.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?Fe.green("\u2713 ready"):Fe.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${Fe.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${Fe.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${Fe.green("\u2713 ready")} ${Fe.dim("(use /sync, /task)")}`:a?` Cursor IDE ${Fe.yellow("\u25CF detected")} ${Fe.dim("(run prjct init)")}`:` Cursor IDE ${Fe.dim("\u25CB no .cursor/ folder")}`),console.log(`
1780
- ${Fe.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1781
- ${Fe.cyan("https://prjct.app")}
1782
- `)}function MC(){console.log(`
1783
+ `}function Ry(){let r=[];r.push(""),r.push(X.cyan.bold("All Commands")),r.push("");let e=Object.entries(Po).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=Dr.filter(o=>o.group===t);if(n.length!==0){r.push(`${X.bold(s.title)} ${X.dim(`(${n.length} commands)`)}`),r.push(X.dim(s.description)),r.push("");for(let o of n){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(X.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1784
+ `)}function zC(r){return r?r==="commands"||r==="all"?Ry():xy(r):Ey()}var Ty,qC,jy=S(()=>{"use strict";fd();ot();Ty=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],qC=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(Ey,"formatMainHelp");l(Cy,"formatTerminalCommandHelp");l(Py,"formatAgentCommandHelp");l(xy,"formatCommandHelp");l(Ry,"formatCommandList");l(zC,"getHelp")});var Iy=Uy((YV,JC)=>{JC.exports={name:"prjct-cli",version:"1.53.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@modelcontextprotocol/sdk":"^1.28.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=18.0.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var sP={};import Dy from"node:os";import ja from"node:path";import He from"chalk";async function KC(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>Hy(Iy()));await eP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(tP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=W.getByName(r);if(!s){let m=YC(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(yn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=ZC(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=XC(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await _.getProjectId(process.cwd()),c&&(await Us.expireIfStale(c),await Us.touch(c))}catch{}let d=new Zs,p;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let m=n.slice(1).join(" ");p=await d.parallelSpawn(m,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let m=n.slice(1);m.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),p=await d.parallelBatch(m,process.cwd())}else if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,v={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor")}[r];if(v)p=await v(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Us.trackCommand(c,r,m)}catch{}try{await wn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await wn.recordTiming(c,"startup_time",w)}await wn.recordMemory(c,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(Ga(s)),t||f.end(),process.exit(1)}}function XC(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return yn("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function YC(r){let e=W.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=QC(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function QC(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function ZC(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function eP(r){let e=await ws(),t=ja.join(Dy.homedir(),".claude","commands","p.md"),s=ja.join(Dy.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([E(t),E(s),E(ja.join(process.cwd(),".cursor","commands","sync.md")),E(ja.join(process.cwd(),".cursor"))]),c=await Ln();if(console.log(`
1785
+ ${He.cyan("p/")} prjct v${r}
1786
+ ${He.dim("Context layer for AI coding agents")}
1787
+
1788
+ ${He.dim("Providers:")}`),e.claude.installed){let u=n?He.green("\u2713 ready"):He.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${He.dim(d)}`)}else console.log(` Claude Code ${He.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?He.green("\u2713 ready"):He.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${He.dim(d)}`)}else console.log(` Gemini CLI ${He.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?He.green("\u2713 ready"):He.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${He.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${He.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${He.green("\u2713 ready")} ${He.dim("(use /sync, /task)")}`:a?` Cursor IDE ${He.yellow("\u25CF detected")} ${He.dim("(run prjct init)")}`:` Cursor IDE ${He.dim("\u25CB no .cursor/ folder")}`),console.log(`
1789
+ ${He.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1790
+ ${He.cyan("https://prjct.app")}
1791
+ `)}function tP(){console.log(`
1783
1792
  prjct - Context layer for AI coding agents
1784
1793
  Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
1785
1794
 
@@ -1838,11 +1847,11 @@ MORE INFO
1838
1847
  ---------
1839
1848
  Documentation: https://prjct.app
1840
1849
  GitHub: https://github.com/jlopezlira/prjct-cli
1841
- `)}var fy=S(()=>{"use strict";Qu();ho();td();st();ve();Yo();Xo();H();qr();V();Je();l(RC,"main");l(AC,"validateCommandParams");l(jC,"findClosestCommand");l(DC,"editDistance");l(IC,"parseCommandArgs");l($C,"displayVersion");l(MC,"displayHelp");RC().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(ja(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var _r=process.argv.slice(2),ad=_r.find(r=>!r.startsWith("--")&&!r.startsWith("-")),OC=new Set(["daemon","stop","restart","start","setup","update","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","jira","help","-h","--help","version","-v","--version"]);if(ad&&!OC.has(ad)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Po(),ld)),t=e.socket();if(r.existsSync(t)){let{sendRequest:s}=await Promise.resolve().then(()=>(ps(),ms)),n=await import("node:crypto"),o=[],i={};for(let a=0;a<_r.length;a++){let c=_r[a];if(c.startsWith("--")){let u=c.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<_r.length&&!_r[a+1].startsWith("--")?i[u]=_r[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await s({id:n.randomUUID(),command:ad,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch{}}}async function NC(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:s}=await Promise.resolve().then(()=>(st(),It)),n=(await Promise.resolve().then(()=>(ve(),Ld))).default,o=(await Promise.resolve().then(()=>(Fo(),Ud))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(dc(),gm)),{fileExists:c}=await Promise.resolve().then(()=>(V(),Dt)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(_a(),Pd)),{VERSION:d}=await Promise.resolve().then(()=>(nt(),Ln));async function p(){let T=r.homedir(),$=await s();if($.claude.installed){let j=e.join(T,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(R=>R.readFile(j,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if($.gemini.installed){let j=e.join(T,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(R=>R.readFile(j,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!$.claude.installed&&!$.gemini.installed,!0}l(p,"checkRoutersInstalled");let m=process.argv.slice(2),g=m.findIndex(T=>T==="--quiet"||T==="-q"),w=g!==-1;if(w){m.splice(g,1);let{setQuietMode:T}=await Promise.resolve().then(()=>(Je(),km));T(!0)}let b=m.indexOf("--refresh"),h=b!==-1;h&&(m.splice(b,1),await u());async function P(T){let $=Date.now();try{let j=await n.getProjectId(process.cwd());if(j){let{sessionTracker:y}=await Promise.resolve().then(()=>(Xo(),vm));return await y.expireIfStale(j),await y.touch(j),()=>{let R=Date.now()-$;y.trackCommand(j,T,R).catch(()=>{}),Promise.resolve().then(()=>(Yo(),Em)).then(({performanceTracker:O})=>{O.recordTiming(j,"command_duration",R,{command:T}).catch(()=>{}),O.recordMemory(j,{command:T}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(P,"trackSession"),m[0]==="daemon"){let T=m[1]||"status";if(T==="start"){let{isDaemonRunning:$,spawnDaemon:j}=await Promise.resolve().then(()=>(ps(),ms));if(await $())console.log("Daemon is already running."),process.exitCode=0;else if(m.includes("--foreground")||m.includes("-f")){let{startDaemon:R}=await Promise.resolve().then(()=>(_h(),Mh)),O=parseInt(m.find(oe=>oe.startsWith("--port="))?.split("=")[1]||"",10)||void 0,G=m.includes("--no-http");await R({port:O,noHttp:G,foreground:!0})}else await j()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(T==="stop"){let{isDaemonRunning:$,stopDaemon:j}=await Promise.resolve().then(()=>(ps(),ms));if(await $()){let y=await j();console.log(y?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=y?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(T==="status"){let{getDaemonStatus:$}=await Promise.resolve().then(()=>(ps(),ms)),j=await $();if(j.running){let y=j.uptime?Math.round(j.uptime/1e3):0,R=j.stale;console.log(`Daemon running (PID ${j.pid})${R?" \u26A0 STALE":""}`),console.log(` Uptime: ${y}s`),console.log(` Commands served: ${j.commandsServed??0}`),j.lastActivity&&console.log(` Last activity: ${j.lastActivity}`),R&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${T}. Use: start, stop, status`),process.exitCode=1}else if(m[0]==="stop"){let{isDaemonRunning:T,stopDaemon:$,forceKillDaemon:j}=await Promise.resolve().then(()=>(ps(),ms));if(m.includes("--force")||m.includes("-f")){let R=j();console.log(R?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await T()?await $()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),j(),console.log("Daemon force-killed."),process.exitCode=0):(j(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(m[0]==="restart"){let{isDaemonRunning:T,stopDaemon:$,forceKillDaemon:j,spawnDaemon:y}=await Promise.resolve().then(()=>(ps(),ms));await T()?(await $()||j(),await new Promise(G=>setTimeout(G,300))):j(),await y()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(m[0]==="start"||m[0]==="setup"){let{runStart:T}=await Promise.resolve().then(()=>(Fh(),Lh));await T()}else if(m[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(m[0]==="web"||m[0]==="serve")try{let T=process.cwd(),$=await n.getProjectId(T);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let j=parseInt(m[1],10)||i;await a($,T,j)}}catch(T){console.error("Server error:",T.message),process.exitCode=1}else if(m[0]==="context"){let T=process.cwd(),$=await n.getProjectId(T);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let j=await P("context"),y=m.slice(1).filter(O=>O!=="--md"&&O!=="--json"),R=m.includes("--md");if(y.length===0){let{ContextCommands:O}=await Promise.resolve().then(()=>(sa(),Gf)),oe=await new O().context(null,T,{md:R});process.exitCode=oe.success?0:1}else{let{runContextTool:O}=await Promise.resolve().then(()=>(Jh(),qh)),G=await O(y,$,T);console.log(JSON.stringify(G,null,2)),process.exitCode=G.tool==="error"?1:0}j()}}else if(m[0]==="hooks"){let T=await P("hooks"),{hooksService:$}=await Promise.resolve().then(()=>(Zh(),Qh)),j=m[1]||"status",y=await $.run(process.cwd(),j);process.exitCode=y,T()}else if(m[0]==="doctor"){let T=await P("doctor"),{doctorService:$}=await Promise.resolve().then(()=>(sy(),ty)),j=await $.run(process.cwd());process.exitCode=j,T()}else if(m[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(ed(),jh)),$=m.includes("--force")||m.includes("-f"),j=m.includes("--backup")||m.includes("-b"),y=m.includes("--dry-run")||m.includes("-n"),R=m.includes("--keep-package"),O=await T({force:$,backup:j,dryRun:y,keepPackage:R});process.exitCode=O.success?0:1}else if(m[0]==="watch"){let T=process.cwd();if(!await n.getProjectId(T))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:j}=await Promise.resolve().then(()=>(ry(),ny)),y=m.includes("--verbose")||m.includes("-v"),R=m.find(Ie=>Ie.startsWith("--debounce=")),O=R?parseInt(R.split("=")[1],10):void 0,G=m.find(Ie=>Ie.startsWith("--interval=")),oe=G?parseInt(G.split("=")[1],10)*1e3:void 0,gt=await j.start(T,{verbose:y,quiet:w,debounceMs:O,minIntervalMs:oe});gt.success||(console.error(gt.error),process.exitCode=1)}}else if(m[0]==="linear"){let{spawn:T}=await import("node:child_process"),$=await import("node:fs"),j=process.cwd(),y=e.join(__dirname,"..","core","cli","linear.ts"),R=e.join(__dirname,"..","dist","cli","linear.mjs"),O=e.join(__dirname,"..","cli","linear.mjs"),G,oe;if($.existsSync(y)?(G=y,oe="bun"):$.existsSync(O)?(G=O,oe="node"):$.existsSync(R)?(G=R,oe="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",oe=""),G){let gt=[...m.slice(1)];T(oe,[G,...gt],{stdio:"inherit",cwd:j}).on("close",Pt=>{process.exitCode=Pt||0})}}else if(m[0]==="jira"){let{spawn:T}=await import("node:child_process"),$=await import("node:fs"),j=process.cwd(),y=e.join(__dirname,"..","core","cli","jira.ts"),R=e.join(__dirname,"..","dist","cli","jira.mjs"),O=e.join(__dirname,"..","cli","jira.mjs"),G,oe;if($.existsSync(y)?(G=y,oe="bun"):$.existsSync(O)?(G=O,oe="node"):$.existsSync(R)?(G=R,oe="node"):(console.error('Jira CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",oe=""),G){let gt=[...m.slice(1)];T(oe,[G,...gt],{stdio:"inherit",cwd:j}).on("close",Pt=>{process.exitCode=Pt||0})}}else if(m[0]==="help"||m[0]==="-h"||m[0]==="--help"){let{getHelp:T}=await Promise.resolve().then(()=>(my(),dy)),$=m[1];console.log(T($)),process.exitCode=0}else if(m[0]==="version"||m[0]==="-v"||m[0]==="--version"){let T=await s(h),$=r.homedir(),j=process.cwd(),[y,R,O,G,oe,gt]=await Promise.all([c(e.join($,".claude","commands","p.md")),c(e.join($,".gemini","commands","p.toml")),c(e.join(j,".cursor")),c(e.join(j,".cursor","rules","prjct.mdc")),c(e.join(j,".windsurf")),c(e.join(j,".windsurf","rules","prjct.md"))]);if(console.log(`
1850
+ `)}var $y=S(()=>{"use strict";gd();bo();wd();rt();Ee();oi();ri();H();Qr();B();Ve();l(KC,"main");l(XC,"validateCommandParams");l(YC,"findClosestCommand");l(QC,"editDistance");l(ZC,"parseCommandArgs");l(eP,"displayVersion");l(tP,"displayHelp");KC().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(Ga(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var Hr=process.argv.slice(2),Ed=Hr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),nP=new Set(["daemon","stop","restart","start","setup","update","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","jira","help","-h","--help","version","-v","--version"]);if(Ed&&!nP.has(Ed)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Io(),Pd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:s}=await Promise.resolve().then(()=>(fs(),gs)),n=await import("node:crypto"),o=[],i={};for(let a=0;a<Hr.length;a++){let c=Hr[a];if(c.startsWith("--")){let u=c.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<Hr.length&&!Hr[a+1].startsWith("--")?i[u]=Hr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await s({id:n.randomUUID(),command:Ed,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch{}}}async function rP(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:s}=await Promise.resolve().then(()=>(rt(),Mt)),n=(await Promise.resolve().then(()=>(Ee(),nm))).default,o=(await Promise.resolve().then(()=>(Vo(),om))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(Pc(),Im)),{fileExists:c}=await Promise.resolve().then(()=>(B(),$t)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ja(),Gd)),{VERSION:d}=await Promise.resolve().then(()=>(ot(),Wn));async function p(){let T=r.homedir(),$=await s();if($.claude.installed){let M=e.join(T,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(R=>R.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if($.gemini.installed){let M=e.join(T,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(R=>R.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!$.claude.installed&&!$.gemini.installed,!0}l(p,"checkRoutersInstalled");let m=process.argv.slice(2),g=m.findIndex(T=>T==="--quiet"||T==="-q"),w=g!==-1;if(w){m.splice(g,1);let{setQuietMode:T}=await Promise.resolve().then(()=>(Ve(),Om));T(!0)}let v=m.indexOf("--refresh"),h=v!==-1;h&&(m.splice(v,1),await u());async function P(T){let $=Date.now();try{let M=await n.getProjectId(process.cwd());if(M){let{sessionTracker:y}=await Promise.resolve().then(()=>(ri(),Fm));return await y.expireIfStale(M),await y.touch(M),()=>{let R=Date.now()-$;y.trackCommand(M,T,R).catch(()=>{}),Promise.resolve().then(()=>(oi(),Hm)).then(({performanceTracker:D})=>{D.recordTiming(M,"command_duration",R,{command:T}).catch(()=>{}),D.recordMemory(M,{command:T}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(P,"trackSession"),m[0]==="daemon"){let T=m[1]||"status";if(T==="start"){let{isDaemonRunning:$,spawnDaemon:M}=await Promise.resolve().then(()=>(fs(),gs));if(await $())console.log("Daemon is already running."),process.exitCode=0;else if(m.includes("--foreground")||m.includes("-f")){let{startDaemon:R}=await Promise.resolve().then(()=>(Zh(),Qh)),D=parseInt(m.find(Y=>Y.startsWith("--port="))?.split("=")[1]||"",10)||void 0,G=m.includes("--no-http");await R({port:D,noHttp:G,foreground:!0})}else await M()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(T==="stop"){let{isDaemonRunning:$,stopDaemon:M}=await Promise.resolve().then(()=>(fs(),gs));if(await $()){let y=await M();console.log(y?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=y?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(T==="status"){let{getDaemonStatus:$}=await Promise.resolve().then(()=>(fs(),gs)),M=await $();if(M.running){let y=M.uptime?Math.round(M.uptime/1e3):0,R=M.stale;console.log(`Daemon running (PID ${M.pid})${R?" \u26A0 STALE":""}`),console.log(` Uptime: ${y}s`),console.log(` Commands served: ${M.commandsServed??0}`),M.lastActivity&&console.log(` Last activity: ${M.lastActivity}`),R&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${T}. Use: start, stop, status`),process.exitCode=1}else if(m[0]==="stop"){let{isDaemonRunning:T,stopDaemon:$,forceKillDaemon:M}=await Promise.resolve().then(()=>(fs(),gs));if(m.includes("--force")||m.includes("-f")){let R=M();console.log(R?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await T()?await $()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),M(),console.log("Daemon force-killed."),process.exitCode=0):(M(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(m[0]==="restart"){let{isDaemonRunning:T,stopDaemon:$,forceKillDaemon:M,spawnDaemon:y}=await Promise.resolve().then(()=>(fs(),gs));await T()?(await $()||M(),await new Promise(G=>setTimeout(G,300))):M(),await y()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(m[0]==="start"||m[0]==="setup"){let{runStart:T}=await Promise.resolve().then(()=>(ny(),sy));await T()}else if(m[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(m[0]==="web"||m[0]==="serve")try{let T=process.cwd(),$=await n.getProjectId(T);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=parseInt(m[1],10)||i;await a($,T,M)}}catch(T){console.error("Server error:",T.message),process.exitCode=1}else if(m[0]==="context"){let T=process.cwd(),$=await n.getProjectId(T);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=await P("context"),y=m.slice(1).filter(D=>D!=="--md"&&D!=="--json"),R=m.includes("--md");if(y.length===0){let{ContextCommands:D}=await Promise.resolve().then(()=>(da(),oh)),Y=await new D().context(null,T,{md:R});process.exitCode=Y.success?0:1}else{let{runContextTool:D}=await Promise.resolve().then(()=>(my(),dy)),G=await D(y,$,T);console.log(JSON.stringify(G,null,2)),process.exitCode=G.tool==="error"?1:0}M()}}else if(m[0]==="hooks"){let T=await P("hooks"),{hooksService:$}=await Promise.resolve().then(()=>(yy(),hy)),M=m[1]||"status",y=await $.run(process.cwd(),M);process.exitCode=y,T()}else if(m[0]==="doctor"){let T=await P("doctor"),{doctorService:$}=await Promise.resolve().then(()=>(Sy(),ky)),M=await $.run(process.cwd());process.exitCode=M,T()}else if(m[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(hd(),Jh)),$=m.includes("--force")||m.includes("-f"),M=m.includes("--backup")||m.includes("-b"),y=m.includes("--dry-run")||m.includes("-n"),R=m.includes("--keep-package"),D=await T({force:$,backup:M,dryRun:y,keepPackage:R});process.exitCode=D.success?0:1}else if(m[0]==="watch"){let T=process.cwd();if(!await n.getProjectId(T))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:M}=await Promise.resolve().then(()=>(vy(),by)),y=m.includes("--verbose")||m.includes("-v"),R=m.find(me=>me.startsWith("--debounce=")),D=R?parseInt(R.split("=")[1],10):void 0,G=m.find(me=>me.startsWith("--interval=")),Y=G?parseInt(G.split("=")[1],10)*1e3:void 0,We=await M.start(T,{verbose:y,quiet:w,debounceMs:D,minIntervalMs:Y});We.success||(console.error(We.error),process.exitCode=1)}}else if(m[0]==="linear"){let{spawn:T}=await import("node:child_process"),$=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","linear.ts"),R=e.join(__dirname,"..","dist","cli","linear.mjs"),D=e.join(__dirname,"..","cli","linear.mjs"),G,Y;if($.existsSync(y)?(G=y,Y="bun"):$.existsSync(D)?(G=D,Y="node"):$.existsSync(R)?(G=R,Y="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Y=""),G){let We=[...m.slice(1)];T(Y,[G,...We],{stdio:"inherit",cwd:M}).on("close",Me=>{process.exitCode=Me||0})}}else if(m[0]==="jira"){let{spawn:T}=await import("node:child_process"),$=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","jira.ts"),R=e.join(__dirname,"..","dist","cli","jira.mjs"),D=e.join(__dirname,"..","cli","jira.mjs"),G,Y;if($.existsSync(y)?(G=y,Y="bun"):$.existsSync(D)?(G=D,Y="node"):$.existsSync(R)?(G=R,Y="node"):(console.error('Jira CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Y=""),G){let We=[...m.slice(1)];T(Y,[G,...We],{stdio:"inherit",cwd:M}).on("close",Me=>{process.exitCode=Me||0})}}else if(m[0]==="help"||m[0]==="-h"||m[0]==="--help"){let{getHelp:T}=await Promise.resolve().then(()=>(jy(),Ay)),$=m[1];console.log(T($)),process.exitCode=0}else if(m[0]==="version"||m[0]==="-v"||m[0]==="--version"){let T=await s(h),$=r.homedir(),M=process.cwd(),[y,R,D,G,Y,We]=await Promise.all([c(e.join($,".claude","commands","p.md")),c(e.join($,".gemini","commands","p.toml")),c(e.join(M,".cursor")),c(e.join(M,".cursor","rules","prjct.mdc")),c(e.join(M,".windsurf")),c(e.join(M,".windsurf","rules","prjct.md"))]);if(console.log(`
1842
1851
  ${t.cyan("p/")} prjct v${d}
1843
1852
  ${t.dim("Context layer for AI coding agents")}
1844
1853
 
1845
- ${t.dim("Providers:")}`),T.claude.installed){let Ie=y?t.green("\u2713 ready"):t.yellow("\u25CF installed"),Pt=T.claude.version?` (v${T.claude.version})`:"";console.log(` Claude Code ${Ie}${t.dim(Pt)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(T.gemini.installed){let Ie=R?t.green("\u2713 ready"):t.yellow("\u25CF installed"),Pt=T.gemini.version?` (v${T.gemini.version})`:"";console.log(` Gemini CLI ${Ie}${t.dim(Pt)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(O){let Ie=G?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${Ie}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(oe){let Ie=gt?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${Ie}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
1854
+ ${t.dim("Providers:")}`),T.claude.installed){let me=y?t.green("\u2713 ready"):t.yellow("\u25CF installed"),Me=T.claude.version?` (v${T.claude.version})`:"";console.log(` Claude Code ${me}${t.dim(Me)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(T.gemini.installed){let me=R?t.green("\u2713 ready"):t.yellow("\u25CF installed"),Me=T.gemini.version?` (v${T.gemini.version})`:"";console.log(` Gemini CLI ${me}${t.dim(Me)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(D){let me=G?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${me}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(Y){let me=We?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${me}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
1846
1855
  ${t.dim("Run 'prjct start' to configure (CLI providers)")}
1847
1856
  ${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1848
1857
  ${t.cyan("https://prjct.app")}
@@ -1855,4 +1864,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
1855
1864
  Claude Code, Gemini CLI, or both.`)}
1856
1865
  `),process.exitCode=0;else{try{let y=await o.getLastVersion();if(y&&y!==d){console.log(`
1857
1866
  ${t.yellow("\u2139")} Updating prjct v${y} \u2192 v${d}...
1858
- `);try{let{default:R}=await Promise.resolve().then(()=>(sr(),ki));await R.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}m.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(ps(),ms)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>(fy(),_C))}}}l(NC,"main");NC().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
1867
+ `);try{let{default:R}=await Promise.resolve().then(()=>(ir(),xi));await R.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}m.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(fs(),gs)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>($y(),sP))}}}l(rP,"main");rP().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});