prjct-cli 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,18 @@
1
+ import { createRequire as __createRequire } from 'module';
1
2
  import { fileURLToPath as __fileURLToPath } from 'url';
2
3
  import { dirname as __pathDirname } from 'path';
3
- const __filename = __fileURLToPath(import.meta.url);
4
- const __dirname = __pathDirname(__filename);
5
- var vy=Object.create;var fr=Object.defineProperty;var xy=Object.getOwnPropertyDescriptor;var Py=Object.getOwnPropertyNames;var Ty=Object.getPrototypeOf,Ey=Object.prototype.hasOwnProperty;var l=(r,e)=>fr(r,"name",{value:e,configurable:!0}),hr=(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')}),dd=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(r,e)=>()=>(r&&(e=r(r=0)),e);var Iy=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ge=(r,e)=>{for(var t in e)fr(r,t,{get:e[t],enumerable:!0})},pd=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Py(e))!Ey.call(r,s)&&s!==t&&fr(r,s,{get:()=>e[s],enumerable:!(n=xy(e,s))||n.enumerable});return r};var Ay=(r,e,t)=>(t=r!=null?vy(Ty(r)):{},pd(e||!r||!r.__esModule?fr(t,"default",{value:r,enumerable:!0}):t,r)),xt=r=>pd(fr({},"__esModule",{value:!0}),r);var md={};ge(md,{DAEMON_PATHS:()=>Ue,IDLE_TIMEOUT_MS:()=>Ea,decodeMessage:()=>jy,encodeMessage:()=>ds});function ds(r){return Buffer.from(`${JSON.stringify(r)}
6
- `)}function jy(r){return JSON.parse(r.trim())}var Ue,Ea,ho=y(()=>{"use strict";Ue={runDir:l(()=>`${process.env.HOME||hr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ue.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ue.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ue.runDir()}/daemon.log`,"log")},Ea=1800*1e3;l(ds,"encodeMessage");l(jy,"decodeMessage")});var ps={};ge(ps,{executeViaDaemon:()=>$y,getDaemonStatus:()=>Ry,isDaemonRunning:()=>gd,sendRequest:()=>yr,spawnDaemon:()=>fd,stopDaemon:()=>My});import yo from"node:crypto";import Pt from"node:fs";import{connect as Dy}from"node:net";async function gd(){let r=Ue.socket();if(!Pt.existsSync(r))return!1;try{return(await yr({id:yo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Pt.unlinkSync(r)}catch{}return!1}}async function Ry(){let r=Ue.socket(),e=Ue.pid();if(!Pt.existsSync(r))return{running:!1};try{let t=await yr({id:yo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Pt.existsSync(e)?{running:!1,pid:parseInt(Pt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function yr(r){return new Promise((e,t)=>{let n=Ue.socket(),s=Dy(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(ds(r))}),s.on("data",c=>{o+=c.toString();let u=o.indexOf(`
7
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function $y(r,e,t,n,s,o=!0){let i=Ue.socket();if(!Pt.existsSync(i))return o&&fd().catch(()=>{}),null;try{return await yr({id:yo.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function My(){try{return(await yr({id:yo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function fd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),s=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Pt.existsSync(t))o=t,i="bun";else if(Pt.existsSync(n))o=n,i="node";else if(Pt.existsSync(s))o=s,i="node";else return!1;let a=Ue.runDir();Pt.mkdirSync(a,{recursive:!0});let c=Ue.log(),u=Pt.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Pt.closeSync(u),await new Promise(m=>setTimeout(m,500)),gd()}var ms=y(()=>{"use strict";ho();l(gd,"isDaemonRunning");l(Ry,"getDaemonStatus");l(yr,"sendRequest");l($y,"executeViaDaemon");l(My,"stopDaemon");l(fd,"spawnDaemon")});import{z as Kt}from"zod";function hd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var BE,VE,JE,wr,qE,Sr=y(()=>{"use strict";BE=Kt.enum(["opus","sonnet","haiku"]),VE=Kt.enum(["2.5-pro","2.5-flash","2.0-flash"]),JE=Kt.string().min(1),wr=Kt.object({provider:Kt.string(),model:Kt.string(),cliVersion:Kt.string().optional(),recordedAt:Kt.string()}),qE=Kt.object({preferredModel:Kt.string().optional(),lastAnalysisModel:wr.optional()});l(hd,"compareSemver")});function yd(r){return r instanceof Error&&"code"in r}function v(r){return yd(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function wo(r){if(r instanceof Error)return r.stack}var _=y(()=>{"use strict";l(yd,"isNodeError");l(v,"isNotFoundError");l(w,"getErrorMessage");l(wo,"getErrorStack")});import kd from"node:fs/promises";async function bd(r,e){let t;try{t=await kd.readFile(r,"utf-8")}catch(o){if(v(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await wd(r,t),Sd(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await wd(r,t),Sd(r,Oy(s.error)),null)}async function wd(r,e){let t=`${r}.backup`;try{await kd.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 Oy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Cd=y(()=>{"use strict";_();l(bd,"safeRead");l(wd,"createBackup");l(Sd,"logCorruption");l(Oy,"formatZodError")});var ce={};ge(ce,{appendLine:()=>Ia,appendToFile:()=>_y,atomicWrite:()=>Fy,copyFile:()=>zy,deleteDir:()=>Hy,deleteFile:()=>Ly,dirExists:()=>So,ensureDir:()=>Mt,fileExists:()=>P,getFileExtension:()=>Jy,getFileModifiedTime:()=>Gy,getFileNameWithoutExtension:()=>qy,getFileSize:()=>Uy,listFiles:()=>hs,moveFile:()=>Wy,prependToFile:()=>Ny,readFile:()=>fs,readJson:()=>_n,readLines:()=>By,writeFile:()=>vd,writeJson:()=>kr,writeLines:()=>Vy});import ye from"node:fs/promises";import gs from"node:path";async function _n(r,e=null,t){if(t)return await bd(r,t)??e;try{let n=await ye.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(v(n))return e;throw n}}async function kr(r,e,t=2){let n=JSON.stringify(e,null,t);await ye.writeFile(r,n,"utf-8")}async function fs(r,e=""){try{return await ye.readFile(r,"utf-8")}catch(t){if(v(t))return e;throw t}}async function vd(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.writeFile(r,e,"utf-8")}async function Fy(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ye.writeFile(n,e,"utf-8"),await ye.rename(n,r)}async function _y(r,e){await ye.appendFile(r,e,"utf-8")}async function Ia(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.appendFile(r,`${e}
8
- `,"utf-8")}async function Ny(r,e){try{let t=await ye.readFile(r,"utf-8");await ye.writeFile(r,e+t,"utf-8")}catch(t){if(v(t))await ye.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await ye.access(r),!0}catch(e){if(v(e))return!1;throw e}}async function So(r){try{return(await ye.stat(r)).isDirectory()}catch(e){if(v(e))return!1;throw e}}async function Mt(r){await ye.mkdir(r,{recursive:!0})}async function Ly(r){try{return await ye.unlink(r),!0}catch(e){if(v(e))return!1;throw e}}async function Hy(r){try{return await ye.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(v(e))return!1;throw e}}async function hs(r,e={}){try{let n=await ye.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(v(t))return[];throw t}}async function Uy(r){return(await ye.stat(r)).size}async function Gy(r){return(await ye.stat(r)).mtime}async function zy(r,e){await ye.copyFile(r,e)}async function Wy(r,e){await ye.rename(r,e)}async function By(r){return(await fs(r,"")).split(`
9
- `)}async function Vy(r,e){let t=e.join(`
10
- `);await vd(r,t)}function Jy(r){return gs.extname(r)}function qy(r){return gs.basename(r,gs.extname(r))}var xe=y(()=>{"use strict";Cd();_();l(_n,"readJson");l(kr,"writeJson");l(fs,"readFile");l(vd,"writeFile");l(Fy,"atomicWrite");l(_y,"appendToFile");l(Ia,"appendLine");l(Ny,"prependToFile");l(P,"fileExists");l(So,"dirExists");l(Mt,"ensureDir");l(Ly,"deleteFile");l(Hy,"deleteDir");l(hs,"listFiles");l(Uy,"getFileSize");l(Gy,"getFileModifiedTime");l(zy,"copyFile");l(Wy,"moveFile");l(By,"readLines");l(Vy,"writeLines");l(Jy,"getFileExtension");l(qy,"getFileNameWithoutExtension")});var Td={};ge(Td,{invalidateProviderCache:()=>Xy,readProviderCache:()=>ja,writeProviderCache:()=>Da});import ko from"node:fs/promises";import Ky from"node:os";import xd from"node:path";async function ja(){try{let r=await ko.readFile(Aa,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Yy?null:e.detection}catch{return null}}async function Da(r){let e={timestamp:new Date().toISOString(),detection:r};await ko.mkdir(Pd,{recursive:!0}),await ko.writeFile(Aa,JSON.stringify(e,null,2))}async function Xy(){try{await ko.unlink(Aa)}catch{}}var Pd,Aa,Yy,Ra=y(()=>{"use strict";Pd=xd.join(Ky.homedir(),".prjct-cli","cache"),Aa=xd.join(Pd,"providers.json"),Yy=600*1e3;l(ja,"readProviderCache");l(Da,"writeProviderCache");l(Xy,"invalidateProviderCache")});var ut={};ge(ut,{AntigravityProvider:()=>Ma,ClaudeProvider:()=>bo,CursorProvider:()=>Ad,GeminiProvider:()=>$a,Providers:()=>Fe,WindsurfProvider:()=>jd,detectAllProviders:()=>an,detectAntigravity:()=>ws,detectCursorProject:()=>Rd,detectProvider:()=>Co,detectWindsurfProject:()=>$d,getActiveProvider:()=>nw,getCommandsDir:()=>lw,getGlobalContextPath:()=>iw,getGlobalSettingsPath:()=>aw,getProjectCommandsPath:()=>uw,getProviderBranding:()=>vo,getSkillsPath:()=>cw,hasProviderConfig:()=>sw,needsCursorRouterRegeneration:()=>rw,needsWindsurfRouterRegeneration:()=>ow,selectProvider:()=>Oa,validateCliVersion:()=>Dd});import{exec as Qy}from"node:child_process";import ys from"node:os";import nt from"node:path";import{promisify as Zy}from"node:util";async function ew(r){try{let{stdout:e}=await Ed(`which ${r}`,{timeout:Id});return e.trim()}catch{return null}}async function tw(r){try{let{stdout:e}=await Ed(`${r} --version`,{timeout:Id}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Co(r){let e=Fe[r];if(!e.cliCommand)return{installed:!1};let t=await ew(e.cliCommand);if(!t)return{installed:!1};let n=await tw(e.cliCommand),s=Dd(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Dd(r,e){let t=Fe[r];return!t.minCliVersion||!e?null:hd(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 an(r=!1){if(!r){let s=await ja();if(s)return s}let[e,t]=await Promise.all([Co("claude"),Co("gemini")]),n={claude:e,gemini:t};return await Da(n).catch(()=>{}),n}async function nw(r){if(r&&Fe[r])return Fe[r];let e=await an();return e.claude.installed&&!e.gemini.installed?bo:e.gemini.installed&&!e.claude.installed?$a:bo}async function sw(r){let e=Fe[r];return e.configDir?P(e.configDir):!1}function vo(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf"}[r]||"\u26A1 prjct"}}async function Rd(r){let e=nt.join(r,".cursor"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.mdc"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function rw(r){let e=await Rd(r);return e.detected&&!e.routerInstalled}async function $d(r){let e=nt.join(r,".windsurf"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.md"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function ow(r){let e=await $d(r);return e.detected&&!e.routerInstalled}async function ws(){let r=Ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=nt.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function iw(r){let e=Fe[r];return e.configDir?nt.join(e.configDir,e.contextFile):null}function aw(r){let e=Fe[r];return!e.configDir||!e.settingsFile?null:nt.join(e.configDir,e.settingsFile)}function cw(r){return Fe[r].skillsDir}function lw(r){return Fe[r].commandsDir}function uw(r,e){let t=Fe[r];return nt.join(e,t.commandsDir)}async function Oa(){let r=await an(),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 Ed,Id,bo,$a,Ma,Ad,jd,Fe,Be=y(()=>{"use strict";Sr();xe();Ra();Ed=Zy(Qy),Id=2e3,bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:nt.join(ys.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:nt.join(ys.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"},$a={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:nt.join(ys.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:nt.join(ys.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0"},Ma={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:nt.join(ys.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:nt.join(ys.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},Ad={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},jd={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},Fe={claude:bo,gemini:$a,cursor:Ad,antigravity:Ma,windsurf:jd};l(ew,"whichCommand");l(tw,"getCliVersion");l(Co,"detectProvider");l(Dd,"validateCliVersion");l(an,"detectAllProviders");l(nw,"getActiveProvider");l(sw,"hasProviderConfig");l(vo,"getProviderBranding");l(Rd,"detectCursorProject");l(rw,"needsCursorRouterRegeneration");l($d,"detectWindsurfProject");l(ow,"needsWindsurfRouterRegeneration");l(ws,"detectAntigravity");l(iw,"getGlobalContextPath");l(aw,"getGlobalSettingsPath");l(cw,"getSkillsPath");l(lw,"getCommandsDir");l(uw,"getProjectCommandsPath");l(Oa,"selectProvider")});import{z as we}from"zod";function dw(r){return r instanceof Ss}function ne(r){return dw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var ks,bI,CI,vI,xI,PI,TI,Ss,xo,Po,br,cn=y(()=>{"use strict";ks={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},bI=ks.create("FileError",we.object({path:we.string(),operation:we.enum(["read","write","delete","create","copy"]),reason:we.string().optional()})),CI=ks.create("ValidationError",we.object({field:we.string(),expected:we.string(),received:we.string().optional(),message:we.string().optional()})),vI=ks.create("PermissionError",we.object({action:we.string(),resource:we.string(),reason:we.string().optional()})),xI=ks.create("TaskError",we.object({taskId:we.string().optional(),operation:we.enum(["create","update","complete","pause","resume","delete"]),reason:we.string()})),PI=ks.create("SessionError",we.object({sessionId:we.string().optional(),reason:we.string()})),TI=ks.create("SyncError",we.object({projectId:we.string().optional(),operation:we.enum(["push","pull","auth","connect"]),reason:we.string()})),Ss=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)}},xo=class r extends Ss{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")}},Po=class r extends Ss{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")}},br=class r extends Ss{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(dw,"isPrjctError");l(ne,"getErrorMessage")});var B={};ge(B,{calculateDuration:()=>kw,formatDate:()=>To,formatDuration:()=>Cr,formatMonth:()=>mw,getDateKey:()=>gw,getDateRange:()=>yw,getDaysAgo:()=>yn,getDaysFromNow:()=>hw,getEndOfDay:()=>Cw,getStartOfDay:()=>bw,getTimestamp:()=>C,getTodayKey:()=>Md,getYearMonthDay:()=>Fa,isToday:()=>ww,isWithinLastDays:()=>Sw,parseDate:()=>fw,toRelative:()=>vw});import{formatDistanceToNowStrict as pw}from"date-fns";function To(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function mw(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Md(){return To(new Date)}function gw(r){return To(r)}function Fa(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function fw(r){return new Date(r)}function C(){return new Date().toISOString()}function yn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function hw(r){let e=new Date;return e.setDate(e.getDate()+r),e}function yw(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function ww(r){return To(r)===Md()}function Sw(r,e){let t=yn(e);return r>=t}function Cr(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function kw(r,e=new Date){let t=e.getTime()-r.getTime();return Cr(t)}function bw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Cw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function vw(r){let e=typeof r=="string"?new Date(r):r;return pw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(To,"formatDate");l(mw,"formatMonth");l(Md,"getTodayKey");l(gw,"getDateKey");l(Fa,"getYearMonthDay");l(fw,"parseDate");l(C,"getTimestamp");l(yn,"getDaysAgo");l(hw,"getDaysFromNow");l(yw,"getDateRange");l(ww,"isToday");l(Sw,"isWithinLastDays");l(Cr,"formatDuration");l(kw,"calculateDuration");l(bw,"getStartOfDay");l(Cw,"getEndOfDay");l(vw,"toRelative")});var Ao={};ge(Ao,{PACKAGE_ROOT:()=>pe,VERSION:()=>fe,compareVersions:()=>Od,getPackageInfo:()=>xw,getPackageRoot:()=>La,getVersion:()=>xr,isCompatible:()=>Pw,needsMigration:()=>Tw});import _a from"node:fs";import Io from"node:path";function La(){if(vr)return vr;let r=__dirname;for(let e=0;e<5;e++){let t=Io.join(r,"package.json");if(_a.existsSync(t))try{if(JSON.parse(_a.readFileSync(t,"utf-8")).name==="prjct-cli")return vr=r,r}catch{}r=Io.dirname(r)}return vr=Io.join(__dirname,"..","..",".."),vr}function xr(){if(Eo)return Eo;try{let r=Io.join(La(),"package.json"),e=JSON.parse(_a.readFileSync(r,"utf-8"));return Eo=e.version,Na=e,Eo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function xw(){return Na||xr(),Na}function Od(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Pw(r){let e=xr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Tw(r,e=null){let t=e||xr();return Od(r,t)<0}var Eo,Na,vr,fe,pe,dt=y(()=>{"use strict";_();Eo=null,Na=null,vr=null;l(La,"getPackageRoot");l(xr,"getVersion");l(xw,"getPackageInfo");l(Od,"compareVersions");l(Pw,"isCompatible");l(Tw,"needsMigration");fe=xr(),pe=La()});import{exec as Ew}from"node:child_process";import{promisify as Iw}from"node:util";async function jo(r){try{let{stdout:e}=await Aw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function jw(){let r=await jo("gh api user --jq .login");return r.success&&r.output||(r=await jo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Dw(){let r=await jo("git config user.name");return r.success&&r.output?r.output:null}async function Rw(){let r=await jo("git config user.email");return r.success&&r.output?r.output:null}async function bs(){let[r,e,t]=await Promise.all([jw(),Dw(),Rw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Aw,Do=y(()=>{"use strict";Aw=Iw(Ew);l(jo,"execCommand");l(jw,"detectGitHubUsername");l(Dw,"detectGitName");l(Rw,"detectGitEmail");l(bs,"detect")});import $w from"node:crypto";import Yt from"node:fs/promises";import Ua from"node:os";import U from"node:path";import{globSync as Mw}from"glob";var Ga,Ow,A,Ce=y(()=>{"use strict";le();xe();Ga=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?U.resolve(e):U.join(Ua.homedir(),".prjct-cli"),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=U.resolve(e),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}generateProjectId(e){return $w.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return U.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return U.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return U.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return U.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await So(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Mt(this.globalBaseDir),await Mt(this.globalProjectsDir),await Mt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Mt(U.join(t,s));return await Mt(U.join(t,"planning","tasks")),await Mt(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Fa(t);return U.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Mt(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Yt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=U.join(s,a.name),u=await Yt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=U.join(c,d.name),p=await Yt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:U.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return U.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Yt.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 So(t)}getDisplayPath(e){let t=Ua.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),xt(ut)).getActiveProvider();return(Be(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(Ua.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=U.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await P(s))try{let o=await Yt.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await Yt.readFile(U.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
11
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=U.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=U.join(e,"lerna.json");if(await P(c)){let u=await Yt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=U.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=Mw(o,{cwd:e,absolute:!1});for(let a of i){let c=U.join(e,a),u=U.join(c,"package.json");if(await P(u))try{let d=await Yt.readFile(u,"utf-8"),m=JSON.parse(d),p=U.join(c,"PRJCT.md");n.push({name:m.name||U.basename(a),path:c,relativePath:a,hasPrjctMd:await P(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=U.resolve(e);for(let s of t.packages){let o=U.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=U.resolve(e),n=U.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=U.dirname(t)}return null}},Ow=new Ga,A=Ow});var _d={};ge(_d,{default:()=>R});import Nn from"node:fs/promises";import Fw from"node:path";import*as Ro from"jsonc-parser";function Fd(r){let e=[],t=Ro.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ro.printParseErrorCode(n.error)}`)}return t}var za,_w,R,Ve=y(()=>{"use strict";cn();_();le();dt();Do();Ce();l(Fd,"parseJsonc");za=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),n=await Nn.readFile(t,"utf-8");return Fd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${ne(t)}`),null}}async writeConfig(e,t){let n=A.getLocalConfigPath(e),s=A.getLegacyPrjctPath(e);await Nn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
12
- `,"utf-8")}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),n=await Nn.readFile(t,"utf-8");return Fd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read global config for ${e}: ${ne(t)}`),null}}async writeGlobalConfig(e,t){let n=A.getGlobalProjectConfigPath(e),s=A.getGlobalProjectPath(e);await Nn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
13
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:fe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=A.generateProjectId(e),s=A.getGlobalProjectPath(n),o=A.getDisplayPath(s),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:fe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=C(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=A.getGlobalProjectPath(s.projectId);try{return(await Nn.readdir(Fw.join(o,"core"))).length===0}catch(i){return v(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:A.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=C(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await bs(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=A.generateProjectId(e);return{projectId:n,dataPath:A.getDisplayPath(A.getGlobalProjectPath(n))}}},_w=new za,R=_w});var Ld={};ge(Ld,{default:()=>Ba});import Cs from"node:fs/promises";import Nw from"node:os";import Nd from"node:path";var Wa,Lw,Ba,Va=y(()=>{"use strict";_();Wa=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Nw.homedir(),this.configDir=Nd.join(this.homeDir,".prjct-cli","config"),this.configFile=Nd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Cs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await Cs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await Cs.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await Cs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){try{return await Cs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await Cs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Lw=new Wa,Ba=Lw});function Hw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Pr(){return Hw()==="bun"}var Ja=y(()=>{"use strict";l(Hw,"detectRuntime");l(Pr,"isBun")});import qa from"node:fs";import Hd from"node:path";function Uw(r){if(Pr()){let{Database:s}=hr("bun:sqlite");return new s(r,{create:!0})}let e=hr("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Gw,$o,$,V,he=y(()=>{"use strict";Ce();Ja();l(Uw,"openDatabase");Gw=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
4
+ var require = __createRequire(import.meta.url);
5
+ var __filename = __fileURLToPath(import.meta.url);
6
+ var __dirname = __pathDirname(__filename);
7
+ var My=Object.create;var hr=Object.defineProperty;var Oy=Object.getOwnPropertyDescriptor;var Fy=Object.getOwnPropertyNames;var _y=Object.getPrototypeOf,Ny=Object.prototype.hasOwnProperty;var l=(s,e)=>hr(s,"name",{value:e,configurable:!0}),yr=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')}),gd=s=>e=>{var t=s[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(s,e)=>()=>(s&&(e=s(s=0)),e);var Ly=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),he=(s,e)=>{for(var t in e)hr(s,t,{get:e[t],enumerable:!0})},fd=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Fy(e))!Ny.call(s,r)&&r!==t&&hr(s,r,{get:()=>e[r],enumerable:!(n=Oy(e,r))||n.enumerable});return s};var Uy=(s,e,t)=>(t=s!=null?My(_y(s)):{},fd(e||!s||!s.__esModule?hr(t,"default",{value:s,enumerable:!0}):t,s)),xt=s=>fd(hr({},"__esModule",{value:!0}),s);var hd={};he(hd,{DAEMON_PATHS:()=>He,IDLE_TIMEOUT_MS:()=>Ma,decodeMessage:()=>Hy,encodeMessage:()=>gs});function gs(s){return Buffer.from(`${JSON.stringify(s)}
8
+ `)}function Hy(s){return JSON.parse(s.trim())}var He,Ma,So=y(()=>{"use strict";He={runDir:l(()=>`${process.env.HOME||yr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${He.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${He.runDir()}/daemon.pid`,"pid"),log:l(()=>`${He.runDir()}/daemon.log`,"log")},Ma=1800*1e3;l(gs,"encodeMessage");l(Hy,"decodeMessage")});var fs={};he(fs,{executeViaDaemon:()=>Wy,getDaemonStatus:()=>zy,isDaemonRunning:()=>yd,sendRequest:()=>wr,spawnDaemon:()=>wd,stopDaemon:()=>By});import bo from"node:crypto";import Tt from"node:fs";import{connect as Gy}from"node:net";async function yd(){let s=He.socket();if(!Tt.existsSync(s))return!1;try{return(await wr({id:bo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Tt.unlinkSync(s)}catch{}return!1}}async function zy(){let s=He.socket(),e=He.pid();if(!Tt.existsSync(s))return{running:!1};try{let t=await wr({id:bo.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:s}:{running:!1}}function wr(s){return new Promise((e,t)=>{let n=He.socket(),r=Gy(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(gs(s))}),r.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Wy(s,e,t,n,r,o=!0){let i=He.socket();if(!Tt.existsSync(i))return o&&wd().catch(()=>{}),null;try{return await wr({id:bo.randomUUID(),command:s,args:e,options:t,cwd:n,perfStartNs:r})}catch{return null}}async function By(){try{return(await wr({id:bo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function wd(){let{spawn:s}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Tt.existsSync(t))o=t,i="bun";else if(Tt.existsSync(n))o=n,i="node";else if(Tt.existsSync(r))o=r,i="node";else return!1;let a=He.runDir();Tt.mkdirSync(a,{recursive:!0});let c=He.log(),u=Tt.openSync(c,"a");return s(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Tt.closeSync(u),await new Promise(m=>setTimeout(m,500)),yd()}var hs=y(()=>{"use strict";So();l(yd,"isDaemonRunning");l(zy,"getDaemonStatus");l(wr,"sendRequest");l(Wy,"executeViaDaemon");l(By,"stopDaemon");l(wd,"spawnDaemon")});import{z as Xt}from"zod";function kd(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=n[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var dI,pI,mI,kr,gI,Sr=y(()=>{"use strict";dI=Xt.enum(["opus","sonnet","haiku"]),pI=Xt.enum(["2.5-pro","2.5-flash","2.0-flash"]),mI=Xt.string().min(1),kr=Xt.object({provider:Xt.string(),model:Xt.string(),cliVersion:Xt.string().optional(),recordedAt:Xt.string()}),gI=Xt.object({preferredModel:Xt.string().optional(),lastAnalysisModel:kr.optional()});l(kd,"compareSemver")});function Sd(s){return s instanceof Error&&"code"in s}function P(s){return Sd(s)&&s.code==="ENOENT"}function w(s){return s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}function Co(s){if(s instanceof Error)return s.stack}var N=y(()=>{"use strict";l(Sd,"isNodeError");l(P,"isNotFoundError");l(w,"getErrorMessage");l(Co,"getErrorStack")});import Pd from"node:fs/promises";async function vd(s,e){let t;try{t=await Pd.readFile(s,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await bd(s,t),Cd(s,"Malformed JSON"),null}let r=e.safeParse(n);return r.success?n:(await bd(s,t),Cd(s,Vy(r.error)),null)}async function bd(s,e){let t=`${s}.backup`;try{await Pd.writeFile(t,e,"utf-8")}catch{}}function Cd(s,e){console.error(`[prjct] Warning: Corrupted storage file: ${s}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function Vy(s){return s.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var xd=y(()=>{"use strict";N();l(vd,"safeRead");l(bd,"createBackup");l(Cd,"logCorruption");l(Vy,"formatZodError")});var ce={};he(ce,{appendLine:()=>Oa,appendToFile:()=>qy,atomicWrite:()=>Jy,copyFile:()=>ew,deleteDir:()=>Xy,deleteFile:()=>Yy,dirExists:()=>Po,ensureDir:()=>Nt,fileExists:()=>x,getFileExtension:()=>rw,getFileModifiedTime:()=>Zy,getFileNameWithoutExtension:()=>ow,getFileSize:()=>Qy,listFiles:()=>ks,moveFile:()=>tw,prependToFile:()=>Ky,readFile:()=>ws,readJson:()=>Un,readLines:()=>nw,writeFile:()=>Td,writeJson:()=>br,writeLines:()=>sw});import we from"node:fs/promises";import ys from"node:path";async function Un(s,e=null,t){if(t)return await vd(s,t)??e;try{let n=await we.readFile(s,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function br(s,e,t=2){let n=JSON.stringify(e,null,t);await we.writeFile(s,n,"utf-8")}async function ws(s,e=""){try{return await we.readFile(s,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Td(s,e){let t=ys.dirname(s);await we.mkdir(t,{recursive:!0}),await we.writeFile(s,e,"utf-8")}async function Jy(s,e){let t=ys.dirname(s);await we.mkdir(t,{recursive:!0});let n=`${s}.${Date.now()}.tmp`;await we.writeFile(n,e,"utf-8"),await we.rename(n,s)}async function qy(s,e){await we.appendFile(s,e,"utf-8")}async function Oa(s,e){let t=ys.dirname(s);await we.mkdir(t,{recursive:!0}),await we.appendFile(s,`${e}
10
+ `,"utf-8")}async function Ky(s,e){try{let t=await we.readFile(s,"utf-8");await we.writeFile(s,e+t,"utf-8")}catch(t){if(P(t))await we.writeFile(s,e,"utf-8");else throw t}}async function x(s){try{return await we.access(s),!0}catch(e){if(P(e))return!1;throw e}}async function Po(s){try{return(await we.stat(s)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Nt(s){await we.mkdir(s,{recursive:!0})}async function Yy(s){try{return await we.unlink(s),!0}catch(e){if(P(e))return!1;throw e}}async function Xy(s){try{return await we.rm(s,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function ks(s,e={}){try{let n=await we.readdir(s,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(r=>r.isFile())),e.dirsOnly&&(n=n.filter(r=>r.isDirectory())),e.extension&&(n=n.filter(r=>r.name.endsWith(e.extension))),n.map(r=>r.name)}catch(t){if(P(t))return[];throw t}}async function Qy(s){return(await we.stat(s)).size}async function Zy(s){return(await we.stat(s)).mtime}async function ew(s,e){await we.copyFile(s,e)}async function tw(s,e){await we.rename(s,e)}async function nw(s){return(await ws(s,"")).split(`
11
+ `)}async function sw(s,e){let t=e.join(`
12
+ `);await Td(s,t)}function rw(s){return ys.extname(s)}function ow(s){return ys.basename(s,ys.extname(s))}var ve=y(()=>{"use strict";xd();N();l(Un,"readJson");l(br,"writeJson");l(ws,"readFile");l(Td,"writeFile");l(Jy,"atomicWrite");l(qy,"appendToFile");l(Oa,"appendLine");l(Ky,"prependToFile");l(x,"fileExists");l(Po,"dirExists");l(Nt,"ensureDir");l(Yy,"deleteFile");l(Xy,"deleteDir");l(ks,"listFiles");l(Qy,"getFileSize");l(Zy,"getFileModifiedTime");l(ew,"copyFile");l(tw,"moveFile");l(nw,"readLines");l(sw,"writeLines");l(rw,"getFileExtension");l(ow,"getFileNameWithoutExtension")});var Ad={};he(Ad,{invalidateProviderCache:()=>cw,readProviderCache:()=>_a,writeProviderCache:()=>Na});import vo from"node:fs/promises";import iw from"node:os";import Ed from"node:path";async function _a(){try{let s=await vo.readFile(Fa,"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>aw?null:e.detection}catch{return null}}async function Na(s){let e={timestamp:new Date().toISOString(),detection:s};await vo.mkdir(Id,{recursive:!0}),await vo.writeFile(Fa,JSON.stringify(e,null,2))}async function cw(){try{await vo.unlink(Fa)}catch{}}var Id,Fa,aw,La=y(()=>{"use strict";Id=Ed.join(iw.homedir(),".prjct-cli","cache"),Fa=Ed.join(Id,"providers.json"),aw=600*1e3;l(_a,"readProviderCache");l(Na,"writeProviderCache");l(cw,"invalidateProviderCache")});var ut={};he(ut,{AntigravityProvider:()=>Ha,ClaudeProvider:()=>xo,CodexProvider:()=>Ga,CursorProvider:()=>Rd,GeminiProvider:()=>Ua,Providers:()=>Me,WindsurfProvider:()=>$d,detectAllProviders:()=>cn,detectAntigravity:()=>Ss,detectCodex:()=>za,detectCursorProject:()=>Fd,detectProvider:()=>To,detectWindsurfProject:()=>_d,getActiveProvider:()=>pw,getCommandsDir:()=>kw,getGlobalContextPath:()=>hw,getGlobalSettingsPath:()=>yw,getProjectCommandsPath:()=>Sw,getProviderBranding:()=>Eo,getSkillsPath:()=>ww,hasProviderConfig:()=>mw,needsCursorRouterRegeneration:()=>gw,needsWindsurfRouterRegeneration:()=>fw,selectProvider:()=>Wa,validateCliVersion:()=>Od});import{exec as lw}from"node:child_process";import kn from"node:os";import Ge from"node:path";import{promisify as uw}from"node:util";async function Md(s){try{let{stdout:e}=await jd(`which ${s}`,{timeout:Dd});return e.trim()}catch{return null}}async function dw(s){try{let{stdout:e}=await jd(`${s} --version`,{timeout:Dd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function To(s){let e=Me[s];if(!e.cliCommand)return{installed:!1};let t=await Md(e.cliCommand);if(!t)return{installed:!1};let n=await dw(e.cliCommand),r=Od(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function Od(s,e){let t=Me[s];return!t.minCliVersion||!e?null:kd(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 cn(s=!1){if(!s){let r=await _a();if(r)return r}let[e,t]=await Promise.all([To("claude"),To("gemini")]),n={claude:e,gemini:t};return await Na(n).catch(()=>{}),n}async function pw(s){if(s&&Me[s])return Me[s];let e=await cn();return e.claude.installed&&!e.gemini.installed?xo:e.gemini.installed&&!e.claude.installed?Ua:xo}async function mw(s){let e=Me[s];return e.configDir?x(e.configDir):!1}function Eo(s){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[s]||"\u26A1 prjct"}}async function Fd(s){let e=Ge.join(s,".cursor"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.mdc"),[r,o]=await Promise.all([x(e),x(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function gw(s){let e=await Fd(s);return e.detected&&!e.routerInstalled}async function _d(s){let e=Ge.join(s,".windsurf"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.md"),[r,o]=await Promise.all([x(e),x(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function fw(s){let e=await _d(s);return e.detected&&!e.routerInstalled}async function Ss(){let s=Ha.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=Ge.join(s,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([x(s),x(e)]);return{installed:t,skillInstalled:n,configPath:t?s:void 0}}async function za(){let s=Ga.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Md("codex"),t=Ge.join(s,"skills","prjct","SKILL.md"),[n,r]=await Promise.all([x(s),x(t)]),o=!!e||n;return{installed:o,skillInstalled:r,configPath:o?s:void 0}}function hw(s){let e=Me[s];return e.configDir?Ge.join(e.configDir,e.contextFile):null}function yw(s){let e=Me[s];return!e.configDir||!e.settingsFile?null:Ge.join(e.configDir,e.settingsFile)}function ww(s){return Me[s].skillsDir}function kw(s){return Me[s].commandsDir}function Sw(s,e){let t=Me[s];return Ge.join(e,t.commandsDir)}async function Wa(){let s=await cn(),e=s.claude.installed,t=s.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:s}:e&&!t?{provider:"claude",userSelected:!1,detection:s}:t&&!e?{provider:"gemini",userSelected:!1,detection:s}:{provider:"claude",userSelected:!0,detection:s}}var jd,Dd,xo,Ua,Ha,Rd,$d,Ga,Me,Je=y(()=>{"use strict";Sr();ve();La();jd=uw(lw),Dd=2e3,xo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ge.join(kn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ge.join(kn.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"},Ua={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ge.join(kn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ge.join(kn.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"},Ha={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ge.join(kn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ge.join(kn.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null},Rd={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null},$d={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null},Ga={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ge.join(kn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ge.join(kn.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},Me={claude:xo,gemini:Ua,cursor:Rd,antigravity:Ha,windsurf:$d,codex:Ga};l(Md,"whichCommand");l(dw,"getCliVersion");l(To,"detectProvider");l(Od,"validateCliVersion");l(cn,"detectAllProviders");l(pw,"getActiveProvider");l(mw,"hasProviderConfig");l(Eo,"getProviderBranding");l(Fd,"detectCursorProject");l(gw,"needsCursorRouterRegeneration");l(_d,"detectWindsurfProject");l(fw,"needsWindsurfRouterRegeneration");l(Ss,"detectAntigravity");l(za,"detectCodex");l(hw,"getGlobalContextPath");l(yw,"getGlobalSettingsPath");l(ww,"getSkillsPath");l(kw,"getCommandsDir");l(Sw,"getProjectCommandsPath");l(Wa,"selectProvider")});import{z as ke}from"zod";function bw(s){return s instanceof bs}function re(s){return bw(s)||s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var Cs,HI,GI,zI,WI,BI,VI,bs,Io,Ao,Cr,ln=y(()=>{"use strict";Cs={create(s,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(r){let o=e.parse(r);super(`${s}: ${JSON.stringify(o)}`),this.name=s,this.errorName=s,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(r){throw new t(r)}static is(r){return r instanceof t&&r.errorName===s}static create(r){return new t(r)}}return t}},HI=Cs.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),GI=Cs.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),zI=Cs.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),WI=Cs.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),BI=Cs.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),VI=Cs.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),bs=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 s extends bs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new s("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new s(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new s(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ao=class s extends bs{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new s(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new s(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Cr=class s extends bs{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new s(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new s(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(bw,"isPrjctError");l(re,"getErrorMessage")});var B={};he(B,{calculateDuration:()=>jw,formatDate:()=>jo,formatDuration:()=>Pr,formatMonth:()=>Pw,getDateKey:()=>vw,getDateRange:()=>Ew,getDaysAgo:()=>Sn,getDaysFromNow:()=>Tw,getEndOfDay:()=>Rw,getStartOfDay:()=>Dw,getTimestamp:()=>C,getTodayKey:()=>Nd,getYearMonthDay:()=>Ba,isToday:()=>Iw,isWithinLastDays:()=>Aw,parseDate:()=>xw,toRelative:()=>$w});import{formatDistanceToNowStrict as Cw}from"date-fns";function jo(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0"),n=s.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function Pw(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Nd(){return jo(new Date)}function vw(s){return jo(s)}function Ba(s){return{year:s.getFullYear().toString(),month:(s.getMonth()+1).toString().padStart(2,"0"),day:s.getDate().toString().padStart(2,"0")}}function xw(s){return new Date(s)}function C(){return new Date().toISOString()}function Sn(s){let e=new Date;return e.setDate(e.getDate()-s),e}function Tw(s){let e=new Date;return e.setDate(e.getDate()+s),e}function Ew(s,e){let t=[],n=new Date(s);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Iw(s){return jo(s)===Nd()}function Aw(s,e){let t=Sn(e);return s>=t}function Pr(s){let e=Math.floor(s/1e3),t=Math.floor(e/60),n=Math.floor(t/60),r=Math.floor(n/24);return r>0?`${r}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function jw(s,e=new Date){let t=e.getTime()-s.getTime();return Pr(t)}function Dw(s){let e=new Date(s);return e.setHours(0,0,0,0),e}function Rw(s){let e=new Date(s);return e.setHours(23,59,59,999),e}function $w(s){let e=typeof s=="string"?new Date(s):s;return Cw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(jo,"formatDate");l(Pw,"formatMonth");l(Nd,"getTodayKey");l(vw,"getDateKey");l(Ba,"getYearMonthDay");l(xw,"parseDate");l(C,"getTimestamp");l(Sn,"getDaysAgo");l(Tw,"getDaysFromNow");l(Ew,"getDateRange");l(Iw,"isToday");l(Aw,"isWithinLastDays");l(Pr,"formatDuration");l(jw,"calculateDuration");l(Dw,"getStartOfDay");l(Rw,"getEndOfDay");l($w,"toRelative")});var $o={};he($o,{PACKAGE_ROOT:()=>de,VERSION:()=>Pe,compareVersions:()=>Ld,getPackageInfo:()=>Mw,getPackageRoot:()=>qa,getVersion:()=>xr,isCompatible:()=>Ow,needsMigration:()=>Fw});import Va from"node:fs";import Ro from"node:path";function qa(){if(vr)return vr;let s=__dirname;for(let e=0;e<5;e++){let t=Ro.join(s,"package.json");if(Va.existsSync(t))try{if(JSON.parse(Va.readFileSync(t,"utf-8")).name==="prjct-cli")return vr=s,s}catch{}s=Ro.dirname(s)}return vr=Ro.join(__dirname,"..","..",".."),vr}function xr(){if(Do)return Do;try{let s=Ro.join(qa(),"package.json"),e=JSON.parse(Va.readFileSync(s,"utf-8"));return Do=e.version,Ja=e,Do}catch(s){return console.error("Failed to read version from package.json:",w(s)),"0.0.0"}}function Mw(){return Ja||xr(),Ja}function Ld(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<Math.max(t.length,n.length);r++){let o=t[r]||0,i=n[r]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Ow(s){let e=xr(),[t,n]=e.split(".").map(Number),[r,o]=s.split(".").map(Number);return t===r&&n===o}function Fw(s,e=null){let t=e||xr();return Ld(s,t)<0}var Do,Ja,vr,Pe,de,dt=y(()=>{"use strict";N();Do=null,Ja=null,vr=null;l(qa,"getPackageRoot");l(xr,"getVersion");l(Mw,"getPackageInfo");l(Ld,"compareVersions");l(Ow,"isCompatible");l(Fw,"needsMigration");Pe=xr(),de=qa()});import{exec as _w}from"node:child_process";import{promisify as Nw}from"node:util";async function Mo(s){try{let{stdout:e}=await Lw(s,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Uw(){let s=await Mo("gh api user --jq .login");return s.success&&s.output||(s=await Mo("git config --global github.user"),s.success&&s.output)?s.output:null}async function Hw(){let s=await Mo("git config user.name");return s.success&&s.output?s.output:null}async function Gw(){let s=await Mo("git config user.email");return s.success&&s.output?s.output:null}async function Ps(){let[s,e,t]=await Promise.all([Uw(),Hw(),Gw()]);return{github:s,email:t,name:e||s||"Unknown"}}var Lw,Oo=y(()=>{"use strict";Lw=Nw(_w);l(Mo,"execCommand");l(Uw,"detectGitHubUsername");l(Hw,"detectGitName");l(Gw,"detectGitEmail");l(Ps,"detect")});import zw from"node:crypto";import Qt from"node:fs/promises";import Ya from"node:os";import G from"node:path";import{globSync as Ww}from"glob";var Xa,Bw,I,Se=y(()=>{"use strict";le();ve();Xa=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?G.resolve(e):G.join(Ya.homedir(),".prjct-cli"),this.globalProjectsDir=G.join(this.globalBaseDir,"projects"),this.globalConfigDir=G.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=G.resolve(e),this.globalProjectsDir=G.join(this.globalBaseDir,"projects"),this.globalConfigDir=G.join(this.globalBaseDir,"config")}generateProjectId(e){return zw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return G.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return G.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return G.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return G.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Po(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await x(t)}async ensureGlobalStructure(){await Nt(this.globalBaseDir),await Nt(this.globalProjectsDir),await Nt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let r of n)await Nt(G.join(t,r));return await Nt(G.join(t,"planning","tasks")),await Nt(G.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:r,day:o}=Ba(t);return G.join(this.getGlobalProjectPath(e),"sessions",n,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Nt(n),n}async listSessions(e,t=null,n=null){let r=G.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Qt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=G.join(r,a.name),u=await Qt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=G.join(c,d.name),p=await Qt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:G.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return G.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Qt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await Po(t)}getDisplayPath(e){let t=Ya.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return G.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return G.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return G.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return G.join(this.globalBaseDir,".running")}getDocsPath(){return G.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Je(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Je(),xt(ut)).getActiveProvider();return(Je(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return G.join(Ya.homedir(),".claude")}getClaudeSettingsPath(){return G.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?G.join(this.getGlobalProjectPath(e),"agents"):G.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return G.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return G.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let r of n){let o=G.join(e,r.file);if(await x(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=G.join(e,"package.json");if(await x(r))try{let o=await Qt.readFile(r,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],r=[];try{if(t==="pnpm"){let i=(await Qt.readFile(G.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
13
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=G.join(e,"package.json"),i=await Qt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let c=G.join(e,"lerna.json");if(await x(c)){let u=await Qt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(r=d.packages)}}}else if(t==="nx")r=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=G.join(e,"package.json"),i=await Qt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(r=a.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let o of r){if(o.startsWith("!"))continue;let i=Ww(o,{cwd:e,absolute:!1});for(let a of i){let c=G.join(e,a),u=G.join(c,"package.json");if(await x(u))try{let d=await Qt.readFile(u,"utf-8"),m=JSON.parse(d),p=G.join(c,"PRJCT.md");n.push({name:m.name||G.basename(a),path:c,relativePath:a,hasPrjctMd:await x(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=G.resolve(e);for(let r of t.packages){let o=G.resolve(r.path);if(n.startsWith(o))return r}return null}async findMonorepoRoot(e){let t=G.resolve(e),n=G.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=G.dirname(t)}return null}},Bw=new Xa,I=Bw});var Hd={};he(Hd,{default:()=>R});import Hn from"node:fs/promises";import Vw from"node:path";import*as Fo from"jsonc-parser";function Ud(s){let e=[],t=Fo.parse(s,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Fo.printParseErrorCode(n.error)}`)}return t}var Qa,Jw,R,qe=y(()=>{"use strict";ln();N();le();dt();Oo();Se();l(Ud,"parseJsonc");Qa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=I.getLocalConfigPath(e),n=await Hn.readFile(t,"utf-8");return Ud(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${re(t)}`),null}}async writeConfig(e,t){let n=I.getLocalConfigPath(e),r=I.getLegacyPrjctPath(e);await Hn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
14
+ `,"utf-8")}async readGlobalConfig(e){try{let t=I.getGlobalProjectConfigPath(e),n=await Hn.readFile(t,"utf-8");return Ud(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${re(t)}`),null}}async writeGlobalConfig(e,t){let n=I.getGlobalProjectConfigPath(e),r=I.getGlobalProjectPath(e);await Hn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
15
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:Pe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=I.generateProjectId(e),r=I.getGlobalProjectPath(n),o=I.getDisplayPath(r),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Pe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=C(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await I.hasLegacyStructure(e))return!1;if(!await I.hasConfig(e))return!0;let r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=I.getGlobalProjectPath(r.projectId);try{return(await Hn.readdir(Vw.join(o,"core"))).length===0}catch(i){return P(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:I.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(r=>r.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let r=n.authors.find(o=>o.github===t);r&&(r.lastActivity=C(),n.lastSync=r.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await Ps(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=I.generateProjectId(e);return{projectId:n,dataPath:I.getDisplayPath(I.getGlobalProjectPath(n))}}},Jw=new Qa,R=Jw});var zd={};he(zd,{default:()=>ec});import vs from"node:fs/promises";import qw from"node:os";import Gd from"node:path";var Za,Kw,ec,tc=y(()=>{"use strict";N();Za=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=qw.homedir(),this.configDir=Gd.join(this.homeDir,".prjct-cli","config"),this.configFile=Gd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await vs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await vs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let r={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await vs.writeFile(this.configFile,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return console.error("[editors-config] Error saving config:",w(r)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await vs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){try{return await vs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await vs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Kw=new Za,ec=Kw});function Yw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Tr(){return Yw()==="bun"}var nc=y(()=>{"use strict";l(Yw,"detectRuntime");l(Tr,"isBun")});import sc from"node:fs";import Wd from"node:path";function Xw(s){if(Tr()){let{Database:r}=yr("bun:sqlite");return new r(s,{create:!0})}let e=yr("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var Qw,_o,M,q,ye=y(()=>{"use strict";Se();nc();l(Xw,"openDatabase");Qw=[{version:1,name:"initial-schema",up:l(s=>{s.run(`
14
16
  -- =======================================================================
15
17
  -- Document storage (backward-compatible with JSON file pattern)
16
18
  -- =======================================================================
@@ -224,7 +226,7 @@ var vy=Object.create;var fr=Object.defineProperty;var xy=Object.getOwnPropertyDe
224
226
  started_at TEXT,
225
227
  ended_at TEXT
226
228
  );
227
- `)},"up")},{version:2,name:"archives-table",up:l(r=>{r.run(`
229
+ `)},"up")},{version:2,name:"archives-table",up:l(s=>{s.run(`
228
230
  -- =======================================================================
229
231
  -- Archives: Stale data moved out of active storage (PRJ-267)
230
232
  -- =======================================================================
@@ -241,13 +243,13 @@ var vy=Object.create;var fr=Object.defineProperty;var xy=Object.getOwnPropertyDe
241
243
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
242
244
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
243
245
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
244
- `)},"up")}],$o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Hd.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Hd.dirname(n);qa.existsSync(s)||qa.mkdirSync(s,{recursive:!0});let o=Uw(n);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return qa.existsSync(this.getDbPath(e))}getDoc(e,t){let s=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,n){let s=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,n,s){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let s=this.getDb(e);return t?s.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):s.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){return this.getDb(e).prepare(t).all(...n)}run(e,t,...n){this.getDb(e).prepare(t).run(...n)}get(e,t,...n){return this.getDb(e).prepare(t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
246
+ `)},"up")}],_o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Wd.join(I.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),r=Wd.dirname(n);sc.existsSync(r)||sc.mkdirSync(r,{recursive:!0});let o=Xw(n);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return sc.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,n){let r=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,n,r){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let r=this.getDb(e);return t?r.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):r.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){return this.getDb(e).prepare(t).all(...n)}run(e,t,...n){this.getDb(e).prepare(t).run(...n)}get(e,t,...n){return this.getDb(e).prepare(t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
245
247
  CREATE TABLE IF NOT EXISTS _migrations (
246
248
  version INTEGER PRIMARY KEY,
247
249
  name TEXT NOT NULL,
248
250
  applied_at TEXT NOT NULL
249
251
  )
250
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Gw)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new $o,V=$});var Ud=y(()=>{"use strict"});import Tr from"node:fs/promises";import wn from"node:path";import{z as ue}from"zod";async function Jw(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=wn.join(e,"package.json"),s=await Tr.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function qw(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await Qw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Vw[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Kw(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=wn.join(e,a);try{await Tr.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Yw(r,e){let t=Date.now();try{let n=await Zw(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Xw(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],s=[];for(let o of r.antiPatterns){let i=wn.join(e,o.file);try{await Tr.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Gd(r,e){let t=Date.now(),n=await Promise.all([Jw(r,e),qw(r,e),Kw(r,e),Yw(r,e),Xw(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function Qw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=wn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Zw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var zw,Ww,Bw,Ka,wA,Vw,Ya=y(()=>{"use strict";_();Sr();zw=ue.enum(["draft","verified","sealed"]),Ww=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),Bw=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),Ka=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(Ww),antiPatterns:ue.array(Bw),analyzedAt:ue.string(),modelMetadata:wr.optional(),status:zw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),wA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Vw={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(Jw,"verifyFrameworks");l(qw,"verifyLanguages");l(Kw,"verifyPatternLocations");l(Yw,"verifyFileCount");l(Xw,"verifyAntiPatternFiles");l(Gd,"semanticVerify");l(Qw,"getProjectExtensions");l(Zw,"countProjectFiles")});import{z as Me}from"zod";var Mo,Sn,eS,CA,Xa,zd,Er=y(()=>{"use strict";Mo=Me.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Sn=Me.object({primaryDomain:Mo,secondaryDomains:Me.array(Mo),confidence:Me.number().min(0).max(1),filePatterns:Me.array(Me.string()),relevantAgents:Me.array(Me.string())}),eS=Me.object({classification:Sn,classifiedAt:Me.string(),source:Me.enum(["cache","history","llm","heuristic"]),descriptionHash:Me.string(),projectId:Me.string()}),CA=Me.object({entries:Me.record(Me.string(),eS),confirmedPatterns:Me.array(Me.object({descriptionHash:Me.string(),classification:Sn,confirmedAt:Me.string(),taskDescription:Me.string()}))}),Xa={entries:{},confirmedPatterns:[]},zd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var tS,nS,Wd,sS,rS,oS,iS,aS,Bd,PA,Qa=y(()=>{"use strict";tS=z.enum(["low","medium","high"]),nS=z.enum(["pending","converted","completed","archived","dormant"]),Wd=z.enum(["high","medium","low"]),sS=z.object({impact:Wd,effort:Wd}),rS=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()}),oS=z.object({name:z.string(),description:z.string()}),iS=z.object({name:z.string(),description:z.string().optional()}),aS=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:tS,status:nS,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:sS.optional(),implementationNotes:z.string().optional(),stack:rS.optional(),modules:z.array(oS).optional(),roles:z.array(iS).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Bd=z.object({ideas:z.array(aS),lastUpdated:z.string()}),PA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Jd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Vd,cS,lS,uS,dS,AA,jA,Za=y(()=>{"use strict";Vd=Y.enum(["linear","jira","github","monday","asana","none"]),cS=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),lS=Y.enum(["none","urgent","high","medium","low"]),uS=Y.enum(["feature","bug","improvement","task","chore","epic"]),dS=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:cS,priority:lS,type:uS.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),AA=Y.object({provider:Vd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),dS)}),jA=Y.object({provider:Vd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Jd,"createEmptyIssues")});var Qd={};ge(Qd,{AgentAssignmentSchema:()=>qd,OUTPUT_SCHEMAS:()=>Yd,SubtaskBreakdownSchema:()=>Kd,TaskClassificationSchema:()=>Sn,renderSchemaForPrompt:()=>ec});import{z as Je}from"zod";function ec(r){let e=Yd[r];return e?`## OUTPUT FORMAT
252
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Qw)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},M=new _o,q=M});var Bd=y(()=>{"use strict"});import Er from"node:fs/promises";import bn from"node:path";import{z as ue}from"zod";async function sk(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=bn.join(e,"package.json"),r=await Er.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function rk(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await ck(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let c=nk[a];if(!c)continue;c.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ok(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,c=bn.join(e,a);try{await Er.access(c),o.push(a)}catch{r.push(`${i.name} (${a})`)}}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function ik(s,e){let t=Date.now();try{let n=await lk(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ak(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=bn.join(e,o.file);try{await Er.access(i),r.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Vd(s,e){let t=Date.now(),n=await Promise.all([sk(s,e),rk(s,e),ok(s,e),ik(s,e),ak(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function ck(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Er.readdir(r,{withFileTypes:!0});for(let i of o){let a=bn.join(r,i.name),c=bn.relative(s,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=bn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(s),Array.from(e)}async function lk(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Er.readdir(r,{withFileTypes:!0});for(let i of o){let a=bn.join(r,i.name),c=bn.relative(s,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(s),e}var Zw,ek,tk,rc,NA,nk,oc=y(()=>{"use strict";N();Sr();Zw=ue.enum(["draft","verified","sealed"]),ek=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),tk=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),rc=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(ek),antiPatterns:ue.array(tk),analyzedAt:ue.string(),modelMetadata:kr.optional(),status:Zw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),NA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},nk={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(sk,"verifyFrameworks");l(rk,"verifyLanguages");l(ok,"verifyPatternLocations");l(ik,"verifyFileCount");l(ak,"verifyAntiPatternFiles");l(Vd,"semanticVerify");l(ck,"getProjectExtensions");l(lk,"countProjectFiles")});import{z as Oe}from"zod";var No,Cn,uk,GA,ic,Jd,Ir=y(()=>{"use strict";No=Oe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Cn=Oe.object({primaryDomain:No,secondaryDomains:Oe.array(No),confidence:Oe.number().min(0).max(1),filePatterns:Oe.array(Oe.string()),relevantAgents:Oe.array(Oe.string())}),uk=Oe.object({classification:Cn,classifiedAt:Oe.string(),source:Oe.enum(["cache","history","llm","heuristic"]),descriptionHash:Oe.string(),projectId:Oe.string()}),GA=Oe.object({entries:Oe.record(Oe.string(),uk),confirmedPatterns:Oe.array(Oe.object({descriptionHash:Oe.string(),classification:Cn,confirmedAt:Oe.string(),taskDescription:Oe.string()}))}),ic={entries:{},confirmedPatterns:[]},Jd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as W}from"zod";var dk,pk,qd,mk,gk,fk,hk,yk,Kd,BA,ac=y(()=>{"use strict";dk=W.enum(["low","medium","high"]),pk=W.enum(["pending","converted","completed","archived","dormant"]),qd=W.enum(["high","medium","low"]),mk=W.object({impact:qd,effort:qd}),gk=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),fk=W.object({name:W.string(),description:W.string()}),hk=W.object({name:W.string(),description:W.string().optional()}),yk=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:dk,status:pk,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:mk.optional(),implementationNotes:W.string().optional(),stack:gk.optional(),modules:W.array(fk).optional(),roles:W.array(hk).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),Kd=W.object({ideas:W.array(yk),lastUpdated:W.string()}),BA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Xd(s){return{provider:s,lastSync:"",staleAfter:18e5,issues:{}}}var Yd,wk,kk,Sk,bk,KA,YA,cc=y(()=>{"use strict";Yd=Y.enum(["linear","jira","github","monday","asana","none"]),wk=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),kk=Y.enum(["none","urgent","high","medium","low"]),Sk=Y.enum(["feature","bug","improvement","task","chore","epic"]),bk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:wk,priority:kk,type:Sk.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),KA=Y.object({provider:Yd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),bk)}),YA=Y.object({provider:Yd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Xd,"createEmptyIssues")});var np={};he(np,{AgentAssignmentSchema:()=>Qd,OUTPUT_SCHEMAS:()=>ep,SubtaskBreakdownSchema:()=>Zd,TaskClassificationSchema:()=>Cn,renderSchemaForPrompt:()=>lc});import{z as Ke}from"zod";function lc(s){let e=ep[s];return e?`## OUTPUT FORMAT
251
253
 
252
254
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
253
255
 
@@ -256,28 +258,28 @@ ${e.example}
256
258
  \`\`\`
257
259
 
258
260
  Fields:
259
- ${pS(e.schema)}`:null}function pS(r){if(r instanceof Je.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Xd(n)}`).join(`
260
- `)}return"(see example above)"}function Xd(r){return r instanceof Je.ZodString?"string":r instanceof Je.ZodNumber?"number":r instanceof Je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Je.ZodArray?`array of ${Xd(r.element)}`:r instanceof Je.ZodObject?"object":"any"}var qd,Kd,Yd,Oo=y(()=>{"use strict";Er();Er();qd=Je.object({agentName:Je.string(),reasoning:Je.string(),confidence:Je.number().min(0).max(1)}),Kd=Je.object({subtasks:Je.array(Je.object({description:Je.string(),domain:Mo,agent:Je.string(),dependsOn:Je.array(Je.number())})),effort:Je.enum(["low","medium","high"])}),Yd={classification:{schema:Sn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:qd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Kd,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(ec,"renderSchemaForPrompt");l(pS,"describeSchema");l(Xd,"describeField")});import{z as E}from"zod";var Zd,mS,gS,ep,fS,hS,yS,wS,SS,kS,bS,tp,CS,vS,NA,np,sp,rp,op,xS,Fo,tc=y(()=>{"use strict";Zd=E.number().min(1).max(5),mS=E.enum(["exceeded","met","partial","failed"]),gS=E.enum(["definitely","probably","maybe","no"]),ep=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),fS=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:ep.optional(),explanation:E.string().optional()})}),hS=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),yS=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),wS=E.object({metrics:E.array(hS),acceptanceCriteria:E.array(yS),overallSuccess:mS,successScore:E.number().min(0).max(100)}),SS=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),kS=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(SS)}),bS=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:gS,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),tp=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:Zd,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),CS=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:fS,success:wS.optional(),learnings:kS,roi:bS,rating:Zd,taskOutcomes:E.array(tp).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),vS=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:ep,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),NA=E.object({outcomes:E.array(CS),taskOutcomes:E.array(tp).optional(),aggregates:vS.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),np={outcomes:[],taskOutcomes:[],lastUpdated:""},sp=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),rp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),op=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),xS=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Fo=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=>xS(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ge}from"zod";function jS(){let r={};for(let e of ES)r[e]="allow";for(let e of IS)r[e]="ask";for(let e of AS)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var _o,GA,PS,nc,TS,zA,ES,IS,AS,WA,ip=y(()=>{"use strict";_o=Ge.enum(["allow","deny","ask"]),GA=Ge.enum(["read","write","delete","create"]),PS=Ge.record(Ge.string(),_o),nc=Ge.record(Ge.string(),_o),TS=Ge.object({enabled:Ge.boolean().default(!0),allowedDomains:Ge.array(Ge.string()).optional(),blockedDomains:Ge.array(Ge.string()).optional()}),zA=Ge.object({bash:PS.optional(),files:Ge.object({read:nc.optional(),write:nc.optional(),delete:nc.optional()}).optional(),web:TS.optional(),skills:Ge.record(Ge.string(),_o).optional(),doomLoop:Ge.object({enabled:Ge.boolean().default(!0),maxRetries:Ge.number().default(3)}).optional(),externalDirectories:_o.default("ask")}),ES=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],IS=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],AS=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(jS,"buildDefaultPermissions");WA=jS()});import{z as at}from"zod";var qA,KA,ap=y(()=>{"use strict";qA=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),KA={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as I}from"zod";var DS,RS,$S,MS,OS,FS,_S,NS,LS,HS,US,GS,zS,WS,BS,VS,JS,qS,ZA,ej,cp=y(()=>{"use strict";DS=I.enum(["planned","active","completed","shipped"]),RS=I.enum(["low","medium","high"]),$S=I.enum(["feature","breaking_change","refactor","infrastructure"]),MS=I.enum(["completed","active","planned"]),OS=I.enum(["planned","active","completed"]),FS=I.enum(["git","git-branch","manual","prd"]),_S=I.object({id:I.string(),description:I.string(),completed:I.boolean(),completedAt:I.string().optional()}),NS=I.object({id:I.string(),name:I.string(),status:MS,completedAt:I.string().optional()}),LS=I.object({goal:I.string(),phases:I.array(NS),successMetrics:I.array(I.string()).optional()}),HS=I.object({hours:I.number(),minutes:I.number(),totalMinutes:I.number(),display:I.string().optional()}),US=I.object({hash:I.string(),message:I.string(),date:I.string(),author:I.string().optional()}),GS=I.object({hours:I.number(),confidence:I.enum(["low","medium","high"]).optional(),breakdown:I.array(I.object({area:I.string(),hours:I.number()})).optional()}),zS=I.object({hours:I.number().optional(),commits:I.number().optional(),linesAdded:I.number().optional(),linesRemoved:I.number().optional()}),WS=I.object({estimated:GS.nullable(),actual:zS.nullable()}),BS=I.object({totalHours:I.number(),allocatedHours:I.number(),bufferPercent:I.number().optional()}),VS=I.object({id:I.string(),name:I.string(),theme:I.string().optional(),goals:I.array(I.string()).optional(),features:I.array(I.string()),capacity:BS.optional(),status:OS,startDate:I.string().optional(),endDate:I.string().optional()}),JS=I.object({id:I.string(),name:I.string(),description:I.string().optional(),date:I.string(),status:DS,impact:RS,effort:I.string().optional(),progress:I.number(),type:$S.optional(),roi:I.number().optional(),why:I.array(I.string()).optional(),technicalNotes:I.array(I.string()).optional(),compatibility:I.string().optional(),phase:I.string().optional(),tasks:I.array(_S),createdAt:I.string(),shippedAt:I.string().optional(),version:I.string().optional(),duration:HS.optional(),taskCount:I.number().optional(),agent:I.string().optional(),sprintName:I.string().optional(),completedDate:I.string().optional(),prdId:I.string().nullable().optional(),legacy:I.boolean().optional(),inferredFrom:FS.optional(),quarter:I.string().nullable().optional(),dependencies:I.array(I.string()).optional(),blockedBy:I.array(I.string()).optional(),effortTracking:WS.optional(),valueScore:I.number().optional(),commits:I.array(US).optional(),branch:I.string().optional(),commitsAhead:I.number().optional()}),qS=I.object({id:I.string(),title:I.string(),prdId:I.string().nullable().optional(),valueScore:I.number().optional(),effortEstimate:I.number().optional(),reason:I.string().optional()}),ZA=I.object({strategy:LS.nullable().optional(),features:I.array(JS),backlog:I.array(I.union([I.string(),qS])),lastUpdated:I.string(),quarters:I.array(VS).optional(),generatedFrom:I.enum(["git-history","manual","prd"]).optional(),generatedAt:I.string().optional()}),ej={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import KS from"node:crypto";import{homedir as YS}from"node:os";import{join as XS}from"node:path";function Se(){return KS.randomUUID()}var QS,lp=y(()=>{"use strict";l(Se,"generateUUID");QS=XS(YS(),".prjct-cli","projects")});import{z as Q}from"zod";var ZS,up,ek,tk,nk,sk,rk,ok,ik,dp,sc=y(()=>{"use strict";ZS=Q.enum(["feature","fix","improvement","refactor"]),up=Q.enum(["pass","warning","fail","skipped"]),ek=Q.enum(["added","changed","fixed","removed"]),tk=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),nk=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),sk=Q.object({description:Q.string(),type:ek.optional()}),rk=Q.object({lintStatus:up.nullable().optional(),lintDetails:Q.string().optional(),testStatus:up.nullable().optional(),testDetails:Q.string().optional()}),ok=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),ik=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:ZS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(sk).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:ok.optional(),codeMetrics:nk.optional(),qualityMetrics:rk.optional(),quantitativeImpact:Q.string().optional(),duration:tk.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),dp=Q.object({shipped:Q.array(ik),lastUpdated:Q.string()})});import{z as T}from"zod";var ak,mp,ck,lk,uk,rc,gp,dk,pk,fp,pp,mk,gk,hp,yp,wp,fk,hk,mj,No=y(()=>{"use strict";Sr();ak=T.enum(["low","medium","high","critical"]),mp=T.enum(["feature","bug","improvement","chore"]),ck=T.enum(["active","backlog","previously_active"]),lk=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),uk=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),rc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),gp=T.object({output:T.string().min(1,"Subtask output is required"),summary:rc}),dk=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:lk,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:rc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),pk=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),fp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(dk).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:pk.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:wr.optional()}),pp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),mk=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),gk=T.object({taskId:T.string(),title:T.string(),classification:mp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(rc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:mk.optional()}),hp=T.object({currentTask:fp.nullable(),previousTask:pp.nullable().optional(),pausedTasks:T.array(pp).optional(),taskHistory:T.array(gk).optional(),lastUpdated:T.string()}),yp=T.object({id:T.string(),description:T.string(),priority:ak,type:mp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:ck,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),wp=T.object({tasks:T.array(yp),lastUpdated:T.string()}),fk=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),hk=T.object({type:uk,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),mj=T.object({projectId:T.string(),currentTask:fp.nullable(),queue:T.array(yp),stats:fk,recentActivity:T.array(hk),lastSync:T.string()})});import{z as ie}from"zod";var yk,wk,Sp,yj,wj,Sj,kn,kp,vs=y(()=>{"use strict";yk=ie.enum(["improving","stable","declining"]),wk=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Sp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),yj=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),wj=ie.object({sprints:ie.array(wk),averageVelocity:ie.number(),velocityTrend:yk,estimationAccuracy:ie.number(),overEstimated:ie.array(Sp),underEstimated:ie.array(Sp),lastUpdated:ie.string()}),Sj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),kn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},kp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ot=y(()=>{"use strict";Ud();Ya();Er();Qa();Za();Oo();Sr();tc();ip();ap();cp();lp();sc();No();vs()});var Xt,oc,St,bn=y(()=>{"use strict";Ot();le();he();Xt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},oc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=Se(),s=C();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Se(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},St=new oc});var bp=y(()=>{"use strict"});var Lo,Cp=y(()=>{"use strict";Lo={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 xs,Ho=y(()=>{"use strict";xs={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var vp=y(()=>{"use strict"});var xp=y(()=>{"use strict";vp()});function Uo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Pp,Ps=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Pp=["frontend","backend","devops","docs","testing","database","general"];l(Uo,"calculateConfidence")});var ic=y(()=>{"use strict"});var ac=y(()=>{"use strict";bp();Cp();Ho();_();xp();Ps();ic()});function Ts(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return Ck[r]}var se,cc,lc,Go,Ck,Tt,Tp,Ir,ln=y(()=>{"use strict";se={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},cc=["feature","spec","design","refactor","migrate"],lc=["ship","cleanup","git","migrate"],Go=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Ck={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ts,"getTimeout");Tt={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},Tp={HISTORY_MAX:100},Ir={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function xk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(vk.has(r)||r.includes("prjct"))return{level:Es.debug,name:"debug"};let e=Es[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zo(r,e,t){return Ep>=r?(...n)=>console[t](e,...n):Tk}var Es,vk,Ep,Pk,Tk,Ek,H,Ln=y(()=>{"use strict";Es={error:0,warn:1,info:2,debug:3},vk=new Set(["1","true","*"]);l(xk,"getLogLevel");({level:Ep,name:Pk}=xk()),Tk=l(()=>{},"noop");l(zo,"createLogMethod");Ek={error:zo(Es.error,"[prjct:error]","error"),warn:zo(Es.warn,"[prjct:warn]","warn"),info:zo(Es.info,"[prjct:info]","log"),debug:zo(Es.debug,"[prjct:debug]","log"),isEnabled:l(()=>Ep>=0,"isEnabled"),level:l(()=>Pk,"level")},H=Ek});var Wo,Ik,Ip=y(()=>{"use strict";cn();he();ac();ln();Ln();Wo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Tp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Lo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Lo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw H.error("Event callback error:",n),n}}async logEvent(e){try{$.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",ne(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Ik=new Wo});var Bo,Vo,Ap=y(()=>{"use strict";Ce();le();xe();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),n=await _n(t,[])??[];n.push(e),await kr(t,n)}async getPending(e){let t=A.getSyncPendingPath(e);return await _n(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await kr(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),n={timestamp:C(),success:!0};await kr(t,n)}async getLastSync(e){let t=A.getLastSyncPath(e);return await _n(t,null)}},Vo=new Bo});var uc=y(()=>{"use strict";Ip();Ap()});var Ft,Jo=y(()=>{"use strict";Ft=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var ze,Qt=y(()=>{"use strict";uc();Jo();le();he();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ft({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Vo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return $.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var dc,Ye,Ar=y(()=>{"use strict";Ot();Qa();le();bn();Qt();dc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Bd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:Se(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=yn(Xt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Ye=new dc});var pc,Pe,jr=y(()=>{"use strict";Ot();No();le();bn();Qt();pc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",wp)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:Se(),createdAt:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id:Se(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=yn(Xt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Pe=new pc});var mc,pt,Dr=y(()=>{"use strict";Ot();sc();le();bn();Qt();mc=class extends ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",dp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Se(),shippedAt:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=yn(Xt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},pt=new mc});var Rr,gc,Hn,fc=y(()=>{"use strict";Rr={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"}},gc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Rr[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Rr[e]}getPrompt(e){return Rr[e].prompt}getValidCommands(e){return Rr[e].transitions}formatNextSteps(e){return Rr[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Hn=new gc});var hc,L,$r=y(()=>{"use strict";Ot();No();le();fc();bn();Qt();hc=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",hp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Hn.getCurrentState(e),s=Hn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:Se()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];St.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));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:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=gp.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
261
+ ${Ck(e.schema)}`:null}function Ck(s){if(s instanceof Ke.ZodObject){let e=s.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${tp(n)}`).join(`
262
+ `)}return"(see example above)"}function tp(s){return s instanceof Ke.ZodString?"string":s instanceof Ke.ZodNumber?"number":s instanceof Ke.ZodEnum?`one of: ${s.options.join(", ")}`:s instanceof Ke.ZodArray?`array of ${tp(s.element)}`:s instanceof Ke.ZodObject?"object":"any"}var Qd,Zd,ep,Lo=y(()=>{"use strict";Ir();Ir();Qd=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),Zd=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:No,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),ep={classification:{schema:Cn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Qd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Zd,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(lc,"renderSchemaForPrompt");l(Ck,"describeSchema");l(tp,"describeField")});import{z as E}from"zod";var sp,Pk,vk,rp,xk,Tk,Ek,Ik,Ak,jk,Dk,op,Rk,$k,rj,ip,ap,cp,lp,Mk,Uo,uc=y(()=>{"use strict";sp=E.number().min(1).max(5),Pk=E.enum(["exceeded","met","partial","failed"]),vk=E.enum(["definitely","probably","maybe","no"]),rp=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),xk=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:rp.optional(),explanation:E.string().optional()})}),Tk=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),Ek=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),Ik=E.object({metrics:E.array(Tk),acceptanceCriteria:E.array(Ek),overallSuccess:Pk,successScore:E.number().min(0).max(100)}),Ak=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),jk=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(Ak)}),Dk=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:vk,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),op=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:sp,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),Rk=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:xk,success:Ik.optional(),learnings:jk,roi:Dk,rating:sp,taskOutcomes:E.array(op).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),$k=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:rp,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),rj=E.object({outcomes:E.array(Rk),taskOutcomes:E.array(op).optional(),aggregates:$k.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),ip={outcomes:[],taskOutcomes:[],lastUpdated:""},ap=l((s,e)=>{let t=e-s,n=s>0?(e-s)/s*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),cp=l((s,e)=>e<=0?s*10:Math.round(s*10/e*100)/100,"calculateROIScore"),lp=l(s=>s>=100?"exceeded":s>=80?"met":s>=50?"partial":"failed","determineSuccessLevel"),Mk=l(s=>Math.max(0,100-Math.abs(s)),"calculateEstimationAccuracy"),Uo=l(s=>{if(s.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=s.map(d=>Mk(d.effort.variance.percentage)),t=s.filter(d=>d.success).map(d=>d.success.successScore),n=s.map(d=>d.roi.roiScore),r={exceeded:s.filter(d=>d.success?.overallSuccess==="exceeded").length,met:s.filter(d=>d.success?.overallSuccess==="met").length,partial:s.filter(d=>d.success?.overallSuccess==="partial").length,failed:s.filter(d=>d.success?.overallSuccess==="failed").length},o=s.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=s.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:s.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as ze}from"zod";function Uk(){let s={};for(let e of _k)s[e]="allow";for(let e of Nk)s[e]="ask";for(let e of Lk)s[e]="deny";return{bash:s,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Ho,cj,Ok,dc,Fk,lj,_k,Nk,Lk,uj,up=y(()=>{"use strict";Ho=ze.enum(["allow","deny","ask"]),cj=ze.enum(["read","write","delete","create"]),Ok=ze.record(ze.string(),Ho),dc=ze.record(ze.string(),Ho),Fk=ze.object({enabled:ze.boolean().default(!0),allowedDomains:ze.array(ze.string()).optional(),blockedDomains:ze.array(ze.string()).optional()}),lj=ze.object({bash:Ok.optional(),files:ze.object({read:dc.optional(),write:dc.optional(),delete:dc.optional()}).optional(),web:Fk.optional(),skills:ze.record(ze.string(),Ho).optional(),doomLoop:ze.object({enabled:ze.boolean().default(!0),maxRetries:ze.number().default(3)}).optional(),externalDirectories:Ho.default("ask")}),_k=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Nk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Lk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Uk,"buildDefaultPermissions");uj=Uk()});import{z as at}from"zod";var gj,fj,dp=y(()=>{"use strict";gj=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),fj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Hk,Gk,zk,Wk,Bk,Vk,Jk,qk,Kk,Yk,Xk,Qk,Zk,eS,tS,nS,sS,rS,kj,Sj,pp=y(()=>{"use strict";Hk=A.enum(["planned","active","completed","shipped"]),Gk=A.enum(["low","medium","high"]),zk=A.enum(["feature","breaking_change","refactor","infrastructure"]),Wk=A.enum(["completed","active","planned"]),Bk=A.enum(["planned","active","completed"]),Vk=A.enum(["git","git-branch","manual","prd"]),Jk=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),qk=A.object({id:A.string(),name:A.string(),status:Wk,completedAt:A.string().optional()}),Kk=A.object({goal:A.string(),phases:A.array(qk),successMetrics:A.array(A.string()).optional()}),Yk=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),Xk=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),Qk=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),Zk=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),eS=A.object({estimated:Qk.nullable(),actual:Zk.nullable()}),tS=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),nS=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:tS.optional(),status:Bk,startDate:A.string().optional(),endDate:A.string().optional()}),sS=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Hk,impact:Gk,effort:A.string().optional(),progress:A.number(),type:zk.optional(),roi:A.number().optional(),why:A.array(A.string()).optional(),technicalNotes:A.array(A.string()).optional(),compatibility:A.string().optional(),phase:A.string().optional(),tasks:A.array(Jk),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Yk.optional(),taskCount:A.number().optional(),agent:A.string().optional(),sprintName:A.string().optional(),completedDate:A.string().optional(),prdId:A.string().nullable().optional(),legacy:A.boolean().optional(),inferredFrom:Vk.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:eS.optional(),valueScore:A.number().optional(),commits:A.array(Xk).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),rS=A.object({id:A.string(),title:A.string(),prdId:A.string().nullable().optional(),valueScore:A.number().optional(),effortEstimate:A.number().optional(),reason:A.string().optional()}),kj=A.object({strategy:Kk.nullable().optional(),features:A.array(sS),backlog:A.array(A.union([A.string(),rS])),lastUpdated:A.string(),quarters:A.array(nS).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),Sj={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import oS from"node:crypto";import{homedir as iS}from"node:os";import{join as aS}from"node:path";function ge(){return oS.randomUUID()}var cS,mp=y(()=>{"use strict";l(ge,"generateUUID");cS=aS(iS(),".prjct-cli","projects")});import{z as Q}from"zod";var lS,gp,uS,dS,pS,mS,gS,fS,hS,fp,pc=y(()=>{"use strict";lS=Q.enum(["feature","fix","improvement","refactor"]),gp=Q.enum(["pass","warning","fail","skipped"]),uS=Q.enum(["added","changed","fixed","removed"]),dS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),pS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),mS=Q.object({description:Q.string(),type:uS.optional()}),gS=Q.object({lintStatus:gp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:gp.nullable().optional(),testDetails:Q.string().optional()}),fS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),hS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:lS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(mS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:fS.optional(),codeMetrics:pS.optional(),qualityMetrics:gS.optional(),quantitativeImpact:Q.string().optional(),duration:dS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),fp=Q.object({shipped:Q.array(hS),lastUpdated:Q.string()})});import{z as T}from"zod";var yS,yp,wS,kS,SS,mc,wp,bS,CS,kp,hp,PS,vS,Sp,bp,Cp,xS,TS,$j,Go=y(()=>{"use strict";Sr();yS=T.enum(["low","medium","high","critical"]),yp=T.enum(["feature","bug","improvement","chore"]),wS=T.enum(["active","backlog","previously_active"]),kS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),SS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),mc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),wp=T.object({output:T.string().min(1,"Subtask output is required"),summary:mc}),bS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:kS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:mc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),CS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),kp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(bS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:CS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:kr.optional()}),hp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),PS=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),vS=T.object({taskId:T.string(),title:T.string(),classification:yp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(mc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:PS.optional()}),Sp=T.object({currentTask:kp.nullable(),previousTask:hp.nullable().optional(),pausedTasks:T.array(hp).optional(),taskHistory:T.array(vS).optional(),lastUpdated:T.string()}),bp=T.object({id:T.string(),description:T.string(),priority:yS,type:yp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:wS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Cp=T.object({tasks:T.array(bp),lastUpdated:T.string()}),xS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),TS=T.object({type:SS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),$j=T.object({projectId:T.string(),currentTask:kp.nullable(),queue:T.array(bp),stats:xS,recentActivity:T.array(TS),lastSync:T.string()})});import{z as ie}from"zod";var ES,IS,Pp,_j,Nj,Lj,Pn,vp,xs=y(()=>{"use strict";ES=ie.enum(["improving","stable","declining"]),IS=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Pp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),_j=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),Nj=ie.object({sprints:ie.array(IS),averageVelocity:ie.number(),velocityTrend:ES,estimationAccuracy:ie.number(),overEstimated:ie.array(Pp),underEstimated:ie.array(Pp),lastUpdated:ie.string()}),Lj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),Pn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},vp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Lt=y(()=>{"use strict";Bd();oc();Ir();ac();cc();Lo();Sr();uc();up();dp();pp();mp();pc();Go();xs()});var Zt,gc,kt,vn=y(()=>{"use strict";Lt();le();ye();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},gc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ge(),r=C();return M.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return M.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ge(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?M.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):M.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=M.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=M.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(M.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);M.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return M.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new gc});var xp=y(()=>{"use strict"});var zo,Tp=y(()=>{"use strict";zo={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 Ts,Wo=y(()=>{"use strict";Ts={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var Ep=y(()=>{"use strict"});var Ip=y(()=>{"use strict";Ep()});function Bo(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var O,Ap,Es=y(()=>{"use strict";O={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"},Ap=["frontend","backend","devops","docs","testing","database","general"];l(Bo,"calculateConfidence")});var fc=y(()=>{"use strict"});var hc=y(()=>{"use strict";xp();Tp();Wo();N();Ip();Es();fc()});function Is(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return RS[s]}var oe,yc,wc,Vo,RS,Et,jp,Ar,un=y(()=>{"use strict";oe={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},yc=["feature","spec","design","refactor","migrate"],wc=["ship","cleanup","git","migrate"],Vo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],RS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Is,"getTimeout");Et={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},jp={HISTORY_MAX:100},Ar={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function MS(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if($S.has(s)||s.includes("prjct"))return{level:As.debug,name:"debug"};let e=As[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function Jo(s,e,t){return Dp>=s?(...n)=>console[t](e,...n):FS}var As,$S,Dp,OS,FS,_S,U,Gn=y(()=>{"use strict";As={error:0,warn:1,info:2,debug:3},$S=new Set(["1","true","*"]);l(MS,"getLogLevel");({level:Dp,name:OS}=MS()),FS=l(()=>{},"noop");l(Jo,"createLogMethod");_S={error:Jo(As.error,"[prjct:error]","error"),warn:Jo(As.warn,"[prjct:warn]","warn"),info:Jo(As.info,"[prjct:info]","log"),debug:Jo(As.debug,"[prjct:debug]","log"),isEnabled:l(()=>Dp>=0,"isEnabled"),level:l(()=>OS,"level")},U=_S});var qo,NS,Rp=y(()=>{"use strict";ln();ye();hc();un();Gn();qo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=jp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),r={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).forEach(u=>{u.status==="rejected"&&U.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(zo.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let r=this.listeners.get(zo.ALL);r&&t.push(...r);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw U.error("Event callback error:",n),n}}async logEvent(e){try{M.appendEvent(this.projectId,e.type,e)}catch(t){U.debug("Failed to log event:",re(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(r=>r.type===t||r.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},NS=new qo});var Ko,Yo,$p=y(()=>{"use strict";Se();le();ve();Ko=class{static{l(this,"SyncEventBus")}async publish(e){let t=I.getSyncPendingPath(e.projectId),n=await Un(t,[])??[];n.push(e),await br(t,n)}async getPending(e){let t=I.getSyncPendingPath(e);return await Un(t,[])??[]}async clearPending(e){let t=I.getSyncPendingPath(e);await br(t,[])}async updateLastSync(e){let t=I.getLastSyncPath(e),n={timestamp:C(),success:!0};await br(t,n)}async getLastSync(e){let t=I.getLastSyncPath(e);return await Un(t,null)}},Yo=new Ko});var kc=y(()=>{"use strict";Rp();$p()});var Ut,Xo=y(()=>{"use strict";Ut=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var We,en=y(()=>{"use strict";kc();Xo();le();ye();We=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ut({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=M.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){M.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Yo.publish(r)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return M.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Sc,Qe,jr=y(()=>{"use strict";Lt();ac();le();vn();en();Sc=class extends We{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Kd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:ge(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Sn(Zt.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},Qe=new Sc});var bc,xe,Dr=y(()=>{"use strict";Lt();Go();le();vn();en();bc=class extends We{static{l(this,"QueueStorage")}constructor(){super("queue.json",Cp)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ge(),createdAt:C(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),r=t.map(o=>({...o,id:ge(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Sn(Zt.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((r,o)=>{let i=n[r.section]-n[o.section];if(i!==0)return i;let a=t[r.priority]-t[o.priority];return a!==0?a:new Date(r.createdAt).getTime()-new Date(o.createdAt).getTime()})}},xe=new bc});var Cc,pt,Rr=y(()=>{"use strict";Lt();pc();le();vn();en();Cc=class extends We{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",fp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ge(),shippedAt:C()};return await this.update(e,r=>({shipped:[n,...r.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-10080*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Sn(Zt.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},pt=new Cc});var $r,Pc,zn,vc=y(()=>{"use strict";$r={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"}},Pc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=$r[e];if(n.transitions.includes(t))return{valid:!0};let r=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return $r[e]}getPrompt(e){return $r[e].prompt}getValidCommands(e){return $r[e].transitions}formatNextSteps(e){return $r[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},zn=new Pc});var xc,L,Mr=y(()=>{"use strict";Lt();Go();le();vc();vn();en();xc=class extends We{static{l(this,"StateStorage")}constructor(){super("state.json",Sp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=zn.getCurrentState(e),r=zn.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:r.parentDescription||e.description,classification:r.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:r.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:r.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let r={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let n=await this.read(e),r=this.getPausedTasksFromState(n);if(r.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(u=>u.id===t),o===-1))return null;let i=r[o],a=r.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:ge()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(r=>r.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));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:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&r.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=wp.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
261
263
  ${f.join(`
262
- `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new hc});import jk from"node:fs/promises";import Dk from"node:path";import{Hono as Rk}from"hono";function $k(r){return A.getGlobalProjectPath(r)}function jp(r,e){let t=new Rk,n=$k(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ye.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await pt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Pe.read(r),Ye.read(r),pt.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=Dk.join(n,"context",`${o}.md`),c=await jk.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||H.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Dp=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();_();Ln();l($k,"getProjectDataPath");l(jp,"createRoutes")});import Is from"node:fs/promises";import Mk from"node:path";import{Hono as Ok}from"hono";function qo(r){return $.getDoc(r,"project")}async function yc(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function Rp(){let r=new Ok;return r.get("/projects",async e=>{try{await Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=qo(o),a=await L.read(o),c=await Pe.read(o),u=await Ye.read(o),d=await pt.read(o),m=a?.currentTask,p=await yc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(qo(t)),L.read(t),Pe.read(t),Ye.read(t),pt.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await yc(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await 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:s},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(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),Pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Ye.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await Pe.read(c),m=await Ye.read(c),p=await pt.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Is.mkdir(As,{recursive:!0});let s=(await Is.readdir(As,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=qo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await yc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var Fk,As,$p=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();Fk=A.getGlobalBasePath(),As=Mk.join(Fk,"projects");l(qo,"getProjectConfig");l(yc,"calculateDuration");l(Rp,"createExtendedRoutes")});import{streamSSE as _k}from"hono/streaming";function Op(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Mp&&t(i)},Nk),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return _k(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},Lk),p=setTimeout(()=>{t(a)},Mp);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}var Mp,Nk,Lk,Fp=y(()=>{"use strict";ic();Mp=3600*1e3,Nk=300*1e3,Lk=3e4;l(Op,"createSSEManager")});var _p={};ge(_p,{DEFAULT_PORT:()=>Yo,createServer:()=>Ko,startServer:()=>zk});import{Hono as Hk}from"hono";import{cors as Uk}from"hono/cors";import{logger as Gk}from"hono/logger";function Ko(r){let e=new Hk,t=Op();r.enableCors!==!1&&e.use("*",Uk({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),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:"0.20.0",projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=jp(r.projectId,r.projectPath);e.route("/api",n);let s=Rp();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Pr())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: ${Pr()?"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 zk(r,e,t=Yo){let n=Ko({port:t,projectId:r,projectPath:e});return await n.start(),n}var Yo,wc=y(()=>{"use strict";Ja();Dp();$p();Fp();l(Ko,"createServer");Yo=3478;l(zk,"startServer")});import Un from"chalk";var Np,Wk,Bk,_t,Lp=y(()=>{"use strict";Be();Np=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Wk=80,Bk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Np,speed:Wk},cli:{header:l(()=>`${Un.cyan.bold("\u26A1")} ${Un.cyan("prjct")}`,"header"),footer:l(()=>Un.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Un.cyan("\u26A1")} ${Un.cyan("prjct")} ${Un.cyan(Np[r%10])} ${Un.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")=>vo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>vo(r).signature,"getSignature")},_t=Bk});function Gn(r,e){return{...xs[r],...e}}function Mr(r,e,t){return{message:r,hint:e,...t}}var Or=y(()=>{"use strict";Ho();Ho();l(Gn,"getError");l(Mr,"createError")});var Up={};ge(Up,{ERRORS:()=>xs,ICONS:()=>Cn,OUTPUT_TIERS:()=>Hp,createError:()=>Mr,default:()=>h,formatForHuman:()=>Yk,getError:()=>Gn,getOutputTier:()=>Jk,getTierConfig:()=>Qo,isQuietMode:()=>Kk,limitLines:()=>Xo,setOutputTier:()=>Vk,setQuietMode:()=>qk});import te from"chalk";function Vk(r){Ds=r}function Jk(){return Ds}function Qo(){return Hp[Ds]}function qk(r){ct=r}function Kk(){return ct}function Xo(r,e){let t=e??Qo().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
263
- `);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
264
+ `)}`)}let{output:r,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:r,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new xc});import US from"node:fs/promises";import HS from"node:path";import{Hono as GS}from"hono";function zS(s){return I.getGlobalProjectPath(s)}function Mp(s,e){let t=new GS,n=zS(s);return t.get("/state",async r=>{let o=await L.read(s);return r.json(o)}),t.get("/queue",async r=>{let o=await xe.read(s);return r.json(o)}),t.get("/ideas",async r=>{let o=await Qe.read(s);return r.json(o)}),t.get("/roadmap",async r=>{let o=M.getDoc(s,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await pt.read(s);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([L.read(s),xe.read(s),Qe.read(s),pt.read(s)]),u=M.getDoc(s,"roadmap");return r.json({projectId:s,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await L.write(s,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=HS.join(n,"context",`${o}.md`),c=await US.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||U.error(`Context read error: ${w(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}var Op=y(()=>{"use strict";Se();ye();jr();Dr();Rr();Mr();N();Gn();l(zS,"getProjectDataPath");l(Mp,"createRoutes")});import js from"node:fs/promises";import WS from"node:path";import{Hono as BS}from"hono";function Qo(s){return M.getDoc(s,"project")}async function Tc(s){if(!s)return"";let e=new Date(s),n=new Date().getTime()-e.getTime(),r=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}function Fp(){let s=new BS;return s.get("/projects",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(n.map(async o=>{let i=Qo(o),a=await L.read(o),c=await xe.read(o),u=await Qe.read(o),d=await pt.read(o),m=a?.currentTask,p=await Tc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),s.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,r,o,i,a]=await Promise.all([Promise.resolve(Qo(t)),L.read(t),xe.read(t),Qe.read(t),pt.read(t)]),c=M.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await Tc(r.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:r||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),s.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,o=await 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:r},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(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:r}=n;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),xe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===r);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=n;if(!r)return e.json({success:!1,error:"text required"},400);let a=await Qe.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.get("/stats/global",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await xe.read(c),m=await Qe.read(c),p=await pt.read(c);u?.currentTask&&a++,r+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await js.mkdir(Ds,{recursive:!0});let r=(await js.readdir(Ds,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await L.read(d),p=Qo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Tc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s}var VS,Ds,_p=y(()=>{"use strict";Se();ye();jr();Dr();Rr();Mr();VS=I.getGlobalBasePath(),Ds=WS.join(VS,"projects");l(Qo,"getProjectConfig");l(Tc,"calculateDuration");l(Fp,"createExtendedRoutes")});import{streamSSE as JS}from"hono/streaming";function Lp(){let s=new Map,e=null;function t(o){let i=s.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),s.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of s)o-new Date(a.client.connectedAt).getTime()>Np&&t(i)},qS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),n(),{handleConnection(o){return JS(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},KS),p=setTimeout(()=>{t(a)},Np);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),s.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of s)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return s.size},shutdown(){r();for(let o of[...s.keys()])t(o)}}}var Np,qS,KS,Up=y(()=>{"use strict";fc();Np=3600*1e3,qS=300*1e3,KS=3e4;l(Lp,"createSSEManager")});var Hp={};he(Hp,{DEFAULT_PORT:()=>ei,createServer:()=>Zo,startServer:()=>ZS});import{Hono as YS}from"hono";import{cors as XS}from"hono/cors";import{logger as QS}from"hono/logger";function Zo(s){let e=new YS,t=Lp();s.enableCors!==!1&&e.use("*",XS({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),s.enableLogging!==!1&&e.use("*",QS()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:s.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Mp(s.projectId,s.projectPath);e.route("/api",n);let r=Fp();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=s.port,a=s.host||"0.0.0.0";if(Tr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${s.projectId}`),console.log(` Runtime: ${Tr()?"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 ZS(s,e,t=ei){let n=Zo({port:t,projectId:s,projectPath:e});return await n.start(),n}var ei,Ec=y(()=>{"use strict";nc();Op();_p();Up();l(Zo,"createServer");ei=3478;l(ZS,"startServer")});import Wn from"chalk";var Gp,eb,tb,Ht,zp=y(()=>{"use strict";Je();Gp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],eb=80,tb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Gp,speed:eb},cli:{header:l(()=>`${Wn.cyan.bold("\u26A1")} ${Wn.cyan("prjct")}`,"header"),footer:l(()=>Wn.dim("\u26A1 prjct"),"footer"),spin:l((s,e)=>`${Wn.cyan("\u26A1")} ${Wn.cyan("prjct")} ${Wn.cyan(Gp[s%10])} ${Wn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((s="claude")=>Eo(s).commitFooter,"getCommitFooter"),getSignature:l((s="claude")=>Eo(s).signature,"getSignature")},Ht=tb});function Bn(s,e){return{...Ts[s],...e}}function Or(s,e,t){return{message:s,hint:e,...t}}var Fr=y(()=>{"use strict";Wo();Wo();l(Bn,"getError");l(Or,"createError")});var Bp={};he(Bp,{ERRORS:()=>Ts,ICONS:()=>xn,OUTPUT_TIERS:()=>Wp,createError:()=>Or,default:()=>h,formatForHuman:()=>ib,getError:()=>Bn,getOutputTier:()=>sb,getTierConfig:()=>ni,isQuietMode:()=>ob,limitLines:()=>ti,setOutputTier:()=>nb,setQuietMode:()=>rb});import se from"chalk";function nb(s){$s=s}function sb(){return $s}function ni(){return Wp[$s]}function rb(s){ct=s}function ob(){return ct}function ti(s,e){let t=e??ni().maxLines;if(t===1/0||t===0)return s;let n=s.split(`
265
+ `);if(n.length<=t)return s;let r=n.slice(0,t),o=n.length-t;return`${r.join(`
264
266
  `)}
265
- ${te.dim(`...${o} more lines`)}`}function Yk(r){let e=Qo();if(Ds==="silent")return"";if(Ds==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Et(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Et(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&&Ds==="compact"&&o.push(te.dim(String(t.url))),Xo(o.join(`
266
- `),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} ${Et(String(a.title),Tt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(te.dim(`...${o.length-e.maxLines} more`)),i.join(`
267
- `)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?Xo(s.map(o=>`${o}: ${Et(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
268
- `),e.maxLines):Xo(JSON.stringify(r,null,2),e.maxLines)}var fR,Sc,Hp,Ds,Cn,js,kc,ct,Et,Xk,Qk,h,Nt=y(()=>{"use strict";Lp();ln();Or();Or();fR=_t.spinner.frames,Sc=_t.spinner.speed,Hp={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}},Ds="compact";l(Vk,"setOutputTier");l(Jk,"getOutputTier");l(Qo,"getTierConfig");Cn={success:te.green("\u2713"),fail:te.red("\u2717"),warn:te.yellow("\u26A0"),info:te.blue("\u2139"),debug:te.dim("\u{1F527}"),bullet:te.dim("\u2022"),arrow:te.dim("\u2192"),check:te.green("\u2713"),cross:te.red("\u2717"),spinner:te.cyan("\u25D0")},js=null,kc=0,ct=!1;l(qk,"setQuietMode");l(Kk,"isQuietMode");Et=l((r,e)=>{let t=e??(Qo().maxCharsPerLine||Tt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Xo,"limitLines");l(Yk,"formatForHuman");Xk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Tt.CLEAR_WIDTH)}\r`):!0,"clear"),Qk={start(){return ct||console.log(_t.cli.header()),this},end(){return ct||console.log(_t.cli.footer()),this},spin(r){return ct?this:(this.stop(),process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,Et(r,Tt.SPINNER_MSG))}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,Et(r,Tt.SPINNER_MSG))}
269
- `),this))},done(r,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=te.dim(` [${n.join(" | ")}]`))}console.log(`${Cn.success} ${Et(r,Tt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Cn.fail} ${Et(r,Tt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Gn(r):r;return console.error(),console.error(`${Cn.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),ct||console.log(`${Cn.warn} ${Et(r,Tt.WARN_MSG)}`),this},info(r){return this.stop(),ct||console.log(`${Cn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${Cn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),ct)return this;let t=e.bullet||Cn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),ct||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(te.dim(s)),console.log(te.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),ct)return this;let t=e.split(`
270
- `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),ct?this:(console.log(`
271
- ${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return js&&(clearInterval(js),js=null,Xk()),this},step(r,e,t){if(ct)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,`${n} ${Et(t,Tt.STEP_MSG)}`)}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,`${n} ${Et(t,Tt.STEP_MSG)}`)}
272
- `),this)},progress(r,e,t){if(ct)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Et(t,Tt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,`[${i}] ${n}%${a}`)}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,`[${i}] ${n}%${a}`)}
273
- `),this)}},h=Qk});var Wp={};ge(Wp,{default:()=>eb,sessionTracker:()=>vn});var Zk,Gp,zp,bc,vn,eb,Zo=y(()=>{"use strict";he();le();Zk=1800*1e3,Gp=50,zp=200,bc=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Zk}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Gp&&(s.current.commands=s.current.commands.slice(-Gp)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>zp&&(s.current.files=s.current.files.slice(-zp)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Cr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Cr(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},vn=new bc,eb=vn});var Vp={};ge(Vp,{default:()=>zn,performanceTracker:()=>Bp});var Cc,Bp,zn,ei=y(()=>{"use strict";he();Cc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){V.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)V.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){V.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){V.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),f=c.map(S=>S.value);o.memory={avgHeapMB:p(g.reduce((S,b)=>S+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,b)=>S+b,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((S,b)=>S+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Bp=new Cc,zn=Bp});function xc(r){if(Pp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ti))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var vc,ti,Wn,Fr,_r,Nr=y(()=>{"use strict";he();Ps();le();vc={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ti={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(xc,"resolveCanonicalDomains");Wn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=V.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();V.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Fr=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()}},_r=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};V.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Lr,Pc=y(()=>{"use strict";he();Ps();le();Nr();Lr=class r extends Wn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Uo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Uo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Uo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=V.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return V.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Bn,Tc=y(()=>{"use strict";Ot();Ps();le();Nr();Bn=class extends Wn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:Se(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),x=(p.tags||[]).filter(O=>D.includes(O));g.tagMatch=Math.min(20,x.length*8)}let S=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-S*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),x=0;for(let O of D)p.content.toLowerCase().includes(O)&&(x+=2),p.title.toLowerCase().includes(O)&&(x+=3);g.keywords=Math.min(15,x)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=vc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ti[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return xc(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
274
- Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Ec,tb,Te,Rs=y(()=>{"use strict";Nr();Pc();Tc();Nr();Pc();Tc();Ec=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Bn,this._patternStore=new Lr,this._historyStore=new _r,this._sessionStore=new Fr}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},tb=new Ec,Te=tb});import{exec as nb}from"node:child_process";import kt from"node:fs/promises";import Lt from"node:path";import{promisify as sb}from"node:util";var Vn,Ic,rb,qe,Jp=y(()=>{"use strict";_();Vn=sb(nb),Ic=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Lt.join(this.projectPath,"package.json"),t=await kt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Lt.join(this.projectPath,"Cargo.toml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=Lt.join(this.projectPath,"requirements.txt");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=Lt.join(this.projectPath,"go.mod");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=Lt.join(this.projectPath,"Gemfile");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=Lt.join(this.projectPath,"mix.exs");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=Lt.join(this.projectPath,"pom.xml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=Lt.join(this.projectPath,"composer.json"),t=await kt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Lt.join(this.projectPath,"pyproject.toml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Vn('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(`
275
- `).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await kt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(v(e))return[];throw e}}async listDirectories(){try{return(await kt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(v(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Vn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Vn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Vn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Vn('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await Vn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await kt.access(Lt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=Lt.join(this.projectPath,e);return await kt.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Vn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
276
- `).filter(Boolean)}catch{return[]}}},rb=new Ic,qe=rb});import jc from"node:fs";import ob from"node:fs/promises";import ni from"node:path";function Dc(){if(qp)return Ac;qp=!0;let r=ni.join(pe,"dist","templates.json");try{let e=jc.readFileSync(r,"utf-8");return Ac=JSON.parse(e),Ac}catch{return null}}function ab(r){let e=Jn.indexOf(r);e>-1&&Jn.splice(e,1),Jn.push(r)}function cb(){for(;$s.size>=ib&&Jn.length>0;){let r=Jn.shift();r&&$s.delete(r)}}function si(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
277
- `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function Kp(r){if($s.has(r))return ab(r),$s.get(r);let e,t=Dc();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ni.join(pe,"templates","commands",`${r}.md`);try{e=await ob.readFile(s,"utf-8")}catch{throw Po.notFound(r)}}let n=si(e);return cb(),$s.set(r,n),Jn.push(r),n}async function lb(r){return(await Kp(r)).frontmatter["allowed-tools"]||[]}function ub(){$s.clear(),Jn.length=0}function ve(r){let e=Dc();if(e?.[r])return e[r];let t=ni.join(pe,"templates",r);try{return jc.readFileSync(t,"utf-8")}catch{return null}}function Ms(r){let e=Dc();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ni.join(pe,"templates",r);try{return jc.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var ib,$s,Jn,Ac,qp,db,Rc,qn=y(()=>{"use strict";cn();dt();ib=50,$s=new Map,Jn=[],Ac=null,qp=!1;l(Dc,"loadBundle");l(ab,"updateLruOrder");l(cb,"evictLru");l(si,"parseFrontmatter");l(Kp,"load");l(lb,"getAllowedTools");l(ub,"clearCache");l(ve,"getTemplateContent");l(Ms,"listTemplates");db={load:Kp,parseFrontmatter:si,getAllowedTools:lb,clearCache:ub,getTemplateContent:ve,listTemplates:Ms},Rc=db});import X from"node:fs/promises";import Mc from"node:os";import Z from"node:path";async function pb(){try{let r=ve("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Z.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function mb(r){let e=await pb();if(!e){let i=ve("global/CLAUDE.md");if(i)return i;let a=Z.join(pe,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ve("global/CLAUDE.md");if(a)return a;let c=Z.join(pe,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=ve(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Z.join(pe,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
278
- `)}async function gb(){try{let r=Z.join(Mc.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=Ms("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ve(s);if(o){let i=Z.basename(s);await X.writeFile(Z.join(r,i),o,"utf-8")}}return{success:!0}}let t=Z.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Z.join(t,s),i=Z.join(r,s),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function fb(){let r=(Be(),xt(ut)),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 X.mkdir(e.configDir,{recursive:!0});let s=Z.join(e.configDir,e.contextFile),o=Z.join(pe,"templates","global",e.contextFile),i="";try{let u=ve(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await mb()}catch{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=Z.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=Z.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(s,"utf-8"),c=!0}catch(u){if(v(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),S=p+f+g;return await X.writeFile(s,S,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
279
-
280
- ${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function Yp(){let r=Mc.homedir();return{claude:{commands:Z.join(r,".claude","commands","p"),config:Z.join(r,".claude"),router:Z.join(r,".claude","commands","p.md")},gemini:{commands:Z.join(r,".gemini","commands"),config:Z.join(r,".gemini"),router:Z.join(r,".gemini","commands","p.toml")}}}var $c,hb,Ee,xn=y(()=>{"use strict";qn();_();dt();l(pb,"loadModuleConfig");l(mb,"composeGlobalTemplate");l(gb,"installDocs");l(fb,"installGlobalConfig");$c=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Mc.homedir(),this.templatesDir=Z.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),xt(ut)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Z.join(t.configDir,"commands"):this.claudeCommandsPath=Z.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(v(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=Ms("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Be(),xt(ut)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Z.join(this.claudeCommandsPath,a),u=ve(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=Z.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=Z.join(this.claudeCommandsPath,s);await X.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(v(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(ve(`commands/${e}.md`))return!0;try{let n=Z.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(v(n))return!1;throw n}}async installRouter(){let t=await(Be(),xt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Z.join(t.configDir,"commands",n);await X.mkdir(Z.dirname(s),{recursive:!0});let o=ve(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=Z.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(s,a,"utf-8"),!0}catch(s){if(v(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Be(),xt(ut)).getActiveProvider(),n=Z.join(t.configDir,"commands"),s=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(Z.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(v(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=Z.join(this.claudeCommandsPath,o),a=n.includes(o),c=ve(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=Z.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return fb()}async installDocs(){return gb()}};l(Yp,"getProviderPaths");hb=new $c,Ee=hb});import{z as Oe}from"zod";function em(r,e="default"){let t=Xp[e]||Xp.default;return r/1e3*t}function ri(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var yb,wb,Qp,Zp,Xp,oi=y(()=>{"use strict";yb=Oe.object({date:Oe.string(),tokensSaved:Oe.number(),syncs:Oe.number(),avgCompressionRate:Oe.number(),totalDuration:Oe.number()}),wb=Oe.object({agentName:Oe.string(),usageCount:Oe.number(),tokensSaved:Oe.number()}),Qp=Oe.object({totalTokensSaved:Oe.number(),avgCompressionRate:Oe.number(),syncCount:Oe.number(),watchTriggers:Oe.number(),avgSyncDuration:Oe.number(),totalSyncDuration:Oe.number(),agentUsage:Oe.array(wb),dailyStats:Oe.array(yb),firstSync:Oe.string(),lastUpdated:Oe.string()}),Zp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Xp={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(em,"estimateCostSaved");l(ri,"formatCost")});function Sb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function kb(r){let e=[],t=Sb(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Oc,o+i.length);if(c===-1)continue;let u=c+Oc.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Fc(r,e){let t=kb(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
267
+ ${se.dim(`...${o} more lines`)}`}function ib(s){let e=ni();if($s==="silent")return"";if($s==="verbose")return JSON.stringify(s,null,2);if(typeof s!="object"||s===null)return It(String(s),e.maxCharsPerLine);let t=s;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${It(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&&$s==="compact"&&o.push(se.dim(String(t.url))),ti(o.join(`
268
+ `),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} ${It(String(a.title),Et.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(se.dim(`...${o.length-e.maxLines} more`)),i.join(`
269
+ `)}let r=["id","name","title","status","message","success","error"].filter(o=>o in t);return r.length>0?ti(r.map(o=>`${o}: ${It(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
270
+ `),e.maxLines):ti(JSON.stringify(s,null,2),e.maxLines)}var OR,Ic,Wp,$s,xn,Rs,Ac,ct,It,ab,cb,h,Gt=y(()=>{"use strict";zp();un();Fr();Fr();OR=Ht.spinner.frames,Ic=Ht.spinner.speed,Wp={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}},$s="compact";l(nb,"setOutputTier");l(sb,"getOutputTier");l(ni,"getTierConfig");xn={success:se.green("\u2713"),fail:se.red("\u2717"),warn:se.yellow("\u26A0"),info:se.blue("\u2139"),debug:se.dim("\u{1F527}"),bullet:se.dim("\u2022"),arrow:se.dim("\u2192"),check:se.green("\u2713"),cross:se.red("\u2717"),spinner:se.cyan("\u25D0")},Rs=null,Ac=0,ct=!1;l(rb,"setQuietMode");l(ob,"isQuietMode");It=l((s,e)=>{let t=e??(ni().maxCharsPerLine||Et.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate");l(ti,"limitLines");l(ib,"formatForHuman");ab=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Et.CLEAR_WIDTH)}\r`):!0,"clear"),cb={start(){return ct||console.log(Ht.cli.header()),this},end(){return ct||console.log(Ht.cli.footer()),this},spin(s){return ct?this:(this.stop(),process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Ac++,It(s,Et.SPINNER_MSG))}`)},Ic),this):(process.stdout.write(`${Ht.cli.spin(0,It(s,Et.SPINNER_MSG))}
271
+ `),this))},done(s,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=se.dim(` [${n.join(" | ")}]`))}console.log(`${xn.success} ${It(s,Et.DONE_MSG)}${t}`)}return this},fail(s){return this.stop(),console.error(`${xn.fail} ${It(s,Et.FAIL_MSG)}`),this},failWithHint(s){this.stop();let e=typeof s=="string"?Bn(s):s;return console.error(),console.error(`${xn.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(s){return this.stop(),ct||console.log(`${xn.warn} ${It(s,Et.WARN_MSG)}`),this},info(s){return this.stop(),ct||console.log(`${xn.info} ${s}`),this},debug(s){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${xn.debug} ${se.dim(s)}`),this},success(s,e){return this.done(s,e)},list(s,e={}){if(this.stop(),ct)return this;let t=e.bullet||xn.bullet,n=" ".repeat(e.indent||0);for(let r of s)console.log(`${n}${t} ${r}`);return this},table(s,e={}){if(this.stop(),ct||s.length===0)return this;let t=Object.keys(s[0]),n={};for(let r of t){n[r]=r.length;for(let o of s){let i=String(o[r]??"");i.length>n[r]&&(n[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(n[o])).join(" ");console.log(se.dim(r)),console.log(se.dim("\u2500".repeat(r.length)))}for(let r of s){let o=t.map(i=>String(r[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(s,e){if(this.stop(),ct)return this;let t=e.split(`
272
+ `),n=Math.max(s.length,...t.map(o=>o.length)),r="\u2500".repeat(n+2);console.log(se.dim(`\u250C${r}\u2510`)),console.log(`${se.dim("\u2502")} ${se.bold(s.padEnd(n))} ${se.dim("\u2502")}`),console.log(se.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${se.dim("\u2502")} ${o.padEnd(n)} ${se.dim("\u2502")}`);return console.log(se.dim(`\u2514${r}\u2518`)),this},section(s){return this.stop(),ct?this:(console.log(`
273
+ ${se.bold(s)}`),console.log(se.dim("\u2500".repeat(s.length))),this)},stop(){return Rs&&(clearInterval(Rs),Rs=null,ab()),this},step(s,e,t){if(ct)return this;this.stop();let n=se.dim(`[${s}/${e}]`);return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Ac++,`${n} ${It(t,Et.STEP_MSG)}`)}`)},Ic),this):(process.stdout.write(`${Ht.cli.spin(0,`${n} ${It(t,Et.STEP_MSG)}`)}
274
+ `),this)},progress(s,e,t){if(ct)return this;this.stop();let n=Math.round(s/e*100),r=Math.round(n/10),o=10-r,i=se.cyan("\u2588".repeat(r))+se.dim("\u2591".repeat(o)),a=t?` ${It(t,Et.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Ac++,`[${i}] ${n}%${a}`)}`)},Ic),this):(process.stdout.write(`${Ht.cli.spin(0,`[${i}] ${n}%${a}`)}
275
+ `),this)}},h=cb});var qp={};he(qp,{default:()=>ub,sessionTracker:()=>Tn});var lb,Vp,Jp,jc,Tn,ub,si=y(()=>{"use strict";ye();le();lb=1800*1e3,Vp=50,Jp=200,jc=class{static{l(this,"SessionTracker")}async read(e){try{return M.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){M.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:lb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,n){let r=await this.read(e);if(!r.current)return;let o=C();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:n}),r.current.commands.length>Vp&&(r.current.commands=r.current.commands.slice(-Vp)),await this.write(e,r)}async trackFile(e,t,n){let r=await this.read(e);if(!r.current)return;let o=C();r.current.lastActivity=o,r.current.files.push({path:t,operation:n,timestamp:o}),r.current.files.length>Jp&&(r.current.files=r.current.files.slice(-Jp)),await this.write(e,r)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,r=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=r-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Pr(r-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Pr(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Tn=new jc,ub=Tn});var Yp={};he(Yp,{default:()=>Vn,performanceTracker:()=>Kp});var Dc,Kp,Vn,ri=y(()=>{"use strict";ye();Dc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,r){q.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:r})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),r=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of r)q.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){q.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){q.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let r=this.getMetrics(e,n),o={period:`${t}d`},i=r.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=r.filter(p=>"metric"in p&&p.metric==="heap_used"),c=r.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,b)=>k+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,b)=>k+b,0)/f.length):0}}let u=r.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=r.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=r.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,b)=>k+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Kp=new Dc,Vn=Kp});function $c(s){if(Ap.includes(s))return[s];let e=s.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,r]of Object.entries(oi))if(n!=="general"){for(let o of r)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var Rc,oi,Jn,_r,Nr,Lr=y(()=>{"use strict";ye();Es();le();Rc={frontend:[O.CODE_STYLE,O.FILE_STRUCTURE,O.ARCHITECTURE,O.TECH_STACK],backend:[O.CODE_STYLE,O.ARCHITECTURE,O.DEPENDENCIES,O.TECH_STACK],devops:[O.SHIP_WORKFLOW,O.TEST_BEHAVIOR,O.DEPENDENCIES,O.ARCHITECTURE],docs:[O.CODE_STYLE,O.NAMING_CONVENTION,O.FILE_STRUCTURE],testing:[O.TEST_BEHAVIOR,O.CODE_STYLE,O.DEPENDENCIES],database:[O.ARCHITECTURE,O.NAMING_CONVENTION,O.TECH_STACK,O.DEPENDENCIES],general:Object.values(O)},oi={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l($c,"resolveCanonicalDomains");Jn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=q.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();q.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),r=t(n);return this._data=r,await this.save(e),r}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},_r=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()}},Nr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};q.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>JSON.parse(r.data))}}});var Ur,Mc=y(()=>{"use strict";ye();Es();le();Lr();Ur=class s extends Jn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>s.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-s.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,r="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[r].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,r&&!c.contexts.includes(r)&&(c.contexts.push(r),c.contexts.length>s.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-s.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Bo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let r=(await this.load(e)).decisions[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let r=(await this.load(e)).decisions[t];return!r||r.confidence==="low"?null:{value:r.value,confidence:r.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let r=await this.load(e),o=C();if(!r.workflows[t])r.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=r.workflows[t];i.count++,i.lastSeen=o,i.confidence=Bo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let r=(await this.load(e)).workflows[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let r=(await this.load(e)).workflows[t];return!r||r.count<3?null:r}async setPreference(e,t,n,r={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=r.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Bo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let r=(await this.load(e)).preferences[t];return r?(r.userConfirmed=!0,r.confidence="high",r.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),r=s.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>r&&o.push(a)}if(o.length===0)return 0;let i=q.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return q.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var qn,Oc=y(()=>{"use strict";Lt();Es();le();Lr();qn=class extends Jn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(O),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(O);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(O));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:r=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(r),c=C(),u={id:ge(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let r=await this.load(e),o=r.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=r.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)r.index[u]=r.index[u].filter(d=>d!==t);for(let u of c)r.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),r=n.memories.findIndex(i=>i.id===t);if(r===-1)return!1;let o=n.memories[r];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(r,1),await this.save(e),!0}async findByTags(e,t,n=!1){let r=await this.load(e),o=this._coerceTags(t);if(n)return r.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=r.index[a];for(let u of c)i.add(u)}return r.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),r=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(r)||o.content.toLowerCase().includes(r))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),r=n.memories.length;if(r===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),v=(p.tags||[]).filter($=>D.includes($));g.tagMatch=Math.min(20,v.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),v=0;for(let $ of D)p.content.toLowerCase().includes($)&&(v+=2),p.title.toLowerCase().includes($)&&(v+=3);g.keywords=Math.min(15,v)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:r,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:r>0?d.length/r:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let r=new Set;for(let a of n){let c=Rc[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of n){let c=oi[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(r.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return $c(e)}_getCommandTags(e){return{ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE],task:[O.BRANCH_NAMING,O.CODE_STYLE],sync:[O.TECH_STACK,O.ARCHITECTURE,O.DEPENDENCIES],test:[O.TEST_BEHAVIOR],bug:[O.CODE_STYLE,O.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(r=>r.length>2&&!n.has(r))}_extractContextTags(e){let t=[],n={ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(r=>r.length>2&&!n.includes(r))}async autoRemember(e,t,n,r=""){let i={commit_footer:[O.COMMIT_STYLE],branch_naming:[O.BRANCH_NAMING],test_before_ship:[O.TEST_BEHAVIOR,O.SHIP_WORKFLOW],preferred_agent:[O.AGENT_PREFERENCE],code_style:[O.CODE_STYLE],verbosity:[O.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${r?`
276
+ Context: ${r}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[r,o]of Object.entries(t.index))n[r]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(r=>r.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Fc,db,Te,Ms=y(()=>{"use strict";Lr();Mc();Oc();Lr();Mc();Oc();Fc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new qn,this._patternStore=new Ur,this._historyStore=new Nr,this._sessionStore=new _r}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,r){return this._semanticMemories.autoRemember(e,t,n,r)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,r){return this._patternStore.recordDecision(e,t,n,r)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,r){return this._patternStore.setPreference(e,t,n,r)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let r=await this.getDecision(e,t);return r?r.value:null}async learnDecision(e,t,n,r=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,r),await this.appendHistory(e,{type:"decision",key:t,value:n,context:r})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},db=new Fc,Te=db});import{exec as pb}from"node:child_process";import St from"node:fs/promises";import zt from"node:path";import{promisify as mb}from"node:util";var Kn,_c,gb,Ye,Xp=y(()=>{"use strict";N();Kn=mb(pb),_c=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=zt.join(this.projectPath,"package.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=zt.join(this.projectPath,"Cargo.toml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=zt.join(this.projectPath,"requirements.txt");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=zt.join(this.projectPath,"go.mod");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=zt.join(this.projectPath,"Gemfile");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=zt.join(this.projectPath,"mix.exs");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=zt.join(this.projectPath,"pom.xml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=zt.join(this.projectPath,"composer.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=zt.join(this.projectPath,"pyproject.toml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Kn('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(`
277
+ `).filter(Boolean).forEach(n=>{let r=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await St.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(r=>r.test(n)))}catch(e){if(P(e))return[];throw e}}async listDirectories(){try{return(await St.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(P(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Kn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Kn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Kn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Kn('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await Kn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await St.access(zt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=zt.join(this.projectPath,e);return await St.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Kn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
278
+ `).filter(Boolean)}catch{return[]}}},gb=new _c,Ye=gb});import Lc from"node:fs";import fb from"node:fs/promises";import ii from"node:path";function Uc(){if(Qp)return Nc;Qp=!0;let s=ii.join(de,"dist","templates.json");try{let e=Lc.readFileSync(s,"utf-8");return Nc=JSON.parse(e),Nc}catch{return null}}function yb(s){let e=Yn.indexOf(s);e>-1&&Yn.splice(e,1),Yn.push(s)}function wb(){for(;Os.size>=hb&&Yn.length>0;){let s=Yn.shift();s&&Os.delete(s)}}function ai(s){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=s.match(e);if(!t)return{frontmatter:{},content:s.trim()};let[,n,r]=t,o={};return n.split(`
279
+ `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:r.trim()}}async function Zp(s){if(Os.has(s))return yb(s),Os.get(s);let e,t=Uc();if(t){let r=`commands/${s}.md`;e=t[r]}if(!e){let r=ii.join(de,"templates","commands",`${s}.md`);try{e=await fb.readFile(r,"utf-8")}catch{throw Ao.notFound(s)}}let n=ai(e);return wb(),Os.set(s,n),Yn.push(s),n}async function kb(s){return(await Zp(s)).frontmatter["allowed-tools"]||[]}function Sb(){Os.clear(),Yn.length=0}function fe(s){let e=Uc();if(e?.[s])return e[s];let t=ii.join(de,"templates",s);try{return Lc.readFileSync(t,"utf-8")}catch{return null}}function En(s){let e=Uc();if(e)return Object.keys(e).filter(n=>n.startsWith(s));let t=ii.join(de,"templates",s);try{return Lc.readdirSync(t).map(r=>`${s}${r}`)}catch{return[]}}var hb,Os,Yn,Nc,Qp,bb,Hc,In=y(()=>{"use strict";ln();dt();hb=50,Os=new Map,Yn=[],Nc=null,Qp=!1;l(Uc,"loadBundle");l(yb,"updateLruOrder");l(wb,"evictLru");l(ai,"parseFrontmatter");l(Zp,"load");l(kb,"getAllowedTools");l(Sb,"clearCache");l(fe,"getTemplateContent");l(En,"listTemplates");bb={load:Zp,parseFrontmatter:ai,getAllowedTools:kb,clearCache:Sb,getTemplateContent:fe,listTemplates:En},Hc=bb});import X from"node:fs/promises";import zc from"node:os";import ne from"node:path";async function Cb(){try{let s=fe("global/modules/module-config.json");if(s)return JSON.parse(s);let e=ne.join(de,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Pb(s){let e=await Cb();if(!e){let i=fe("global/CLAUDE.md");if(i)return i;let a=ne.join(de,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=s||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=fe("global/CLAUDE.md");if(a)return a;let c=ne.join(de,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let r=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of r){let a=fe(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=ne.join(de,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
280
+ `)}async function vb(){try{let s=ne.join(zc.homedir(),".prjct-cli","docs");await X.mkdir(s,{recursive:!0});let e=En("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=fe(r);if(o){let i=ne.basename(r);await X.writeFile(ne.join(s,i),o,"utf-8")}}return{success:!0}}let t=ne.join(de,"templates/global/docs"),n=await X.readdir(t);for(let r of n)if(r.endsWith(".md")){let o=ne.join(t,r),i=ne.join(s,r),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(s){return{success:!1,error:w(s)}}}async function xb(){let s=(Je(),xt(ut)),e=await s.getActiveProvider(),t=e.name;if(!(await s.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await X.mkdir(e.configDir,{recursive:!0});let r=ne.join(e.configDir,e.contextFile),o=ne.join(de,"templates","global",e.contextFile),i="";try{let u=fe(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Pb()}catch{let d=fe("global/CLAUDE.md");if(d)i=d;else{let m=ne.join(de,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=fe("global/CLAUDE.md");if(d)i=d;else{let m=ne.join(de,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(r,"utf-8"),c=!0}catch(u){if(P(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await X.writeFile(r,k,"utf-8"),{success:!0,action:"updated",path:r}}else{let p=`${a}
281
+
282
+ ${i}`;return await X.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r}}}else return await X.writeFile(r,i,"utf-8"),{success:!0,action:"created",path:r}}catch(r){return{success:!1,error:w(r),action:"failed"}}}function em(){let s=zc.homedir();return{claude:{commands:ne.join(s,".claude","commands","p"),config:ne.join(s,".claude"),router:ne.join(s,".claude","commands","p.md")},gemini:{commands:ne.join(s,".gemini","commands"),config:ne.join(s,".gemini"),router:ne.join(s,".gemini","commands","p.toml")}}}var Gc,Tb,Ee,An=y(()=>{"use strict";In();N();dt();l(Cb,"loadModuleConfig");l(Pb,"composeGlobalTemplate");l(vb,"installDocs");l(xb,"installGlobalConfig");Gc=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=zc.homedir(),this.templatesDir=ne.join(de,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Je(),xt(ut)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=ne.join(t.configDir,"commands"):this.claudeCommandsPath=ne.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(P(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=En("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(r=>r.endsWith(".md")&&!e.has(r))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Je(),xt(ut)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let r=await this.getCommandFiles(),o=[],i=[];for(let a of r)try{let c=ne.join(this.claudeCommandsPath,a),u=fe(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=ne.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(r){return{success:!1,error:w(r)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let r of e)try{let o=ne.join(this.claudeCommandsPath,r);await X.unlink(o),t.push(r.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:r,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(P(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(fe(`commands/${e}.md`))return!0;try{let n=ne.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Je(),xt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let r=ne.join(t.configDir,"commands",n);await X.mkdir(ne.dirname(r),{recursive:!0});let o=fe(`commands/${n}`);if(o)return await X.writeFile(r,o,"utf-8"),!0;let i=ne.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(r,a,"utf-8"),!0}catch(r){if(P(r))return!1;throw r}}async removeLegacyCommands(){let t=await(Je(),xt(ut)).getActiveProvider(),n=ne.join(t.configDir,"commands"),r=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(ne.join(n,a)),r++}catch{}}catch{}return r}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(P(o))n=[];else throw o}let r={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=ne.join(this.claudeCommandsPath,o),a=n.includes(o),c=fe(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=ne.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?r.updated++:r.added++}catch(i){r.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),r}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return xb()}async installDocs(){return vb()}};l(em,"getProviderPaths");Tb=new Gc,Ee=Tb});import{z as Fe}from"zod";function rm(s,e="default"){let t=tm[e]||tm.default;return s/1e3*t}function ci(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var Eb,Ib,nm,sm,tm,li=y(()=>{"use strict";Eb=Fe.object({date:Fe.string(),tokensSaved:Fe.number(),syncs:Fe.number(),avgCompressionRate:Fe.number(),totalDuration:Fe.number()}),Ib=Fe.object({agentName:Fe.string(),usageCount:Fe.number(),tokensSaved:Fe.number()}),nm=Fe.object({totalTokensSaved:Fe.number(),avgCompressionRate:Fe.number(),syncCount:Fe.number(),watchTriggers:Fe.number(),avgSyncDuration:Fe.number(),totalSyncDuration:Fe.number(),agentUsage:Fe.array(Ib),dailyStats:Fe.array(Eb),firstSync:Fe.string(),lastUpdated:Fe.string()}),sm={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},tm={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(rm,"estimateCostSaved");l(ci,"formatCost")});function Ab(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function jb(s){let e=[],t=Ab(),n,r=0;for(;(n=t.exec(s))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${r++}`,c=s.indexOf(Wc,o+i.length);if(c===-1)continue;let u=c+Wc.length,d=s.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Bc(s,e){let t=jb(e);if(t.length===0)return s;let n=s.trimEnd();n+=`
281
283
 
282
284
  ---
283
285
 
@@ -285,103 +287,105 @@ ${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
285
287
 
286
288
  `,n+=`_The sections below are preserved during sync. Edit freely._
287
289
 
288
- `;for(let s of t)n+=s.content,n+=`
290
+ `;for(let r of t)n+=r.content,n+=`
289
291
 
290
292
  `;return`${n.trimEnd()}
291
- `}function _c(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
292
- `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(Oc)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var Oc,Nc=y(()=>{"use strict";Oc="<!-- /prjct:preserve -->";l(Sb,"createPreserveStartRegex");l(kb,"extractPreservedSections");l(Fc,"mergePreservedSections");l(_c,"validatePreserveBlocks")});function Hr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&bb.has(e.code))return!0;if(e.code&&nm.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 ai(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&nm.has(e.code))}function tm(r,e,t){let n=Pn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Pn.delete(r),!1):!0:!1}function Lc(r,e){let t=Pn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Pn.set(r,t)}function Cb(r){Pn.delete(r)}var bb,nm,Pn,ii,sm,Ur,ci=y(()=>{"use strict";bb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),nm=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Hr,"isTransientError");l(ai,"isPermanentError");Pn=new Map;l(tm,"isCircuitOpen");l(Lc,"recordFailure");l(Cb,"recordSuccess");ii=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(tm(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Cb(t),o}catch(o){if(n=o,s++,ai(o))throw Lc(t,this.options.circuitBreakerThreshold),o;if(!(Hr(o)&&s<this.options.maxAttempts))throw Lc(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Lc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Hr(e)}isCircuitOpen(e){return tm(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Pn.get(e)}resetCircuit(e){Pn.delete(e)}resetAllCircuits(){Pn.clear()}},sm=new ii({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Ur=new ii({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var rm=y(()=>{"use strict";Nc();ci()});import li from"node:fs/promises";import Hc from"node:path";var Uc,om,im=y(()=>{"use strict";Ve();Ce();_();Uc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=A.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await li.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await li.readFile(Hc.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return v(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Hc.join(this.agentsPath,`${e}.md`),n=await li.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return v(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=Hc.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
293
- `;await li.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},om=Uc});import am from"node:path";async function Pb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(am.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(am.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Tb(){return{...vb}}function Eb(){return{...xb}}async function cm(){return ui||(ui=await Pb()?Tb():Eb(),ui)}var ui,vb,xb,lm=y(()=>{"use strict";xe();ui=null,vb={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},xb={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(Pb,"isClaudeEnvironment");l(Tb,"getClaudeAgent");l(Eb,"getTerminalAgent");l(cm,"detect")});var Ab,Gc=y(()=>{Ab=dd({})});var jb,di,Os,um=y(()=>{"use strict";im();cn();lm();ci();Gc();jb=["claude"],di=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new om}async initialize(){return this.agent?this.agent:await sm.execute(async()=>{if(this.agentInfo=await cm(),!this.agentInfo?.isSupported)throw br.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!jb.includes(e))throw br.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Ab(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
293
+ `}function Vc(s){let e=[],t=s.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=s.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let r=0,o=0,i=s.split(`
294
+ `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(r++,o=Math.max(o,r)),c.includes(Wc)&&r--,r>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),r<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var Wc,Jc=y(()=>{"use strict";Wc="<!-- /prjct:preserve -->";l(Ab,"createPreserveStartRegex");l(jb,"extractPreservedSections");l(Bc,"mergePreservedSections");l(Vc,"validatePreserveBlocks")});function Hr(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&Db.has(e.code))return!0;if(e.code&&im.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 di(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&im.has(e.code))}function om(s,e,t){let n=jn.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(jn.delete(s),!1):!0:!1}function qc(s,e){let t=jn.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),jn.set(s,t)}function Rb(s){jn.delete(s)}var Db,im,jn,ui,am,Gr,pi=y(()=>{"use strict";Db=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),im=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Hr,"isTransientError");l(di,"isPermanentError");jn=new Map;l(om,"isCircuitOpen");l(qc,"recordFailure");l(Rb,"recordSuccess");ui=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(om(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return Rb(t),o}catch(o){if(n=o,r++,di(o))throw qc(t,this.options.circuitBreakerThreshold),o;if(!(Hr(o)&&r<this.options.maxAttempts))throw qc(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw qc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Hr(e)}isCircuitOpen(e){return om(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return jn.get(e)}resetCircuit(e){jn.delete(e)}resetAllCircuits(){jn.clear()}},am=new ui({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Gr=new ui({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var cm=y(()=>{"use strict";Jc();pi()});import mi from"node:fs/promises";import Kc from"node:path";var Yc,lm,um=y(()=>{"use strict";qe();Se();N();Yc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=I.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await mi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let r=n.replace(".md",""),o=await mi.readFile(Kc.join(this.agentsPath,n),"utf-8");t.push({name:r,content:o})}return t}catch(e){return P(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Kc.join(this.agentsPath,`${e}.md`),n=await mi.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let r=Kc.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
295
+ `;await mi.appendFile(r,o)}catch(r){P(r)||console.error(`Agent usage log error: ${w(r)}`)}}},lm=Yc});import dm from"node:path";async function Ob(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await x(dm.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await x(dm.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Fb(){return{...$b}}function _b(){return{...Mb}}async function pm(){return gi||(gi=await Ob()?Fb():_b(),gi)}var gi,$b,Mb,mm=y(()=>{"use strict";ve();gi=null,$b={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},Mb={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(Ob,"isClaudeEnvironment");l(Fb,"getClaudeAgent");l(_b,"getTerminalAgent");l(pm,"detect")});var Lb,Xc=y(()=>{Lb=gd({})});var Ub,fi,Fs,gm=y(()=>{"use strict";um();ln();mm();pi();Xc();Ub=["claude"],fi=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new lm}async initialize(){return this.agent?this.agent:await am.execute(async()=>{if(this.agentInfo=await pm(),!this.agentInfo?.isSupported)throw Cr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Ub.includes(e))throw Cr.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Lb(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let r=await this.agentRouter.getAgentNames();return r.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:r},_agenticNote:`
294
296
  AGENTIC EXECUTION:
295
297
  - Read: templates/agentic/orchestrator.md
296
298
  - Analyze task: "${e}"
297
- - Available specialists: ${s.join(", ")}
299
+ - Available specialists: ${r.join(", ")}
298
300
  - Claude decides which agent(s) to use
299
301
  - Always prefer specialists over generalist
300
302
  - Fragment complex tasks into subtasks
301
- `}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Os=new di});var pi,mi,dm=y(()=>{"use strict";pi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},mi=new pi});import Db from"node:crypto";import gi from"node:fs/promises";import pm from"node:path";function mm(){return{version:Ht,lastUpdated:"",checksums:{}}}var Ht,zc,Xe,Gr=y(()=>{"use strict";Ce();_();le();he();Ht="1.0.0";l(mm,"getDefaultChecksums");zc=class{static{l(this,"IndexStorage")}getIndexPath(e){return pm.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await gi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Ht?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 mm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return Db.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Ht,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await gi.readdir(t);await Promise.all(n.map(s=>gi.unlink(pm.join(t,s))))}catch(n){if(!v(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Ht?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Ht?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=$.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Xe=new zc});var gm,Rb,fi,$b,fm=y(()=>{"use strict";Gr();gm=8e4,Rb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},fi=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||gm,[c,u,d]=await Promise.all([Xe.readIndex(t),Xe.readDomains(t),Xe.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let x of m){let O=d.domainIndex[x]||[];for(let F of O)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let O of x)p.add(O)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,O)=>O.score-x.score);let f=0,S=[];for(let x of g){let O=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+O>a||S.length>=s)break;S.push(x),f+=O}let b=Math.ceil(c.relevantFiles.reduce((x,O)=>x+O.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Rb))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Xe.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Xe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Xe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||gm,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},$b=new fi});import hm from"node:path";var Wc,hi,Mb,ym=y(()=>{"use strict";Gr();le();Wc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],hi=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Wc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=hm.dirname(i.path);n.get(u).add(`**/${hm.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Wc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Wc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Ht,projectId:e,domains:t,discoveredAt:s};await Xe.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Ht,lastUpdate:s,fileCategories:n,domainIndex:i};await Xe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Xe.readDomains(e),Xe.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Xe.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Xe.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Ht,lastUpdate:C(),fileCategories:u,domainIndex:d};await Xe.writeCategories(e,m)}return o}},Mb=new hi});import Bc from"node:path";var Vc,Ob,Fb,yi,wm,Jc=y(()=>{"use strict";Vc=30,Ob=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],Fb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],yi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=Vc){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=Bc.basename(e.path);for(let n of Ob)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=Bc.basename(e.path);for(let s of Fb)if(s.test(t))return 15;let n=Bc.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},wm=new yi});import{execSync as qc}from"node:child_process";var wi,Kc,Si,Fs,ki=y(()=>{"use strict";Or();wi={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"}},Kc=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=wi[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=wi[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Si(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=wi[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
302
- `);throw new Si({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
303
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(wi),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=qc(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Mr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Mr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Si=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}},Fs=new Kc});import{exec as _b}from"node:child_process";import{promisify as Nb}from"node:util";var CM,Sm=y(()=>{"use strict";ln();ki();CM=Nb(_b)});var bi,mt,Yc=y(()=>{"use strict";Ve();bn();he();bi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;V.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?V.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await R.getProjectId(e);return s?V.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;V.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 V.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Xt.MEMORY_MAX_ENTRIES)return 0;let s=n-Xt.MEMORY_MAX_ENTRIES,o=V.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);St.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&V.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new bi});var km=y(()=>{"use strict";Ce();xe()});import{exec as Hb}from"node:child_process";import{promisify as Ub}from"node:util";var NM,bm=y(()=>{"use strict";Gr();le();Jc();NM=Ub(Hb)});import{createHash as Gb}from"node:crypto";var Xc,Zt,Ci=y(()=>{"use strict";Ya();le();Qt();Xc=class extends ze{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ka.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ka.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await Gd(s,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Gb("sha256").update(JSON.stringify(t)).digest("hex")}},Zt=new Xc});var Qc,un,zr=y(()=>{"use strict";oi();le();Qt();Qc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Qp)}getDefault(){return{...Zp}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],S=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(O=>O.agentName===D);x>=0?b[x]={...b[x],usageCount:b[x].usageCount+1,tokensSaved:b[x].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:S,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:em(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},un=new Qc});import lt from"node:fs/promises";import de from"node:path";async function Wr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=A.getGlobalProjectPath(r),s=de.join(n,"storage"),o=de.join(n,"index"),i=de.join(n,"memory");t.backupDir=await zb(s,o,i),$.getDb(r);for(let{filename:a,key:c}of tl){let u=de.join(s,a),d=await Kn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),Cm(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of el){let u=de.join(o,a),d=await Kn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),vm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Xb(r,o,t),await Qb(r,o,t),await Zb(r,i,t),await eC(r,i,t),t.errors.length===0&&await tC(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function zb(r,e,t){let n=de.join(r,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(de.join(n,"index"),{recursive:!0}),await lt.mkdir(de.join(n,"memory"),{recursive:!0}),await Zc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Zc(e,de.join(n,"index")),await Zc(t,de.join(n,"memory")),n}async function Zc(r,e,t){try{let n=await lt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=de.join(r,s.name),i=de.join(e,s.name);await lt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Cm(r,e,t){switch(e){case"state":Wb(r,t);break;case"queue":Bb(r,t);break;case"ideas":Vb(r,t);break;case"shipped":Jb(r,t);break;case"metrics":qb(r,t);break;case"analysis":Kb(r,t);break}}function Wb(r,e){let t=$.getDb(r),n=t.prepare(`
303
+ `}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Fs=new fi});var hi,yi,fm=y(()=>{"use strict";hi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},yi=new hi});import Hb from"node:crypto";import wi from"node:fs/promises";import hm from"node:path";function ym(){return{version:Wt,lastUpdated:"",checksums:{}}}var Wt,Qc,Ze,zr=y(()=>{"use strict";Se();N();le();ye();Wt="1.0.0";l(ym,"getDefaultChecksums");Qc=class{static{l(this,"IndexStorage")}getIndexPath(e){return hm.join(I.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await wi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Wt?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 ym()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await wi.readFile(e);return Hb.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let r=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in r?r[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(r))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Wt,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{M.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await wi.readdir(t);await Promise.all(n.map(r=>wi.unlink(hm.join(t,r))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),r=new Map;if(!n)return r;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&r.set(i.path,i.categories);return r}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let r=M.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setIndexMeta(e,t,n){let r=M.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Ze=new Qc});var wm,Gb,ki,zb,km=y(()=>{"use strict";zr();wm=8e4,Gb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},ki=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let r=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||wm,[c,u,d]=await Promise.all([Ze.readIndex(t),Ze.readDomains(t),Ze.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let v of m){let $=d.domainIndex[v]||[];for(let F of $)p.add(F)}if(i&&d.domainIndex.general){let v=d.domainIndex.general.slice(0,10);for(let $ of v)p.add($)}let g=c.relevantFiles.filter(v=>p.has(v.path)&&v.score>=o);g.sort((v,$)=>$.score-v.score);let f=0,k=[];for(let v of g){let $=Math.ceil(v.size/this.CHARS_PER_TOKEN);if(f+$>a||k.length>=r)break;k.push(v),f+=$}let b=Math.ceil(c.relevantFiles.reduce((v,$)=>v+$.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),r=new Set;for(let[o,i]of Object.entries(Gb))for(let a of i)if(n.includes(a)){r.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){r.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){r.add(o.name);break}}return r.size===0&&(r.add("services"),r.add("api")),Array.from(r)}async filterByDomains(e,t,n){let r=await Ze.readCategories(e);if(!r)return n||[];let o=new Set;for(let a of t){let c=r.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Ze.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ze.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,r=t.minScore||30,o=t.tokenBudget||wm,i=e.filter(d=>d.score>=r).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let r of e){let o=n[r];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},zb=new ki});import Sm from"node:path";var Zc,Si,Wb,bm=y(()=>{"use strict";zr();le();Zc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],Si=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let r=n.useLLM!==!1,o=r?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=r?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:r?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!r}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Zc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Sm.dirname(i.path);n.get(u).add(`**/${Sm.basename(d)}/**`)}}let r=this.extractDirectoryDomains(e);for(let[i,a]of r)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Zc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let r=n.path.split("/");for(let o of r.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],r=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Zc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:r,method:"heuristic"})}return n}async saveToCache(e,t,n){let r=C(),o={version:Wt,projectId:e,domains:t,discoveredAt:r};await Ze.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Wt,lastUpdate:r,fileCategories:n,domainIndex:i};await Ze.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ze.readDomains(e),Ze.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let r=await Ze.readDomains(e);if(!r)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,r.domains):this.categorizeFilesHeuristic(t,r.domains),i=await Ze.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Wt,lastUpdate:C(),fileCategories:u,domainIndex:d};await Ze.writeCategories(e,m)}return o}},Wb=new Si});import el from"node:path";var tl,Bb,Vb,bi,Cm,nl=y(()=>{"use strict";tl=30,Bb=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],Vb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],bi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},r=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,r)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,r)=>r.score-n.score)}getRelevantFiles(e,t=tl){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,r=t.allFiles.size;if(r===0)return 0;let o=n/r;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=el.basename(e.path);for(let n of Bb)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=el.basename(e.path);for(let r of Vb)if(r.test(t))return 15;let n=el.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let r=n/t.maxRecentCommits;return r>=.5?10:r>=.25?7:r>=.1?5:n>0?2:0}},Cm=new bi});import{execSync as sl}from"node:child_process";var Ci,rl,Pi,_s,vi=y(()=>{"use strict";Fr();Ci={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"}},rl=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Ci[e];if(!n)return this.checkUnknownTool(e);let r=this.executeCheck(n);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Ci[e],r=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Pi(r)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(r=>{let o=Ci[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
304
+ `);throw new Pi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
305
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Ci),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=sl(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Or(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return sl(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return sl(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Or(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Pi=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}},_s=new rl});import{exec as Jb}from"node:child_process";import{promisify as qb}from"node:util";var GM,Pm=y(()=>{"use strict";un();vi();GM=qb(Jb)});var xi,mt,ol=y(()=>{"use strict";qe();vn();ye();xi=class{static{l(this,"MemoryService")}async log(e,t,n,r){try{let o=await R.getProjectId(e);if(!o)return;q.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?q.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let r=await R.getProjectId(e);return r?q.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;q.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 q.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Zt.MEMORY_MAX_ENTRIES)return 0;let r=n-Zt.MEMORY_MAX_ENTRIES,o=q.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);kt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&q.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new xi});var vm=y(()=>{"use strict";Se();ve()});import{exec as Yb}from"node:child_process";import{promisify as Xb}from"node:util";var rO,xm=y(()=>{"use strict";zr();le();nl();rO=Xb(Yb)});import{createHash as Qb}from"node:crypto";var il,bt,Ti=y(()=>{"use strict";oc();le();en();il=class extends We{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};rc.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return rc.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await Vd(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Qb("sha256").update(JSON.stringify(t)).digest("hex")}},bt=new il});var al,dn,Wr=y(()=>{"use strict";li();le();en();al=class extends We{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",nm)}getDefault(){return{...sm}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+r)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let v=b.findIndex($=>$.agentName===D);v>=0?b[v]={...b[v],usageCount:b[v].usageCount+1,tokensSaved:b[v].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:k,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=r.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:rm(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},dn=new al});import lt from"node:fs/promises";import pe from"node:path";async function Br(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(M.exists(s)&&M.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=I.getGlobalProjectPath(s),r=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await Zb(r,o,i),M.getDb(s);for(let{filename:a,key:c}of ul){let u=pe.join(r,a),d=await Xn(u);if(d===null){t.skippedFiles.push(a);continue}try{M.setDoc(s,c,d),Tm(s,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of ll){let u=pe.join(o,a),d=await Xn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{M.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Em(s,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await aC(s,o,t),await cC(s,o,t),await lC(s,i,t),await uC(s,i,t),t.errors.length===0&&await dC(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function Zb(s,e,t){let n=pe.join(s,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(pe.join(n,"index"),{recursive:!0}),await lt.mkdir(pe.join(n,"memory"),{recursive:!0}),await cl(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await cl(e,pe.join(n,"index")),await cl(t,pe.join(n,"memory")),n}async function cl(s,e,t){try{let n=await lt.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=pe.join(s,r.name),i=pe.join(e,r.name);await lt.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Tm(s,e,t){switch(e){case"state":eC(s,t);break;case"queue":tC(s,t);break;case"ideas":nC(s,t);break;case"shipped":sC(s,t);break;case"metrics":rC(s,t);break;case"analysis":oC(s,t);break}}function eC(s,e){let t=M.getDb(s),n=t.prepare(`
304
306
  INSERT OR REPLACE INTO tasks
305
307
  (id, description, type, status, parent_description, branch, linear_id,
306
308
  linear_uuid, session_id, feature_id, started_at, completed_at,
307
309
  shipped_at, paused_at, pause_reason, pr_url, expected_value, data)
308
310
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
309
- `),s=t.prepare(`
311
+ `),r=t.prepare(`
310
312
  INSERT OR REPLACE INTO subtasks
311
313
  (id, task_id, description, status, domain, agent, sort_order,
312
314
  depends_on, started_at, completed_at, output, summary)
313
315
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
314
- `),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function Bb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
316
+ `),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];r.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function tC(s,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
315
317
  INSERT OR REPLACE INTO queue_tasks
316
318
  (id, description, type, priority, section, created_at, completed, completed_at,
317
319
  feature_id, feature_name)
318
320
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
319
- `);for(let o of t)s.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function Vb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
321
+ `);for(let o of t)r.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function nC(s,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
320
322
  INSERT OR REPLACE INTO ideas
321
323
  (id, text, status, priority, tags, added_at, converted_to, details, data)
322
324
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
323
- `);for(let o of t)s.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function Jb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
325
+ `);for(let o of t)r.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function sC(s,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
324
326
  INSERT OR REPLACE INTO shipped_features
325
327
  (id, name, shipped_at, version, description, type, duration, data)
326
328
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
327
- `);for(let o of t)s.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function qb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
329
+ `);for(let o of t)r.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function rC(s,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
328
330
  INSERT OR REPLACE INTO metrics_daily
329
331
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
330
332
  VALUES (?, ?, ?, ?, ?)
331
- `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Kb(r,e){let n=$.getDb(r).prepare(`
333
+ `);for(let o of t)r.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function oC(s,e){let n=M.getDb(s).prepare(`
332
334
  INSERT OR REPLACE INTO analysis
333
335
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
334
336
  VALUES (?, ?, ?, ?, ?, ?, ?)
335
- `),s=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&s(e.draft,"draft"),e.sealed&&s(e.sealed,"sealed")}function vm(r,e,t){e==="categories-cache"&&Yb(r,t)}function Yb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
337
+ `),r=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function Em(s,e,t){e==="categories-cache"&&iC(s,t)}function iC(s,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
336
338
  INSERT OR REPLACE INTO index_files
337
339
  (path, categories, domain, score, size, mtime, language)
338
340
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
339
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Xb(r,e,t){let n=de.join(e,"checksums.json"),s=await Kn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Qb(r,e,t){let n=de.join(e,"file-scores.json"),s=await Kn(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=$.getDb(r),a=i.prepare(`
341
+ `);for(let o of t)r.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function aC(s,e,t){let n=pe.join(e,"checksums.json"),r=await Xn(n);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=M.getDb(s),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function cC(s,e,t){let n=pe.join(e,"file-scores.json"),r=await Xn(n);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=M.getDb(s),a=i.prepare(`
340
342
  INSERT OR REPLACE INTO index_files
341
343
  (path, score, size, mtime, language, categories, domain)
342
344
  VALUES (?, ?, ?, ?, NULL,
343
345
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
344
346
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
345
- `);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Zb(r,e,t){let n=de.join(e,"events.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
346
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function eC(r,e,t){let n=de.join(e,"learnings.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
347
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function tC(r,e,t,n){let s=l(async(i,a)=>{try{await lt.unlink(i)}catch(c){v(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of tl)await s(de.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(de.join(e,i),`cleanup:index/${i}`);await s(de.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(de.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Kn(r){try{let e=await lt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async function vi(r){let e=A.getGlobalProjectPath(r),t=de.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of tl){let m=de.join(t,u),p=await Kn(m);if(p!==null){$.setDoc(r,d,p),Cm(r,d,p);try{await lt.unlink(m)}catch{}n++}}let s=de.join(e,"project.json"),o=await Kn(s);if(o!==null){$.setDoc(r,"project",o);try{await lt.unlink(s)}catch{}n++}let i=de.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=de.join(i,u);try{let p=(await lt.readFile(d,"utf-8")).split(`
348
- `).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,S,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S),D=`learning:${b.taskId??b.timestamp??Date.now()}`,x=b.tags;f.run(D,x?.[0]??null,S,1,b.timestamp??new Date().toISOString())}catch{}})()}await lt.unlink(d),n++}catch{}}let a=de.join(e,"index"),c=[...el.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=de.join(a,u),m=await Kn(d);if(m===null)continue;let p=el.find(g=>g.filename===u);p&&($.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),vm(r,p.key,m));try{await lt.unlink(d)}catch{}n++}return n}var tl,el,xi=y(()=>{"use strict";Ce();_();he();tl=[{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"}],el=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Wr,"migrateJsonToSqlite");l(zb,"createBackup");l(Zc,"copyFiles");l(Cm,"populateNormalized");l(Wb,"populateTasksFromState");l(Bb,"populateQueueTasks");l(Vb,"populateIdeas");l(Jb,"populateShippedFeatures");l(qb,"populateMetricsDaily");l(Kb,"populateAnalysis");l(vm,"populateIndexTables");l(Yb,"populateCategoriesIndex");l(Xb,"migrateChecksums");l(Qb,"migrateFileScores");l(Zb,"migrateEventsJsonl");l(eC,"migrateLearningsJsonl");l(tC,"cleanupJsonFiles");l(Kn,"readJsonSafe");l(vi,"sweepLegacyJson")});var xm=y(()=>{"use strict";uc();_()});var nl,sl,rl=y(()=>{"use strict";vs();Qt();nl=class extends ze{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:kp,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}},sl=new nl});var Ut=y(()=>{"use strict";Ci();bn();he();Ar();Gr();zr();xi();jr();Dr();$r();xm();Qt();rl()});function st(r,e,t=2){return`${"#".repeat(t)} ${r}
349
- ${e}`}function Gt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
350
- `)}function ol(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: ${r.linearId}`),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`);let t=e.length>0?`
351
- ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function il(r,e){return`### Subtasks
352
- ${r.map((n,s)=>{let o=n.status==="completed",i=s===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
353
- `)}`}function Pm(r){return`### Rules
354
- ${Gt(r)}`}function Qe(r){return`### Next
355
- ${r.map(t=>`- ${t.label}: \`${t.command}\``).join(`
356
- `)}`}function zt(r){let e=[];for(let[t,n]of Object.entries(r))n!=null&&e.push(`- **${t}:** ${n}`);return e.join(`
357
- `)}function en(r,e){return e?`## ${r} \u2713
358
- ${e}`:`## ${r} \u2713`}function Tn(r){return`> \u26A0\uFE0F ${r}`}function Ie(...r){return r.filter(Boolean).join(`
359
-
360
- `)}var _s=y(()=>{"use strict";l(st,"mdSection");l(Gt,"mdList");l(ol,"mdTaskHeader");l(il,"mdSubtasks");l(Pm,"mdRules");l(Qe,"mdNextSteps");l(zt,"mdStats");l(en,"mdDone");l(Tn,"mdWarn");l(Ie,"mdJoin")});import Br from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Em[r]||"idle",n=Hn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Tm[o]||o}));console.log(Br.dim(`
361
- Next:`));for(let o of s){let i=Br.cyan(o.cmd.padEnd(12));console.log(Br.dim(` ${i} \u2192 ${o.desc}`))}}function Pi(r){let e=Em[r]||"idle";return Hn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Tm[n]||n}))}function Vr(r){let e=Hn.getStateInfo(r);console.log(Br.dim(`\u{1F4CD} State: ${Br.white(r.toUpperCase())} - ${e.description}`))}var Tm,Em,Ns=y(()=>{"use strict";fc();Tm={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Em={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(Pi,"getNextSteps");l(Vr,"showStateInfo")});import It from"chalk";import Yn from"prompts";var al,Im,Ls,Am=y(()=>{"use strict";Nt();al=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Im=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"}],Ls=class{static{l(this,"OnboardingWizard")}projectPath;currentStep=0;totalSteps=5;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e,Yn.override({})}async run(){this.printWelcome();let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(this.currentStep++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=await Yn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:al.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:al.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Yn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Im.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(It.dim(`
347
+ `);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function lC(s,e,t){let n=pe.join(e,"events.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
348
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=M.getDb(s),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(r){P(r)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(r)})}}async function uC(s,e,t){let n=pe.join(e,"learnings.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
349
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=M.getDb(s),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(r){P(r)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(r)})}}async function dC(s,e,t,n){let r=l(async(i,a)=>{try{await lt.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of ul)await r(pe.join(s,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(pe.join(e,i),`cleanup:index/${i}`);await r(pe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(pe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Xn(s){try{let e=await lt.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Ei(s){let e=I.getGlobalProjectPath(s),t=pe.join(e,"storage"),n=0;M.getDb(s);for(let{filename:u,key:d}of ul){let m=pe.join(t,u),p=await Xn(m);if(p!==null){M.setDoc(s,d,p),Tm(s,d,p);try{await lt.unlink(m)}catch{}n++}}let r=pe.join(e,"project.json"),o=await Xn(r);if(o!==null){M.setDoc(s,"project",o);try{await lt.unlink(r)}catch{}n++}let i=pe.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=pe.join(i,u);try{let p=(await lt.readFile(d,"utf-8")).split(`
350
+ `).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=M.getDb(s);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,k,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k),D=`learning:${b.taskId??b.timestamp??Date.now()}`,v=b.tags;f.run(D,v?.[0]??null,k,1,b.timestamp??new Date().toISOString())}catch{}})()}await lt.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...ll.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.join(a,u),m=await Xn(d);if(m===null)continue;let p=ll.find(g=>g.filename===u);p&&(M.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Em(s,p.key,m));try{await lt.unlink(d)}catch{}n++}return n}var ul,ll,Ii=y(()=>{"use strict";Se();N();ye();ul=[{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"}],ll=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Br,"migrateJsonToSqlite");l(Zb,"createBackup");l(cl,"copyFiles");l(Tm,"populateNormalized");l(eC,"populateTasksFromState");l(tC,"populateQueueTasks");l(nC,"populateIdeas");l(sC,"populateShippedFeatures");l(rC,"populateMetricsDaily");l(oC,"populateAnalysis");l(Em,"populateIndexTables");l(iC,"populateCategoriesIndex");l(aC,"migrateChecksums");l(cC,"migrateFileScores");l(lC,"migrateEventsJsonl");l(uC,"migrateLearningsJsonl");l(dC,"cleanupJsonFiles");l(Xn,"readJsonSafe");l(Ei,"sweepLegacyJson")});var Im=y(()=>{"use strict";kc();N()});var dl,pl,ml=y(()=>{"use strict";xs();en();dl=class extends We{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:vp,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}},pl=new dl});var Bt=y(()=>{"use strict";Ti();vn();ye();jr();zr();Wr();Ii();Dr();Rr();Mr();Im();en();ml()});function rt(s,e,t=2){return`${s}
351
+ ${e}`}function At(s,e=!1){return s.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
352
+ `)}function gl(s){let e=[];s.branch&&e.push(`Branch: ${s.branch}`),s.linearId&&e.push(`Linear: ${s.linearId}`),s.type&&e.push(`Type: ${s.type}`),s.duration&&e.push(`Duration: ${s.duration}`);let t=e.length>0?`
353
+ ${e.join(" | ")}`:"";return`Task: ${s.description}${t}`}function Am(s,e){return`Subtasks
354
+ ${s.map((n,r)=>{let o=n.status==="completed",i=r===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
355
+ `)}`}function jm(s){return s.length===0?"":`Relevant files
356
+ ${s.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",r=t.description?` \u2014 ${t.description}`:"";return`- ${t.path}${n}${r}`}).join(`
357
+ `)}`}function Dm(s){return`Rules
358
+ ${At(s)}`}function et(s){return`Next
359
+ ${s.map(t=>`- ${t.label}: ${t.command}`).join(`
360
+ `)}`}function jt(s){let e=[];for(let[t,n]of Object.entries(s))n!=null&&e.push(`- ${t}: ${n}`);return e.join(`
361
+ `)}function tn(s,e){return e?`${s}
362
+ ${e}`:s}function Rm(s){return`> \u26A0\uFE0F ${s}`}function Ie(...s){return s.filter(Boolean).join(`
363
+
364
+ `)}function pn(s,e,t,n){console.log(JSON.stringify({status:s,reason:e,...n,options:t}))}var Ns=y(()=>{"use strict";l(rt,"mdSection");l(At,"mdList");l(gl,"mdTaskHeader");l(Am,"mdSubtasks");l(jm,"mdRelevantFiles");l(Dm,"mdRules");l(et,"mdNextSteps");l(jt,"mdStats");l(tn,"mdDone");l(Rm,"mdWarn");l(Ie,"mdJoin");l(pn,"mdActionRequired")});import Vr from"chalk";function Ct(s,e={}){if(e.quiet)return;let t=Mm[s]||"idle",n=zn.getValidCommands(t);if(n.length===0)return;let r=n.map(o=>({cmd:`p. ${o}`,desc:$m[o]||o}));console.log(Vr.dim(`
365
+ Next:`));for(let o of r){let i=Vr.cyan(o.cmd.padEnd(12));console.log(Vr.dim(` ${i} \u2192 ${o.desc}`))}}function Ai(s){let e=Mm[s]||"idle";return zn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:$m[n]||n}))}function Jr(s){let e=zn.getStateInfo(s);console.log(Vr.dim(`\u{1F4CD} State: ${Vr.white(s.toUpperCase())} - ${e.description}`))}var $m,Mm,Ls=y(()=>{"use strict";vc();$m={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"},Mm={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(Ct,"showNextSteps");l(Ai,"getNextSteps");l(Jr,"showStateInfo")});import Dt from"chalk";import Qn from"prompts";var fl,Om,Us,Fm=y(()=>{"use strict";Gt();fl=[{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."}],Om=[{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"}],Us=class{static{l(this,"OnboardingWizard")}projectPath;currentStep=0;totalSteps=5;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e,Qn.override({})}async run(){this.printWelcome();let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(this.currentStep++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=await Qn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:fl.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:fl.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Qn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Om.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(Dt.dim(`
362
366
  Detected: ${e}
363
- `));let t=await Yn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Yn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.framework||""}],{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Yn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(It.bold(" Configuration Summary")),console.log(It.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${It.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${It.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${It.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${It.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${It.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Yn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(It.bold.cyan(" Welcome to prjct-cli!")),console.log(It.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(It.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(It.yellow(`
367
+ `));let t=await Qn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Qn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.framework||""}],{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Qn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(Dt.bold(" Configuration Summary")),console.log(Dt.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${Dt.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${Dt.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${Dt.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${Dt.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${Dt.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Qn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),r=[];try{await e.access(t.join(n.homedir(),".claude")),r.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),r.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),r.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),r.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),r.push("gemini")}catch{}return r.length>0?r:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let r=await e.readdir(this.projectPath);if(r.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",r.includes("bun.lockb")?n.packageManager="Bun":r.includes("pnpm-lock.yaml")?n.packageManager="pnpm":r.includes("yarn.lock")?n.packageManager="Yarn":r.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else r.includes("pyproject.toml")||r.includes("requirements.txt")?n.language="Python":r.includes("go.mod")?n.language="Go":r.includes("Cargo.toml")?n.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(Dt.bold.cyan(" Welcome to prjct-cli!")),console.log(Dt.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(Dt.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(Dt.yellow(`
364
368
  Setup cancelled. Run again anytime.
365
- `))}getProjectTypeLabel(e){return al.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Im.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import cl from"node:path";var nC,sC,Ti,rC,gt,Xn=y(()=>{"use strict";Ce();Ot();xe();nC="outcomes",sC="outcomes.jsonl",Ti=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return cl.join(t,nC)}getOutcomesPath(e){return cl.join(this.getOutcomesDir(e),sC)}async record(e,t){let n={...t,id:Se()},s=this.getOutcomesPath(e);return await Mt(cl.dirname(s)),await Ia(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let n=await fs(t);return n.trim()?n.trim().split(`
366
- `).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},rC=new Ti,gt=rC});var Ei,oC,ll,jm=y(()=>{"use strict";Xn();Ei=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await gt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,b)=>S+b.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let b=this.parseVariance(S.variance),D=this.parseDuration(S.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(b=>b.completedAsPlanned))for(let b of S.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((S,b)=>b[1]-S[1]).slice(0,3).map(([S])=>S);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},oC=new Ei,ll=oC});var Jr,Ii,ul,dl=y(()=>{"use strict";Ps();le();Jr=3,Ii=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Jr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
367
- `)}},ul=new Ii});var Ai,Dm,pl=y(()=>{"use strict";tc();Qt();le();Ai=class extends ze{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...np,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Fo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Fo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Fo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=sp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=rp(5,s);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:op(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},Dm=new Ai});var ml=y(()=>{"use strict";Am();jm();dl();Xn();pl()});import tn from"chalk";function iC(r){return Rm[r.toLowerCase()]||Rm.default}var Rm,gl,ji,$m=y(()=>{"use strict";Rm={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(iC,"getIcon");gl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(tn.cyan(`
369
+ `))}getProjectTypeLabel(e){return fl.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Om.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import hl from"node:path";var pC,mC,ji,gC,gt,Zn=y(()=>{"use strict";Se();Lt();ve();pC="outcomes",mC="outcomes.jsonl",ji=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=I.getGlobalProjectPath(e);return hl.join(t,pC)}getOutcomesPath(e){return hl.join(this.getOutcomesDir(e),mC)}async record(e,t){let n={...t,id:ge()},r=this.getOutcomesPath(e);return await Nt(hl.dirname(r)),await Oa(r,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await x(t))return[];let n=await ws(t);return n.trim()?n.trim().split(`
370
+ `).filter(r=>r.trim()).map(r=>JSON.parse(r)):[]}async filter(e,t){return(await this.getAll(e)).filter(r=>{if(t.sessionId&&r.sessionId!==t.sessionId||t.command&&r.command!==t.command||t.agent&&r.agentUsed!==t.agent||t.fromDate&&r.startedAt<t.fromDate||t.toDate&&r.completedAt>t.toDate||t.minQuality&&r.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=r.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(r=>{if(!r.variance)return!1;let o=this.parseVariance(r.variance),i=this.parseDuration(r.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},gC=new ji,gt=gC});var Di,fC,yl,_m=y(()=>{"use strict";Zn();Di=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,r=await gt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:r,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let r=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,b)=>k+b.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let b=this.parseVariance(k.variance),D=this.parseDuration(k.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(b=>b.completedAsPlanned))for(let b of k.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((k,b)=>b[1]-k[1]).slice(0,3).map(([k])=>k);r.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return r}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let r=t.filter(c=>this.parseVariance(c.variance)>0);r.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:r.length/t.length,occurrences:r.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let r=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(r.length<2)return null;let o=r.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/r.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let r=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return r.length===0?null:r.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},fC=new Di,yl=fC});var qr,Ri,wl,kl=y(()=>{"use strict";Es();le();qr=3,Ri=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return r}async learnFromOutcomes(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=this.extractOutcomePatterns(t);r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return r}extractFileCochangePatterns(e){let t=new Map;for(let r of e){if(!r.subtaskSummaries)continue;let o=new Set;for(let a of r.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(r.taskId),t.set(u,d)}}let n=[];for(let[r,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=r.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((r,o)=>o.occurrences-r.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let r of n.feedback.stackConfirmed){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let r of n.feedback.patternsDiscovered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:n,occurrences:r,confidence:this.calculateConfidence(r),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let r of n.feedback.issuesEncountered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).filter(([n,{count:r}])=>r>=2).map(([n,{count:r,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,r=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=r.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),r.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of r)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=qr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,r)=>r.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let r=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:r}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:r,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[O.FILE_STRUCTURE,O.ARCHITECTURE],tech_stack:[O.TECH_STACK],architecture:[O.ARCHITECTURE,O.CODE_STYLE],estimation:[O.SHIP_WORKFLOW],workflow:[O.SHIP_WORKFLOW,O.CODE_STYLE],gotcha:[O.TEST_BEHAVIOR,O.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: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
371
+ `)}},wl=new Ri});var $i,Nm,Sl=y(()=>{"use strict";uc();en();le();$i=class extends We{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...ip,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Uo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),r=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:r}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Uo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Uo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,r=t/60,o=ap(n,r),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=cp(5,r);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:r,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:lp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t||60}},Nm=new $i});var bl=y(()=>{"use strict";Fm();_m();kl();Zn();Sl()});import nn from"chalk";function hC(s){return Lm[s.toLowerCase()]||Lm.default}var Lm,Cl,Mi,Um=y(()=>{"use strict";Lm={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(hC,"getIcon");Cl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(nn.cyan(`
368
372
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
369
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=iC(t);console.log(tn.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(tn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(tn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(tn.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?tn.green("\u2713"):tn.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${tn.dim(`(${n})`)}
370
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${tn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(tn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ji=new gl});import Ze from"chalk";function aC(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Mm.length;return Mm[t]}function cC(r,e,t="\u25B6"){let n=Ze.dim(String(r+1).padStart(2)),o=aC(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=Ze.green("\u2713 Complete");break;case"in_progress":a=Ze.yellow(`${t} Working...`);break;case"pending":a=Ze.gray("\u25CB Pending");break;case"failed":a=Ze.red("\u2717 Failed");break;case"blocked":a=Ze.gray("\u2298 Blocked");break;default:a=Ze.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function lC(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ze.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ze.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(cC(t,r[t]));return e.push(""),e.join(`
371
- `)}function Om(r){console.log(lC(r))}var Mm,Fm=y(()=>{"use strict";Mm=[Ze.cyan,Ze.magenta,Ze.yellow,Ze.blue,Ze.green,Ze.redBright,Ze.magentaBright,Ze.cyanBright];l(aC,"getDomainColor");l(cC,"formatSubtaskLine");l(lC,"renderSubtaskProgress");l(Om,"printSubtaskProgress")});function uC(r){return _m.includes(r)}async function dC(r,e,t){let n=[],s=[],o=[];switch(r){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),s.push("Read current task from now.md"),s.push("Calculate duration"),s.push("Append to shipped.md"),s.push("Clear now.md"),s.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),s.push("Parse feature description"),s.push("Generate tasks breakdown"),s.push("Add to roadmap.md"),s.push("Add tasks to next.md"),s.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),s.push("Generate spec template"),s.push("Analyze requirements"),s.push("Create spec file"),s.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),s.push("Scan for unused code"),s.push("Identify dead imports"),s.push("List files to clean"),s.push("Show preview"),s.push("Wait for approval"),s.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),s.push("Analyze current state"),s.push("Generate migration plan"),s.push("Show affected files"),s.push("Request approval"),s.push("Execute migration"),s.push("Verify results");break;default:s.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:r,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:s,confidence:c}}function pC(r){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${r.commandName}`),e.push(""),r.reasoning&&(e.push("Steps:"),r.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),r.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),r.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),r.plan.length>0&&(e.push("Plan:"),r.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(r.confidence*100)}%`),e.join(`
372
- `)}var _m,mC,Di,Nm=y(()=>{"use strict";_m=["ship","feature","spec","cleanup","migrate"];l(uC,"requiresReasoning");l(dC,"reason");l(pC,"formatPlan");mC={requiresReasoning:uC,reason:dC,formatPlan:pC,REASONING_REQUIRED_COMMANDS:_m},Di=mC});import qr from"node:fs/promises";var fl,gC,ft,hl=y(()=>{"use strict";Ve();Ce();_();Jo();fl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ft({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=A.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:A.getFilePath(n,"core","now.md"),next:A.getFilePath(n,"core","next.md"),context:A.getFilePath(n,"core","context.md"),shipped:A.getFilePath(n,"progress","shipped.md"),metrics:A.getFilePath(n,"progress","metrics.md"),ideas:A.getFilePath(n,"planning","ideas.md"),roadmap:A.getFilePath(n,"planning","roadmap.md"),specs:A.getFilePath(n,"planning","specs"),memory:A.getFilePath(n,"memory","context.jsonl"),patterns:A.getFilePath(n,"memory","patterns.json"),analysis:A.getFilePath(n,"analysis","repo-summary.md"),codePatterns:A.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await qr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(v(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([qr.readFile(d,"utf-8"),qr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(v(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await qr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(v(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await qr.access(e),!0}catch(t){if(v(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},gC=new fl,ft=gC});import{exec as fC}from"node:child_process";import Ae from"node:fs/promises";import Lm from"node:os";import En from"node:path";import{promisify as hC}from"node:util";function Hm(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function yl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wC(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
373
- `;return r.warnings.forEach(t=>{e+=` - ${t}
374
- `}),r.recommendations.length>0&&(e+=`
373
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let r=hC(t);console.log(nn.cyan(`\u250C\u2500 ${r} ${e} (${t})`)),n&&console.log(nn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(nn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(nn.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),r=e?nn.green("\u2713"):nn.red("\u2717");console.log(`\u2514\u2500 ${r} ${e?"Complete":"Failed"} ${nn.dim(`(${n})`)}
374
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${nn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(nn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Mi=new Cl});import tt from"chalk";function yC(s){let e=0;for(let n of s)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Hm.length;return Hm[t]}function wC(s,e,t="\u25B6"){let n=tt.dim(String(s+1).padStart(2)),o=yC(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=tt.green("\u2713 Complete");break;case"in_progress":a=tt.yellow(`${t} Working...`);break;case"pending":a=tt.gray("\u25CB Pending");break;case"failed":a=tt.red("\u2717 Failed");break;case"blocked":a=tt.gray("\u2298 Blocked");break;default:a=tt.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function kC(s){if(s.length===0)return"";let e=[];e.push(""),e.push(` ${tt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${tt.dim("\u2500".repeat(58))}`);for(let t=0;t<s.length;t++)e.push(wC(t,s[t]));return e.push(""),e.join(`
375
+ `)}function Gm(s){console.log(kC(s))}var Hm,zm=y(()=>{"use strict";Hm=[tt.cyan,tt.magenta,tt.yellow,tt.blue,tt.green,tt.redBright,tt.magentaBright,tt.cyanBright];l(yC,"getDomainColor");l(wC,"formatSubtaskLine");l(kC,"renderSubtaskProgress");l(Gm,"printSubtaskProgress")});function SC(s){return Wm.includes(s)}async function bC(s,e,t){let n=[],r=[],o=[];switch(s){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),r.push("Read current task from now.md"),r.push("Calculate duration"),r.push("Append to shipped.md"),r.push("Clear now.md"),r.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),r.push("Parse feature description"),r.push("Generate tasks breakdown"),r.push("Add to roadmap.md"),r.push("Add tasks to next.md"),r.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),r.push("Generate spec template"),r.push("Analyze requirements"),r.push("Create spec file"),r.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),r.push("Scan for unused code"),r.push("Identify dead imports"),r.push("List files to clean"),r.push("Show preview"),r.push("Wait for approval"),r.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),r.push("Analyze current state"),r.push("Generate migration plan"),r.push("Show affected files"),r.push("Request approval"),r.push("Execute migration"),r.push("Verify results");break;default:r.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:s,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:r,confidence:c}}function CC(s){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${s.commandName}`),e.push(""),s.reasoning&&(e.push("Steps:"),s.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),s.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),s.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),s.plan.length>0&&(e.push("Plan:"),s.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(s.confidence*100)}%`),e.join(`
376
+ `)}var Wm,PC,Oi,Bm=y(()=>{"use strict";Wm=["ship","feature","spec","cleanup","migrate"];l(SC,"requiresReasoning");l(bC,"reason");l(CC,"formatPlan");PC={requiresReasoning:SC,reason:bC,formatPlan:CC,REASONING_REQUIRED_COMMANDS:Wm},Oi=PC});import Kr from"node:fs/promises";var Pl,vC,ft,vl=y(()=>{"use strict";qe();Se();N();Xo();Pl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ut({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),r=I.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:r,paths:{now:I.getFilePath(n,"core","now.md"),next:I.getFilePath(n,"core","next.md"),context:I.getFilePath(n,"core","context.md"),shipped:I.getFilePath(n,"progress","shipped.md"),metrics:I.getFilePath(n,"progress","metrics.md"),ideas:I.getFilePath(n,"planning","ideas.md"),roadmap:I.getFilePath(n,"planning","roadmap.md"),specs:I.getFilePath(n,"planning","specs"),memory:I.getFilePath(n,"memory","context.jsonl"),patterns:I.getFilePath(n,"memory","patterns.json"),analysis:I.getFilePath(n,"analysis","repo-summary.md"),codePatterns:I.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},r=Object.entries(e.paths),o=t?r.filter(([a])=>t.includes(a)):r;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Kr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Kr.readFile(d,"utf-8"),Kr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},r=n[t]||n.default;return this.loadState(e,r)}async batchRead(e){let t=new Map,n=[];for(let r of e){let o=this._cache.get(r);o!==null?t.set(r,o.content):n.push(r)}if(n.length>0){let r=n.map(async i=>{try{let a=await Kr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(r);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await Kr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},vC=new Pl,ft=vC});import{exec as xC}from"node:child_process";import Ae from"node:fs/promises";import Vm from"node:os";import Dn from"node:path";import{promisify as TC}from"node:util";function Jm(s){let e=Math.floor(s/36e5),t=Math.floor(s%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function xl(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function IC(s){if(s.verified||s.warnings.length===0)return null;let e=` Ground Truth Warnings:
377
+ `;return s.warnings.forEach(t=>{e+=` - ${t}
378
+ `}),s.recommendations.length>0&&(e+=`
375
379
  Recommendations:
376
- `,r.recommendations.forEach(t=>{e+=` -> ${t}
377
- `})),e}async function Um(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=Hm(n.durationMs))}}catch(a){if(v(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await Ae.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(v(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await Ae.access(En.dirname(i),Ae.constants.W_OK),n.metricsWritable=!0}catch(a){if(v(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Gm(r){let e=[],t=[],n={};try{let{stdout:i}=await yC("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
378
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=En.join(r.projectPath,"package.json");try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${yl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function zm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ae.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(yl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Wm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Bm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=En.join(Lm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Vm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=En.join(Lm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Jm(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ae.access(En.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(En.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function qm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ae.access(s),n.specsExists=!0;let i=await Ae.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Ym(r,e,t){let n=Km[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function SC(r,e,t){let n=await Ym(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function kC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var yC,Km,bC,Ri,Xm=y(()=>{"use strict";_();yC=hC(fC);l(Hm,"formatDuration");l(yl,"escapeRegex");l(wC,"formatWarnings");l(Um,"verifyDone");l(Gm,"verifyShip");l(zm,"verifyFeature");l(Wm,"verifyNow");l(Bm,"verifyInit");l(Vm,"verifySync");l(Jm,"verifyAnalyze");l(qm,"verifySpec");Km={done:Um,ship:Gm,feature:zm,now:Wm,init:Bm,sync:Vm,analyze:Jm,spec:qm};l(Ym,"verify");l(SC,"prepareCommand");l(kC,"requiresVerification");bC={verify:Ym,prepareCommand:SC,requiresVerification:kC,verifiers:Km,formatWarnings:wC,formatDuration:Hm,escapeRegex:yl,verifyDone:Um,verifyShip:Gm,verifyFeature:zm,verifyNow:Wm,verifyInit:Bm,verifySync:Vm,verifyAnalyze:Jm,verifySpec:qm},Ri=bC});function vC(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 xC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of CC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:vC(t)};return{detected:!1}}function PC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function TC(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 EC(r,e,t){let n={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return n[e.type]||n.unknown}function IC(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 CC,wl,AC,Hs,Qm=y(()=>{"use strict";CC=[{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(vC,"getHallucinationSuggestion");l(xC,"detectHallucination");l(PC,"isSimilarError");l(TC,"analyzeErrorPattern");l(EC,"generateEscalationMessage");l(IC,"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="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>PC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=TC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:EC(e,o,this.maxAttempts),suggestion:IC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return xC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},AC=new wl,Hs=AC});function Sl(r,e){let t=Kr(e),n=jC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function DC(r,e){let t=Kr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function RC(r,e,t){let n=Kr(t),s=Sl(r,t),o=Sl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $i(r,e=kn){let t=Kr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=$C(r,e),s=MC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=_C(o),a=OC(o),c=FC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=NC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function eg(r,e,t=kn){let n=Kr(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function $C(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=RC(i,s,e);if(!t.has(a)){let c=Sl(i,e),u=DC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function MC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+LC(d),0),o=n.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:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function OC(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function FC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=bl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function _C(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function NC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=bl(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function bl(r){if(!r.variance)return 0;let e=kl(r.estimatedDuration),t=kl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function kl(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function tg(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(`
379
- `)}function LC(r){if(!r.estimatedDuration)return 0;let e=kl(r.estimatedDuration);if(e<=0)return 0;let t=Zm[0],n=Number.POSITIVE_INFINITY;for(let s of Zm){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Kr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var jC,Zm,Cl=y(()=>{"use strict";vs();jC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Sl,"getSprintStart");l(DC,"getSprintEnd");l(RC,"getSprintNumber");l($i,"calculateVelocity");l(eg,"projectCompletion");l($C,"bucketBySprint");l(MC,"buildSprintVelocities");l(OC,"detectTrend");l(FC,"calculateOverallAccuracy");l(_C,"calculateAverageVelocity");l(NC,"detectEstimationPatterns");l(bl,"parseVariancePercent");l(kl,"parseDurationMinutes");l(tg,"formatVelocityContext");Zm=[{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(LC,"derivePoints");l(Kr,"resolveConfig")});import{exec as HC}from"node:child_process";import UC from"node:fs/promises";import Mi from"node:path";import{promisify as GC}from"node:util";async function Yr(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=JC(r),c=await qC(e),u=await KC(e),d=[];for(let p of c){if(!i&&XC(p))continue;let g=YC(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function JC(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(n=>!t.has(n)&&n.length>2)}async function qC(r){let e=[];async function t(n,s=""){try{let o=await UC.readdir(n,{withFileTypes:!0});for(let i of o){let a=Mi.join(n,i.name),c=Mi.join(s,i.name);if(i.isDirectory()){if(VC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Mi.extname(i.name).toLowerCase();BC.has(u)&&e.push(c)}}}catch(o){v(o)}}return l(t,"walk"),await t(r),e}async function KC(r){let e=new Map;try{let{stdout:t}=await zC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
380
+ `,s.recommendations.forEach(t=>{e+=` -> ${t}
381
+ `})),e}async function qm(s){let e=[],t=[],n={},r=s.paths.now;try{let a=await Ae.readFile(r,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=Jm(n.durationMs))}}catch(a){if(P(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=s.paths.next;try{let a=await Ae.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(P(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=s.paths.metrics;try{await Ae.access(Dn.dirname(i),Ae.constants.W_OK),n.metricsWritable=!0}catch(a){if(P(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Km(s){let e=[],t=[],n={};try{let{stdout:i}=await EC("git status --porcelain",{cwd:s.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
382
+ `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let r=Dn.join(s.projectPath,"package.json");try{let i=await Ae.readFile(r,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=s.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=s.params.feature||s.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${xl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(r,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Ym(s){let e=[],t=[],n={},r=s.paths.next;try{let a=await Ae.readFile(r,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=s.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=s.params.description||s.params.feature;c&&new RegExp(xl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=s.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Xm(s){let e=[],t=[],n={},r=s.paths.now;try{let i=await Ae.readFile(r,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&s.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=s.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!s.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Qm(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(r,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Dn.join(Vm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Zm(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(r,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=Dn.join(Vm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function eg(s){let e=[],t=[],n={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of r)try{await Ae.access(Dn.join(s.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(Dn.join(s.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function tg(s){let e=[],t=[],n={},r=s.paths.specs;try{await Ae.access(r),n.specsExists=!0;let i=await Ae.readdir(r);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=s.params.feature||s.params.name||s.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function sg(s,e,t){let n=ng[s];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${w(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function AC(s,e,t){let n=await sg(s,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:s}}}function jC(s){return["done","ship","feature","spec","now","init","sync","analyze"].includes(s)}var EC,ng,DC,Fi,rg=y(()=>{"use strict";N();EC=TC(xC);l(Jm,"formatDuration");l(xl,"escapeRegex");l(IC,"formatWarnings");l(qm,"verifyDone");l(Km,"verifyShip");l(Ym,"verifyFeature");l(Xm,"verifyNow");l(Qm,"verifyInit");l(Zm,"verifySync");l(eg,"verifyAnalyze");l(tg,"verifySpec");ng={done:qm,ship:Km,feature:Ym,now:Xm,init:Qm,sync:Zm,analyze:eg,spec:tg};l(sg,"verify");l(AC,"prepareCommand");l(jC,"requiresVerification");DC={verify:sg,prepareCommand:AC,requiresVerification:jC,verifiers:ng,formatWarnings:IC,formatDuration:Jm,escapeRegex:xl,verifyDone:qm,verifyShip:Km,verifyFeature:Ym,verifyNow:Xm,verifyInit:Qm,verifySync:Zm,verifyAnalyze:eg,verifySpec:tg},Fi=DC});function $C(s){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[s]||"Verify actual state before proceeding."}function MC(s){if(!s||typeof s!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of RC)if(e.test(s))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:$C(t)};return{detected:!1}}function OC(s,e){if(!s||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(s)===t(e)}function FC(s){if(!s||s.length===0)return{type:"unknown",description:"No error information"};let e=s[s.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function _C(s,e,t){let n={permission:`I've tried ${s} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${s}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${s} from completing.`,validation:`Validation keeps failing for ${s}.`,config:`There seems to be a configuration issue affecting ${s}.`,unknown:`I've tried ${s} ${t} times without success.`};return n[e.type]||n.unknown}function NC(s){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[s.type]||e.unknown}var RC,Tl,LC,Hs,og=y(()=>{"use strict";RC=[{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($C,"getHallucinationSuggestion");l(MC,"detectHallucination");l(OC,"isSimilarError");l(FC,"analyzeErrorPattern");l(_C,"generateEscalationMessage");l(NC,"generateSuggestion");Tl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let r=this._getKey(e,t),o=Date.now(),i=this._attempts.get(r);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(r,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return!1;if(r.attempts>=2&&!r.success){let o=r.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>OC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);return r?r.attempts>=this.maxAttempts&&!r.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return null;let o=FC(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:_C(e,o,this.maxAttempts),suggestion:NC(o),lastError:r.errors[r.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);r&&(r.success=!0,r.attempts=0,r.errors=[],this._attempts.set(n,r))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return MC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},LC=new Tl,Hs=LC});function El(s,e){let t=Yr(e),n=UC[t.startDay],r=new Date(s);r.setHours(0,0,0,0);let i=(r.getDay()-n+7)%7;return r.setDate(r.getDate()-i),r}function HC(s,e){let t=Yr(e),n=new Date(s);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function GC(s,e,t){let n=Yr(t),r=El(s,t),o=El(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function _i(s,e=Pn){let t=Yr(e);if(s.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=zC(s,e),r=WC(n,t.accuracyTolerance),o=r.slice(-t.windowSize),i=JC(o),a=BC(o),c=VC(s,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=qC(s);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function ag(s,e,t=Pn){let n=Yr(t);if(e<=0)return{totalPoints:s,sprints:0,estimatedDate:""};let r=Math.ceil(s/e),o=r*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:s,sprints:r,estimatedDate:i.toISOString()}}function zC(s,e){let t=new Map,n=s.map(o=>new Date(o.completedAt)),r=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of s){let i=new Date(o.completedAt),a=GC(i,r,e);if(!t.has(a)){let c=El(i,e),u=HC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function WC(s,e){let t=[];for(let[,n]of s){let r=n.outcomes.reduce((u,d)=>u+KC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Al(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:r,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,r)=>n.sprintNumber-r.sprintNumber)}function BC(s){if(s.length<3)return"stable";let e=s.map(d=>d.pointsCompleted),t=e.length,n=0,r=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,r+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*r)/(t*i-n*n),c=r/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function VC(s,e){let t=s.filter(r=>r.variance);if(t.length===0)return 0;let n=t.filter(r=>{let o=Al(r);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function JC(s){if(s.length===0)return 0;let e=s.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/s.length*10)/10}function qC(s){let e=new Map;for(let r of s){if(!r.variance)continue;let o=Al(r),i=r.tags&&r.tags.length>0?r.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[r,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:r,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:r,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((r,o)=>o.avgVariance-r.avgVariance),n.sort((r,o)=>o.avgVariance-r.avgVariance),{overEstimated:t,underEstimated:n}}function Al(s){if(!s.variance)return 0;let e=Il(s.estimatedDuration),t=Il(s.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Il(s){let e=0,t=s.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=s.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),s.match(/(\d+)s/)&&e===0&&(e=1),e}function cg(s){if(s.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${s.averageVelocity} pts/sprint (trend: ${s.velocityTrend})`),e.push(`Estimation accuracy: ${s.estimationAccuracy}%`);for(let t of s.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of s.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
383
+ `)}function KC(s){if(!s.estimatedDuration)return 0;let e=Il(s.estimatedDuration);if(e<=0)return 0;let t=ig[0],n=Number.POSITIVE_INFINITY;for(let r of ig){let o=Math.abs(r.typical-e);o<n&&(n=o,t=r)}return t.points}function Yr(s){return{sprintLengthDays:s.sprintLengthDays??7,startDay:s.startDay??"monday",windowSize:s.windowSize??6,accuracyTolerance:s.accuracyTolerance??20}}var UC,ig,jl=y(()=>{"use strict";xs();UC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(El,"getSprintStart");l(HC,"getSprintEnd");l(GC,"getSprintNumber");l(_i,"calculateVelocity");l(ag,"projectCompletion");l(zC,"bucketBySprint");l(WC,"buildSprintVelocities");l(BC,"detectTrend");l(VC,"calculateOverallAccuracy");l(JC,"calculateAverageVelocity");l(qC,"detectEstimationPatterns");l(Al,"parseVariancePercent");l(Il,"parseDurationMinutes");l(cg,"formatVelocityContext");ig=[{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(KC,"derivePoints");l(Yr,"resolveConfig")});import{exec as YC}from"node:child_process";import XC from"node:fs/promises";import Ni from"node:path";import{promisify as QC}from"node:util";async function es(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=sP(s),c=await rP(e),u=await oP(e),d=[];for(let p of c){if(!i&&aP(p))continue;let g=iP(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,r);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function sP(s){let e=s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(n=>!t.has(n)&&n.length>2)}async function rP(s){let e=[];async function t(n,r=""){try{let o=await XC.readdir(n,{withFileTypes:!0});for(let i of o){let a=Ni.join(n,i.name),c=Ni.join(r,i.name);if(i.isDirectory()){if(nP.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Ni.extname(i.name).toLowerCase();tP.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(s),e}async function oP(s){let e=new Map;try{let{stdout:t}=await ZC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
380
384
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
381
385
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
382
386
  END { for (f in files) print files[f], lastmod[f], f }
383
- '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
384
- `).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function YC(r,e,t){let n=[],s=0,o=0,i=0,a=0,c=r.toLowerCase(),u=c.split("/").join(" ").split(/[^a-z0-9]+/);for(let g of e){c.includes(g)&&(s+=.3,n.push(`keyword:${g}`));for(let f of u)if(f.includes(g)||g.includes(f)){s+=.15;break}}s=Math.min(1,s);for(let[g,f]of Object.entries(WC))for(let S of f)if(c.includes(S)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Mi.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function XC(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 zC,WC,BC,VC,vl=y(()=>{"use strict";_();zC=GC(HC),WC={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"]},BC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),VC=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Yr,"findRelevantFiles");l(JC,"extractKeywords");l(qC,"getAllCodeFiles");l(KC,"getGitRecency");l(YC,"scoreFile");l(XC,"isTestFile")});import{exec as QC}from"node:child_process";import{promisify as ZC}from"node:util";async function Qr(r=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,s=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(s){let c=await nv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await tv(r,t);return o=o.filter(c=>!sv(c.path)).slice(0,n),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,n),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function tv(r,e){let{stdout:t}=await Xr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
387
+ '`,{cwd:s,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),r=t.trim().split(`
388
+ `).filter(Boolean);for(let o of r){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function iP(s,e,t){let n=[],r=0,o=0,i=0,a=0,c=s.toLowerCase(),u=c.split("/").join(" ").split(/[^a-z0-9]+/);for(let g of e){c.includes(g)&&(r+=.3,n.push(`keyword:${g}`));for(let f of u)if(f.includes(g)||g.includes(f)){r+=.15;break}}r=Math.min(1,r);for(let[g,f]of Object.entries(eP))for(let k of f)if(c.includes(k)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(s);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Ni.basename(s).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=r*.6+o*.2+i*.15+a*.05;return{path:s,score:Math.min(1,p),reasons:[...new Set(n)]}}function aP(s){let e=s.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var ZC,eP,tP,nP,Li=y(()=>{"use strict";N();ZC=QC(YC),eP={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"]},tP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),nP=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(es,"findRelevantFiles");l(sP,"extractKeywords");l(rP,"getAllCodeFiles");l(oP,"getGitRecency");l(iP,"scoreFile");l(aP,"isTestFile")});import{exec as cP}from"node:child_process";import{promisify as lP}from"node:util";async function Qr(s=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,r=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(r){let c=await pP(s);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await dP(s,t);return o=o.filter(c=>!mP(c.path)).slice(0,n),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,n),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function dP(s,e){let{stdout:t}=await Xr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
385
389
  /^[0-9]+$/ { timestamp=$1; next }
386
390
  NF {
387
391
  count[$0]++
@@ -390,8 +394,8 @@ Recommendations:
390
394
  END {
391
395
  for (f in count) print count[f], lastmod[f], f
392
396
  }
393
- ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
394
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),S=Math.max(0,1-g/30),b=u/i,D=S*.6+b*.4,x;f<1?x="just now":f<24?x=`${f}h ago`:g<7?x=`${g}d ago`:g<30?x=`${Math.floor(g/7)}w ago`:x=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:x,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function nv(r){let{stdout:e}=await Xr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Xr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Xr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
397
+ ' | sort -rn`,{cwd:s,maxBuffer:10485760}),n=[],r=t.trim().split(`
398
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),b=u/i,D=k*.6+b*.4,v;f<1?v="just now":f<24?v=`${f}h ago`:g<7?v=`${g}d ago`:g<30?v=`${Math.floor(g/7)}w ago`:v=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:v,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function pP(s){let{stdout:e}=await Xr("git branch --show-current",{cwd:s}),t=e.trim(),n="main";try{await Xr("git rev-parse --verify main",{cwd:s})}catch{n="master"}let{stdout:r}=await Xr(`git diff --name-only ${n}...HEAD`,{cwd:s}),o=r.trim().split(`
395
399
  `).filter(Boolean),{stdout:i}=await Xr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
396
400
  /^[0-9]+$/ { timestamp=$1; next }
397
401
  NF {
@@ -401,64 +405,64 @@ Recommendations:
401
405
  END {
402
406
  for (f in count) print count[f], lastmod[f], f
403
407
  }
404
- '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
405
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),S=p[3],b=u-f,D=Math.floor(b/86400),x=Math.floor(b/3600),O=Math.max(0,1-D/14),F=g/d,K=O*.5+F*.5,oe;x<1?oe="just now":x<24?oe=`${x}h ago`:oe=`${D}d ago`,a.push({path:S,changes:g,heatScore:Math.round(K*100)/100,lastChanged:oe,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function sv(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 Xr,ev,xl=y(()=>{"use strict";Xr=ZC(QC),ev=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Qr,"getRecentFiles");l(tv,"getHotFilesFromCommits");l(nv,"getBranchOnlyFiles");l(sv,"shouldIgnore")});function Oi(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function ng(r,e){let t=rv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Tl(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Zr(r,e){let t=Oi(r),n=Oi(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=ng(s,ov),a=Pl.map(c=>({model:c,...ng(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Tl(i.total),byModel:a}}}function Qn(r){let e=Oi(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Pl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Fi(r){if(r.length===0)return Qn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),n=r.reduce((a,c)=>a+c.tokens.saved,0),s=e>0?(e-t)/e:0,o=Pl.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:n},compression:s,cost:{saved:i,formatted:Tl(i),byModel:o}}}function iv(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function av(r){return`${Math.round(r*100)}%`}var rv,ov,Pl,eo=y(()=>{"use strict";rv={"claude-opus-4.5":{input:.005,output:.025},"claude-sonnet-4.5":{input:.003,output:.015},"claude-haiku-4.5":{input:.001,output:.005},"claude-opus-4":{input:.015,output:.075},"claude-opus-4-6":{input:.015,output:.075},"gpt-4o":{input:.0025,output:.01},"gpt-4-turbo":{input:.01,output:.03},"gpt-4o-mini":{input:15e-5,output:6e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4}},ov="claude-sonnet-4.5";l(Oi,"countTokens");Pl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(ng,"calculateModelCost");l(Tl,"formatCostSaved");l(Zr,"measureCompression");l(Qn,"noCompression");l(Fi,"combineMetrics");l(iv,"formatTokenCount");l(av,"formatCompressionRate")});import og from"node:fs/promises";import In from"node:path";async function An(r,e=process.cwd()){let t=In.isAbsolute(r)?r:In.join(e,r),n;try{n=await og.readFile(t,"utf-8")}catch(u){if(v(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Qn("")};throw u}let s=In.extname(r).toLowerCase(),o=ig[s]||"unknown",i=dv[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:Qn(n)};let a=pv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
406
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function El(r,e=process.cwd(),t={}){let n=In.isAbsolute(r)?r:In.join(e,r),s=[];async function o(i){let a=await og.readdir(i,{withFileTypes:!0});for(let c of a){let u=In.join(i,c.name),d=In.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 m=In.extname(c.name).toLowerCase();if(ig[m]){let p=await An(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function pv(r,e){let t=[],n=r.split(`
407
- `),s=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(s.has(c))continue;s.add(c);let u=i.index,d=r.substring(0,u).split(`
408
- `).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:mv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function mv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var ig,sg,cv,lv,uv,rg,dv,_i=y(()=>{"use strict";_();eo();ig={".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"},sg=[{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}],cv=[{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}],lv=[{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}],uv=[{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}],rg=[{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}],dv={typescript:sg,javascript:sg,python:cv,go:lv,rust:uv,java:rg,csharp:rg,php:[],ruby:[],unknown:[]};l(An,"extractSignatures");l(El,"extractDirectorySignatures");l(pv,"extractFromContent");l(mv,"cleanSignature")});import{createHash as gv}from"node:crypto";import lg from"node:fs/promises";import ug from"node:path";function ag(r){return gv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function cg(r){try{let e=ug.join(r,"storage","classification-cache.json"),t=await lg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e)?Xa:(console.warn("[classifier] Failed to load cache:",w(e)),Xa)}}async function Il(r,e){try{let t=ug.join(r,"storage","classification-cache.json");await lg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function hv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>fv?null:n.classification}function yv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function wv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=dg(e),s=ec("classification")||"",o=`Classify this software engineering task into a domain.
408
+ '`,{cwd:s,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
409
+ `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],b=u-f,D=Math.floor(b/86400),v=Math.floor(b/3600),$=Math.max(0,1-D/14),F=g/d,H=$*.5+F*.5,ee;v<1?ee="just now":v<24?ee=`${v}h ago`:ee=`${D}d ago`,a.push({path:k,changes:g,heatScore:Math.round(H*100)/100,lastChanged:ee,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function mP(s){let e=s.split("/").pop()||"";for(let t of uP)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Xr,uP,Dl=y(()=>{"use strict";Xr=lP(cP),uP=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Qr,"getRecentFiles");l(dP,"getHotFilesFromCommits");l(pP,"getBranchOnlyFiles");l(mP,"shouldIgnore")});function Ui(s){return!s||s.length===0?0:Math.ceil(s.length/4)}function lg(s,e){let t=gP[e],n=s/1e3*t.input,r=s/1e3*t.output*.3;return{inputSaved:n,outputPotential:r,total:n+r}}function $l(s){return s<.001?"<$0.01":s<.01?`$${s.toFixed(3)}`:`$${s.toFixed(2)}`}function Zr(s,e){let t=Ui(s),n=Ui(e),r=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=lg(r,fP),a=Rl.map(c=>({model:c,...lg(r,c)}));return{tokens:{original:t,filtered:n,saved:r},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:$l(i.total),byModel:a}}}function ts(s){let e=Ui(s);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Rl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Hi(s){if(s.length===0)return ts("");let e=s.reduce((a,c)=>a+c.tokens.original,0),t=s.reduce((a,c)=>a+c.tokens.filtered,0),n=s.reduce((a,c)=>a+c.tokens.saved,0),r=e>0?(e-t)/e:0,o=Rl.map(a=>{let c=s.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=s.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:n},compression:r,cost:{saved:i,formatted:$l(i),byModel:o}}}function hP(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function yP(s){return`${Math.round(s*100)}%`}var gP,fP,Rl,eo=y(()=>{"use strict";gP={"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}},fP="claude-sonnet-4.5";l(Ui,"countTokens");Rl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(lg,"calculateModelCost");l($l,"formatCostSaved");l(Zr,"measureCompression");l(ts,"noCompression");l(Hi,"combineMetrics");l(hP,"formatTokenCount");l(yP,"formatCompressionRate")});import pg from"node:fs/promises";import Rn from"node:path";async function $n(s,e=process.cwd()){let t=Rn.isAbsolute(s)?s:Rn.join(e,s),n;try{n=await pg.readFile(t,"utf-8")}catch(u){if(P(u))return{file:s,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:ts("")};throw u}let r=Rn.extname(s).toLowerCase(),o=mg[r]||"unknown",i=bP[o];if(!i||i.length===0)return{file:s,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:ts(n)};let a=CP(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
410
+ `);return{file:s,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function Ml(s,e=process.cwd(),t={}){let n=Rn.isAbsolute(s)?s:Rn.join(e,s),r=[];async function o(i){let a=await pg.readdir(i,{withFileTypes:!0});for(let c of a){let u=Rn.join(i,c.name),d=Rn.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 m=Rn.extname(c.name).toLowerCase();if(mg[m]){let p=await $n(d,e);r.push(p)}}}}return l(o,"processDir"),await o(n),r}function CP(s,e){let t=[],n=s.split(`
411
+ `),r=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(s))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(r.has(c))continue;r.add(c);let u=i.index,d=s.substring(0,u).split(`
412
+ `).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:PP(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function PP(s){return s.replace(/\{$/,"").replace(/\s+/g," ").trim()}var mg,ug,wP,kP,SP,dg,bP,Gi=y(()=>{"use strict";N();eo();mg={".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"},ug=[{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}],wP=[{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}],kP=[{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}],SP=[{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}],dg=[{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}],bP={typescript:ug,javascript:ug,python:wP,go:kP,rust:SP,java:dg,csharp:dg,php:[],ruby:[],unknown:[]};l($n,"extractSignatures");l(Ml,"extractDirectorySignatures");l(CP,"extractFromContent");l(PP,"cleanSignature")});import{createHash as vP}from"node:crypto";import hg from"node:fs/promises";import yg from"node:path";function gg(s){return vP("sha256").update(s.toLowerCase().trim()).digest("hex").slice(0,16)}async function fg(s){try{let e=yg.join(s,"storage","classification-cache.json"),t=await hg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?ic:(console.warn("[classifier] Failed to load cache:",w(e)),ic)}}async function Ol(s,e){try{let t=yg.join(s,"storage","classification-cache.json");await hg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function TP(s,e,t){let n=s.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>xP?null:n.classification}function EP(s,e){return s.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function IP(s,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=wg(e),r=lc("classification")||"",o=`Classify this software engineering task into a domain.
409
413
 
410
- Task: "${r}"
414
+ Task: "${s}"
411
415
 
412
416
  Available domains in this project: ${n.join(", ")}
413
417
  Available agents: ${e.agents.join(", ")||"none"}
414
418
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
415
419
 
416
- ${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Sn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function kv(r,e){let t=dg(e),n=new Map;for(let[p,g]of Object.entries(Sv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let S of g)r.match(new RegExp(S,"gi"))&&(f+=S.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return zd;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=bv(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function dg(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function bv(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var fv,Sv,Al,Cv,pg,mg=y(()=>{"use strict";Er();Oo();_();fv=3600*1e3;l(ag,"hashDescription");l(cg,"loadCache");l(Il,"saveCache");l(hv,"lookupCache");l(yv,"lookupPatterns");l(wv,"classifyWithLLM");Sv={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(kv,"classifyWithHeuristic");l(dg,"buildAvailableDomains");l(bv,"getFilePatterns");Al=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=ag(e),i=await cg(n),a=hv(i,o,t);if(a)return{classification:a,source:"cache"};let c=yv(i,o);if(c)return{classification:c,source:"history"};let u=await wv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Il(n,i),{classification:u,source:"llm"};let d=kv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Il(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=ag(e),o=await cg(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Il(n,o))}},Cv=new Al,pg=Cv});import{exec as vv}from"node:child_process";import to from"node:fs/promises";import xv from"node:os";import Zn from"node:path";import{promisify as Pv}from"node:util";var gg,fg,jl,Tv,Ni,Dl=y(()=>{"use strict";Cl();Ve();Ce();vs();Ut();vl();xl();_i();_();Xn();mg();qn();gg=Pv(vv),fg=["database","backend","frontend","testing","devops"],jl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=A.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),[m,p,g]=await Promise.all([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),f=this.shouldFragment(a,t),S=null;return f&&e==="task"&&(S=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:f,subtasks:S,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:p,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Yr(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await An(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
417
- `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([gg("git branch --show-current",{cwd:e}),gg("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
418
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await Zt.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=$i(t,kn);return n.sprints.length===0?null:tg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Zn.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return v(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=A.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await pg.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=Zn.join(e,"agents");return(await to.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=A.getGlobalProjectPath(t),s=Zn.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=Zn.join(s,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=si(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=Zn.join(xv.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=Zn.join(t,`${i}.md`),c=Zn.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=fg.indexOf(a),d=fg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Tv=new jl,Ni=Tv});function Ev(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 Rl,Iv,_e,hg=y(()=>{"use strict";Ot();le();ln();ln();l(Ev,"generateApprovalPrompt");Rl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return cc.includes(e)}isDestructive(e){return lc.includes(e)}isToolAllowedInPlanning(e){return Go.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Go.includes(n)):t}startPlanning(e,t,n){let s={id:Se(),projectId:e,command:t,params:n,status:se.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[se.GATHERING,se.ANALYZING,se.PROPOSING,se.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===se.APPROVED?n.approvedAt=C():t===se.EXECUTING?n.executionStartedAt=C():(t===se.COMPLETED||t===se.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=se.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=se.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==se.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=se.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=se.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==se.APPROVED?null:(t.status=se.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==se.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==se.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=se.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=se.ABORTED,n.completedAt=C(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Ev(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[se.GATHERING]:"\u{1F50D}",[se.ANALYZING]:"\u{1F9E0}",[se.PROPOSING]:"\u{1F4DD}",[se.PENDING_APPROVAL]:"\u23F3",[se.APPROVED]:"\u2705",[se.EXECUTING]:"\u26A1",[se.COMPLETED]:"\u{1F389}",[se.REJECTED]:"\u274C",[se.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===se.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
419
- `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},Iv=new Rl,_e=Iv});function Av(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Li[t]?Li[t]:Li[e]?Li[e]:e}function Hi(r){let e=new Set,t=[];for(let n of r){let s=Av(n);e.has(s)||(e.add(s),t.push(n))}return t}var Li,$l=y(()=>{"use strict";Li={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(Av,"normalizeFrameworkName");l(Hi,"deduplicateTechStack")});import{z as Ne}from"zod";function yg(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
420
- `);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=Hi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let c=Object.entries(r.domains).filter(([,u])=>!u).map(([u])=>jv[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=r.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),r.fileCount&&e.push(`
421
- Context: ${r.fileCount} files in project.`),e.join(`
422
- `)}var H_,jv,wg=y(()=>{"use strict";$l();H_=Ne.object({projectPath:Ne.string(),language:Ne.string().optional(),framework:Ne.string().optional(),techStack:Ne.array(Ne.string()).default([]),domains:Ne.object({hasFrontend:Ne.boolean().default(!1),hasBackend:Ne.boolean().default(!1),hasDatabase:Ne.boolean().default(!1),hasTesting:Ne.boolean().default(!1),hasDocker:Ne.boolean().default(!1)}).optional(),fileCount:Ne.number().optional(),availableAgents:Ne.array(Ne.string()).default([]),analysisLanguages:Ne.array(Ne.string()).default([]),analysisFrameworks:Ne.array(Ne.string()).default([]),analysisPackageManager:Ne.string().optional()}),jv={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(yg,"buildAntiHallucinationBlock")});import{z as Wt}from"zod";var Dv,Sg,kg=y(()=>{"use strict";Dv=Wt.object({agents:Wt.boolean(),patterns:Wt.boolean(),checklist:Wt.boolean(),modules:Wt.array(Wt.string())}),Sg=Wt.object({version:Wt.string(),description:Wt.string().optional(),commands:Wt.record(Wt.string(),Dv).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Ml(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function bg(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Ml(o,Rv),a=Ml(o,$v),c=Ml(o,Mv);return s.some(d=>Ov.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var Rv,$v,Mv,Ov,Cg=y(()=>{"use strict";Rv=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],$v=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Mv=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],Ov=["Write","Edit","Bash"];l(Ml,"countMatches");l(bg,"classifyCommand")});import Ol from"node:fs/promises";import Fv from"node:path";async function xg(){if(no)return no;let r=await Ol.readFile(Fl,"utf-8"),e=JSON.parse(r);return no=Sg.parse(e),no}function _v(r){return Pg.get(r)}function Nv(r,e){Pg.set(r,e)}function Hv(r,e){let t=r,n=vg.get(t);return n&&Gv(n.entry,e)?(n.count++,n.count>=Lv):(vg.set(t,{entry:e,count:1}),!1)}async function Uv(r,e){let t=await Ol.readFile(Fl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Ol.writeFile(Fl,`${JSON.stringify(n,null,2)}
423
- `,"utf-8"),no=null}function Gv(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,n)=>t===e.modules[n])}function Tg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=_v(e);if(n)return{entry:n,source:"cache"};if(t){let s=bg(e,t);return Nv(e,s),Hv(e,s)&&Uv(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Fl,no,Pg,vg,Lv,Eg=y(()=>{"use strict";kg();dt();Cg();Fl=Fv.join(pe,"core/config/command-context.config.json"),no=null;l(xg,"loadCommandContextConfig");Pg=new Map;l(_v,"getCachedClassification");l(Nv,"cacheClassification");vg=new Map,Lv=3;l(Hv,"trackClassification");l(Uv,"persistClassification");l(Gv,"isSameEntry");l(Tg,"resolveCommandContextFull")});import zv from"node:os";import{z as nn}from"zod";function Wv(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Bv(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Ig(r){let e=r.platform??zv.platform(),t=r.runtime??Wv(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
424
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Bv(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
420
+ ${r}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Cn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function jP(s,e){let t=wg(e),n=new Map;for(let[p,g]of Object.entries(AP)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)s.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Jd;let r=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=r[0][0],i=r[0][1],a=r.slice(1,3).map(([p])=>p),c=r.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=DP(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function wg(s){let e=[];return s.domains.hasFrontend&&e.push("frontend"),s.domains.hasBackend&&e.push("backend"),s.domains.hasDatabase&&e.push("database"),s.domains.hasTesting&&e.push("testing"),s.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function DP(s){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[s]||e.general}var xP,AP,Fl,RP,kg,Sg=y(()=>{"use strict";Ir();Lo();N();xP=3600*1e3;l(gg,"hashDescription");l(fg,"loadCache");l(Ol,"saveCache");l(TP,"lookupCache");l(EP,"lookupPatterns");l(IP,"classifyWithLLM");AP={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(jP,"classifyWithHeuristic");l(wg,"buildAvailableDomains");l(DP,"getFilePatterns");Fl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,r){let o=gg(e),i=await fg(n),a=TP(i,o,t);if(a)return{classification:a,source:"cache"};let c=EP(i,o);if(c)return{classification:c,source:"history"};let u=await IP(e,r);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Ol(n,i),{classification:u,source:"llm"};let d=jP(e,r);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Ol(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let r=gg(e),o=await fg(n);o.confirmedPatterns.some(i=>i.descriptionHash===r)||(o.confirmedPatterns.push({descriptionHash:r,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Ol(n,o))}},RP=new Fl,kg=RP});import{exec as $P}from"node:child_process";import to from"node:fs/promises";import MP from"node:os";import ns from"node:path";import{promisify as OP}from"node:util";var bg,Cg,_l,FP,zi,Nl=y(()=>{"use strict";jl();qe();Se();xs();Bt();Li();Dl();Gi();N();Zn();Sg();In();bg=OP($P),Cg=["database","backend","frontend","testing","devops"],_l=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let r=await R.getProjectId(n),o=I.getGlobalProjectPath(r),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,r,i),u=await this.loadAgents(a,r),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(r),this.loadVelocityContext(r)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((H,ee)=>{if(H.status==="fulfilled")return H.value;g.push(p[ee]),console.warn(`Context tool "${p[ee]}" failed: ${w(H.reason)}`)}),[k,b,D]=f,v={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},$=this.shouldFragment(a,t),F=null;return $&&e==="task"&&(F=await this.createSubtasks(t,a,u,r)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:$,subtasks:F,project:{id:r,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:b??null,velocityContext:D??null,contextDegradation:v}}async gatherRealContext(e,t){try{let[n,r,o]=await Promise.all([this.getGitState(t),es(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=r.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await $n(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
421
+ `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:r.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([bg("git branch --show-current",{cwd:e}),bg("git status --porcelain",{cwd:e})]),r=t.stdout.trim()||"main",o=n.stdout.trim().split(`
422
+ `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await bt.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=_i(t,Pn);return n.sprints.length===0?null:cg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ns.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let r=I.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(r),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await kg.classify(e,t,r,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=ns.join(e,"agents");return(await to.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=I.getGlobalProjectPath(t),r=ns.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=ns.join(r,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=ai(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(r=>r.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=ns.join(MP.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let r=Array.from(n.keys()).map(async i=>{let a=ns.join(t,`${i}.md`),c=ns.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(r)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],r=t.toLowerCase();for(let i of n)if(r.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,r){let o=[...t].sort((a,c)=>{let u=Cg.indexOf(a),d=Cg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(r,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let r={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${r} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},FP=new _l,zi=FP});function _P(s,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[s]||{title:"Confirmation Required",message:`Execute ${s}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var Ll,NP,_e,Pg=y(()=>{"use strict";Lt();le();un();un();l(_P,"generateApprovalPrompt");Ll=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return yc.includes(e)}isDestructive(e){return wc.includes(e)}isToolAllowedInPlanning(e){return Vo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Vo.includes(n)):t}startPlanning(e,t,n){let r={id:ge(),projectId:e,command:t,params:n,status:oe.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,r),r}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[oe.GATHERING,oe.ANALYZING,oe.PROPOSING,oe.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===oe.APPROVED?n.approvedAt=C():t===oe.EXECUTING?n.executionStartedAt=C():(t===oe.COMPLETED||t===oe.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=oe.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=oe.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==oe.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=oe.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((r,o)=>({index:o,description:typeof r=="string"?r:r.description||"",status:"pending",tool:typeof r=="string"?void 0:r.tool,args:typeof r=="string"?void 0:r.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=oe.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==oe.APPROVED?null:(t.status=oe.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==oe.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==oe.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=oe.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(r=>r.status==="completed").length,failedSteps:t.steps.filter(r=>r.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=oe.ABORTED,n.completedAt=C(),n.abortReason=t;let r={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),r}generateApprovalPrompt(e,t){return _P(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let r=[`${{[oe.GATHERING]:"\u{1F50D}",[oe.ANALYZING]:"\u{1F9E0}",[oe.PROPOSING]:"\u{1F4DD}",[oe.PENDING_APPROVAL]:"\u23F3",[oe.APPROVED]:"\u2705",[oe.EXECUTING]:"\u26A1",[oe.COMPLETED]:"\u{1F389}",[oe.REJECTED]:"\u274C",[oe.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===oe.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);r.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return r.join(`
423
+ `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),r=Math.floor(n/1e3),o=Math.floor(r/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${r%60}s`:`${r}s`}},NP=new Ll,_e=NP});function LP(s){let e=s.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Wi[t]?Wi[t]:Wi[e]?Wi[e]:e}function Bi(s){let e=new Set,t=[];for(let n of s){let r=LP(n);e.has(r)||(e.add(r),t.push(n))}return t}var Wi,Ul=y(()=>{"use strict";Wi={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(LP,"normalizeFrameworkName");l(Bi,"deduplicateTechStack")});import{z as Ne}from"zod";function vg(s){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
424
+ `);let t=[];s.language&&t.push(s.language),s.framework&&t.push(s.framework);let n=s.techStack??[];t.push(...n);let r=s.analysisLanguages??[],o=s.analysisFrameworks??[];t.push(...r,...o);let i=Bi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),s.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${s.analysisPackageManager}`),s.domains){let c=Object.entries(s.domains).filter(([,u])=>!u).map(([u])=>UP[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=s.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${s.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),s.fileCount&&e.push(`
425
+ Context: ${s.fileCount} files in project.`),e.join(`
426
+ `)}var iN,UP,xg=y(()=>{"use strict";Ul();iN=Ne.object({projectPath:Ne.string(),language:Ne.string().optional(),framework:Ne.string().optional(),techStack:Ne.array(Ne.string()).default([]),domains:Ne.object({hasFrontend:Ne.boolean().default(!1),hasBackend:Ne.boolean().default(!1),hasDatabase:Ne.boolean().default(!1),hasTesting:Ne.boolean().default(!1),hasDocker:Ne.boolean().default(!1)}).optional(),fileCount:Ne.number().optional(),availableAgents:Ne.array(Ne.string()).default([]),analysisLanguages:Ne.array(Ne.string()).default([]),analysisFrameworks:Ne.array(Ne.string()).default([]),analysisPackageManager:Ne.string().optional()}),UP={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(vg,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var HP,Tg,Eg=y(()=>{"use strict";HP=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),Tg=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),HP).refine(s=>"*"in s,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Hl(s,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(s)).length}function Ig(s,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),r=e.frontmatter?.["allowed-tools"]||[],o=`${s} ${t} ${n}`,i=Hl(o,GP),a=Hl(o,zP),c=Hl(o,WP);return r.some(d=>BP.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var GP,zP,WP,BP,Ag=y(()=>{"use strict";GP=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],zP=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],WP=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],BP=["Write","Edit","Bash"];l(Hl,"countMatches");l(Ig,"classifyCommand")});import Gl from"node:fs/promises";import VP from"node:path";async function Dg(){if(no)return no;let s=await Gl.readFile(zl,"utf-8"),e=JSON.parse(s);return no=Tg.parse(e),no}function JP(s){return Rg.get(s)}function qP(s,e){Rg.set(s,e)}function YP(s,e){let t=s,n=jg.get(t);return n&&QP(n.entry,e)?(n.count++,n.count>=KP):(jg.set(t,{entry:e,count:1}),!1)}async function XP(s,e){let t=await Gl.readFile(zl,"utf-8"),n=JSON.parse(t);n.commands[s]=e,await Gl.writeFile(zl,`${JSON.stringify(n,null,2)}
427
+ `,"utf-8"),no=null}function QP(s,e){return s.agents===e.agents&&s.patterns===e.patterns&&s.checklist===e.checklist&&s.modules.length===e.modules.length&&s.modules.every((t,n)=>t===e.modules[n])}function $g(s,e,t){if(e in s.commands&&e!=="*")return{entry:s.commands[e],source:"config"};let n=JP(e);if(n)return{entry:n,source:"cache"};if(t){let r=Ig(e,t);return qP(e,r),YP(e,r)&&XP(e,r).catch(()=>{}),{entry:r,source:"classified"}}return{entry:s.commands["*"],source:"wildcard"}}var zl,no,Rg,jg,KP,Mg=y(()=>{"use strict";Eg();dt();Ag();zl=VP.join(de,"core/config/command-context.config.json"),no=null;l(Dg,"loadCommandContextConfig");Rg=new Map;l(JP,"getCachedClassification");l(qP,"cacheClassification");jg=new Map,KP=3;l(YP,"trackClassification");l(XP,"persistClassification");l(QP,"isSameEntry");l($g,"resolveCommandContextFull")});import ZP from"node:os";import{z as sn}from"zod";function ev(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function tv(s){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[s]??s}function Og(s){let e=s.platform??ZP.platform(),t=s.runtime??ev(),n=s.date??new Date().toISOString().split("T")[0];return`<env>
428
+ ${[["project",s.projectName],["path",s.projectPath],["git",s.isGitRepo?"true":"false"],["branch",s.gitBranch],["platform",tv(e)],["runtime",t],["date",n],["model",s.model],["provider",s.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
425
429
  `)}
426
- </env>`}var nN,Ag=y(()=>{"use strict";nN=nn.object({projectName:nn.string(),projectPath:nn.string(),isGitRepo:nn.boolean().default(!0),gitBranch:nn.string().optional(),platform:nn.string().optional(),runtime:nn.string().optional(),date:nn.string().optional(),model:nn.string().optional(),provider:nn.string().optional()});l(Wv,"detectRuntime");l(Bv,"normalizePlatform");l(Ig,"buildEnvironmentBlock")});function Dg(r){let e=r.getAllocationFor("injection");return{...Gi,totalPrompt:e}}function es(r,e){let t=e*Rg;return r.length<=t?r:`${r.substring(0,t)}
427
- ... (truncated to ~${e} tokens)`}function jg(r){return Math.ceil(r.length/Rg)}function $g(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Vv[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var Gi,Rg,Vv,Ui,Mg=y(()=>{"use strict";Gi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Dg,"budgetsFromCoordinator");Rg=4;l(es,"truncateToTokenBudget");l(jg,"estimateTokens");Vv={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l($g,"filterSkillsByDomains");Ui=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Gi,...e}}addSection(e,t){let n=es(e,t),s=jg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=es(n,o);return this.used+=jg(i),i}return this.used+=s,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import Og from"node:fs/promises";import ts from"node:path";var _l,Jv,Fg,_g=y(()=>{"use strict";Ut();_();xe();dt();ml();wg();Eg();Ag();Mg();$l();qn();_l=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await P(e)){let s=await Og.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){v(s)||console.error(`Template loading warning: ${w(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Dg(this._coordinator):Gi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ve(`global/modules/${e}`);if(t)return t;let n=ts.join(pe,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=Ms("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ve(s);if(o){let i=ts.basename(s,".md");t[i]=o}}}else{let s=ts.join(pe,"templates","checklists");if(await P(s)){let o=(await Og.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=ts.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){v(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([L.read(e),Pe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(v(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await ll.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!v(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let s=n.join(`
428
- `);return es(s,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),s=Date.now()-t,o=Math.floor(s/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=ts.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let k=await xg();p=Tg(k,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
429
- `),s.role&&d.push(`Role: ${s.role}
430
- `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
430
+ </env>`}var CN,Fg=y(()=>{"use strict";CN=sn.object({projectName:sn.string(),projectPath:sn.string(),isGitRepo:sn.boolean().default(!0),gitBranch:sn.string().optional(),platform:sn.string().optional(),runtime:sn.string().optional(),date:sn.string().optional(),model:sn.string().optional(),provider:sn.string().optional()});l(ev,"detectRuntime");l(tv,"normalizePlatform");l(Og,"buildEnvironmentBlock")});function Ng(s){let e=s.getAllocationFor("injection");return{...Ji,totalPrompt:e}}function ss(s,e){let t=e*Lg;return s.length<=t?s:`${s.substring(0,t)}
431
+ ... (truncated to ~${e} tokens)`}function _g(s){return Math.ceil(s.length/Lg)}function Ug(s,e){if(e.length===0||s.length===0)return s;let t=new Set;for(let n of e){let r=nv[n.toLowerCase()];if(r)for(let o of r)t.add(o);t.add(n.toLowerCase())}return s.filter(n=>{let r=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(r.includes(o))return!0;return!1})}var Ji,Lg,nv,Vi,Hg=y(()=>{"use strict";Ji={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Ng,"budgetsFromCoordinator");Lg=4;l(ss,"truncateToTokenBudget");l(_g,"estimateTokens");nv={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l(Ug,"filterSkillsByDomains");Vi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Ji,...e}}addSection(e,t){let n=ss(e,t),r=_g(n);if(this.used+r>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ss(n,o);return this.used+=_g(i),i}return this.used+=r,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import Gg from"node:fs/promises";import rs from"node:path";var Wl,sv,zg,Wg=y(()=>{"use strict";Bt();N();ve();dt();bl();xg();Mg();Fg();Hg();Ul();In();Wl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await x(e)){let r=await Gg.readFile(e,"utf-8");return this._templateCache.set(e,{content:r,loadedAt:n}),r}}catch(r){P(r)||console.error(`Template loading warning: ${w(r)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Ng(this._coordinator):Ji}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=fe(`global/modules/${e}`);if(t)return t;let n=rs.join(de,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=En("checklists/");if(n.length>0){for(let r of n)if(r.endsWith(".md")){let o=fe(r);if(o){let i=rs.basename(r,".md");t[i]=o}}}else{let r=rs.join(de,"templates","checklists");if(await x(r)){let o=(await Gg.readdir(r)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=rs.join(r,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,r]=await Promise.all([L.read(e),xe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:r.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(P(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await yl.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!P(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let r=n.join(`
432
+ `);return ss(r,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),r=Date.now()-t,o=Math.floor(r/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=rs.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,r=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,r,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,r=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let S=await Dg();p=$g(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;r&&g&&(d.push(`# AGENT: ${r.name}
433
+ `),r.role&&d.push(`Role: ${r.role}
434
+ `),r.skills?.length&&d.push(`Skills: ${r.skills.join(", ")}
431
435
  `),d.push(`
432
436
  Apply specialized expertise. Read agent file for details if needed.
433
437
 
434
438
  `)),d.push(`TASK: ${e.frontmatter.description}
435
439
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
436
440
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
437
- `);let S=t.projectPath;if(S){let k=u?.project?.id?ts.basename(S):ts.basename(S),j=Ig({projectName:k,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
441
+ `);let k=t.projectPath;if(k){let S=u?.project?.id?rs.basename(k):rs.basename(k),j=Og({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
438
442
  ${j}
439
- `)}if(u){let k=u.sealedAnalysis;if(d.push(`
443
+ `)}if(u){let S=u.sealedAnalysis;if(d.push(`
440
444
  ## PROJECT ANALYSIS (Sealed)
441
445
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
442
446
  `),d.push(`**Primary Domain**: ${u.primaryDomain}
443
447
  `),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
444
- `),k){if(k.languages.length>0&&d.push(`**Languages**: ${k.languages.join(", ")}
445
- `),k.frameworks.length>0&&d.push(`**Frameworks**: ${k.frameworks.join(", ")}
446
- `),k.packageManager&&d.push(`**Package Manager**: ${k.packageManager}
447
- `),k.sourceDir&&d.push(`**Source Dir**: ${k.sourceDir}
448
- `),k.testDir&&d.push(`**Test Dir**: ${k.testDir}
449
- `),d.push(`**Files Analyzed**: ${k.fileCount}
450
- `),d.push(`**Analysis Status**: ${k.status}${k.commitHash?` (commit: ${k.commitHash.slice(0,8)})`:""}
451
- `),k.patterns.length>0){d.push(`
448
+ `),S){if(S.languages.length>0&&d.push(`**Languages**: ${S.languages.join(", ")}
449
+ `),S.frameworks.length>0&&d.push(`**Frameworks**: ${S.frameworks.join(", ")}
450
+ `),S.packageManager&&d.push(`**Package Manager**: ${S.packageManager}
451
+ `),S.sourceDir&&d.push(`**Source Dir**: ${S.sourceDir}
452
+ `),S.testDir&&d.push(`**Test Dir**: ${S.testDir}
453
+ `),d.push(`**Files Analyzed**: ${S.fileCount}
454
+ `),d.push(`**Analysis Status**: ${S.status}${S.commitHash?` (commit: ${S.commitHash.slice(0,8)})`:""}
455
+ `),S.patterns.length>0){d.push(`
452
456
  ### Code Patterns (Follow These)
453
- `);for(let j of k.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
454
- `)}if(k.antiPatterns.length>0){d.push(`
457
+ `);for(let j of S.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
458
+ `)}if(S.antiPatterns.length>0){d.push(`
455
459
  ### Anti-Patterns (Avoid These)
456
- `);for(let j of k.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
460
+ `);for(let j of S.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
457
461
  `)}}d.push(`
458
- `)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let k=this.extractPatternSummary(D);k&&(d.push(`## CODE PATTERNS
459
- `),d.push(k),d.push(`
462
+ `)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let S=this.extractPatternSummary(D);S&&(d.push(`## CODE PATTERNS
463
+ `),d.push(S),d.push(`
460
464
  Full patterns: Read analysis/patterns.md
461
- `))}let x=n?.analysis||"";if(b&&x&&x.trim()){let k=x.match(/Stack[:\s]+([^\n]+)/i)||x.match(/Technology[:\s]+([^\n]+)/i),j=k?k[1].trim():"detected";d.push(`
465
+ `))}let v=n?.analysis||"";if(b&&v&&v.trim()){let S=v.match(/Stack[:\s]+([^\n]+)/i)||v.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
462
466
  ## STACK
463
467
  Stack: ${j}
464
468
  `),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
@@ -469,18 +473,18 @@ Stack: ${j}
469
473
  `),j.effort&&d.push(`Effort: ${j.effort}
470
474
  `),j.model&&d.push(`Model: ${j.model}
471
475
  `),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
472
- `);let ee=es(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
473
- ${ee}
476
+ `);let te=ss(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
477
+ ${te}
474
478
  \`\`\`
475
479
 
476
- `)}}let k=$g(u.skills,u.detectedDomains);if(k.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
480
+ `)}}let S=Ug(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
477
481
 
478
- `);for(let j of k){d.push(`#### Skill: ${j.name}
479
- `);let ee=es(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
480
- ${ee}
482
+ `);for(let j of S){d.push(`#### Skill: ${j.name}
483
+ `);let te=ss(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
484
+ ${te}
481
485
  \`\`\`
482
486
 
483
- `)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let k of O){let j=await this.loadModule(k);j&&(d.push(`
487
+ `)}}}let $=this.getModulesForCommand(m,p);if($.length>0)for(let S of $){let j=await this.loadModule(S);j&&(d.push(`
484
488
  `),d.push(j))}if(c?.isPlanning&&(d.push(`
485
489
  ## PLAN MODE
486
490
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
@@ -488,56 +492,63 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
488
492
  `)),c?.requiresApproval&&d.push(`
489
493
  ## APPROVAL REQUIRED
490
494
  Show changes, list affected files, ask for confirmation.
491
- `),S){let k=u?.sealedAnalysis,j=[...k?.frameworks||[],...u?.project?.conventions||[]],ee={projectPath:S,language:u?.project?.ecosystem,framework:k?.frameworks?.[0],techStack:Hi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(N=>N.name)||[],analysisLanguages:k?.languages||[],analysisFrameworks:k?.frameworks||[],analysisPackageManager:k?.packageManager};d.push(`
492
- ${yg(ee)}
493
- `)}else d.push(this.buildCriticalRules());if(u?.realContext){let k=u.realContext;if(d.push(`
495
+ `),k){let S=u?.sealedAnalysis,j=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],te={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:Bi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Ve=>Ve.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
496
+ ${vg(te)}
497
+ `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let S=u.contextDegradation;d.push(`
498
+ ### CONTEXT DEGRADATION NOTICE
499
+
500
+ `),d.push(`**Level**: ${S.level}
501
+ `),d.push(`**Unavailable**: ${S.failedTools.join(", ")}
502
+ `),d.push(`Some context tools failed. Explore the codebase manually for missing context.
503
+
504
+ `)}if(u?.realContext){let S=u.realContext;if(d.push(`
494
505
  ### CODEBASE CONTEXT
495
506
 
496
- `),d.push(`**Git State**: Branch \`${k.gitBranch}\` | ${k.gitStatus}
507
+ `),d.push(`**Git State**: Branch \`${S.gitBranch}\` | ${S.gitStatus}
497
508
 
498
- `),k.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
509
+ `),S.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
499
510
  `),d.push(`| Score | File | Why |
500
511
  `),d.push(`|-------|------|-----|
501
- `);for(let j of k.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
512
+ `);for(let j of S.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
502
513
  `);d.push(`
503
- `)}if(k.signatures.length>0){d.push(`**Code Signatures** (top files):
504
- `);for(let j of k.signatures)d.push(`\`\`\`typescript
514
+ `)}if(S.signatures.length>0){d.push(`**Code Signatures** (top files):
515
+ `);for(let j of S.signatures)d.push(`\`\`\`typescript
505
516
  // ${j.path}
506
517
  ${j.content}
507
518
  \`\`\`
508
519
  `);d.push(`
509
- `)}if(k.recentFiles.length>0){d.push("**Recently Changed**: ");let j=k.recentFiles.slice(0,5).map(ee=>`${ee.path} (${ee.lastChanged})`).join(", ");d.push(`${j}
520
+ `)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let j=S.recentFiles.slice(0,5).map(te=>`${te.path} (${te.lastChanged})`).join(", ");d.push(`${j}
510
521
 
511
- `)}}let F=t.files||[];if(F.length>0){let k=F.slice(0,5).join(", ");d.push(`
512
- ## FILES: ${F.length} available. Top: ${k}
522
+ `)}}let F=t.files||[];if(F.length>0){let S=F.slice(0,5).join(", ");d.push(`
523
+ ## FILES: ${F.length} available. Top: ${S}
513
524
  `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
514
525
 
515
- `)}else S&&d.push(`
516
- ## PROJECT: ${S}
526
+ `)}else k&&d.push(`
527
+ ## PROJECT: ${k}
517
528
  Read files before modifying.
518
529
 
519
- `);let K=this.filterRelevantState(n);if(K&&(d.push(`
530
+ `);let H=this.filterRelevantState(n);if(H&&(d.push(`
520
531
  ## PRJCT STATE (Project Management Data)
521
- `),d.push(K),d.push(`
532
+ `),d.push(H),d.push(`
522
533
  `)),u?.velocityContext&&(d.push(`
523
534
  ### VELOCITY (Historical Estimation Data)
524
535
 
525
536
  `),d.push(u.velocityContext),d.push(`
526
537
 
527
- `)),o&&Object.keys(o).some(k=>o[k])){d.push(`
538
+ `)),o&&Object.keys(o).some(S=>o[S])){d.push(`
528
539
  ## PROJECT DEFAULTS (apply automatically)
529
- `);for(let[k,j]of Object.entries(o))j&&d.push(`- ${k}: ${j}
540
+ `);for(let[S,j]of Object.entries(o))j&&d.push(`- ${S}: ${j}
530
541
  `)}if(i?.plan&&i.plan.length>0){if(d.push(`
531
542
  ## THINK FIRST (reasoning from analysis)
532
543
  `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
533
- `);for(let k of i.conclusions)d.push(` \u2192 ${k}
544
+ `);for(let S of i.conclusions)d.push(` \u2192 ${S}
534
545
  `)}d.push(`Plan:
535
- `);for(let k=0;k<i.plan.length;k++)d.push(` ${k+1}. ${i.plan[k]}
546
+ `);for(let S=0;S<i.plan.length;S++)d.push(` ${S+1}. ${i.plan[S]}
536
547
  `);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
537
548
  `)}if(a&&a.length>0){d.push(`
538
549
  ## CONTEXT (apply these)
539
- `);for(let k of a)d.push(`- **${k.title}**: ${k.content}
540
- `),k.tags&&k.tags.length>0&&d.push(` Tags: ${k.tags.join(", ")}
550
+ `);for(let S of a)d.push(`- **${S.title}**: ${S.content}
551
+ `),S.tags&&S.tags.length>0&&d.push(` Tags: ${S.tags.join(", ")}
541
552
  `)}if(d.push(`
542
553
  ---
543
554
  `),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
@@ -545,34 +556,34 @@ Read files before modifying.
545
556
 
546
557
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
547
558
  `),d.push(`|---|--------|-------------|--------|
548
- `);for(let j of u.subtasks){let ee=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${ee} |
549
- `)}let k=u.subtasks.find(j=>j.status==="in_progress");if(k&&(d.push(`
550
- **FOCUS ON SUBTASK #${k.order}**: ${k.description}
551
- `),d.push(`Agent: ${k.agent} | Domain: ${k.domain}
552
- `),k.dependsOn.length>0&&d.push(`Dependencies: ${k.dependsOn.join(", ")}
553
- `),k.handoff)){let j=k.handoff;d.push(`
559
+ `);for(let j of u.subtasks){let te=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${te} |
560
+ `)}let S=u.subtasks.find(j=>j.status==="in_progress");if(S&&(d.push(`
561
+ **FOCUS ON SUBTASK #${S.order}**: ${S.description}
562
+ `),d.push(`Agent: ${S.agent} | Domain: ${S.domain}
563
+ `),S.dependsOn.length>0&&d.push(`Dependencies: ${S.dependsOn.join(", ")}
564
+ `),S.handoff)){let j=S.handoff;d.push(`
554
565
  ### Previous Subtask Handoff
555
566
 
556
567
  `),d.push(`**From:** ${j.fromSubtask}
557
568
 
558
569
  `),d.push(`**What was done:**
559
- `);for(let ee of j.whatWasDone)d.push(`- ${ee}
570
+ `);for(let te of j.whatWasDone)d.push(`- ${te}
560
571
  `);if(j.filesChanged.length>0){d.push(`
561
572
  **Files changed:**
562
- `);for(let ee of j.filesChanged)d.push(`- \`${ee.path}\` (${ee.action})
573
+ `);for(let te of j.filesChanged)d.push(`- \`${te.path}\` (${te.action})
563
574
  `)}d.push(`
564
575
  **Context for this subtask:**
565
576
  ${j.outputForNextAgent}
566
577
  `)}d.push(`
567
- `)}let oe=this.getSchemaTypeForCommand(m);if(oe){let{renderSchemaForPrompt:k}=await Promise.resolve().then(()=>(Oo(),Qd)),j=k(oe);j&&d.push(`
578
+ `)}let ee=this.getSchemaTypeForCommand(m);if(ee){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(Lo(),np)),j=S(ee);j&&d.push(`
568
579
  ${j}
569
- `)}if(p.checklist){let k=await this.loadChecklistRouting(),j=await this.loadChecklists();k&&Object.keys(j).length>0&&(d.push(`
580
+ `)}if(p.checklist){let S=await this.loadChecklistRouting(),j=await this.loadChecklists();S&&Object.keys(j).length>0&&(d.push(`
570
581
  ## QUALITY CHECKLISTS
571
582
  `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
572
583
  `),d.push(`Available: ${Object.keys(j).join(", ")}
573
584
  `),d.push(`Path: templates/checklists/{name}.md
574
585
  `),d.push(`Use Read tool to load checklists you determine are relevant.
575
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Ui({totalPrompt:t.stateData}),s=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=s.includes(i)?500:250,u=n.addSection(`### ${i}
586
+ `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Vi({totalPrompt:t.stateData}),r=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=r.includes(i)?500:250,u=n.addSection(`### ${i}
576
587
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
577
588
 
578
589
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -586,10 +597,10 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
586
597
 
587
598
  `),n.join("")}extractPatternSummary(e){if(!e)return null;let t=[],n=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(n){let a=n[0].split(`
588
599
  `).filter(c=>c.includes(":")||c.startsWith("-")).slice(0,6).join(`
589
- `);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
600
+ `);a&&t.push(a)}let r=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(r){let a=r[0].substring(0,300);t.push(`
590
601
  Avoid:
591
602
  ${a}`)}let o=t.join(`
592
- `);return es(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
603
+ `);return ss(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
593
604
  ## RULES (CRITICAL)
594
605
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
595
606
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -606,7 +617,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
606
617
  - Prefer structured output (JSON) over free text when applicable.
607
618
 
608
619
  EXECUTE: Follow flow. Use tools. Decide.
609
- `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},Jv=new _l,Fg=Jv});import Ng from"node:fs/promises";import At from"node:path";var qv,Kv,Nl,Ll,zi,Hl=y(()=>{"use strict";Ve();Ce();_();qv=["task","done","ship","resume","bug","enrich"],Kv=["init","sync","pause","next","dash","history","undo","redo"],Nl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return At.dirname(hr.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=A.getGlobalProjectPath(s),a=await(Be(),xt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=At.join(u,"templates")}catch{c=At.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:At.join(c,"agentic","orchestrator.md"),agentRouting:At.join(c,"agentic","agent-routing.md"),taskFragmentation:At.join(c,"agentic","task-fragmentation.md"),commandTemplate:At.join(c,"commands",`${e}.md`),repoAnalysis:At.join(o,"analysis","repo-analysis.json"),agentsDir:At.join(o,"agents"),skillsDir:a.skillsDir,stateJson:At.join(o,"storage","state.json")}}}requiresOrchestration(e){return qv.includes(e)?!0:!Kv.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=At.join(A.getGlobalProjectPath(t),"agents");return(await Ng.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return v(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=At.join(A.getGlobalProjectPath(t),"agents");return(await Ng.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
620
+ `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},sv=new Wl,zg=sv});import Bg from"node:fs/promises";import Rt from"node:path";var rv,ov,Bl,Vl,qi,Jl=y(()=>{"use strict";qe();Se();N();rv=["task","done","ship","resume","bug","enrich"],ov=["init","sync","pause","next","dash","history","undo","redo"],Bl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Rt.dirname(yr.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let r=await this.getProjectId(n),o=I.getGlobalProjectPath(r),a=await(Je(),xt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Rt.join(u,"templates")}catch{c=Rt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:r,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await I.getAgentSettingsPath(),paths:{orchestrator:Rt.join(c,"agentic","orchestrator.md"),agentRouting:Rt.join(c,"agentic","agent-routing.md"),taskFragmentation:Rt.join(c,"agentic","task-fragmentation.md"),commandTemplate:Rt.join(c,"commands",`${e}.md`),repoAnalysis:Rt.join(o,"analysis","repo-analysis.json"),agentsDir:Rt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:Rt.join(o,"storage","state.json")}}}requiresOrchestration(e){return rv.includes(e)?!0:!ov.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Bg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Bg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
610
621
  ## Agentic Execution Mode
611
622
 
612
623
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -689,13 +700,13 @@ When fragmenting tasks:
689
700
  2. Track progress: currentSubtaskIndex, subtaskProgress
690
701
  3. Each completed subtask generates a summary
691
702
  4. Pass summary to next agent for context handoff
692
- `,context:e,requiresOrchestration:t}}},Ll=new Nl,zi=Ll});import{exec as Yv}from"node:child_process";import Lg from"node:fs/promises";import{promisify as Xv}from"node:util";var Qv,ns,Ke,Ul=y(()=>{"use strict";ci();Qv=Xv(Yv),ns={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};ns.register("Read",async r=>{try{return await Ur.execute(async()=>await Lg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ai(e)||Hr(e),null}});ns.register("Write",async(r,e)=>{try{return await Ur.execute(async()=>await Lg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ai(t)||Hr(t),!1}});ns.register("Bash",async r=>{try{return await Ur.execute(async()=>await Qv(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});ns.register("GetTimestamp",async()=>new Date().toISOString());ns.register("GetDate",async()=>new Date().toISOString().split("T")[0]);ns.register("GetDateTime",async()=>new Date().toISOString());Ke=ns});import Gl from"node:fs/promises";import Zv from"node:os";import Hg from"node:path";async function ex(r){try{let e=Hg.dirname(Wi);await P(e)||await Gl.mkdir(e,{recursive:!0}),await Gl.writeFile(Wi,`/p:${r}`)}catch{}}async function tx(){try{await P(Wi)&&await Gl.unlink(Wi)}catch{}}var Wi,zl,nx,Bi,Wl=y(()=>{"use strict";_();$m();xe();Fm();Nm();hl();Xm();Qm();Rs();Dl();hg();_g();Hl();qn();Ul();Wi=Hg.join(Zv.homedir(),".prjct-cli",".running");l(ex,"signalStart");l(tx,"signalEnd");zl=class{static{l(this,"CommandExecutor")}async signalStart(e){await ex(e)}async signalEnd(){await tx()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Hs.shouldEscalate(e,s)){let o=Hs.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Rc.load(e),i=await ft.build(n,t),a=_e.requiresPlanning(e),c=_e.isDestructive(e),u=_e.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=_e.startPlanning(i.projectId,e,t):u&&(d=_e.getActivePlan(i.projectId));let m=null;if(Ri.requiresVerification(e)){let k=await ft.loadStateForCommand(i,e);m=await Ri.verify(e,i,k),!m.verified&&m.warnings.length>0&&console.log(Ri.formatWarnings(m))}let p=null;if(Di.requiresReasoning(e)){let k=await ft.loadStateForCommand(i,e);p=await Di.reason(e,i,k),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Di.formatPlan(p)))}let g=t.task||t.description||"",f=await zi.buildContext(e,g,n),S=zi.buildAgenticPrompt(f),b=null;if(zi.requiresOrchestration(e)&&g)try{b=await Ni.execute(e,g,n),b.detectedDomains.length>0&&ji.orchestrate(b.detectedDomains);for(let k of b.agents){let j=k.domain||k.name.replace(".md","");ji.startAgent(k.name,j,`Loading ${j} specialist...`),ji.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let k=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Om(k)}}catch(k){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(k)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},x=await ft.loadState(i),O=null,F=null;i.projectId&&(O={commit_footer:await Te.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Te.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Te.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Te.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Te.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let K={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},oe=await Fg.build(o,D,x,null,O,null,F,K,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Hs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:x,prompt:oe,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:S.prompt,requiresOrchestration:S.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:F,orchestratorContext:b,memory:{create:l(k=>Te.createMemory(i.projectId,k),"create"),autoRemember:l((k,j,ee)=>Te.autoRemember(i.projectId,k,j,ee),"autoRemember"),search:l(k=>Te.searchMemories(i.projectId,k),"search"),findByTags:l(k=>Te.findByTags(i.projectId,k),"findByTags"),getStats:l(()=>Te.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(k=>_e.recordGatheredInfo(i.projectId,k),"recordInfo"),setAnalysis:l(k=>_e.setAnalysis(i.projectId,k),"setAnalysis"),propose:l(k=>_e.proposePlan(i.projectId,k),"propose"),approve:l(k=>_e.approvePlan(i.projectId,k),"approve"),reject:l(k=>_e.rejectPlan(i.projectId,k),"reject"),getApprovalPrompt:l(()=>_e.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>_e.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>_e.getNextStep(i.projectId),"getNextStep"),completeStep:l(k=>_e.completeStep(i.projectId,k),"completeStep"),failStep:l(k=>_e.failStep(i.projectId,k),"failStep"),abort:l(k=>_e.abortPlan(i.projectId,k),"abort"),getStatus:l(()=>_e.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Hs.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Hs.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Ke.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ke.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Rc.load(e)).frontmatter["allowed-tools"]||[],i=await ft.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:w(s)}}}},nx=new zl,Bi=nx});import Vi from"node:fs/promises";import sx from"node:https";import rx from"node:os";import Bl from"node:path";import Bt from"chalk";var Vl,Ug,Gg=y(()=>{"use strict";_();xe();Vl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Bl.join(rx.homedir(),".prjct-cli","config"),this.cacheFile=Bl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Bl.join(__dirname,"..","..","package.json");return JSON.parse(await Vi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=sx.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await P(this.cacheFile))return JSON.parse(await Vi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await P(this.cacheDir)||await Vi.mkdir(this.cacheDir,{recursive:!0}),await Vi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
693
- `+Bt.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")+`
694
- `+Bt.yellow("\u2502")+" "+Bt.bold("Update available!")+" "+Bt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Bt.yellow("\u2502")+`
695
- `+Bt.yellow("\u2502")+" "+Bt.yellow("\u2502")+`
696
- `+Bt.yellow("\u2502")+" Run: "+Bt.cyan("npm update -g prjct-cli")+" "+Bt.yellow("\u2502")+`
697
- `+Bt.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")+`
698
- `}},Ug=Vl});var ke,rt=y(()=>{"use strict";Wl();hl();Ul();Ve();Ce();Gg();Dn();le();xe();Nt();ke=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Ug,this.updateNotificationShown=!1,this.commandExecutor=Bi}get agent(){return Os.getAgent()}get agentInfo(){return Os.getInfo()}get currentAuthor(){return jn.getCurrentAuthor()}async initializeAgent(){return Os.initialize()}async ensureProjectInit(e){return jn.ensureInit(e)}async ensureAuthor(){return jn.ensureAuthor()}async getGlobalProjectPath(e){return jn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return mt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return jn.isEmptyDirectory(e)}async _detectExistingCode(e){return jn.hasExistingCode(e)}_breakdownFeatureTasks(e){return mi.breakdownFeature(e)}_detectBugSeverity(e){return mi.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Os.assignForTask(e,t,n)}}});var zg={};ge(zg,{PlanningCommands:()=>rs});import ss from"node:path";async function ox(){if(!Jl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(qi(),Wg));Jl=new r}return Jl}var Jl,rs,Ji=y(()=>{"use strict";Do();xn();Ot();Ut();_();_s();Ns();ml();rt();Jl=null;l(ox,"getAnalysisCommands");rs=class extends ke{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Ls(t).runNonInteractive());else if(a=await new Ls(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await bs(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m),g={"core/now.md":`# NOW
703
+ `,context:e,requiresOrchestration:t}}},Vl=new Bl,qi=Vl});import{exec as iv}from"node:child_process";import Vg from"node:fs/promises";import{promisify as av}from"node:util";var cv,os,Xe,ql=y(()=>{"use strict";pi();cv=av(iv),os={tools:new Map,register(s,e){this.tools.set(s,e)},get(s){return this.tools.get(s)},isAllowed(s,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?s.startsWith(t.slice(0,-1)):s===t)},list(){return Array.from(this.tools.keys())}};os.register("Read",async s=>{try{return await Gr.execute(async()=>await Vg.readFile(s,"utf-8"),`read-${s}`)}catch(e){return di(e)||Hr(e),null}});os.register("Write",async(s,e)=>{try{return await Gr.execute(async()=>await Vg.writeFile(s,e,"utf-8"),`write-${s}`),!0}catch(t){return di(t)||Hr(t),!1}});os.register("Bash",async s=>{try{return await Gr.execute(async()=>await cv(s),`bash-${s}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});os.register("GetTimestamp",async()=>new Date().toISOString());os.register("GetDate",async()=>new Date().toISOString().split("T")[0]);os.register("GetDateTime",async()=>new Date().toISOString());Xe=os});import Kl from"node:fs/promises";import lv from"node:os";import Jg from"node:path";async function uv(s){try{let e=Jg.dirname(Ki);await x(e)||await Kl.mkdir(e,{recursive:!0}),await Kl.writeFile(Ki,`/p:${s}`)}catch{}}async function dv(){try{await x(Ki)&&await Kl.unlink(Ki)}catch{}}var Ki,Yl,pv,Yi,Xl=y(()=>{"use strict";N();Um();ve();zm();Bm();vl();rg();og();Ms();Nl();Pg();Wg();Jl();In();ql();Ki=Jg.join(lv.homedir(),".prjct-cli",".running");l(uv,"signalStart");l(dv,"signalEnd");Yl=class{static{l(this,"CommandExecutor")}async signalStart(e){await uv(e)}async signalEnd(){await dv()}async execute(e,t,n){await this.signalStart(e);let r=t.task||t.description||"";if(Hs.shouldEscalate(e,r)){let o=Hs.getEscalationInfo(e,r);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Hc.load(e),i=await ft.build(n,t),a=_e.requiresPlanning(e),c=_e.isDestructive(e),u=_e.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=_e.startPlanning(i.projectId,e,t):u&&(d=_e.getActivePlan(i.projectId));let m=null;if(Fi.requiresVerification(e)){let S=await ft.loadStateForCommand(i,e);m=await Fi.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Fi.formatWarnings(m))}let p=null;if(Oi.requiresReasoning(e)){let S=await ft.loadStateForCommand(i,e);p=await Oi.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Oi.formatPlan(p)))}let g=t.task||t.description||"",f=await qi.buildContext(e,g,n),k=qi.buildAgenticPrompt(f),b=null;if(qi.requiresOrchestration(e)&&g)try{b=await zi.execute(e,g,n),b.detectedDomains.length>0&&Mi.orchestrate(b.detectedDomains);for(let S of b.agents){let j=S.domain||S.name.replace(".md","");Mi.startAgent(S.name,j,`Loading ${j} specialist...`),Mi.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let S=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Gm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(S)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},v=await ft.loadState(i),$=null,F=null;i.projectId&&($={commit_footer:await Te.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Te.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Te.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Te.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Te.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let H={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ee=await zg.build(o,D,v,null,$,null,F,H,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Hs.recordSuccess(e,r),await this.signalEnd(),{success:!0,template:o,context:D,state:v,prompt:ee,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:$,relevantMemories:F,orchestratorContext:b,memory:{create:l(S=>Te.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,te)=>Te.autoRemember(i.projectId,S,j,te),"autoRemember"),search:l(S=>Te.searchMemories(i.projectId,S),"search"),findByTags:l(S=>Te.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>Te.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>_e.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>_e.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>_e.proposePlan(i.projectId,S),"propose"),approve:l(S=>_e.approvePlan(i.projectId,S),"approve"),reject:l(S=>_e.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>_e.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>_e.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>_e.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>_e.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>_e.failStep(i.projectId,S),"failStep"),abort:l(S=>_e.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>_e.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Hs.recordAttempt(e,r,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Hs.getEscalationInfo(e,r);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Xe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let r=Xe.get(e);if(!r)throw new Error(`Tool ${e} not found`);return await r(...t)}async executeSimple(e,t,n){try{let o=(await Hc.load(e)).frontmatter["allowed-tools"]||[],i=await ft.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(r){return{success:!1,error:w(r)}}}},pv=new Yl,Yi=pv});import Xi from"node:fs/promises";import mv from"node:https";import gv from"node:os";import Ql from"node:path";import Jt from"chalk";var Zl,qg,Kg=y(()=>{"use strict";N();ve();Zl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Ql.join(gv.homedir(),".prjct-cli","config"),this.cacheFile=Ql.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Ql.join(__dirname,"..","..","package.json");return JSON.parse(await Xi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},r=mv.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await x(this.cacheFile))return JSON.parse(await Xi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await x(this.cacheDir)||await Xi.mkdir(this.cacheDir,{recursive:!0}),await Xi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let r=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
704
+ `+Jt.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")+`
705
+ `+Jt.yellow("\u2502")+" "+Jt.bold("Update available!")+" "+Jt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Jt.yellow("\u2502")+`
706
+ `+Jt.yellow("\u2502")+" "+Jt.yellow("\u2502")+`
707
+ `+Jt.yellow("\u2502")+" Run: "+Jt.cyan("npm update -g prjct-cli")+" "+Jt.yellow("\u2502")+`
708
+ `+Jt.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")+`
709
+ `}},qg=Zl});var be,ot=y(()=>{"use strict";Xl();vl();ql();qe();Se();Kg();On();le();ve();Gt();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new qg,this.updateNotificationShown=!1,this.commandExecutor=Yi}get agent(){return Fs.getAgent()}get agentInfo(){return Fs.getInfo()}get currentAuthor(){return Mn.getCurrentAuthor()}async initializeAgent(){return Fs.initialize()}async ensureProjectInit(e){return Mn.ensureInit(e)}async ensureAuthor(){return Mn.ensureAuthor()}async getGlobalProjectPath(e){return Mn.getGlobalPath(e)}async logToMemory(e,t,n){let r=await this.ensureAuthor();return mt.log(e,t,n,r.name)}async _detectEmptyDirectory(e){return Mn.isEmptyDirectory(e)}async _detectExistingCode(e){return Mn.hasExistingCode(e)}_breakdownFeatureTasks(e){return yi.breakdownFeature(e)}_detectBugSeverity(e){return yi.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Fs.assignForTask(e,t,n)}}});var Yg={};he(Yg,{PlanningCommands:()=>as});import is from"node:path";async function fv(){if(!eu){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(Zi(),Xg));eu=new s}return eu}var eu,as,Qi=y(()=>{"use strict";Oo();An();Lt();Bt();N();Ns();Ls();bl();ot();eu=null;l(fv,"getAnalysisCommands");as=class extends be{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Us(t).runNonInteractive());else if(a=await new Us(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await Ps(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await I.ensureProjectStructure(m);let p=I.getGlobalProjectPath(m),g={"core/now.md":`# NOW
699
710
 
700
711
  No current task. Use \`/p:now\` to set focus.
701
712
  `,"core/next.md":`# NEXT
@@ -715,7 +726,7 @@ No current task. Use \`/p:now\` to set focus.
715
726
  `,"planning/roadmap.md":`# ROADMAP
716
727
 
717
728
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
718
- `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[D,x]of Object.entries(g))await Ke.get("Write")(ss.join(p,D),x);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let D=await ox();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!S){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=ss.join(p,"planning","architect-session.md"),x=`# Architect Session
729
+ `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[D,v]of Object.entries(g))await Xe.get("Write")(is.join(p,D),v);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let D=await fv();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!k){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=is.join(p,"planning","architect-session.md"),v=`# Architect Session
719
730
 
720
731
  ## Idea
721
732
  ${b}
@@ -724,8 +735,8 @@ ${b}
724
735
  Initialized - awaiting stack recommendation
725
736
 
726
737
  Generated: ${new Date().toLocaleString()}
727
- `;return await Ke.get("Write")(D,x),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=Se(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Pe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:B.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await ft.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await Pe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Bug Reported",e),zt({Severity:a,Priority:m,Agent:u}),Qe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
728
- `);let s=await this.getGlobalProjectPath(t),o=ss.join(s,"planning","architect-session.md"),i;try{i=await ce.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
738
+ `;return await Xe.get("Write")(D,v),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ge(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await xe.addTasks(r,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:B.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await ft.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await xe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:B.getTimestamp()}),n.md?console.log(Ie(rt("Bug Reported",e),jt({Severity:a,Priority:m,Agent:u}),et([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),Ct("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(r){return n.md||h.fail(w(r)),{success:!1,error:w(r)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
739
+ `);let r=await this.getGlobalProjectPath(t),o=is.join(r,"planning","architect-session.md"),i;try{i=await ce.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
729
740
 
730
741
  Create a plan first:
731
742
  1. Run /p:init in an empty directory
@@ -746,7 +757,7 @@ The architect plan is ready. Claude will now:
746
757
  4. Create starter files with boilerplate
747
758
  `),console.log(`
748
759
  \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.
749
- `),await this.logToMemory(t,"architect_executed",{timestamp:B.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=ss.join(c,"planning","architect-session.md"),d=`# Architect Session
760
+ `),await this.logToMemory(t,"architect_executed",{timestamp:B.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=I.getGlobalProjectPath(o),u=is.join(c,"planning","architect-session.md"),d=`# Architect Session
750
761
 
751
762
  ## Idea
752
763
  ${e}
@@ -761,14 +772,14 @@ Initialized - awaiting architecture design
761
772
  4. Generate roadmap
762
773
 
763
774
  Generated: ${new Date().toLocaleString()}
764
- `;return await Ke.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),zt({Mode:"architecture"}),Qe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
775
+ `;return await Xe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(rt("Idea Captured",e),jt({Mode:"architecture"}),et([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
765
776
  \u{1F4A1} Use /p:architect execute to continue planning
766
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ye.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),zt({Mode:"capture"}),Qe([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=A.getGlobalProjectPath(s),m=ss.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(S=>S.endsWith(".md")&&S!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
777
+ `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Qe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(rt("Idea Captured",e),jt({Mode:"capture"}),et([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),Ct("idea")),{success:!0,mode:"capture",idea:e}}catch(r){return n.md||h.fail(w(r)),{success:!1,error:w(r)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=I.getGlobalProjectPath(r),m=is.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
767
778
  \u{1F4A1} Create one with /p:spec "feature name"
768
779
  `),{success:!0,specs:[]}):(console.log(`
769
780
  \u{1F4CB} SPECIFICATIONS
770
- `),console.log("\u2550".repeat(50)),f.forEach((S,b)=>{let D=S.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
771
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=A.getGlobalProjectPath(s),i=ss.join(o,"planning","specs");await ce.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=ss.join(i,`${a}.md`),u=`# Specification: ${e}
781
+ `),console.log("\u2550".repeat(50)),f.forEach((k,b)=>{let D=k.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
782
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=I.getGlobalProjectPath(r),i=is.join(o,"planning","specs");await ce.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=is.join(i,`${a}.md`),u=`# Specification: ${e}
772
783
 
773
784
  ## Overview
774
785
  [Brief description of the feature]
@@ -798,49 +809,63 @@ Generated: ${new Date().toLocaleString()}
798
809
  ---
799
810
  Created: ${new Date().toLocaleString()}
800
811
  Status: Draft
801
- `;return await Ke.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:B.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
802
- \u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
803
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var Ki,jn,Bg=y(()=>{"use strict";cn();Do();Ve();Ce();_();xe();Nt();Ki=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ji(),zg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw xo.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await A.ensureProjectStructure(t),A.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await bs();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 hs(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return v(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await hs(e)).some(s=>t.includes(s))}catch(t){return v(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},jn=new Ki});import{exec as ix}from"node:child_process";import{promisify as ax}from"node:util";var ql,cx,Yi,so,Vg=y(()=>{"use strict";he();_();Zo();ql=ax(ix),cx={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Yi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...cx,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=$.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await ql("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([ql(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),ql(`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(`
804
- `).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
805
- `)}async getSessionInfo(e){return vn.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
806
- `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
807
- `)}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}},so=l((r,e)=>new Yi(r,e),"createStalenessChecker")});import Jg from"node:fs/promises";import Xi from"node:path";function ro(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 px(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ro(p));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ro(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ro(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...ro(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ro(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!ux.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function qg(r,e){let t=[],n=await Jg.readdir(r,{withFileTypes:!0});for(let s of n){if(dx.has(s.name))continue;let o=Xi.join(r,s.name);if(s.isDirectory())t.push(...await qg(o,e));else if(s.isFile()){let i=Xi.extname(s.name).toLowerCase();lx.has(i)&&t.push(Xi.relative(e,o))}}return t}async function mx(r){let e=await qg(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await Jg.readFile(Xi.join(r,d),"utf-8"),p=px(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function fx(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};V.setDoc(r,gx,t)}async function Kg(r,e){let t=await mx(r);return fx(e,t),t}var lx,ux,dx,gx,Yg=y(()=>{"use strict";he();lx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ux=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"]),dx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ro,"splitIdentifier");l(px,"tokenizeFile");l(qg,"listFiles");l(mx,"buildIndex");gx="bm25-index";l(fx,"saveIndex");l(Kg,"indexProject")});import Kl from"node:fs/promises";import dn from"node:path";function kx(r){let e=[],t,n=new RegExp(Sx.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function bx(r,e,t){let n;if(r.startsWith("@/"))n=dn.join(t,"src",r.slice(2));else{let s=dn.dirname(dn.join(t,e));n=dn.resolve(s,r)}for(let s of wx){let o=n+s;try{if((await Kl.stat(o)).isFile())return dn.relative(t,o)}catch{}}return null}async function Xg(r,e){let t=[],n=await Kl.readdir(r,{withFileTypes:!0});for(let s of n){if(yx.has(s.name))continue;let o=dn.join(r,s.name);if(s.isDirectory())t.push(...await Xg(o,e));else if(s.isFile()){let i=dn.extname(s.name).toLowerCase();hx.has(i)&&t.push(dn.relative(e,o))}}return t}async function Cx(r){let e=await Xg(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await Kl.readFile(dn.join(r,u),"utf-8"),m=kx(d),p=[];for(let g of m){let f=await bx(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function vx(r,e){V.setDoc(r,Qg,e)}function Zg(r){return V.getDoc(r,Qg)}async function ef(r,e){let t=await Cx(r);return vx(e,t),t}var hx,yx,wx,Sx,Qg,Yl=y(()=>{"use strict";he();hx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),yx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),wx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Sx=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(kx,"extractImportSources");l(bx,"resolveImport");l(Xg,"listFiles");l(Cx,"buildGraph");Qg="import-graph";l(vx,"saveGraph");l(Zg,"loadGraph");l(ef,"indexImports")});function tf(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Zg(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function nf(r){let e=new Set;for(let t of r){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var sf=y(()=>{"use strict";Yl();l(tf,"propagateChanges");l(nf,"affectedDomains")});import Xl from"node:fs/promises";import Qi from"node:path";async function rf(r,e){let t=[],n=await Xl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Px.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Qi.join(r,o);if(s.isDirectory())t.push(...await rf(i,e));else if(s.isFile()){let a=Qi.extname(o).toLowerCase();xx.has(a)&&t.push(Qi.relative(e,i))}}return t}function Tx(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 Ex(r){let e=await rf(r,r),t=new Map,n=100;for(let s=0;s<e.length;s+=n){let o=e.slice(s,s+n),i=await Promise.all(o.map(async a=>{try{let c=Qi.join(r,a),[u,d]=await Promise.all([Xl.readFile(c,"utf-8"),Xl.stat(c)]);return{path:a,hash:Tx(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function Ix(r,e){let t=[],n=[],s=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?n.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:s}}function Ql(r,e){let t=V.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),V.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Ax(r){let e=new Map;try{let t=V.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Zl(r,e){let[t,n]=await Promise.all([Ex(r),Promise.resolve(Ax(e))]);return{diff:Ix(t,n),currentHashes:t}}function of(r){return V.hasDoc(r,"file-hashes-meta")}var xx,Px,af=y(()=>{"use strict";he();xx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Px=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(rf,"listProjectFiles");l(Tx,"hashContent");l(Ex,"computeHashes");l(Ix,"diffHashes");l(Ql,"saveHashes");l(Ax,"loadHashes");l(Zl,"detectChanges");l(of,"hasHashRegistry")});import{exec as jx}from"node:child_process";import{promisify as Dx}from"node:util";async function Mx(r,e=100){try{let{stdout:t}=await Rx(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
808
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=lf&&n.push(s),s=new Set):i&&s&&Ox(i)&&s.add(i)}return s&&s.size>0&&s.size<=lf&&n.push(s),n}catch{return[]}}function Ox(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 Fx(r,e=100){let t=await Mx(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=_x(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<cf||m<cf)continue;let p=d+m-a,g=p>0?a/p:0;g<$x||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function _x(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Lx(r,e){V.setDoc(r,Nx,e)}async function uf(r,e,t=100){let n=await Fx(r,t);return Lx(e,n),n}var Rx,$x,cf,lf,Nx,df=y(()=>{"use strict";he();Rx=Dx(jx),$x=.1,cf=2,lf=30;l(Mx,"parseGitLog");l(Ox,"isSourceFile");l(Fx,"buildMatrix");l(_x,"pairKey");Nx="cochange-index";l(Lx,"saveMatrix");l(uf,"indexCoChanges")});function jt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function os(){let r={file:"unknown",type:"detected"};return{name:{...r},version:{...r},ecosystem:{...r},languages:{...r},frameworks:{...r},commands:{...r},projectType:{...r},git:{file:"git",type:"detected"}}}var eu=y(()=>{"use strict";l(jt,"cite");l(os,"defaultSources")});function Hx(r,e){let t=r.sources||os();return`# ${r.name} - Project Rules
809
- <!-- projectId: ${r.projectId} -->
812
+ `;return await Xe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:B.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
813
+ \u{1F4DD} Edit: ~/.prjct-cli/projects/${r}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
814
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var ea,Mn,Qg=y(()=>{"use strict";ln();Oo();qe();Se();N();ve();Gt();ea=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Qi(),Yg)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw Io.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await I.ensureProjectStructure(t),I.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Ps();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 ks(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="README.md").length===0}catch(t){return P(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ks(e)).some(r=>t.includes(r))}catch(t){return P(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},Mn=new ea});import{exec as hv}from"node:child_process";import{promisify as yv}from"node:util";var tu,wv,ta,so,Zg=y(()=>{"use strict";ye();N();si();tu=yv(hv),wv={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ta=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...wv,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=M.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let r=n.lastSync;try{let{stdout:c}=await tu("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([tu(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),tu(`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(`
815
+ `).filter(Boolean):[],r){let c=new Date(r),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let r=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let r of e.significantChanges.slice(0,5))t.push(` \u2022 ${r}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
816
+ `)}async getSessionInfo(e){return Tn.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
817
+ `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let r=new Set,o=[];for(let i of e.commands)r.has(i)||(r.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let r=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
818
+ `)}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}},so=l((s,e)=>new ta(s,e),"createStalenessChecker")});import ef from"node:fs/promises";import na from"node:path";function ro(s){return s.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Cv(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ro(p));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of r){let g;for(;(g=p.exec(s))!==null;)g[1]&&t.push(...ro(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(s))!==null;)g[1]&&t.push(...ro(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...ro(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ro(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(s))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(s))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!Sv.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function tf(s,e){let t=[],n=await ef.readdir(s,{withFileTypes:!0});for(let r of n){if(bv.has(r.name))continue;let o=na.join(s,r.name);if(r.isDirectory())t.push(...await tf(o,e));else if(r.isFile()){let i=na.extname(r.name).toLowerCase();kv.has(i)&&t.push(na.relative(e,o))}}return t}async function Pv(s){let e=await tf(s,s),t={},n={},r=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await ef.readFile(na.join(s,d),"utf-8"),p=Cv(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},r+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function xv(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};q.setDoc(s,vv,t)}async function nf(s,e){let t=await Pv(s);return xv(e,t),t}var kv,Sv,bv,vv,sf=y(()=>{"use strict";ye();kv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Sv=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"]),bv=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ro,"splitIdentifier");l(Cv,"tokenizeFile");l(tf,"listFiles");l(Pv,"buildIndex");vv="bm25-index";l(xv,"saveIndex");l(nf,"indexProject")});import nu from"node:fs/promises";import mn from"node:path";function jv(s){let e=[],t,n=new RegExp(Av.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function Dv(s,e,t){let n;if(s.startsWith("@/"))n=mn.join(t,"src",s.slice(2));else{let r=mn.dirname(mn.join(t,e));n=mn.resolve(r,s)}for(let r of Iv){let o=n+r;try{if((await nu.stat(o)).isFile())return mn.relative(t,o)}catch{}}return null}async function rf(s,e){let t=[],n=await nu.readdir(s,{withFileTypes:!0});for(let r of n){if(Ev.has(r.name))continue;let o=mn.join(s,r.name);if(r.isDirectory())t.push(...await rf(o,e));else if(r.isFile()){let i=mn.extname(r.name).toLowerCase();Tv.has(i)&&t.push(mn.relative(e,o))}}return t}async function Rv(s){let e=await rf(s,s),t={},n={},r=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await nu.readFile(mn.join(s,u),"utf-8"),m=jv(d),p=[];for(let g of m){let f=await Dv(g,u,s);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,r+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function $v(s,e){q.setDoc(s,of,e)}function af(s){return q.getDoc(s,of)}async function cf(s,e){let t=await Rv(s);return $v(e,t),t}var Tv,Ev,Iv,Av,of,su=y(()=>{"use strict";ye();Tv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Ev=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Iv=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Av=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(jv,"extractImportSources");l(Dv,"resolveImport");l(rf,"listFiles");l(Rv,"buildGraph");of="import-graph";l($v,"saveGraph");l(af,"loadGraph");l(cf,"indexImports")});function lf(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=af(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:s.deleted,allAffected:a}}function uf(s){let e=new Set;for(let t of s){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var df=y(()=>{"use strict";su();l(lf,"propagateChanges");l(uf,"affectedDomains")});import ru from"node:fs/promises";import sa from"node:path";async function pf(s,e){let t=[],n=await ru.readdir(s,{withFileTypes:!0}).catch(()=>[]);for(let r of n){let o=String(r.name);if(Ov.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=sa.join(s,o);if(r.isDirectory())t.push(...await pf(i,e));else if(r.isFile()){let a=sa.extname(o).toLowerCase();Mv.has(a)&&t.push(sa.relative(e,i))}}return t}function Fv(s){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(s).toString(36)}`;let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function _v(s){let e=await pf(s,s),t=new Map,n=100;for(let r=0;r<e.length;r+=n){let o=e.slice(r,r+n),i=await Promise.all(o.map(async a=>{try{let c=sa.join(s,a),[u,d]=await Promise.all([ru.readFile(c,"utf-8"),ru.stat(c)]);return{path:a,hash:Fv(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function Nv(s,e){let t=[],n=[],r=[];for(let[i,a]of s){let c=e.get(i);c?c.hash!==a.hash?n.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())s.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:r}}function ou(s,e){let t=q.getDb(s);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)n.run(r.path,r.hash,r.size,r.mtime)})(),q.setDoc(s,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Lv(s){let e=new Map;try{let t=q.query(s,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function iu(s,e){let[t,n]=await Promise.all([_v(s),Promise.resolve(Lv(e))]);return{diff:Nv(t,n),currentHashes:t}}function mf(s){return q.hasDoc(s,"file-hashes-meta")}var Mv,Ov,gf=y(()=>{"use strict";ye();Mv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Ov=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(pf,"listProjectFiles");l(Fv,"hashContent");l(_v,"computeHashes");l(Nv,"diffHashes");l(ou,"saveHashes");l(Lv,"loadHashes");l(iu,"detectChanges");l(mf,"hasHashRegistry")});import{exec as Uv}from"node:child_process";import{promisify as Hv}from"node:util";async function Wv(s,e=100){try{let{stdout:t}=await Gv(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:s,maxBuffer:10485760}),n=[],r=null;for(let o of t.split(`
819
+ `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=hf&&n.push(r),r=new Set):i&&r&&Bv(i)&&r.add(i)}return r&&r.size>0&&r.size<=hf&&n.push(r),n}catch{return[]}}function Bv(s){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(s)&&!s.includes("node_modules/")}async function Vv(s,e=100){let t=await Wv(s,e),n=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=Jv(a[c],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<ff||m<ff)continue;let p=d+m-a,g=p>0?a/p:0;g<zv||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function Jv(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function Kv(s,e){q.setDoc(s,qv,e)}async function yf(s,e,t=100){let n=await Vv(s,t);return Kv(e,n),n}var Gv,zv,ff,hf,qv,wf=y(()=>{"use strict";ye();Gv=Hv(Uv),zv=.1,ff=2,hf=30;l(Wv,"parseGitLog");l(Bv,"isSourceFile");l(Vv,"buildMatrix");l(Jv,"pairKey");qv="cochange-index";l(Kv,"saveMatrix");l(yf,"indexCoChanges")});function $t(s){return`<!-- source: ${s.file}, ${s.type} -->`}function cs(){let s={file:"unknown",type:"detected"};return{name:{...s},version:{...s},ecosystem:{...s},languages:{...s},frameworks:{...s},commands:{...s},projectType:{...s},git:{file:"git",type:"detected"}}}var au=y(()=>{"use strict";l($t,"cite");l(cs,"defaultSources")});function oo(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
820
+ `)}function io(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
821
+ `)}function kf(s){let e=[];return s.packageManager&&e.push(`- Package Manager: \`${s.packageManager}\``),s.sourceDir&&e.push(`- Source: \`${s.sourceDir}/\``),s.testDir&&e.push(`- Tests: \`${s.testDir}/\``),e.length>0?`
822
+ ### Project Structure
823
+
824
+ ${e.join(`
825
+ `)}
826
+ `:""}function Yv(s){let e=[];return s.patterns.length>0&&e.push(`
827
+ ### Code Patterns (Follow These)
828
+
829
+ ${oo(s.patterns)}`),s.antiPatterns.length>0&&e.push(`
830
+ ### Anti-Patterns (Avoid These)
831
+
832
+ ${io(s.antiPatterns)}`),e.push(kf(s)),e.join(`
833
+ `)}function Xv(s,e){let t=s.sources||cs();return`# ${s.name} - Project Rules
834
+ <!-- projectId: ${s.projectId} -->
810
835
  <!-- Generated: ${new Date().toISOString()} -->
811
- <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
836
+ <!-- Ecosystem: ${s.ecosystem} | Type: ${s.projectType} -->
812
837
 
813
- ## THIS PROJECT (${r.ecosystem})
838
+ ## THIS PROJECT (${s.ecosystem})
814
839
 
815
- ${jt(t.ecosystem)}
816
- **Type:** ${r.projectType}
817
- **Path:** ${r.repoPath}
840
+ ${$t(t.ecosystem)}
841
+ **Type:** ${s.projectType}
842
+ **Path:** ${s.repoPath}
818
843
 
819
844
  ### Commands (USE THESE, NOT OTHERS)
820
845
 
821
- ${jt(t.commands)}
846
+ ${$t(t.commands)}
822
847
  | Action | Command |
823
848
  |--------|---------|
824
- | Install dependencies | \`${r.commands.install}\` |
825
- | Run dev server | \`${r.commands.dev}\` |
826
- | Run tests | \`${r.commands.test}\` |
827
- | Build | \`${r.commands.build}\` |
828
- | Lint | \`${r.commands.lint}\` |
829
- | Format | \`${r.commands.format}\` |
849
+ | Install dependencies | \`${s.commands.install}\` |
850
+ | Run dev server | \`${s.commands.dev}\` |
851
+ | Run tests | \`${s.commands.test}\` |
852
+ | Build | \`${s.commands.build}\` |
853
+ | Lint | \`${s.commands.lint}\` |
854
+ | Format | \`${s.commands.format}\` |
830
855
 
831
856
  ### Code Conventions
832
857
 
833
- ${jt(t.languages)}
834
- - **Languages**: ${r.languages.join(", ")||"Not detected"}
835
- ${jt(t.frameworks)}
836
- - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
837
-
858
+ ${$t(t.languages)}
859
+ - **Languages**: ${s.languages.join(", ")||"Not detected"}
860
+ ${$t(t.frameworks)}
861
+ - **Frameworks**: ${s.frameworks.join(", ")||"Not detected"}
862
+ ${s.analysis?Yv(s.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
838
863
  ---
839
864
 
840
865
  ## PRJCT RULES
841
866
 
842
867
  ### Path Resolution
843
- **ALL prjct writes go to**: \`~/.prjct-cli/projects/${r.projectId}/\`
868
+ **ALL prjct writes go to**: \`~/.prjct-cli/projects/${s.projectId}/\`
844
869
  - NEVER write to \`.prjct/\`
845
870
  - NEVER write to \`./\` for prjct data
846
871
 
@@ -860,48 +885,49 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
860
885
 
861
886
  ## PROJECT STATE
862
887
 
863
- ${jt(t.name)}
888
+ ${$t(t.name)}
864
889
  | Field | Value |
865
890
  |-------|-------|
866
- | Name | ${r.name} |
867
- | Version | ${r.version} |
868
- | Ecosystem | ${r.ecosystem} |
869
- | Branch | ${r.branch} |
870
- | Files | ~${r.fileCount} |
871
- | Commits | ${r.commits} |
891
+ | Name | ${s.name} |
892
+ | Version | ${s.version} |
893
+ | Ecosystem | ${s.ecosystem} |
894
+ | Branch | ${s.branch} |
895
+ | Files | ~${s.fileCount} |
896
+ | Commits | ${s.commits} |
872
897
 
873
898
  ---
874
899
 
875
900
  ## AGENTS
876
901
 
877
- Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
878
-
879
- **Workflow**: ${r.agents.workflow.join(", ")}
880
- **Domain**: ${r.agents.domain.join(", ")||"none"}
881
- `}function Ux(r,e){let t=r.sources||os(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(jt(t.languages)),n.push("## Tech Stack"),r.languages.length>0&&n.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- Frameworks: ${r.frameworks.join(", ")}`),n.push(""),n.push(jt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push("## Code Style"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns in this project"),n.push("- Use idiomatic constructs for the language"),n.push(""),n.push("## Best Practices"),n.push("- Write clean, readable code"),n.push("- Add comments only for complex logic"),n.push("- Keep functions small and focused"),n.push("- Handle errors appropriately"),n.push("- Write tests for new functionality"),n.join(`
882
- `)}function Gx(r,e){let t=r.sources||os(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(jt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),n.push("## Conventions"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns"),n.push("- Keep code clean and readable"),n.push(""),n.push(jt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
883
- `)}function zx(r,e){let t=r.sources||os(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push(jt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(jt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),n.push("## Rules"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing project patterns"),n.push("- Clean code, minimal comments"),n.push("- Test new functionality"),n.join(`
884
- `)}function Wx(r,e){let n={systemMessage:[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`,"",`Follow ${r.ecosystem} conventions. Match existing code patterns.`].join(`
885
- `),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(n,null,2)}function pf(r){return{claude:Hx,cursor:Ux,copilot:Gx,windsurf:zx,continue:Wx}[r]||null}var tu=y(()=>{"use strict";eu();l(Hx,"formatForClaude");l(Ux,"formatForCursor");l(Gx,"formatForCopilot");l(zx,"formatForWindsurf");l(Wx,"formatForContinue");l(pf,"getFormatter")});import{exec as Bx}from"node:child_process";import Vx from"node:os";import oo from"node:path";import{promisify as Jx}from"node:util";function mf(r){return Zi[r]||null}async function nu(r){try{return await qx(`which ${r}`),!0}catch{return!1}}async function ea(r=process.cwd()){let e=[];return await nu("claude")&&e.push("claude"),(await nu("cursor")||await P(oo.join(r,".cursor")))&&e.push("cursor"),await P(oo.join(r,".github"))&&e.push("copilot"),(await nu("windsurf")||await P(oo.join(r,".windsurf")))&&e.push("windsurf"),(await P(oo.join(r,".continue"))||await P(oo.join(Vx.homedir(),".continue")))&&e.push("continue"),e}async function gf(r,e=process.cwd()){if(r==="auto"){let t=await ea(e);return t.length>0?t:["claude"]}return r==="all"?Kx:r.filter(t=>Zi[t])}var qx,Zi,io,Kx,su=y(()=>{"use strict";xe();qx=Jx(Bx),Zi={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"}},io=["claude"],Kx=Object.keys(Zi);l(mf,"getAIToolConfig");l(nu,"commandExists");l(ea,"detectInstalledTools");l(gf,"resolveToolIds")});import ru from"node:fs/promises";import ou from"node:path";async function ff(r,e,t,n=io){let s=[];for(let o of n){let i=mf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await Yx(r,i,e,t);s.push(a)}return s}async function Yx(r,e,t,n){let s=pf(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=ou.join(n,e.outputFile):i=ou.join(t,"context",e.outputFile),await ru.mkdir(ou.dirname(i),{recursive:!0});try{let a=await ru.readFile(i,"utf-8"),c=_c(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Fc(o,a)}catch{}return await ru.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var hf=y(()=>{"use strict";_();Nc();tu();su();l(ff,"generateAIToolContexts");l(Yx,"generateForTool")});var yf=y(()=>{"use strict";tu();hf();su()});import iu from"node:fs/promises";import au from"node:path";var cu,lu,wf,Sf=y(()=>{"use strict";_();cu=".prjct-state.md",lu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=au.join(e,cu),s=this.toMarkdown(t);await iu.writeFile(n,s,"utf-8")}async remove(e){let t=au.join(e,cu);try{await iu.unlink(t)}catch(n){if(!v(n))throw n}}async exists(e){let t=au.join(e,cu);try{return await iu.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
886
- `)}},wf=new lu});import uu from"node:fs/promises";import Xx from"node:os";import kf from"node:path";function du(){return kf.join(Xx.homedir(),".prjct-cli","skills",Qx)}function Zx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ao(){try{let r=await uu.readFile(du(),"utf-8");return JSON.parse(r)}catch{return Zx()}}async function pu(r){let e=du();await uu.mkdir(kf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await uu.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function eP(r){let e=await ao();e.skills[r.name]=r,await pu(e)}async function tP(r){let e=await ao();return r in e.skills?(delete e.skills[r],await pu(e),!0):!1}async function nP(r){return(await ao()).skills[r]||null}async function sP(){return(await ao()).skills}function rP(){return du()}var Qx,co,bf=y(()=>{"use strict";Qx=".skill-lock.json";l(du,"getLockFilePath");l(Zx,"createEmptyLockFile");l(ao,"read");l(pu,"write");l(eP,"addEntry");l(tP,"removeEntry");l(nP,"getEntry");l(sP,"getAll");l(rP,"getPath");co={read:ao,write:pu,addEntry:eP,removeEntry:tP,getEntry:nP,getAll:sP,getPath:rP}});import{exec as oP}from"node:child_process";import pn from"node:fs/promises";import gu from"node:os";import ot from"node:path";import{promisify as iP}from"node:util";import{glob as Cf}from"glob";function xf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ot.join(gu.homedir(),r.slice(1)):ot.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Pf(r){let e=[];try{let s=ot.join(r,"SKILL.md");await pn.access(s);let o=ot.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Cf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Cf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function aP(r,e,t){let n=new Date().toISOString(),s=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&s.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=r.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
887
- ${s.join(`
888
- `)}`;return r.replace(o,`---
902
+ Load from \`~/.prjct-cli/projects/${s.projectId}/agents/\`:
903
+
904
+ **Workflow**: ${s.agents.workflow.join(", ")}
905
+ **Domain**: ${s.agents.domain.join(", ")||"none"}
906
+ `}function Qv(s,e){let t=s.sources||cs(),n=[];if(n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`),n.push(""),n.push($t(t.languages)),n.push("## Tech Stack"),s.languages.length>0&&n.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- Frameworks: ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Install: \`${s.commands.install}\``),n.push(`- Dev: \`${s.commands.dev}\``),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.push(""),s.analysis){s.analysis.patterns.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(io(s.analysis.antiPatterns)),n.push(""));let r=kf(s.analysis);r&&(n.push(r.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
907
+ `)}function Zv(s,e){let t=s.sources||cs(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${s.name}, a ${s.ecosystem} project.`),n.push(""),n.push($t(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${s.projectType}`),n.push(`- Stack: ${s.frameworks.join(", ")||s.ecosystem}`),n.push(""),s.analysis?(s.analysis.patterns.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns,5)),n.push("")),s.analysis.antiPatterns.length>0&&(n.push("## Anti-Patterns"),n.push(io(s.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.join(`
908
+ `)}function ex(s,e){let t=s.sources||cs(),n=[];return n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${s.name}`),n.push(""),n.push(`${s.projectType} project using ${s.ecosystem}.`),n.push(""),n.push($t(t.languages)),n.push("## Stack"),n.push(`- ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(s.commands.install),n.push("# Dev"),n.push(s.commands.dev),n.push("# Test"),n.push(s.commands.test),n.push("# Build"),n.push(s.commands.build),n.push("```"),n.push(""),s.analysis?(s.analysis.patterns.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(io(s.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
909
+ `)}function tx(s,e){let t=[`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`,"",`Stack: ${s.languages.join(", ")}${s.frameworks.length>0?` with ${s.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${s.commands.install}`,`- Dev: ${s.commands.dev}`,`- Test: ${s.commands.test}`,`- Build: ${s.commands.build}`];if(s.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of s.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(s.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of s.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}s.analysis||t.push("","Run `p. sync` to populate project intelligence.");let r={systemMessage:t.join(`
910
+ `),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${s.commands.test}`}]};return JSON.stringify(r,null,2)}function nx(s,e){let t=[];return t.push(`# ${s.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),s.languages.length>0&&t.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&t.push(`- Frameworks: ${s.frameworks.join(", ")}`),s.analysis?.packageManager&&t.push(`- Package Manager: ${s.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${s.commands.install}\` |`),t.push(`| Dev | \`${s.commands.dev}\` |`),t.push(`| Test | \`${s.commands.test}\` |`),t.push(`| Build | \`${s.commands.build}\` |`),t.push(""),(s.analysis?.sourceDir||s.analysis?.testDir)&&(t.push("## Project Structure"),s.analysis.sourceDir&&t.push(`- Source: \`${s.analysis.sourceDir}/\``),s.analysis.testDir&&t.push(`- Tests: \`${s.analysis.testDir}/\``),t.push("")),s.analysis?(s.analysis.patterns.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(oo(s.analysis.patterns)),t.push("")),s.analysis.antiPatterns.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(io(s.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
911
+ `)}function Sf(s){return{claude:Xv,cursor:Qv,copilot:Zv,windsurf:ex,continue:tx,codex:nx}[s]||null}var cu=y(()=>{"use strict";au();l(oo,"formatPatterns");l(io,"formatAntiPatterns");l(kf,"formatStructure");l(Yv,"formatAnalysisForClaude");l(Xv,"formatForClaude");l(Qv,"formatForCursor");l(Zv,"formatForCopilot");l(ex,"formatForWindsurf");l(tx,"formatForContinue");l(nx,"formatForCodex");l(Sf,"getFormatter")});import{exec as sx}from"node:child_process";import rx from"node:os";import Gs from"node:path";import{promisify as ox}from"node:util";function bf(s){return oa[s]||null}async function ra(s){try{return await ix(`which ${s}`),!0}catch{return!1}}async function ia(s=process.cwd()){let e=[];return await ra("claude")&&e.push("claude"),(await ra("cursor")||await x(Gs.join(s,".cursor")))&&e.push("cursor"),await x(Gs.join(s,".github"))&&e.push("copilot"),(await ra("windsurf")||await x(Gs.join(s,".windsurf")))&&e.push("windsurf"),(await x(Gs.join(s,".continue"))||await x(Gs.join(rx.homedir(),".continue")))&&e.push("continue"),(await ra("codex")||await x(Gs.join(s,".agents")))&&e.push("codex"),e}async function Cf(s,e=process.cwd()){if(s==="auto"){let t=await ia(e);return t.length>0?t:["claude"]}return s==="all"?ax:s.filter(t=>oa[t])}var ix,oa,ao,ax,lu=y(()=>{"use strict";ve();ix=ox(sx),oa={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},ao=["claude"],ax=Object.keys(oa);l(bf,"getAIToolConfig");l(ra,"commandExists");l(ia,"detectInstalledTools");l(Cf,"resolveToolIds")});import uu from"node:fs/promises";import du from"node:path";async function Pf(s,e,t,n=ao){let r=[];for(let o of n){let i=bf(o);if(!i){r.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await cx(s,i,e,t);r.push(a)}return r}async function cx(s,e,t,n){let r=Sf(e.id);if(!r)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=r(s,e),i;e.outputPath==="repo"?i=du.join(n,e.outputFile):i=du.join(t,"context",e.outputFile),await uu.mkdir(du.dirname(i),{recursive:!0});try{let a=await uu.readFile(i,"utf-8"),c=Vc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Bc(o,a)}catch{}return await uu.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var vf=y(()=>{"use strict";N();Jc();cu();lu();l(Pf,"generateAIToolContexts");l(cx,"generateForTool")});var xf=y(()=>{"use strict";cu();vf();lu()});import co from"node:fs/promises";import lo from"node:path";var pu,Tf,mu,Ef,If=y(()=>{"use strict";N();pu=".prjct/.prjct-state.md",Tf=".prjct-state.md",mu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=lo.join(e,pu);await co.mkdir(lo.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await co.writeFile(n,r,"utf-8");try{let o=lo.join(e,Tf);await co.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[pu,Tf])try{await co.unlink(lo.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=lo.join(e,pu);try{return await co.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
912
+ `)}},Ef=new mu});import gu from"node:fs/promises";import lx from"node:os";import Af from"node:path";function fu(){return Af.join(lx.homedir(),".prjct-cli","skills",ux)}function dx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function uo(){try{let s=await gu.readFile(fu(),"utf-8");return JSON.parse(s)}catch{return dx()}}async function hu(s){let e=fu();await gu.mkdir(Af.dirname(e),{recursive:!0}),s.generatedAt=new Date().toISOString(),await gu.writeFile(e,JSON.stringify(s,null,2),"utf-8")}async function px(s){let e=await uo();e.skills[s.name]=s,await hu(e)}async function mx(s){let e=await uo();return s in e.skills?(delete e.skills[s],await hu(e),!0):!1}async function gx(s){return(await uo()).skills[s]||null}async function fx(){return(await uo()).skills}function hx(){return fu()}var ux,po,jf=y(()=>{"use strict";ux=".skill-lock.json";l(fu,"getLockFilePath");l(dx,"createEmptyLockFile");l(uo,"read");l(hu,"write");l(px,"addEntry");l(mx,"removeEntry");l(gx,"getEntry");l(fx,"getAll");l(hx,"getPath");po={read:uo,write:hu,addEntry:px,removeEntry:mx,getEntry:gx,getAll:fx,getPath:hx}});import{exec as yx}from"node:child_process";import gn from"node:fs/promises";import wu from"node:os";import it from"node:path";import{promisify as wx}from"node:util";import{glob as Df}from"glob";function $f(s){if(s.startsWith("./")||s.startsWith("/")||s.startsWith("~")){let n=s.startsWith("~")?it.join(wu.homedir(),s.slice(1)):it.resolve(s);return{type:"local",localPath:n,url:n}}let e=s.indexOf("@");if(e>0){let n=s.slice(0,e),r=s.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:r,url:`https://github.com/${o}/${i}`}}let t=s.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${s}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Mf(s){let e=[];try{let r=it.join(s,"SKILL.md");await gn.access(r);let o=it.basename(s);e.push({name:o,filePath:r})}catch{}let t=await Df("*/SKILL.md",{cwd:s,absolute:!0});for(let r of t){let o=it.basename(it.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let n=await Df("skills/*/SKILL.md",{cwd:s,absolute:!0});for(let r of n){let o=it.basename(it.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function kx(s,e,t){let n=new Date().toISOString(),r=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&r.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=s.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
913
+ ${r.join(`
914
+ `)}`;return s.replace(o,`---
889
915
  ${c}
890
916
  ---`)}return`---
891
- ${s.join(`
917
+ ${r.join(`
892
918
  `)}
893
919
  ---
894
920
 
895
- ${r}`}function fu(){return ot.join(gu.homedir(),".claude","skills")}async function mu(r,e,t,n){let s=fu(),o=ot.join(s,e),i=ot.join(o,"SKILL.md"),a=await pn.readFile(r,"utf-8"),c=aP(a,t,n);return await pn.mkdir(o,{recursive:!0}),await pn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function cP(r){let e={installed:[],skipped:[],errors:[]};if(!Fs.isAvailable("git")){let n=Fs.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${n.error?.hint||"Install git and try again."}`),e}let t=ot.join(gu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await vf(`git clone --depth 1 ${n} ${t}`,{timeout:Ts("GIT_CLONE")});let s;try{let{stdout:a}=await vf("git rev-parse HEAD",{cwd:t,timeout:Ts("TOOL_CHECK")});s=a.trim()}catch{}let o=await Pf(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${r.owner}/${r.repo}`),e;let i=r.skillName?o.filter(a=>a.name===r.skillName):o;if(r.skillName&&i.length===0)return e.errors.push(`Skill "${r.skillName}" not found in ${r.owner}/${r.repo}`),e;for(let a of i)try{let c=await mu(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await co.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await pn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function lP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await pn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await pn.stat(t)).isFile()){let s=ot.basename(ot.dirname(t));try{let o=await mu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await co.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await Pf(t);if(s.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of s)try{let i=await mu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await co.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function uP(r){let e=fu(),t=ot.join(e,r);try{await pn.rm(t,{recursive:!0,force:!0})}catch{}let n=ot.join(e,`${r}.md`);try{await pn.rm(n,{force:!0})}catch{}return co.removeEntry(r)}async function dP(r){let e=xf(r);switch(e.type){case"github":return cP(e);case"local":return lP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var vf,Tf,Ef=y(()=>{"use strict";_();ln();ki();bf();vf=iP(oP);l(xf,"parseSource");l(Pf,"discoverSkills");l(aP,"injectSourceMetadata");l(fu,"getInstallDir");l(mu,"installSkillFile");l(cP,"installFromGitHub");l(lP,"installFromLocal");l(uP,"remove");l(dP,"install");Tf={install:dP,remove:uP,parseSource:xf,getInstallDir:fu}});import Dt from"node:fs/promises";import pP from"node:os";import Ct from"node:path";async function If(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await Dt.readdir(o);for(let u of c)u.endsWith(".md")&&await Dt.unlink(Ct.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:ne(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>mP(c,o)));for(let c of i)s.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>gP(c.name,o,t,e,n)));for(let c of a)s.push({name:c.name,type:"domain",skill:c.skill});return s}async function Af(r){let e=Ct.join(r,"agents"),t=[];try{let n=await Dt.readdir(e),s=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=s.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function jf(r){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...r.matchAll(e)];if(t.length===0)return r;let n=r;for(let s of t){let o=s[1],i=ve(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Dt.readFile(a,"utf-8")}catch{n=n.replace(s[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(s[0],i.trim())}return n}async function mP(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Dt.readFile(n,"utf-8"),t=await jf(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:ne(n)}),t=hP(r)}await Dt.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function gP(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Dt.readFile(i,"utf-8"),o=await jf(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:r,error:ne(i)}),o=yP(r,t,n)}o=fP(o,r,s),await Dt.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function fP(r,e,t){if(!t)return r;let{patternsDiscovered:n,knownGotchas:s,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||s.length>0||i.length>0))return r;let c=[`
921
+ ${s}`}function ku(){return it.join(wu.homedir(),".claude","skills")}async function yu(s,e,t,n){let r=ku(),o=it.join(r,e),i=it.join(o,"SKILL.md"),a=await gn.readFile(s,"utf-8"),c=kx(a,t,n);return await gn.mkdir(o,{recursive:!0}),await gn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function Sx(s){let e={installed:[],skipped:[],errors:[]};if(!_s.isAvailable("git")){let n=_s.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${n.error?.hint||"Install git and try again."}`),e}let t=it.join(wu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${s.owner}/${s.repo}.git`;await Rf(`git clone --depth 1 ${n} ${t}`,{timeout:Is("GIT_CLONE")});let r;try{let{stdout:a}=await Rf("git rev-parse HEAD",{cwd:t,timeout:Is("TOOL_CHECK")});r=a.trim()}catch{}let o=await Mf(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${s.owner}/${s.repo}`),e;let i=s.skillName?o.filter(a=>a.name===s.skillName):o;if(s.skillName&&i.length===0)return e.errors.push(`Skill "${s.skillName}" not found in ${s.owner}/${s.repo}`),e;for(let a of i)try{let c=await yu(a.filePath,a.name,s,r),u={name:a.name,source:{type:"github",url:`${s.owner}/${s.repo}`,sha:r},installedAt:new Date().toISOString(),filePath:c.filePath};await po.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await gn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function bx(s){let e={installed:[],skipped:[],errors:[]},t=s.localPath;try{await gn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await gn.stat(t)).isFile()){let r=it.basename(it.dirname(t));try{let o=await yu(t,r,s),i={name:r,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await po.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let r=await Mf(t);if(r.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of r)try{let i=await yu(o.filePath,o.name,s),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await po.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function Cx(s){let e=ku(),t=it.join(e,s);try{await gn.rm(t,{recursive:!0,force:!0})}catch{}let n=it.join(e,`${s}.md`);try{await gn.rm(n,{force:!0})}catch{}return po.removeEntry(s)}async function Px(s){let e=$f(s);switch(e.type){case"github":return Sx(e);case"local":return bx(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Rf,Of,Ff=y(()=>{"use strict";N();un();vi();jf();Rf=wx(yx);l($f,"parseSource");l(Mf,"discoverSkills");l(kx,"injectSourceMetadata");l(ku,"getInstallDir");l(yu,"installSkillFile");l(Sx,"installFromGitHub");l(bx,"installFromLocal");l(Cx,"remove");l(Px,"install");Of={install:Px,remove:Cx,parseSource:$f,getInstallDir:ku}});import Mt from"node:fs/promises";import vx from"node:os";import Pt from"node:path";async function _f(s,e,t,n){let r=[],o=Pt.join(s,"agents");try{let c=await Mt.readdir(o);for(let u of c)u.endsWith(".md")&&await Mt.unlink(Pt.join(o,u))}catch(c){U.debug("Failed to purge old agents",{path:o,error:re(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>xx(c,o)));for(let c of i)r.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>Tx(c.name,o,t,e,n)));for(let c of a)r.push({name:c.name,type:"domain",skill:c.skill});return r}async function Nf(s){let e=Pt.join(s,"agents"),t=[];try{let n=await Mt.readdir(e),r=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=r.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function Lf(s){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...s.matchAll(e)];if(t.length===0)return s;let n=s;for(let r of t){let o=r[1],i=fe(`subagents/${o}.md`);if(!i){let a=Pt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Mt.readFile(a,"utf-8")}catch{n=n.replace(r[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(r[0],i.trim())}return n}async function xx(s,e){let t="";try{let n=Pt.join(__dirname,"..","..","templates","subagents","workflow",`${s}.md`);t=await Mt.readFile(n,"utf-8"),t=await Lf(t)}catch(n){U.debug("Workflow agent template not found, generating minimal",{name:s,error:re(n)}),t=Ix(s)}await Mt.writeFile(Pt.join(e,`${s}.md`),t,"utf-8")}async function Tx(s,e,t,n,r){let o="";try{let i=Pt.join(__dirname,"..","..","templates","subagents","domain",`${s}.md`);o=await Mt.readFile(i,"utf-8"),o=await Lf(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){U.debug("Domain agent template not found, generating minimal",{name:s,error:re(i)}),o=Ax(s,t,n)}o=Ex(o,s,r),await Mt.writeFile(Pt.join(e,`${s}.md`),o,"utf-8")}function Ex(s,e,t){if(!t)return s;let{patternsDiscovered:n,knownGotchas:r,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||r.length>0||i.length>0))return s;let c=[`
896
922
  ## Recent Learnings (from completed tasks)
897
- `];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(s.length>0){c.push("### Known Gotchas");for(let u of s)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return r+c.join(`
898
- `)}function hP(r){return`---
899
- name: ${r}
900
- description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[r]||"Workflow agent"}
923
+ `];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(r.length>0){c.push("### Known Gotchas");for(let u of r)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return s+c.join(`
924
+ `)}function Ix(s){return`---
925
+ name: ${s}
926
+ description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[s]||"Workflow agent"}
901
927
  tools: Read, Write, Glob
902
928
  ---
903
929
 
904
- # ${r.toUpperCase()}
930
+ # ${s.toUpperCase()}
905
931
 
906
932
  Workflow agent for prjct operations.
907
933
 
@@ -911,16 +937,16 @@ When invoked:
911
937
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
912
938
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
913
939
  3. Execute requested operation
914
- `}function yP(r,e,t){return`---
915
- name: ${r}
916
- description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
940
+ `}function Ax(s,e,t){return`---
941
+ name: ${s}
942
+ description: ${s.charAt(0).toUpperCase()+s.slice(1)} specialist for ${e.name}
917
943
  tools: Read, Write, Glob, Grep
918
944
  skills: []
919
945
  ---
920
946
 
921
- # ${r.toUpperCase()} AGENT
947
+ # ${s.toUpperCase()} AGENT
922
948
 
923
- Domain specialist for ${r} tasks.
949
+ Domain specialist for ${s} tasks.
924
950
 
925
951
  ## Project Context
926
952
 
@@ -930,86 +956,86 @@ Domain specialist for ${r} tasks.
930
956
 
931
957
  ## Your Role
932
958
 
933
- You are the ${r} expert for this project. Apply best practices for the detected stack.
934
- `}function Df(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Dt.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:ne(o)})}),n}async function Rf(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Dt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Ct.join(pP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Ct.join(a,d,"SKILL.md"),p=Ct.join(a,`${d}.md`),g=!1;try{await Dt.access(m),g=!0}catch{try{await Dt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),S;f.length===3?S=`${f[0]}/${f[1]}@${f[2]}`:S=c;let b=await Tf.install(S);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:ne(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:ne(t)})}return e}var $f=y(()=>{"use strict";qn();cn();le();Ln();Ef();l(If,"generateAgents");l(Af,"loadExistingAgents");l(jf,"resolveTemplateIncludes");l(mP,"generateWorkflowAgent");l(gP,"generateDomainAgent");l(fP,"injectFeedbackSection");l(hP,"generateMinimalWorkflowAgent");l(yP,"generateMinimalDomainAgent");l(Df,"configureSkills");l(Rf,"autoInstallSkills")});import Mf from"node:fs/promises";import Of from"node:path";var ta,Ff=y(()=>{"use strict";ta=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Of.join(this.projectPath,"package.json"),t=await Mf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Mf.access(Of.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as wP}from"node:child_process";import _f from"node:fs/promises";import hu from"node:path";import{promisify as SP}from"node:util";async function Nf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await is("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await is("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await is("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await is("git status --porcelain",{cwd:r}),i=o.trim().split(`
935
- `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await is('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
936
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await is('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:ne(t)})}return e}async function sn(r,e){try{return await _f.access(hu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:ne(t)}),!1}}async function Lf(r){let e={fileCount:0,version:"0.0.0",name:hu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await is('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){H.debug("File count failed",{path:r,error:ne(t)}),e.fileCount=0}try{let t=hu.join(r,"package.json"),n=JSON.parse(await _f.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await sn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:ne(t)})}return await sn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await sn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await sn(r,"requirements.txt")||await sn(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 Hf(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 sn(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await sn(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 sn(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 sn(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 sn(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Uf(r,e){let t=os(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Gf(r){return new ta(r).detect()}var is,zf=y(()=>{"use strict";cn();eu();Ln();Ff();is=SP(wP);l(Nf,"analyzeGit");l(sn,"fileExists");l(Lf,"gatherStats");l(Hf,"detectCommands");l(Uf,"buildSources");l(Gf,"detectStack")});import{exec as kP}from"node:child_process";import yu from"node:fs/promises";import na from"node:path";import{promisify as bP}from"node:util";var CP,wu,Su,Wf,Bf=y(()=>{"use strict";Ut();_();CP=bP(kP),wu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=na.join(r,s);try{await yu.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=na.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=na.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await yu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await yu.readFile(na.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Su=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[wu.contextFilesExist(t),wu.jsonFilesValid(t),wu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await CP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Wf=new Su});import sa from"node:fs/promises";import ra from"node:path";var oa,as,ku=y(()=>{"use strict";Rs();Yg();sf();af();df();Yl();cn();xn();Ve();Ce();Ci();bn();he();Ar();zr();xi();jr();Dr();$r();yf();le();Ln();dl();pl();Sf();Yc();$f();zf();Bf();oa=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await ea(e)).filter(i=>!io.includes(i));s=[...io,...o]}else t.aiTools[0]==="auto"?(s=await ea(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await gf("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Wr(this.projectId);try{let N=await vi(this.projectId);N>0&&H.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){H.debug("Legacy JSON sweep failed (non-critical)",{error:ne(N)})}let[i,a,c,u]=await Promise.all([Nf(this.projectPath),Lf(this.projectPath),Hf(this.projectPath),Gf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&of(this.projectId))try{let{diff:N,currentHashes:it}=await Zl(this.projectPath,this.projectId),On=N.added.length+N.modified.length+N.deleted.length;if(On===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let gr=tf(N,this.projectId);f=nf(gr.allAffected);let by=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=gr.allAffected.some(Fn=>{let Cy=Fn.substring(Fn.lastIndexOf("."));return by.has(Cy)}),g=gr.directlyChanged.some(Fn=>Fn==="package.json"||Fn==="tsconfig.json"||Fn.includes("Dockerfile")||Fn.includes("docker-compose")),m={isIncremental:!0,filesChanged:On,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Ql(this.projectId,it)}catch(N){H.debug("Incremental detection failed, falling back to full sync",{error:ne(N)})}else try{let{currentHashes:N}=await Zl(this.projectPath,this.projectId);Ql(this.projectId,N)}catch(N){H.debug("Hash computation failed (non-critical)",{error:ne(N)})}if(p)try{await Promise.all([Kg(this.projectPath,this.projectId),ef(this.projectPath,this.projectId),uf(this.projectPath,this.projectId)])}catch(N){H.debug("File ranking index build failed (non-critical)",{error:ne(N)})}let S;if(g)try{let N=await L.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(S=N)}catch{}let b=g?await If(this.globalPath,u,a,S):await Af(this.globalPath),D=Df(b,this.projectId,this.globalPath),x=g?await Rf(b):[],O=Uf(a,c),F=[],K={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(N=>N.type==="workflow").map(N=>N.name),domain:b.filter(N=>N.type==="domain").map(N=>N.name)},sources:O},oe=await ff(K,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let k=Date.now()-n,j=await this.recordSyncMetrics(a,F,b,k);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let ee;try{let N=await R.readConfig(this.projectPath);ee=await Wf.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){H.debug("Verification failed (non-critical)",{error:ne(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:x,contextFiles:F,aiTools:oe.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:j,verification:ee,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:ne(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>sa.mkdir(ra.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await wf.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:ne(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=ra.join(this.globalPath,m),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:ne(p)})}for(let m of n)try{let p=ra.join(this.globalPath,"agents",`${m.name}.md`),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:ne(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await un.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:ne(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await Zt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:ne(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Ye.markDormantIdeas(this.projectId).catch(()=>0),Pe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=St.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ne(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Bn,n=await ul.learnFromTaskHistory(this.projectId,e,t);try{let s=await Dm.getFeatureOutcomes(this.projectId);s.length>0&&await ul.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:ne(e)})}}async getCliVersion(){try{let e=ra.join(__dirname,"..","..","package.json");return JSON.parse(await sa.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ne(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:[]}}},as=new oa});var Dn=y(()=>{"use strict";rm();um();dm();fm();ym();Jc();Sm();Yc();km();bm();Bg();Vg();ku()});import mn from"chalk";function Vf(r){return Math.ceil(r.length/vP)}function Jf(r){let e=r.split(`
937
- `),t=[],n=null;for(let s=0;s<e.length;s++){let o=e[s],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=s-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:s,endLine:s}):n&&(n.content+=`
938
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function bu(r){return r.includes("<!-- prjct:preserve")}function qf(r,e){let t=Jf(r),n=Jf(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Vf(r),tokensAfter:Vf(e),tokenDelta:0};s.tokenDelta=s.tokensAfter-s.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)bu(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
939
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(bu(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
940
- `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
941
- `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!bu(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
942
- `).length}),s.hasChanges=!0)}return s}function Kf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:p=>p,o=t?mn.red:p=>p,i=t?mn.yellow:p=>p,a=t?mn.dim:p=>p,c=t?mn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
943
- `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),r.added.length>0)for(let p of r.added)n.push(s(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of r.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(s(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?s:o;return n.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
944
- `)}function Yf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:c=>c,o=t?mn.red:c=>c,i=t?mn.cyan:c=>c,a=t?mn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
945
- `))n.push(s(`+ ${u}`));n.push("")}for(let c of r.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
959
+ You are the ${s} expert for this project. Apply best practices for the detected stack.
960
+ `}function Uf(s,e,t){let n=[];for(let o of s)o.skill&&n.push({agent:o.name,skill:o.skill});let r={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Mt.writeFile(Pt.join(t,"config","skills.json"),JSON.stringify(r,null,2),"utf-8").catch(o=>{U.debug("Failed to write skills.json",{error:re(o)})}),n}async function Hf(s){let e=[];try{let t=Pt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Mt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of s){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Pt.join(vx.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Pt.join(a,d,"SKILL.md"),p=Pt.join(a,`${d}.md`),g=!1;try{await Mt.access(m),g=!0}catch{try{await Mt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let b=await Of.install(k);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),U.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),U.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),U.debug(`Skill install error for ${d}`,{error:re(f)})}}}catch(t){U.debug("Skill auto-installation failed (non-critical)",{error:re(t)})}return e}var Gf=y(()=>{"use strict";In();ln();le();Gn();Ff();l(_f,"generateAgents");l(Nf,"loadExistingAgents");l(Lf,"resolveTemplateIncludes");l(xx,"generateWorkflowAgent");l(Tx,"generateDomainAgent");l(Ex,"injectFeedbackSection");l(Ix,"generateMinimalWorkflowAgent");l(Ax,"generateMinimalDomainAgent");l(Uf,"configureSkills");l(Hf,"autoInstallSkills")});import zf from"node:fs/promises";import Wf from"node:path";var aa,Bf=y(()=>{"use strict";aa=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Wf.join(this.projectPath,"package.json"),t=await zf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await zf.access(Wf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as jx}from"node:child_process";import Vf from"node:fs/promises";import Su from"node:path";import{promisify as Dx}from"node:util";async function Jf(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ls("git branch --show-current",{cwd:s});e.branch=t.trim()||"main";let{stdout:n}=await ls("git rev-list --count HEAD",{cwd:s});e.commits=parseInt(n.trim(),10)||0;let{stdout:r}=await ls("git shortlog -sn --all | wc -l",{cwd:s});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await ls("git status --porcelain",{cwd:s}),i=o.trim().split(`
961
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await ls('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:s});e.recentCommits=a.split(`
962
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ls('git log --oneline --since="1 week ago" | wc -l',{cwd:s});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:re(t)})}return e}async function rn(s,e){try{return await Vf.access(Su.join(s,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:re(t)}),!1}}async function qf(s){let e={fileCount:0,version:"0.0.0",name:Su.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ls('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:s});e.fileCount=parseInt(t.trim(),10)||0}catch(t){U.debug("File count failed",{path:s,error:re(t)}),e.fileCount=0}try{let t=Su.join(s,"package.json"),n=JSON.parse(await Vf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let r={...n.dependencies,...n.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await rn(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:s,error:re(t)})}return await rn(s,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await rn(s,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await rn(s,"requirements.txt")||await rn(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Kf(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await rn(s,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rn(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await rn(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await rn(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await rn(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Yf(s,e){let t=cs(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[s.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Xf(s){return new aa(s).detect()}var ls,Qf=y(()=>{"use strict";ln();au();Gn();Bf();ls=Dx(jx);l(Jf,"analyzeGit");l(rn,"fileExists");l(qf,"gatherStats");l(Kf,"detectCommands");l(Yf,"buildSources");l(Xf,"detectStack")});import{exec as Rx}from"node:child_process";import bu from"node:fs/promises";import ca from"node:path";import{promisify as $x}from"node:util";var Mx,Cu,Pu,Zf,eh=y(()=>{"use strict";Bt();N();Mx=$x(Rx),Cu={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=ca.join(s,r);try{await bu.access(o)}catch{n.push(r)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(s){let e=Date.now(),t=[],n=ca.basename(s);try{await L.read(n)}catch(r){P(r)||t.push(`state: ${w(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=ca.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await bu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await bu.readFile(ca.join(t,i),"utf-8");for(let c of n)if(c.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Pu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Cu.contextFilesExist(t),Cu.jsonFilesValid(t),Cu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Mx(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Zf=new Pu});import la from"node:fs/promises";import ua from"node:path";var da,us,vu=y(()=>{"use strict";Ms();sf();df();gf();wf();su();ln();An();qe();Se();Ti();vn();ye();jr();Wr();Ii();Dr();Rr();Mr();xf();le();Gn();kl();Sl();If();ol();Gf();Qf();eh();da=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r;if(!t.aiTools||t.aiTools.length===0){let o=(await ia(e)).filter(i=>!ao.includes(i));r=[...ao,...o]}else t.aiTools[0]==="auto"?(r=await ia(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Cf("all",e):r=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=I.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let _=await Ei(this.projectId);_>0&&U.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){U.debug("Legacy JSON sweep failed (non-critical)",{error:re(_)})}let[i,a,c,u]=await Promise.all([Jf(this.projectPath),qf(this.projectPath),Kf(this.projectPath),Xf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&mf(this.projectId))try{let{diff:_,currentHashes:ms}=await iu(this.projectPath,this.projectId),ko=_.added.length+_.modified.length+_.deleted.length;if(ko===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let $a=lf(_,this.projectId);f=uf($a.allAffected);let Ry=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=$a.allAffected.some(Ln=>{let $y=Ln.substring(Ln.lastIndexOf("."));return Ry.has($y)}),g=$a.directlyChanged.some(Ln=>Ln==="package.json"||Ln==="tsconfig.json"||Ln.includes("Dockerfile")||Ln.includes("docker-compose")),m={isIncremental:!0,filesChanged:ko,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}ou(this.projectId,ms)}catch(_){U.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await iu(this.projectPath,this.projectId);ou(this.projectId,_)}catch(_){U.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([nf(this.projectPath,this.projectId),cf(this.projectPath,this.projectId),yf(this.projectPath,this.projectId)])}catch(_){U.debug("File ranking index build failed (non-critical)",{error:re(_)})}let k;if(g)try{let _=await L.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(k=_)}catch{}let b=g?await _f(this.globalPath,u,a,k):await Nf(this.globalPath),D=Uf(b,this.projectId,this.globalPath),v=g?await Hf(b):[],$=Yf(a,c),F=[],H;try{let _=await bt.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(H={patterns:_.patterns,antiPatterns:_.antiPatterns,packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let ee={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(_=>_.type==="workflow").map(_=>_.name),domain:b.filter(_=>_.type==="domain").map(_=>_.name)},sources:$,analysis:H},S=await Pf(ee,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let j=Date.now()-n,te=await this.recordSyncMetrics(a,F,b,j);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let Ve;try{let _=await R.readConfig(this.projectPath);Ve=await Zf.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){U.debug("Verification failed (non-critical)",{error:re(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:v,contextFiles:F,aiTools:S.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:te,verification:Ve,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:re(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>la.mkdir(ua.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=M.getDoc(this.projectId,"project")||{},r={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};M.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await L.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=C(),r.lastUpdated=C(),r.context={...r.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,r);try{await Ef.generate(this.projectPath,r)}catch(o){U.debug("Local state generation failed (optional)",{error:re(o)})}}async logToMemory(e,t){M.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,r){let i=0;for(let m of t)try{let p=ua.join(this.globalPath,m),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:re(p)})}for(let m of n)try{let p=ua.join(this.globalPath,"agents",`${m.name}.md`),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:re(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await dn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:re(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let r=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await bt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:r??void 0})}catch(r){U.debug("Failed to save draft analysis (non-critical)",{error:re(r)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,r,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Qe.markDormantIdeas(this.projectId).catch(()=>0),xe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:re(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new qn,n=await wl.learnFromTaskHistory(this.projectId,e,t);try{let r=await Nm.getFeatureOutcomes(this.projectId);r.length>0&&await wl.learnFromOutcomes(this.projectId,r,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:re(e)})}}async getCliVersion(){try{let e=ua.join(__dirname,"..","..","package.json");return JSON.parse(await la.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:re(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:[]}}},us=new da});var On=y(()=>{"use strict";cm();gm();fm();km();bm();nl();Pm();ol();vm();xm();Qg();Zg();vu()});import fn from"chalk";function th(s){return Math.ceil(s.length/Ox)}function nh(s){let e=s.split(`
963
+ `),t=[],n=null;for(let r=0;r<e.length;r++){let o=e[r],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=r-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:r,endLine:r}):n&&(n.content+=`
964
+ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xu(s){return s.includes("<!-- prjct:preserve")}function sh(s,e){let t=nh(s),n=nh(e),r={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:th(s),tokensAfter:th(e),tokenDelta:0};r.tokenDelta=r.tokensAfter-r.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)xu(a.content)&&r.preserved.push({name:a.name,lineCount:a.content.split(`
965
+ `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(xu(u.content)||(r.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
966
+ `).length}),r.hasChanges=!0)):(r.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
967
+ `).length}),r.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!xu(a.content)&&(r.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
968
+ `).length}),r.hasChanges=!0)}return r}function rh(s,e={}){let{colorize:t=!0}=e,n=[],r=t?fn.green:p=>p,o=t?fn.red:p=>p,i=t?fn.yellow:p=>p,a=t?fn.dim:p=>p,c=t?fn.bold:p=>p;if(!s.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
969
+ `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),s.added.length>0)for(let p of s.added)n.push(r(`+ \u2502 + ${p.name} (new)`));if(s.modified.length>0)for(let p of s.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(s.removed.length>0)for(let p of s.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(s.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of s.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];s.added.length>0&&u.push(r(`+${s.added.length} added`)),s.modified.length>0&&u.push(i(`~${s.modified.length} modified`)),s.removed.length>0&&u.push(o(`-${s.removed.length} removed`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=s.tokenDelta>=0?"+":"",m=s.tokenDelta>=0?r:o;return n.push(`Tokens: ${s.tokensBefore.toLocaleString()} \u2192 ${s.tokensAfter.toLocaleString()} (${m(d+s.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
970
+ `)}function oh(s,e={}){let{colorize:t=!0}=e,n=[],r=t?fn.green:c=>c,o=t?fn.red:c=>c,i=t?fn.cyan:c=>c,a=t?fn.dim:c=>c;for(let c of s.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
971
+ `))n.push(r(`+ ${u}`));n.push("")}for(let c of s.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
946
972
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
947
973
  `).length>5&&n.push(a(` ... ${c.before.split(`
948
974
  `).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
949
- `).slice(0,5))n.push(s(`+ ${u}`));c.after.split(`
975
+ `).slice(0,5))n.push(r(`+ ${u}`));c.after.split(`
950
976
  `).length>5&&n.push(a(` ... ${c.after.split(`
951
- `).length-5} more lines`))}n.push("")}for(let c of r.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
977
+ `).length-5} more lines`))}n.push("")}for(let c of s.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
952
978
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
953
979
  `).length>5&&n.push(a(` ... ${c.before.split(`
954
980
  `).length-5} more lines`))}n.push("")}return n.join(`
955
- `)}var vP,Xf=y(()=>{"use strict";vP=4;l(Vf,"estimateTokens");l(Jf,"parseMarkdownSections");l(bu,"isPreservedSection");l(qf,"generateSyncDiff");l(Kf,"formatDiffPreview");l(Yf,"formatFullDiff")});import xP from"node:path";async function Cu(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await Ee.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
956
- `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Qf(r){try{let e=await mt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=B.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function lo(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function vu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Zf(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(s=>s.tokensSaved),n=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/n*(e.length-1)),e.length-1);return e[o]}).join("")}function eh(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${lo(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ri(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${vu(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${lo(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(`
957
- `)}function th(r,e){let t=[];t.push(`# Repository Analysis
981
+ `)}var Ox,ih=y(()=>{"use strict";Ox=4;l(th,"estimateTokens");l(nh,"parseMarkdownSections");l(xu,"isPreservedSection");l(sh,"generateSyncDiff");l(rh,"formatDiffPreview");l(oh,"formatFullDiff")});import Fx from"node:path";async function Tu(s,e){let t=Date.now()-e,n=s.contextFiles.length+(s.aiTools?.filter(p=>p.success).length||0),r=s.agents.length,o=s.agents.filter(p=>p.type==="domain").length;await Ee.installGlobalConfig(),h.done(`Synced ${s.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=s.syncMetrics?.compressionRate?Math.round(s.syncMetrics.compressionRate*100):0,a=s.stats.frameworks.length>0?` (${s.stats.frameworks[0]})`:"",c=[`${s.stats.fileCount} files \u2192 ${n} context | ${r} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${s.stats.ecosystem}${a} | Branch: ${s.git.branch}`];h.box("Sync Summary",c.join(`
982
+ `));let u=[];s.contextFiles.length>0&&u.push(`${s.contextFiles.length} context files`);let d=s.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),r>0){let p=o>0?`${r} agents (${o} domain)`:`${r} agents`;u.push(p)}if(s.skills.length>0){let p=s.skills.length===1?"skill":"skills";u.push(`${s.skills.length} ${p}`)}let m=s.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),s.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),s.verification){let p=s.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Ct("sync"),{success:!0,data:s,metrics:{elapsed:t,contextFilesCount:n,agentCount:r,fileCount:s.stats.fileCount}}}async function ah(s){try{let e=await mt.getRecentEvents(s,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];r=B.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:r,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function mo(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function Eu(s){return s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(1)}s`}function ch(s){if(s.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=s.map(r=>r.tokensSaved),n=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/n*(e.length-1)),e.length-1);return e[o]}).join("")}function lh(s,e,t,n,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),r){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${mo(s.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(s.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ci(s.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${s.syncCount} |`),i.push(`| Avg time | ${Eu(s.avgSyncDuration)} |`),i.push(""),s.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=s.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of s.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${mo(s.last30DaysTokens)}`),s.trend!==0){let a=s.trend>0?"+":"";i.push(`- Trend: ${a}${s.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
983
+ `)}function uh(s,e){let t=[];t.push(`# Repository Analysis
958
984
  `),t.push(`Generated: ${new Date().toLocaleString()}
959
- `);let n=xP.basename(e);if(t.push(`## Project: ${n}
985
+ `);let n=Fx.basename(e);if(t.push(`## Project: ${n}
960
986
  `),t.push(`## Stack Detected
961
- `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
962
- `),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
987
+ `),s.packageJson){let i=s.packageJson;if(t.push(`### JavaScript/TypeScript
988
+ `),t.push("- **Package Manager**: npm/yarn/pnpm"),i.dependencies){let a=Object.keys(i.dependencies);a.length>0&&t.push(`- **Dependencies**: ${a.slice(0,10).join(", ")}${a.length>10?` (+${a.length-10} more)`:""}`)}s.hasNextConfig&&t.push("- **Framework**: Next.js detected"),s.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),s.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}s.cargoToml&&(t.push(`### Rust
963
989
  `),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
964
- `)),r.goMod&&(t.push(`### Go
990
+ `)),s.goMod&&(t.push(`### Go
965
991
  `),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
966
- `)),r.requirements&&(t.push(`### Python
992
+ `)),s.requirements&&(t.push(`### Python
967
993
  `),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
968
- `));let s=r.directories;t.push(`## Structure
969
- `),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${s?.slice(0,15).join(", ")||"none"}${(s?.length||0)>15?` (+${(s?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
970
- `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
971
- `),r.gitLog.split(`
994
+ `));let r=s.directories;t.push(`## Structure
995
+ `),t.push(`- **Total Files**: ${s.fileCount}`),t.push(`- **Directories**: ${r?.slice(0,15).join(", ")||"none"}${(r?.length||0)>15?` (+${(r?.length||0)-15} more)`:""}`),s.hasDockerfile&&t.push("- **Docker**: Detected"),s.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),s.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=s.gitStats;return t.push(`## Git Statistics
996
+ `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),s.gitLog&&(t.push(`## Recent Activity
997
+ `),s.gitLog.split(`
972
998
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
973
999
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
974
1000
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
975
- `)}var nh=y(()=>{"use strict";xn();oi();Dn();Ns();Nt();rt();l(Cu,"showSyncResult");l(Qf,"getSessionActivity");l(lo,"formatTokens");l(vu,"formatDuration");l(Zf,"generateSparkline");l(eh,"generateStatsMarkdown");l(th,"generateAnalysisSummary")});var Wg={};ge(Wg,{AnalysisCommands:()=>cs});import xu from"node:fs/promises";import sh from"node:path";import rh from"prompts";var cs,qi=y(()=>{"use strict";Rs();Jp();xn();oi();Dn();Xf();Ci();he();zr();_();_s();Ns();Nt();nh();rt();cs=class extends ke{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
976
- `),qe.init(t);let n=await ft.build(t,e),s={packageJson:await qe.readPackageJson(),cargoToml:await qe.readCargoToml(),goMod:await qe.readGoMod(),requirements:await qe.readRequirements(),directories:await qe.listDirectories(),fileCount:await qe.countFiles(),gitStats:await qe.getGitStats(),gitLog:await qe.getGitLog(20),hasDockerfile:await qe.fileExists("Dockerfile"),hasDockerCompose:await qe.fileExists("docker-compose.yml"),hasReadme:await qe.fileExists("README.md"),hasTsconfig:await qe.fileExists("tsconfig.json"),hasViteConfig:await qe.fileExists("vite.config.ts")||await qe.fileExists("vite.config.js"),hasNextConfig:await qe.fileExists("next.config.js")||await qe.fileExists("next.config.mjs")},o=th(s,t),i=await R.getProjectId(t),a=n.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Ke.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:B.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Be(),xt(ut)).getActiveProvider(),d=await Ee.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1001
+ `)}var dh=y(()=>{"use strict";An();li();On();Ls();Gt();ot();l(Tu,"showSyncResult");l(ah,"getSessionActivity");l(mo,"formatTokens");l(Eu,"formatDuration");l(ch,"generateSparkline");l(lh,"generateStatsMarkdown");l(uh,"generateAnalysisSummary")});var Xg={};he(Xg,{AnalysisCommands:()=>ds});import Iu from"node:fs/promises";import ph from"node:path";import mh from"prompts";var ds,Zi=y(()=>{"use strict";Ms();Xp();An();li();On();ih();Ti();ye();Wr();N();Ns();Ls();Gt();dh();ot();ds=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1002
+ `),Ye.init(t);let n=await ft.build(t,e),r={packageJson:await Ye.readPackageJson(),cargoToml:await Ye.readCargoToml(),goMod:await Ye.readGoMod(),requirements:await Ye.readRequirements(),directories:await Ye.listDirectories(),fileCount:await Ye.countFiles(),gitStats:await Ye.getGitStats(),gitLog:await Ye.getGitLog(20),hasDockerfile:await Ye.fileExists("Dockerfile"),hasDockerCompose:await Ye.fileExists("docker-compose.yml"),hasReadme:await Ye.fileExists("README.md"),hasTsconfig:await Ye.fileExists("tsconfig.json"),hasViteConfig:await Ye.fileExists("vite.config.ts")||await Ye.fileExists("vite.config.js"),hasNextConfig:await Ye.fileExists("next.config.js")||await Ye.fileExists("next.config.mjs")},o=uh(r,t),i=await R.getProjectId(t),a=n.paths.analysis||I.getFilePath(i,"analysis","repo-summary.md");await Xe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:B.getTimestamp(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits});let u=await(Je(),xt(ut)).getActiveProvider(),d=await Ee.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${I.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
977
1003
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
978
- `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(S=>S.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await as.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(en(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=sh.join(o,"context","CLAUDE.md"),c=null;try{c=await xu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await as.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ie("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await xu.readFile(a,"utf-8")}catch{p=""}let g=qf(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(en("No changes detected","Context is up to date.")),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await xu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let x of g.added)b.push(`Added: ${x.name} (${x.lineCount} lines)`);for(let x of g.modified)b.push(`Modified: ${x.name} (${x.lineCount} lines)`);for(let x of g.removed)b.push(`Removed: ${x.name} (${x.lineCount} lines)`);let D=Ie("## Sync Preview",b.length>0?st("Changes",Gt(b),3):"No section changes.",zt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:b,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Kf(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await rh({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return S.action==="cancel"||!S.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):S.action==="diff"&&(console.log(`
979
- ${Yf(g)}`),!(await rh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Cu(m,i))}t.md||h.spin("Syncing project...");let d=await as.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Pi("sync"),S=Ie(en("Sync Complete",zt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Tn("Uncommitted changes detected"):null,Qe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Cu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await un.getSummary(s),i=await un.getDailyStats(s,30),a=await Qf(s),c=await Te.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await un.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${lo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ri(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=Zf(i);if(console.log(` ${p} ${lo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=eh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Zt.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=sh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ie(`## Status: ${u}`,zt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?st("Analysis",Gt(p),3):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Zt.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Zt.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await Zt.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var ia,G,Us=y(()=>{"use strict";Ve();Ce();_();le();ia=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:A.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};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()}},G=new ia});import PP from"node:path";var Gs,Pu=y(()=>{"use strict";Dn();Ut();_();_s();rt();Us();Gs=class extends ke{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=PP.basename(t),a=await L.getCurrentTask(o),c=await Pe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Ye.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=B.getDaysAgo(m),g=[];try{let b=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(x=>({...JSON.parse(x.data),timestamp:x.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
1004
+ `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:r}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=I.getGlobalProjectPath(r),i=Date.now();if(t.package){let m=await I.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await us.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(tn(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=ph.join(o,"context","CLAUDE.md"),c=null;try{c=await Iu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await us.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ie("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await Iu.readFile(a,"utf-8")}catch{p=""}let g=sh(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(tn("No changes detected","Context is up to date.")),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await Iu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let v of g.added)b.push(`Added: ${v.name} (${v.lineCount} lines)`);for(let v of g.modified)b.push(`Modified: ${v.name} (${v.lineCount} lines)`);for(let v of g.removed)b.push(`Removed: ${v.name} (${v.lineCount} lines)`);let D=Ie("## Sync Preview",b.length>0?rt("Changes",At(b),3):"No section changes.",jt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:b,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(rh(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await mh({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return k.action==="cancel"||!k.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):k.action==="diff"&&(console.log(`
1005
+ ${oh(g)}`),!(await mh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Tu(m,i))}t.md||h.spin("Syncing project...");let d=await us.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Ai("sync"),k=Ie(tn("Sync Complete",jt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Rm("Uncommitted changes detected"):null,et(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Tu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await dn.getSummary(r),i=await dn.getDailyStats(r,30),a=await ah(r),c=await Te.getPatternsSummary(r);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=M.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await dn.read(r),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${mo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ci(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Eu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=ch(i);if(console.log(` ${p} ${mo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=lh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await bt.getStatus(r);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=ph.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ie(`## Status: ${u}`,jt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?rt("Analysis",At(p),3):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await bt.seal(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await bt.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let r=w(n);return h.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=M.getDoc(r,"project")?.repoPath||e}catch{}let i=await bt.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}}});var pa,z,zs=y(()=>{"use strict";qe();Se();N();le();pa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,r){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(r=>r.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),r=n.filter((a,c)=>n.indexOf(a)!==c);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};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()}},z=new pa});import _x from"node:path";var Ws,Au=y(()=>{"use strict";On();Bt();N();Ns();ot();zs();Ws=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=_x.basename(t),a=await L.getCurrentTask(o),c=await xe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Qe.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=B.getDaysAgo(m),g=[];try{let b=p.toISOString();g=M.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(v=>({...JSON.parse(v.data),timestamp:v.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
980
1006
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
981
- `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let S=this._generateSparkline(g,m);return console.log(`
982
- Activity: ${S}
983
- `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Ke.get("Read")(m.paths.roadmap);if(console.log(`
1007
+ `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
1008
+ Activity: ${k}
1009
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Xe.get("Read")(m.paths.roadmap);if(console.log(`
984
1010
  \u{1F5FA}\uFE0F ROADMAP - ${i}
985
1011
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
986
- `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let b=f.split(`
987
- `)[0].trim();console.log(` ${S+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
988
- `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${B.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(S=>{let b=S.priority?` [${S.priority}]`:"";return`${S.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let b=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Ie(`## Dashboard: ${i}`,st("Current Focus",m,3),st(`Queue (${c.length})`,Gt(p,!0),3),st("Recent Ships",Gt(g),3),st("Ideas",`${d.length} pending`,3),Qe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1012
+ `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let b=f.split(`
1013
+ `)[0].trim();console.log(` ${k+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1014
+ `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${B.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let b=k.priority?` [${k.priority}]`:"";return`${k.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let b=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Ie(`## Dashboard: ${i}`,rt("Current Focus",m,3),rt(`Queue (${c.length})`,At(p,!0),3),rt("Recent Ships",At(g),3),rt("Ideas",`${d.length} pending`,3),et([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
989
1015
  \u{1F4CA} DASHBOARD - ${i}
990
1016
  `),console.log("\u2550".repeat(50));let m=so(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
991
1017
  ${g}`),console.log(`
992
1018
  \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=B.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
993
- \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
994
- \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let S=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${S?`(${S})`:""}`)}),console.log(`
1019
+ \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1020
+ \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
995
1021
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
996
1022
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
997
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:B.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1023
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:B.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
998
1024
  PRJCT COMMANDS
999
- `),console.log("=".repeat(50));let i=G.getAllCategories(),a=G.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1025
+ `),console.log("=".repeat(50));let i=z.getAllCategories(),a=z.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1000
1026
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1001
1027
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1002
- `),{success:!0,topic:"overview"}}let n=G.getByName(e);if(n){if(console.log(`
1028
+ `),{success:!0,topic:"overview"}}let n=z.getByName(e);if(n){if(console.log(`
1003
1029
  \u{1F4DA} HELP: /p:${n.name}
1004
1030
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1005
1031
  Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
1006
1032
  Features:`);for(let i of n.features)console.log(` \u2022 ${i}`)}return console.log(`
1007
1033
  ${"\u2550".repeat(50)}
1008
- `),{success:!0,topic:e,command:n}}let s={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(s))if(o.includes(i))return console.log(`
1034
+ `),{success:!0,topic:e,command:n}}let r={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(r))if(o.includes(i))return console.log(`
1009
1035
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1010
1036
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1011
1037
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1012
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import TP from"node:fs/promises";import EP from"node:path";var ls,MG,Tu=y(()=>{"use strict";Dl();Ve();Ce();Ut();_();ls=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=A.getGlobalProjectPath(a),u=await L.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await Ni.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=EP.join(e,"analysis","repo-analysis.json"),n=await TP.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return v(t),null}}},MG=new ls});async function aa(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;V.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 ca(r){let e=await R.getProjectId(r);if(!e)return;let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;V.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}async function Eu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await aa(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=V.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;V.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await Ye.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${w(a)}`)}try{let c=(await Pe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${w(a)}`)}return await ca(e),await mt.log(e,"cleanup_performed",{items:s.length,timestamp:B.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Iu=y(()=>{"use strict";Dn();Ut();he();_();rt();l(aa,"cleanupMemory");l(ca,"cleanupMemoryInternal");l(Eu,"cleanup")});import oh from"node:path";async function Au(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=oh.join(A.getGlobalProjectPath(i),"planning","designs");await ce.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1038
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],r=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(r);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import Nx from"node:fs/promises";import Lx from"node:path";var ps,ez,ju=y(()=>{"use strict";Nl();qe();Se();Bt();N();ps=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),r=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=I.getGlobalProjectPath(a),u=await L.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await zi.execute(r,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=Lx.join(e,"analysis","repo-analysis.json"),n=await Nx.readFile(t,"utf-8"),r=JSON.parse(n);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return P(t),null}}},ez=new ps});async function ma(s){let e=await R.getProjectId(s),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let r=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(r>500){let o=r-500;q.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 ga(s){let e=await R.getProjectId(s);if(!e)return;let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let r=n-500;q.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",r)}}async function Du(s={},e=process.cwd()){try{if(s.memory===!0||s.type==="memory"){h.spin("cleaning memory...");let a=await ma(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let r=[],i=q.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;q.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),r.push(`Memory: ${a} old entries removed`)}else r.push("Memory: No cleanup needed");try{let a=await Qe.cleanup(n);a.removed>0?r.push(`Ideas: ${a.removed} old archived ideas removed`):r.push("Ideas: No cleanup needed")}catch(a){r.push(`Ideas: Error - ${w(a)}`)}try{let c=(await xe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?r.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):r.push("Queue: No completed tasks")}catch(a){r.push(`Queue: Error - ${w(a)}`)}return await ga(e),await mt.log(e,"cleanup_performed",{items:r.length,timestamp:B.getTimestamp()}),h.done(`${r.length} items cleaned`),{success:!0,cleaned:r}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Ru=y(()=>{"use strict";On();Bt();ye();N();ot();l(ma,"cleanupMemory");l(ga,"cleanupMemoryInternal");l(Du,"cleanup")});import gh from"node:path";async function $u(s=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=s||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=gh.join(I.getGlobalProjectPath(i),"planning","designs");await ce.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1013
1039
 
1014
1040
  *Use templates/design/architecture.md for full design*
1015
1041
  `;break;case"api":c=`# API Design: ${o}
@@ -1024,45 +1050,45 @@ ${"\u2550".repeat(50)}
1024
1050
  `;break;case"flow":c=`# Flow Design: ${o}
1025
1051
 
1026
1052
  *Use templates/design/flow.md for full design*
1027
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=oh.join(a,u);return await ce.writeFile(d,c),await mt.log(t,"design_created",{type:n,target:o,timestamp:B.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}var ju=y(()=>{"use strict";Dn();_();rt();l(Au,"design")});import zs from"node:path";async function Du(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=A.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ce.readFile(t);n=JSON.parse(s)}catch(s){if(v(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1053
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=gh.join(a,u);return await ce.writeFile(d,c),await mt.log(t,"design_created",{type:n,target:o,timestamp:B.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}var Mu=y(()=>{"use strict";On();N();ot();l($u,"design")});import Bs from"node:path";async function Ou(s=process.cwd()){try{let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=I.getFilePath(e,"progress","sessions/current.json"),n=null;try{let r=await ce.readFile(t);n=JSON.parse(r)}catch(r){if(P(r)||r instanceof SyntaxError)n=null;else throw r}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1028
1054
  Found abandoned session:
1029
- `),console.log(` Task: ${n.task}`),n.startedAt){let s=B.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1055
+ `),console.log(` Task: ${n.task}`),n.startedAt){let r=B.calculateDuration(new Date(n.startedAt));console.log(` Started: ${r} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1030
1056
  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
1031
- `),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Ru(r=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots");await ce.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=zs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ce.readFile(a);c=JSON.parse(u)}catch(u){if(!v(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ce.writeFile(a,JSON.stringify(c,null,2)),await mt.log(r,"undo_performed",{snapshotId:i,timestamp:B.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(s)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function $u(r=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots"),n=zs.join(t,"history.json"),s;try{let i=await ce.readFile(n);s=JSON.parse(i)}catch(i){if(v(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1032
- `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ce.writeFile(n,JSON.stringify(s,null,2)),await mt.log(r,"redo_performed",{timestamp:B.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Mu(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots"),n=zs.join(t,"history.json"),s;try{let o=await ce.readFile(n);s=JSON.parse(o)}catch(o){if(v(o)||o instanceof SyntaxError)return console.log(`
1057
+ `),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Fu(s=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Bs.join(I.getGlobalProjectPath(e),"snapshots");await ce.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:s,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:s,encoding:"utf-8"});let a=Bs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ce.readFile(a);c=JSON.parse(u)}catch(u){if(!P(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ce.writeFile(a,JSON.stringify(c,null,2)),await mt.log(s,"undo_performed",{snapshotId:i,timestamp:B.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(r){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(r)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function _u(s=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Bs.join(I.getGlobalProjectPath(e),"snapshots"),n=Bs.join(t,"history.json"),r;try{let i=await ce.readFile(n);r=JSON.parse(i)}catch(i){if(P(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(r.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:s,encoding:"utf-8"}).trim();return i?i.split(`
1058
+ `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:s,encoding:"utf-8"}),r.snapshots.pop(),r.current=Math.max(0,r.current-1),await ce.writeFile(n,JSON.stringify(r,null,2)),await mt.log(s,"redo_performed",{timestamp:B.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Nu(s=process.cwd()){try{let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Bs.join(I.getGlobalProjectPath(e),"snapshots"),n=Bs.join(t,"history.json"),r;try{let o=await ce.readFile(n);r=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1033
1059
  SNAPSHOT HISTORY
1034
1060
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1035
1061
  `),{success:!0,snapshots:[]};throw o}return console.log(`
1036
1062
  SNAPSHOT HISTORY
1037
- `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1038
- `)):(s.snapshots.forEach((o,i)=>{let a=i===s.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${s.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1063
+ `),console.log("=".repeat(50)),r.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1064
+ `)):(r.snapshots.forEach((o,i)=>{let a=i===r.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${r.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1039
1065
  `)),console.log(`${"=".repeat(50)}
1040
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Ou=y(()=>{"use strict";Dn();_();rt();l(Du,"recover");l(Ru,"undo");l($u,"redo");l(Mu,"history")});var Ws,Fu=y(()=>{"use strict";rt();Iu();ju();Ou();Iu();ju();Ou();Ws=class extends ke{static{l(this,"MaintenanceCommands")}_cleanupMemory=aa;_cleanupMemoryInternal=ca;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Eu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Au(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Du(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ru(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$u(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Mu(e):t}}});import je from"chalk";function la(r,e,t){return t==="below"?r<=e?je.green("\u2713"):je.yellow("\u26A0"):r>=e?je.green("\u2713"):je.yellow("\u26A0")}var Rn,Bs,_u=y(()=>{"use strict";ei();_();rt();Rn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(la,"statusIcon");Bs=class extends ke{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await zn.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1066
+ `),{success:!0,snapshots:r.snapshots,current:r.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Lu=y(()=>{"use strict";On();N();ot();l(Ou,"recover");l(Fu,"undo");l(_u,"redo");l(Nu,"history")});var Vs,Uu=y(()=>{"use strict";ot();Ru();Mu();Lu();Ru();Mu();Lu();Vs=class extends be{static{l(this,"MaintenanceCommands")}_cleanupMemory=ma;_cleanupMemoryInternal=ga;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Du(e,t):n}async design(e=null,t={},n=process.cwd()){let r=await this.ensureProjectInit(n);return r.success?$u(e,t,n):r}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ou(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Fu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?_u(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nu(e):t}}});import je from"chalk";function fa(s,e,t){return t==="below"?s<=e?je.green("\u2713"):je.yellow("\u26A0"):s>=e?je.green("\u2713"):je.yellow("\u26A0")}var Fn,Js,Hu=y(()=>{"use strict";ri();N();ot();Fn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(fa,"statusIcon");Js=class extends be{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Vn.getReport(r,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1041
1067
  ${je.dim("No performance data yet.")}`),console.log(`${je.dim("Metrics are collected automatically as you use the CLI.")}
1042
1068
  `),{success:!0,message:"No data"};if(console.log(`
1043
- ${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=la(i.startup.avg,Rn.startup.max,"below");console.log(` Startup: avg ${je.bold(`${i.startup.avg}ms`)} ${je.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${je.dim(`target: <${Rn.startup.max}ms`)}`)}if(i.memory){let c=la(i.memory.peakHeapMB,Rn.heapMB.max,"below");console.log(` Memory: avg ${je.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${je.dim(`target: <${Rn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=la(i.contextCorrectness.rate,Rn.contextRate.min,"above");console.log(` Context: ${je.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${je.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${je.dim(`target: ${Rn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=la(i.subtaskHandoff.rate,Rn.handoffRate.min,"above");console.log(` Handoff: ${je.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${je.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${je.dim(`target: ${Rn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1044
- ${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import Nu from"node:fs/promises";import IP from"node:path";import ae from"chalk";var Vs,Lu=y(()=>{"use strict";xn();Ce();_();xe();dt();rt();Vs=class extends ke{static{l(this,"SetupCommands")}async start(){let t=await(Be(),xt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1069
+ ${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=fa(i.startup.avg,Fn.startup.max,"below");console.log(` Startup: avg ${je.bold(`${i.startup.avg}ms`)} ${je.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${je.dim(`target: <${Fn.startup.max}ms`)}`)}if(i.memory){let c=fa(i.memory.peakHeapMB,Fn.heapMB.max,"below");console.log(` Memory: avg ${je.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${je.dim(`target: <${Fn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=fa(i.contextCorrectness.rate,Fn.contextRate.min,"above");console.log(` Context: ${je.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${je.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${je.dim(`target: ${Fn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=fa(i.subtaskHandoff.rate,Fn.handoffRate.min,"above");console.log(` Handoff: ${je.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${je.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${je.dim(`target: ${Fn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1070
+ ${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import Gu from"node:fs/promises";import Ux from"node:path";import ae from"chalk";var qs,zu=y(()=>{"use strict";An();Se();N();ve();dt();ot();qs=class extends be{static{l(this,"SetupCommands")}async start(){let t=await(Je(),xt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1045
1071
  `),!(await Ee.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1046
1072
 
1047
1073
  Please install it first:
1048
- - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ee.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
1049
- \u2705 Installed ${s.installed?.length??0} commands to:
1050
- ${A.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
1051
- \u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1074
+ - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let r=await Ee.installCommands();if(!r.success)return{success:!1,message:`\u274C Installation failed: ${r.error}`};if(console.log(`
1075
+ \u2705 Installed ${r.installed?.length??0} commands to:
1076
+ ${I.getDisplayPath(r.path||"")}`),(r.errors?.length??0)>0){console.log(`
1077
+ \u26A0\uFE0F ${r.errors?.length??0} errors:`);for(let o of r.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1052
1078
  \u{1F389} Setup complete!`),console.log(`
1053
1079
  Next steps:`),console.log(` 1. Open ${t.displayName}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: /p:init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1054
1080
  `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ee.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ee.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1055
1081
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1056
1082
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
1057
- \u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),s=n.path?A.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Be(),xt(ut)).getActiveProvider()).name==="claude"){console.log(`
1083
+ \u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),r=n.path?I.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${r}`):n.action==="updated"?console.log(`\u2705 Updated ${r}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${r}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Je(),xt(ut)).getActiveProvider()).name==="claude"){console.log(`
1058
1084
  \u26A1 Installing status line...`);let a=await this.installStatusLine();a.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${a.error}`)}return console.log(`
1059
1085
  \u{1F389} Setup complete!
1060
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),n=IP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1086
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=I.getClaudeDir(),t=I.getClaudeSettingsPath(),n=Ux.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
1061
1087
  # prjct Status Line for Claude Code
1062
1088
  # Shows version update notifications and current task
1063
1089
 
1064
1090
  # Current CLI version (embedded at install time)
1065
- CLI_VERSION="${fe}"
1091
+ CLI_VERSION="${Pe}"
1066
1092
 
1067
1093
  # Read JSON context from stdin (provided by Claude Code)
1068
1094
  read -r json
@@ -1113,16 +1139,16 @@ fi
1113
1139
 
1114
1140
  # Default: show prjct branding
1115
1141
  echo "\u26A1 prjct"
1116
- `;await Nu.writeFile(n,s,{mode:493});let o={};if(await P(t))try{o=JSON.parse(await Nu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Nu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${fe} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import ht from"node:path";async function AP(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await P(ht.join(r,"pnpm-lock.yaml"))?"pnpm":await P(ht.join(r,"yarn.lock"))?"yarn":await P(ht.join(r,"bun.lockb"))||await P(ht.join(r,"bun.lock"))?"bun":(await P(ht.join(r,"package-lock.json")),"npm")}function ih(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function jP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Hu(r){let e=ht.join(r,"package.json"),t=await _n(e,null);if(t){let o=await AP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:ih(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:ih(o,"typecheck")}),i.test&&(a.test={tool:o,command:jP(o)}),a}if(await P(ht.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await fs(ht.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await P(ht.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await P(ht.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await hs(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await P(ht.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await P(ht.join(r,"gradlew"))&&(await P(ht.join(r,"build.gradle"))||await P(ht.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var ah=y(()=>{"use strict";xe();l(AP,"detectPackageManager");l(ih,"pmRun");l(jP,"pmTest");l(Hu,"detectProjectCommands")});import{exec as DP}from"node:child_process";import{promisify as RP}from"node:util";import Vt from"chalk";function uo(r,e){return`workflow:${r}_${e}`}async function ch(r,e){let t=uo(e.hook,e.command);switch(e.scope){case"permanent":await Te.recordDecision(r,t,e.action,"workflow");break;case"session":ua.set(t,e);break;case"once":Js.set(t,e);break}}async function MP(r,e){let t={};for(let n of["before","after","skip"]){let s=uo(n,e),o=Js.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ua.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Te.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function $n(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await MP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=uo(e,t);Js.has(i)&&Js.delete(i),console.log(`
1117
- ${Vt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await $P(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${Vt.green("\u2713")} ${Vt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Vt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(Vt.dim(c.split(`
1118
- `)[0])),{success:!1,failed:o,output:c}}}async function Uu(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=uo(o,s),a=Js.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=ua.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Te.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}async function lh(r,e,t){let n=uo(e,t);return Js.delete(n),ua.delete(n),await Te.recordDecision(r,n,"","workflow:remove"),!0}function uh(r){if(r.length===0)return`${Vt.dim(Ir.NO_PREFERENCES)}
1142
+ `;await Gu.writeFile(n,r,{mode:493});let o={};if(await x(t))try{o=JSON.parse(await Gu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Gu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${Pe} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import ht from"node:path";async function Hx(s,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await x(ht.join(s,"pnpm-lock.yaml"))?"pnpm":await x(ht.join(s,"yarn.lock"))?"yarn":await x(ht.join(s,"bun.lockb"))||await x(ht.join(s,"bun.lock"))?"bun":(await x(ht.join(s,"package-lock.json")),"npm")}function fh(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function Gx(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function Wu(s){let e=ht.join(s,"package.json"),t=await Un(e,null);if(t){let o=await Hx(s,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:fh(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:fh(o,"typecheck")}),i.test&&(a.test={tool:o,command:Gx(o)}),a}if(await x(ht.join(s,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await ws(ht.join(s,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await x(ht.join(s,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await x(ht.join(s,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await ks(s)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await x(ht.join(s,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await x(ht.join(s,"gradlew"))&&(await x(ht.join(s,"build.gradle"))||await x(ht.join(s,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var hh=y(()=>{"use strict";ve();l(Hx,"detectPackageManager");l(fh,"pmRun");l(Gx,"pmTest");l(Wu,"detectProjectCommands")});import{exec as zx}from"node:child_process";import{promisify as Wx}from"node:util";import qt from"chalk";function go(s,e){return`workflow:${s}_${e}`}async function yh(s,e){let t=go(e.hook,e.command);switch(e.scope){case"permanent":await Te.recordDecision(s,t,e.action,"workflow");break;case"session":ha.set(t,e);break;case"once":Ks.set(t,e);break}}async function Vx(s,e){let t={};for(let n of["before","after","skip"]){let r=go(n,e),o=Ks.get(r);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ha.get(r);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Te.getSmartDecision(s,r);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function hn(s,e,t,n={}){if(n.skipHooks)return{success:!0};let r=await Vx(s,t);if(r.skip)return{success:!0,skipped:[t]};let o=r[e];if(!o)return{success:!0};let i=go(e,t);Ks.has(i)&&Ks.delete(i),console.log(`
1143
+ ${qt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await Bx(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${qt.green("\u2713")} ${qt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(qt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(qt.dim(c.split(`
1144
+ `)[0])),{success:!1,failed:o,output:c}}}async function Bu(s){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let r of t)for(let o of n){let i=go(o,r),a=Ks.get(i);if(a){e.push({key:`${o} ${r}`,action:a.action,scope:"once"});continue}let c=ha.get(i);if(c){e.push({key:`${o} ${r}`,action:c.action,scope:"session"});continue}let u=await Te.getSmartDecision(s,i);u&&e.push({key:`${o} ${r}`,action:u,scope:"permanent"})}return e}async function wh(s,e,t){let n=go(e,t);return Ks.delete(n),ha.delete(n),await Te.recordDecision(s,n,"","workflow:remove"),!0}function kh(s){if(s.length===0)return`${qt.dim(Ar.NO_PREFERENCES)}
1119
1145
 
1120
- Set one: "${Ir.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];for(let t of r){let n=t.scope==="permanent"?Vt.green("permanent"):t.scope==="session"?Vt.yellow("session"):Vt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Vt.dim(`Modify: "${Ir.MODIFY_EXAMPLE}"`)),e.push(Vt.dim(`Remove: "${Ir.REMOVE_EXAMPLE}"`)),e.join(`
1121
- `)}var $P,ua,Js,Gu=y(()=>{"use strict";Rs();_();ln();$P=RP(DP),ua=new Map,Js=new Map;l(uo,"prefKey");l(ch,"setWorkflowPreference");l(MP,"getWorkflowPreferences");l($n,"runWorkflowHooks");l(Uu,"listWorkflowPreferences");l(lh,"removeWorkflowPreference");l(uh,"formatWorkflowPreferences")});import dh from"node:path";var qs,zu=y(()=>{"use strict";Rs();Ut();_();_s();Ns();ah();Gu();rt();qs=class extends ke{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Ke.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1146
+ Set one: "${Ar.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];for(let t of s){let n=t.scope==="permanent"?qt.green("permanent"):t.scope==="session"?qt.yellow("session"):qt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(qt.dim(`Modify: "${Ar.MODIFY_EXAMPLE}"`)),e.push(qt.dim(`Remove: "${Ar.REMOVE_EXAMPLE}"`)),e.join(`
1147
+ `)}var Bx,ha,Ks,Vu=y(()=>{"use strict";Ms();N();un();Bx=Wx(zx),ha=new Map,Ks=new Map;l(go,"prefKey");l(yh,"setWorkflowPreference");l(Vx,"getWorkflowPreferences");l(hn,"runWorkflowHooks");l(Bu,"listWorkflowPreferences");l(wh,"removeWorkflowPreference");l(kh,"formatWorkflowPreferences")});import Sh from"node:path";var Ys,Ju=y(()=>{"use strict";Ms();Bt();N();Ns();Ls();hh();Vu();ot();Ys=class extends be{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Xe.get("Bash"),r=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(r),i=`${o.stdout}
1122
1148
  ${o.stderr}`.trim(),a=i.split(`
1123
1149
  `),c;for(let m=a.length-1;m>=0;m--)if(a[m].startsWith("__EXIT:")){c=a[m];break}let u=c?Number(c.replace("__EXIT:","").trim()):1,d=i.split(`
1124
1150
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
1125
- `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await $n(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:B.getTimestamp()}),await Te.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Te.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Te.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await $n(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Pi("ship"),S=Ie(en(`Shipped: ${i}`,`Version: ${d}`),st("Results",Gt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),Qe(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(S)}else h.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async _runLint(e){try{let t=await Hu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Hu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=dh.join(e,"package.json"),n=await ce.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ce.writeJson(t,n)),c}catch(t){if(v(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=dh.join(n,"CHANGELOG.md"),o=await ce.readFile(s,`# Changelog
1151
+ `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await hn(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:B.getTimestamp()}),await Te.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Te.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Te.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await hn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Ai("ship"),k=Ie(tn(`Shipped: ${i}`,`Version: ${d}`),rt("Results",At([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),et(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(k)}else h.done(`v${d} shipped`),Ct("ship");return{success:!0,feature:i,version:d}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async _runLint(e){try{let t=await Wu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return P(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Wu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return P(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Sh.join(e,"package.json"),n=await ce.readJson(t,{version:"0.0.0"}),r=n?.version||"0.0.0",[o,i,a]=r.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ce.writeJson(t,n)),c}catch(t){if(P(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let r=Sh.join(n,"CHANGELOG.md"),o=await ce.readFile(r,`# Changelog
1126
1152
 
1127
1153
  `),i=`## [${t}] - ${B.formatDate(new Date)}
1128
1154
 
@@ -1133,73 +1159,82 @@ ${o.stderr}`.trim(),a=i.split(`
1133
1159
 
1134
1160
  `,`# Changelog
1135
1161
 
1136
- ${i}`);await ce.writeFile(s,a)}catch(s){v(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Ke.get("Bash")("git add .");let n=`feat: ${e}
1162
+ ${i}`);await ce.writeFile(r,a)}catch(r){P(r)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Xe.get("Bash")("git add .");let n=`feat: ${e}
1137
1163
 
1138
- Generated with [p/](https://www.prjct.app/)`;return await Ke.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return v(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Ke.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return v(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import OP from"node:fs/promises";import FP from"node:path";import Ks from"chalk";var Ys,Wu=y(()=>{"use strict";Ve();Ce();xi();_();Nt();rt();Ys=class extends ke{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(Ks.dim(`[dry-run] Would update ${o.length} project(s)
1139
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ks.dim("would update")} ${m}`);continue}try{let p=await Wr(d),g=await vi(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ks.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ks.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${Ks.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ks.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=FP.join(A.getGlobalBasePath(),"projects");try{return(await OP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import De from"chalk";var Xs,Bu=y(()=>{"use strict";Cl();vs();rl();_();Xn();rt();Xs=class extends ke{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await gt.getAll(s);if(i.length===0)return console.log(`
1164
+ Generated with [p/](https://www.prjct.app/)`;return await Xe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Xe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import Jx from"node:fs/promises";import qx from"node:path";import Xs from"chalk";var Qs,qu=y(()=>{"use strict";qe();Se();Ii();N();Gt();ot();Qs=class extends be{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,r=e.all===!0;try{let o=r?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(Xs.dim(`[dry-run] Would update ${o.length} project(s)
1165
+ `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Xs.dim("would update")} ${m}`);continue}try{let p=await Br(d),g=await Ei(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Xs.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Xs.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Xs.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Xs.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=qx.join(I.getGlobalBasePath(),"projects");try{return(await Jx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import De from"chalk";var Zs,Ku=y(()=>{"use strict";jl();xs();ml();N();Zn();ot();Zs=class extends be{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await gt.getAll(r);if(i.length===0)return console.log(`
1140
1166
  ${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
1141
- `),{success:!0,message:"No data"};let a=$i(i,o);await sl.saveMetrics(s,a),console.log(`
1167
+ `),{success:!0,message:"No data"};let a=_i(i,o);await pl.saveMetrics(r,a),console.log(`
1142
1168
  ${De.cyan("Sprint Velocity")} ${De.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?De.green:m.estimationAccuracy>=60?De.yellow:De.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${De.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?De.green("\u2191"):a.velocityTrend==="declining"?De.red("\u2193"):De.dim("\u2192");if(console.log(` Average: ${De.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${De.bold(`${a.estimationAccuracy}%`)} ${De.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1143
- ${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=eg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1144
- ${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...kn,...n.velocity}}catch{}return kn}}});var _P,NP,mh,da,ph,gh,fh=y(()=>{"use strict";Xn();_P=[1,2,3,5,8,13,21],NP={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}},mh=l(r=>_P.includes(r),"isValidPoint"),da=l(r=>NP[r],"pointsToMinutes"),ph=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"),gh=l(r=>{let e=da(r);return`${ph(e.min)}\u2013${ph(e.max)}`},"pointsToTimeRange")});function Vu(){et.clear(),Jt.clear(),Qs.clear(),Zs.clear()}function Ju(){return{issues:et.stats(),assignedIssues:Jt.stats(),teams:Qs.stats(),projects:Zs.stats()}}var pa,et,Jt,Qs,Zs,qu=y(()=>{"use strict";Jo();pa=300*1e3,et=new Ft({ttl:pa,maxSize:100}),Jt=new Ft({ttl:pa,maxSize:10}),Qs=new Ft({ttl:pa,maxSize:5}),Zs=new Ft({ttl:pa,maxSize:5});l(Vu,"clearLinearCache");l(Ju,"getLinearCacheStats")});import{exec as LP}from"node:child_process";import{promisify as HP}from"node:util";async function ma(r){if(process.platform!=="darwin")return hh(r);try{let{stdout:e}=await UP(`security find-generic-password -s "${GP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return hh(r)}}function hh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var UP,GP,Ku=y(()=>{"use strict";_();UP=HP(LP),GP="prjct-cli";l(ma,"getCredential");l(hh,"getEnvFallback")});var zP,WP,yh,ga,yt,Yu=y(()=>{"use strict";_();Ku();zP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},WP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},yh={none:0,urgent:1,high:2,medium:3,low:4},ga=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ma("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?yh[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=yh[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:zP[t?.type||"backlog"]||"backlog",priority:WP[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new ga});var fa,Rt,Xu=y(()=>{"use strict";qu();Yu();fa=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Jt.get(t);if(n)return n;let s=await yt.fetchAssignedIssues(e);Jt.set(t,s);for(let o of s)et.set(`issue:${o.id}`,o),et.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Jt.get(n);if(s)return s;let o=await yt.fetchTeamIssues(e,t);Jt.set(n,o);for(let i of o)et.set(`issue:${i.id}`,i),et.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=et.get(t);if(n)return n;let s=await yt.fetchIssue(e);return s&&(et.set(`issue:${s.id}`,s),et.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return et.set(`issue:${t.id}`,t),et.set(`issue:${t.externalId}`,t),Jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return et.set(`issue:${n.id}`,n),et.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),et.delete(`issue:${e}`),Jt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),et.delete(`issue:${e}`),Jt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Qs.get("teams");if(e)return e;let t=await yt.getTeams();return Qs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Zs.get("projects");if(e)return e;let t=await yt.getProjects();return Zs.set("projects",t),t}clearCache(){Vu()}getCacheStats(){return Ju()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Rt=new fa});var wh,ha,BP,Sh=y(()=>{"use strict";Za();he();_();Xu();wh=1800*1e3,ha=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Rt.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:wh,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Rt.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Rt.markInProgress(t):n==="done"&&await Rt.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||wh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Jd("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},BP=new ha});var kh=y(()=>{"use strict";qu();Yu();Xu();Sh()});import VP from"node:fs/promises";import JP from"node:os";import qP from"node:path";function KP(r){return qP.join(JP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function ya(r){let e=KP(r);if(!await P(e))return{};try{return JSON.parse(await VP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function Qu(r){let e=await ya(r);return e.linear?.apiKey?e.linear.apiKey:ma("linear-api-key")}var bh=y(()=>{"use strict";_();xe();Ku();l(KP,"getCredentialsPath");l(ya,"getProjectCredentials");l(Qu,"getLinearApiKey")});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`}function YP(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var er,Zu=y(()=>{"use strict";Wl();Hl();fh();kh();Ot();Ut();_();_s();Ns();bh();Gu();Xn();rt();er=class extends ke{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await $n(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await Bi.execute("task",{task:e},t);if(!a.success)return n.md||h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await ya(o),S=await Qu(o);if(S&&f.linear?.teamId){await Rt.initializeFromApiKey(S,f.linear.teamId);let b=await Rt.fetchIssue(e);b&&(c=e,u=`${e}: ${b.title}`,await Rt.markInProgress(e))}}catch{}await L.startTask(o,{id:Se(),description:u,sessionId:Se(),linearId:c});let m=await Ll.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;if(n.md){let f=a.subtasks||[],S=ol({description:u,branch:a.branch,linearId:c,type:a.type}),b=f.length>0?il(f,0):"",D=Pm(["All commits must include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"]),x=Qe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(S,b,D,x))}else h.done(`${e}`,{agents:g>0?g:void 0}),Vr("working"),bt("task");return await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:B.getTimestamp()}),await $n(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:mh,pointsToMinutes:da,pointsToTimeRange:gh,storeEstimate:l(async f=>{let S=da(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Tn("No active task")):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?B.calculateDuration(new Date(i.startedAt)):void 0,c=ol({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?il(u,d):"",p=Qe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){return n.md?console.log(`> Error: ${w(s)}`):h.fail(w(s)),{success:!1,error:w(s)}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await $n(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Ch(d):"0m",actualDuration:c||"0m",variance:d?YP(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,S=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Ch(d)}) \u2192 ${b}${S}%`}await L.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await ya(s),S=await Qu(s);S&&f.linear?.teamId&&(await Rt.initializeFromApiKey(S,f.linear.teamId),await Rt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(en("Subtask Complete",`**Completed:** ${a}${f}`),zt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Qe([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Vr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await $n(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Pe.getActiveTasks(s);if(o.length===0)return t.md?console.log(Tn("Queue is empty")):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(st("Queue",`${o.length} task${o.length!==1?"s":""}`),Gt(i,!0),Qe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Tn("No active task to pause")):h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};let a="";if(i.startedAt&&(a=B.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(en("Task Paused",`**Paused:** ${i.description}`),zt({Reason:e||void 0,"Duration worked":a||void 0}),Qe([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Vr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?console.log(Tn(`Already working on: ${i.description}`)):h.warn("already working on a task"),{success:!1,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(en("Task Resumed",`**Resumed:** ${a.description}`),Qe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Vr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?console.log(Tn("No paused task found")):h.warn("no paused task to resume"),{success:!1,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Uu(s);return console.log(uh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await ch(s,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await lh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Uu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Ch,"formatMinutesToDuration");l(YP,"formatVariance")});var gn,TB,vh=y(()=>{"use strict";qi();Pu();Tu();Fu();_u();Ji();Lu();zu();Wu();Bu();Zu();gn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new er,this.planning=new rs,this.shipping=new qs,this.analytics=new Gs,this.performanceCmds=new Bs,this.maintenance=new Ws,this.analysis=new cs,this.setupCmds=new Vs,this.updateCmds=new Ys,this.velocityCmds=new Xs,this.contextCmds=new ls,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},TB=new gn});var po,tr,ed=y(()=>{"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}},tr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Eh={};ge(Eh,{UninstallCommands:()=>go,uninstall:()=>Th});import{execSync as wa}from"node:child_process";import wt from"node:fs/promises";import XP from"node:os";import fn from"node:path";import QP from"node:readline";import be from"chalk";async function td(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=fn.join(r,n.name);if(n.isDirectory())e+=await td(s);else try{let o=await wt.stat(s);e+=o.size}catch{}}}catch{}return e}function xh(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 ZP(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function eT(){let r={homebrew:!1,npm:!1};try{wa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{wa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function tT(){let r=[],e=Yp(),t=A.getGlobalBasePath(),n=await P(t),s=n?await ZP(fn.join(t,"projects")):0,o=n?await td(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=fn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let K=await wt.readFile(i,"utf-8");c=K.includes(Sa)&&K.includes(mo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await P(u),m=d?await td(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await P(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=fn.join(e.claude.config,"prjct-statusline.sh"),S=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=fn.join(e.gemini.config,"GEMINI.md"),O=await P(x),F=!1;if(O)try{let K=await wt.readFile(x,"utf-8");F=K.includes(Sa)&&K.includes(mo)}catch{}return O&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function nT(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Sa)||!e.includes(mo))return!1;let t=e.indexOf(Sa),n=e.indexOf(mo)+mo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1145
-
1146
- `).trim(),!s||s.trim().length===0?await wt.unlink(r):await wt.writeFile(r,`${s}
1147
- `,"utf-8"),!0}catch{return!1}}async function sT(){let r=XP.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=fn.join(r,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let n=A.getGlobalBasePath();return await P(n)&&await Ph(n,fn.join(t,".prjct-cli")),t}catch{return null}}async function Ph(r,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=fn.join(r,n.name),o=fn.join(e,n.name);n.isDirectory()?await Ph(s,o):await wt.copyFile(s,o)}}async function rT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await nT(o.path)&&n.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||wa(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||wa("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}async function oT(r){let e=QP.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Th(r={},e=process.cwd()){let t=await tT(),n=eT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(be.yellow(`
1148
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(be.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(be.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=be.dim("(section only)"):c.size&&(d=be.dim(`(${xh(c.size)})`)),console.log(` ${be.cyan(u.padEnd(35))} ${d}`),console.log(` ${be.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${be.cyan("Homebrew".padEnd(35))} ${be.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${be.cyan("npm global".padEnd(35))} ${be.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(be.dim(` Total size: ${xh(o)}`)),console.log("")),r.dryRun)return console.log(be.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(be.blue("Creating backup..."));let c=await sT();c?(console.log(be.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(be.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(be.yellow('Type "uninstall" to confirm:')),!await oT("> ")))return console.log(be.yellow(`
1149
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(be.blue("Removing prjct..."));let{deleted:i,errors:a}=await rT(t,n,r);if(console.log(""),i.length>0&&console.log(be.green(`Removed ${i.length} items`)),a.length>0){console.log(be.yellow(`
1150
- ${a.length} errors:`));for(let c of a)console.log(be.red(` - ${c}`))}return console.log(""),console.log(be.green("prjct has been uninstalled.")),console.log(be.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 Sa,mo,go,nd=y(()=>{"use strict";xn();Ce();_();xe();rt();Sa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",mo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(td,"getDirectorySize");l(xh,"formatSize");l(ZP,"countDirectoryItems");l(eT,"detectInstallation");l(tT,"gatherUninstallItems");l(nT,"removePrjctSection");l(sT,"createBackup");l(Ph,"copyDirectory");l(rT,"performUninstall");l(oT,"promptConfirmation");l(Th,"uninstall");go=class extends ke{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Th(e,t)}}});function pT(){for(let[r,e]of Object.entries(po))G.registerCategory(r,e)}function jh(){if(G.has("work"))return;pT();let r=l(e=>tr.find(t=>t.name===e),"getMeta");G.registerMethod("task",nr,"now",r("task")),G.registerMethod("done",nr,"done",r("done")),G.registerMethod("next",nr,"next",r("next")),G.registerMethod("pause",nr,"pause",r("pause")),G.registerMethod("resume",nr,"resume",r("resume")),G.registerMethod("workflow",nr,"workflow",r("workflow")),G.registerMethod("init",ka,"init",r("init")),G.registerMethod("bug",ka,"bug",r("bug")),G.registerMethod("idea",ka,"idea",r("idea")),G.registerMethod("spec",ka,"spec",r("spec")),G.registerMethod("ship",iT,"ship",r("ship")),G.registerMethod("dash",Ih,"dash",r("dash")),G.registerMethod("help",Ih,"help",r("help")),G.registerMethod("perf",aT,"perf",r("perf")),G.registerMethod("velocity",lT,"velocity",r("velocity")),G.registerMethod("cleanup",sr,"cleanup",r("cleanup")),G.registerMethod("design",sr,"design",r("design")),G.registerMethod("recover",sr,"recover",r("recover")),G.registerMethod("undo",sr,"undo",r("undo")),G.registerMethod("redo",sr,"redo",r("redo")),G.registerMethod("history",sr,"history",r("history")),G.registerMethod("analyze",rr,"analyze",r("analyze")),G.registerMethod("sync",rr,"sync",r("sync")),G.registerMethod("stats",rr,"stats",r("stats")),G.registerMethod("status",rr,"status",r("status")),G.registerMethod("seal",rr,"seal",r("seal")),G.registerMethod("verify",rr,"verify",r("verify")),G.registerMethod("start",Ah,"start",r("start")),G.registerMethod("setup",Ah,"setup",r("setup")),G.registerMethod("uninstall",uT,"uninstall",r("uninstall")),G.registerMethod("update",dT,"update",r("update")),G.registerMethod("context",cT,"context",r("context"))}var nr,ka,iT,Ih,aT,sr,rr,Ah,cT,lT,uT,dT,ba=y(()=>{"use strict";qi();Pu();ed();Tu();Fu();_u();Ji();Us();Lu();zu();nd();Wu();Bu();Zu();nr=new er,ka=new rs,iT=new qs,Ih=new Gs,aT=new Bs,sr=new Ws,rr=new cs,Ah=new Vs,cT=new ls,lT=new Xs,uT=new go,dT=new Ys;l(pT,"registerCategories");l(jh,"registerAllCommands");jh()});var sd=y(()=>{"use strict";ac();vh();ba();Us()});var Rh={};ge(Rh,{shutdown:()=>ir,startDaemon:()=>gT});import $t from"node:fs";import{createServer as mT}from"node:net";async function gT(r){let e=Ue.socket(),t=Ue.pid(),n=Ue.runDir();if($t.mkdirSync(n,{recursive:!0}),$t.existsSync(t)){let s=parseInt($t.readFileSync(t,"utf-8").trim(),10);ST(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),$t.unlinkSync(t)}if($t.existsSync(e)&&$t.unlinkSync(e),We={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ea,idleTimer:null},Le=new gn,or=mT(s=>fT(s)),or.listen(e,()=>{$t.chmodSync(e,384),$t.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Dh()}),or.on("error",s=>{console.error("Daemon socket error:",s.message),ir(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||Yo;fo=Ko({port:i,projectId:o,projectPath:s,enableLogging:!1}),await fo.start()}}catch{}if(process.on("SIGTERM",()=>ir(0)),process.on("SIGINT",()=>ir(0)),process.on("SIGHUP",()=>{Le=new gn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function fT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1151
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await hT(o);r.write(ds(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ds(i))}}}),r.on("error",()=>{})}async function hT(r){if(!We||!Le)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Dh(),We.commandsServed++,We.lastActivity=Date.now(),r.command==="daemon")return wT(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await yT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1169
+ ${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=ag(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1170
+ ${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Pn,...n.velocity}}catch{}return Pn}}});var Kx,Yx,Ch,ya,bh,Ph,vh=y(()=>{"use strict";Zn();Kx=[1,2,3,5,8,13,21],Yx={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}},Ch=l(s=>Kx.includes(s),"isValidPoint"),ya=l(s=>Yx[s],"pointsToMinutes"),bh=l(s=>{if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Ph=l(s=>{let e=ya(s);return`${bh(e.min)}\u2013${bh(e.max)}`},"pointsToTimeRange")});function Yu(){nt.clear(),Kt.clear(),er.clear(),tr.clear()}function Xu(){return{issues:nt.stats(),assignedIssues:Kt.stats(),teams:er.stats(),projects:tr.stats()}}var wa,nt,Kt,er,tr,Qu=y(()=>{"use strict";Xo();wa=300*1e3,nt=new Ut({ttl:wa,maxSize:100}),Kt=new Ut({ttl:wa,maxSize:10}),er=new Ut({ttl:wa,maxSize:5}),tr=new Ut({ttl:wa,maxSize:5});l(Yu,"clearLinearCache");l(Xu,"getLinearCacheStats")});import{exec as Xx}from"node:child_process";import{promisify as Qx}from"node:util";async function ka(s){if(process.platform!=="darwin")return xh(s);try{let{stdout:e}=await Zx(`security find-generic-password -s "${eT}" -a "${s}" -w 2>/dev/null`);return e.trim()||null}catch{return xh(s)}}function xh(s){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[s];return process.env[t]||null}var Zx,eT,Zu=y(()=>{"use strict";N();Zx=Qx(Xx),eT="prjct-cli";l(ka,"getCredential");l(xh,"getEnvFallback")});var tT,nT,Th,Sa,yt,ed=y(()=>{"use strict";N();Zu();tT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},nT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Th={none:0,urgent:1,high:2,medium:3,low:4},Sa=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ka("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(r){throw this.sdk=null,new Error(`Linear connection failed: ${w(r)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let r=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(r.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let r=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(r.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,r,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===r);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let r=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Th[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!r)throw new Error("Failed to create issue");return this.mapIssue(r)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let r={};t.title!==void 0&&(r.title=t.title),t.description!==void 0&&(r.description=t.description),t.priority!==void 0&&(r.priority=Th[t.priority]),t.assigneeId!==void 0&&(r.assigneeId=t.assigneeId),t.stateId!==void 0&&(r.stateId=t.stateId),t.projectId!==void 0&&(r.projectId=t.projectId),t.labels!==void 0&&n.team&&(r.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,r);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let r=await(await this.sdk.issue(t.id)).team;if(!r)throw new Error("Issue has no team");let i=(await r.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let r=await(await this.sdk.issue(t.id)).team;if(!r)throw new Error("Issue has no team");let i=(await r.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,r=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:tT[t?.type||"backlog"]||"backlog",priority:nT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:r?{id:r.id,name:r.name,key:r.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),r=t.map(o=>o.toLowerCase());return r.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":r.includes("feature")||n.includes("add")||n.includes("implement")?"feature":r.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":r.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new Sa});var ba,Ot,td=y(()=>{"use strict";Qu();ed();ba=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Kt.get(t);if(n)return n;let r=await yt.fetchAssignedIssues(e);Kt.set(t,r);for(let o of r)nt.set(`issue:${o.id}`,o),nt.set(`issue:${o.externalId}`,o);return r}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,r=Kt.get(n);if(r)return r;let o=await yt.fetchTeamIssues(e,t);Kt.set(n,o);for(let i of o)nt.set(`issue:${i.id}`,i),nt.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=nt.get(t);if(n)return n;let r=await yt.fetchIssue(e);return r&&(nt.set(`issue:${r.id}`,r),nt.set(`issue:${r.externalId}`,r)),r}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return nt.set(`issue:${t.id}`,t),nt.set(`issue:${t.externalId}`,t),Kt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return nt.set(`issue:${n.id}`,n),nt.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),nt.delete(`issue:${e}`),Kt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),nt.delete(`issue:${e}`),Kt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=er.get("teams");if(e)return e;let t=await yt.getTeams();return er.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=tr.get("projects");if(e)return e;let t=await yt.getProjects();return tr.set("projects",t),t}clearCache(){Yu()}getCacheStats(){return Xu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ot=new ba});var Eh,Ca,sT,Ih=y(()=>{"use strict";cc();ye();N();td();Eh=1800*1e3,Ca=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let r=await Ot.fetchAssignedIssues({limit:100}),o={};for(let a of r)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:Eh,issues:o};return M.setDoc(e,"issues",i),{provider:"linear",fetched:r.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(r){return n.push({issueId:"all",error:w(r)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let r=n.issues[t],o=new Date(r.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return r}try{let r=await Ot.fetchIssue(t);if(!r)return null;let o=new Date().toISOString(),i=this.toCachedIssue(r,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Ot.markInProgress(t):n==="done"&&await Ot.markDone(t);let r=this.loadIssues(e);if(r?.issues[t]){let o=n==="done"?"done":"in_progress";r.issues[t].status=o,r.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,r)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),r=Date.now(),o=t.staleAfter||Eh;return r-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return M.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){M.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let r=this.loadIssues(e);r||(r=Xd("linear")),r.issues[t]=n,this.saveIssues(e,r)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},sT=new Ca});var Ah=y(()=>{"use strict";Qu();ed();td();Ih()});import rT from"node:fs/promises";import oT from"node:os";import iT from"node:path";function aT(s){return iT.join(oT.homedir(),".prjct-cli","projects",s,"config","credentials.json")}async function Pa(s){let e=aT(s);if(!await x(e))return{};try{return JSON.parse(await rT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function nd(s){let e=await Pa(s);return e.linear?.apiKey?e.linear.apiKey:ka("linear-api-key")}var jh=y(()=>{"use strict";N();ve();Zu();l(aT,"getCredentialsPath");l(Pa,"getProjectCredentials");l(nd,"getLinearApiKey")});import cT from"node:fs/promises";import lT from"node:path";function Dh(s){if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`}async function uT(){try{let{execSync:s}=await import("node:child_process");return s("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}async function dT(s){try{let e=lT.join(s,"analysis","repo-analysis.json"),t=await cT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}function pT(s,e){if(!s&&!e)return null;let t=e?.ecosystem||null,n=s?.languages?.join(", ")||null,r=s?.frameworks?.join(", ")||null,o=s?.packageManager||null,i=s?.sourceDir||e?.structure?.srcDir||null,a=s?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),r&&(c.Frameworks=r),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=jt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: ${k}`);m=`Commands
1171
+ ${At(g)}`}return[u?`Project
1172
+ ${u}`:null,m].filter(Boolean).join(`
1173
+
1174
+ `)||null}function mT(s){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=s?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(r=>r.toLowerCase()===n.toLowerCase())&&e.push(n);return Dm(e)}function gT(s){if(!s)return null;let e=[],t=s.patterns;if(Array.isArray(t)&&t.length>0){let r=t.map(o=>{let i=o.location?` \u2014 ${o.location}`:"";return`- ${o.name}: ${o.description}${i}`});e.push(`Patterns (follow these)
1175
+ ${r.join(`
1176
+ `)}`)}let n=s.antiPatterns;if(Array.isArray(n)&&n.length>0){let r=n.map(o=>`- ${o.issue} \u2014 ${o.file} \u2192 ${o.suggestion}`);e.push(`Anti-patterns (avoid these)
1177
+ ${r.join(`
1178
+ `)}`)}return e.length>0?e.join(`
1179
+
1180
+ `):null}function fT(s){let e=s>=0?"+":"-",t=Math.abs(s);if(t>=60){let n=Math.floor(t/60),r=t%60;return r>0?`${e}${n}h ${r}m`:`${e}${n}h`}return`${e}${t}m`}var nr,sd=y(()=>{"use strict";Xl();Jl();vh();Se();Ah();Lt();Bt();Li();N();Ns();Ls();jh();Vu();Zn();ot();nr=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await hn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Pa(o),k=await nd(o);if(k&&f.linear?.teamId){await Ot.initializeFromApiKey(k,f.linear.teamId);let b=await Ot.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await Ot.markInProgress(e))}}catch{}if(n.md){let f=await L.getCurrentTask(o);if(f)return pn("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await L.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let k=I.getGlobalProjectPath(o),[b,D,v,$]=await Promise.all([uT(),bt.getActive(o).catch(()=>null),dT(k),es(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=gl({description:c,branch:b,linearId:a}),H=pT(D,v),ee=jm($.files.map(Ve=>({path:Ve.path,description:Ve.reasons.join(", ")}))),S=mT(v),j=gT(D),te=et([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(Ie(F,H,ee,S,j,te)),await this.logToMemory(t,"task_started",{task:e,timestamp:B.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Yi.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await L.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let m=await Vl.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Jr("working"),Ct("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:B.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Ch,pointsToMinutes:ya,pointsToTimeRange:Ph,storeEstimate:l(async f=>{let k=ya(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?B.calculateDuration(new Date(i.startedAt)):void 0,c=gl({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Am(u,d):"",p=et([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(r){let o=w(r);return n.md?o.includes("Cannot run")||o.includes("working state")?pn("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(r);if(!o)return t.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await hn(r,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(r,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Dh(d):"0m",actualDuration:c||"0m",variance:d?fT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Dh(d)}) \u2192 ${b}${k}%`}await L.completeTask(r,t.feedback);let g=o.linearId;if(g)try{let f=await Pa(r),k=await nd(r);k&&f.linear?.teamId&&(await Ot.initializeFromApiKey(k,f.linear.teamId),await Ot.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(tn("Completed",`${a}${f}`),jt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),et([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Jr("completed"),Ct("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await hn(r,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await xe.getActiveTasks(r);if(o.length===0)return t.md?pn("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(rt("Queue",`${o.length} task${o.length!==1?"s":""}`),At(i,!0),et([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),Ct("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";if(i.startedAt&&(a=B.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(tn("Task Paused",`**Paused:** ${i.description}`),jt({Reason:e||void 0,"Duration worked":a||void 0}),et([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Jr("paused"),Ct("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async resume(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?pn("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(tn("Task Resumed",`**Resumed:** ${a.description}`),et([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Jr("working"),Ct("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?pn("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Bu(r);return console.log(kh(o)),{success:!0,preferences:o}}return{success:!0,projectId:r,input:e,setWorkflowPreference:l(async o=>{await yh(r,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await wh(r,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Bu(r),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Dh,"formatMinutesToDuration");l(uT,"getGitBranch");l(dT,"loadRepoAnalysis");l(pT,"buildProjectContext");l(mT,"buildRules");l(gT,"buildPatterns");l(fT,"formatVariance")});var yn,YB,Rh=y(()=>{"use strict";Zi();Au();ju();Uu();Hu();Qi();zu();Ju();qu();Ku();sd();yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new nr,this.planning=new as,this.shipping=new Ys,this.analytics=new Ws,this.performanceCmds=new Js,this.maintenance=new Vs,this.analysis=new ds,this.setupCmds=new qs,this.updateCmds=new Qs,this.velocityCmds=new Zs,this.contextCmds=new ps,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},YB=new yn});var fo,sr,rd=y(()=>{"use strict";fo={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}},sr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Fh={};he(Fh,{UninstallCommands:()=>yo,uninstall:()=>Oh});import{execSync as va}from"node:child_process";import wt from"node:fs/promises";import hT from"node:os";import wn from"node:path";import yT from"node:readline";import Ce from"chalk";async function od(s){let e=0;try{let t=await wt.readdir(s,{withFileTypes:!0});for(let n of t){let r=wn.join(s,n.name);if(n.isDirectory())e+=await od(r);else try{let o=await wt.stat(r);e+=o.size}catch{}}}catch{}return e}function $h(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}async function wT(s){try{return(await wt.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function kT(){let s={homebrew:!1,npm:!1};try{va("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{va("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}async function ST(){let s=[],e=em(),t=I.getGlobalBasePath(),n=await x(t),r=n?await wT(wn.join(t,"projects")):0,o=n?await od(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=wn.join(e.claude.config,"CLAUDE.md"),a=await x(i),c=!1;if(a)try{let H=await wt.readFile(i,"utf-8");c=H.includes(xa)&&H.includes(ho)}catch{}s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await x(u),m=d?await od(u):0;s.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await x(p);s.push({path:p,type:"file",description:"Claude router",exists:g});let f=wn.join(e.claude.config,"prjct-statusline.sh"),k=await x(f);s.push({path:f,type:"file",description:"Status line script",exists:k});let b=e.gemini.router,D=await x(b);s.push({path:b,type:"file",description:"Gemini router",exists:D});let v=wn.join(e.gemini.config,"GEMINI.md"),$=await x(v),F=!1;if($)try{let H=await wt.readFile(v,"utf-8");F=H.includes(xa)&&H.includes(ho)}catch{}return $&&F&&s.push({path:v,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}async function bT(s){try{let e=await wt.readFile(s,"utf-8");if(!e.includes(xa)||!e.includes(ho))return!1;let t=e.indexOf(xa),n=e.indexOf(ho)+ho.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
1181
+
1182
+ `).trim(),!r||r.trim().length===0?await wt.unlink(s):await wt.writeFile(s,`${r}
1183
+ `,"utf-8"),!0}catch{return!1}}async function CT(){let s=hT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=wn.join(s,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let n=I.getGlobalBasePath();return await x(n)&&await Mh(n,wn.join(t,".prjct-cli")),t}catch{return null}}async function Mh(s,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(s,{withFileTypes:!0});for(let n of t){let r=wn.join(s,n.name),o=wn.join(e,n.name);n.isDirectory()?await Mh(r,o):await wt.copyFile(r,o)}}async function PT(s,e,t){let n=[],r=[];for(let o of s)if(o.exists)try{o.type==="section"?await bT(o.path)&&n.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),n.push(o.path))}catch(i){r.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||va(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||va("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){r.push(`npm: ${w(o)}`)}}return{deleted:n,errors:r}}async function vT(s){let e=yT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(s,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Oh(s={},e=process.cwd()){let t=await ST(),n=kT(),r=t.filter(c=>c.exists);if(r.length===0&&!n.homebrew&&!n.npm)return console.log(Ce.yellow(`
1184
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ce.white("The following will be permanently deleted:")),console.log("");for(let c of r){let u=I.getDisplayPath(c.path),d="";c.type==="section"?d=Ce.dim("(section only)"):c.size&&(d=Ce.dim(`(${$h(c.size)})`)),console.log(` ${Ce.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ce.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Ce.cyan("Homebrew".padEnd(35))} ${Ce.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Ce.cyan("npm global".padEnd(35))} ${Ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ce.dim(` Total size: ${$h(o)}`)),console.log("")),s.dryRun)return console.log(Ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(s.backup){console.log(Ce.blue("Creating backup..."));let c=await CT();c?(console.log(Ce.green(`Backup created: ${I.getDisplayPath(c)}`)),console.log("")):console.log(Ce.yellow("Failed to create backup, continuing..."))}if(!s.force&&(console.log(Ce.yellow('Type "uninstall" to confirm:')),!await vT("> ")))return console.log(Ce.yellow(`
1185
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await PT(t,n,s);if(console.log(""),i.length>0&&console.log(Ce.green(`Removed ${i.length} items`)),a.length>0){console.log(Ce.yellow(`
1186
+ ${a.length} errors:`));for(let c of a)console.log(Ce.red(` - ${c}`))}return console.log(""),console.log(Ce.green("prjct has been uninstalled.")),console.log(Ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var xa,ho,yo,id=y(()=>{"use strict";An();Se();N();ve();ot();xa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",ho="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(od,"getDirectorySize");l($h,"formatSize");l(wT,"countDirectoryItems");l(kT,"detectInstallation");l(ST,"gatherUninstallItems");l(bT,"removePrjctSection");l(CT,"createBackup");l(Mh,"copyDirectory");l(PT,"performUninstall");l(vT,"promptConfirmation");l(Oh,"uninstall");yo=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Oh(e,t)}}});function DT(){for(let[s,e]of Object.entries(fo))z.registerCategory(s,e)}function Lh(){if(z.has("work"))return;DT();let s=l(e=>sr.find(t=>t.name===e),"getMeta");z.registerMethod("task",rr,"now",s("task")),z.registerMethod("done",rr,"done",s("done")),z.registerMethod("next",rr,"next",s("next")),z.registerMethod("pause",rr,"pause",s("pause")),z.registerMethod("resume",rr,"resume",s("resume")),z.registerMethod("workflow",rr,"workflow",s("workflow")),z.registerMethod("init",Ta,"init",s("init")),z.registerMethod("bug",Ta,"bug",s("bug")),z.registerMethod("idea",Ta,"idea",s("idea")),z.registerMethod("spec",Ta,"spec",s("spec")),z.registerMethod("ship",xT,"ship",s("ship")),z.registerMethod("dash",_h,"dash",s("dash")),z.registerMethod("help",_h,"help",s("help")),z.registerMethod("perf",TT,"perf",s("perf")),z.registerMethod("velocity",IT,"velocity",s("velocity")),z.registerMethod("cleanup",or,"cleanup",s("cleanup")),z.registerMethod("design",or,"design",s("design")),z.registerMethod("recover",or,"recover",s("recover")),z.registerMethod("undo",or,"undo",s("undo")),z.registerMethod("redo",or,"redo",s("redo")),z.registerMethod("history",or,"history",s("history")),z.registerMethod("analyze",ir,"analyze",s("analyze")),z.registerMethod("sync",ir,"sync",s("sync")),z.registerMethod("stats",ir,"stats",s("stats")),z.registerMethod("status",ir,"status",s("status")),z.registerMethod("seal",ir,"seal",s("seal")),z.registerMethod("verify",ir,"verify",s("verify")),z.registerMethod("start",Nh,"start",s("start")),z.registerMethod("setup",Nh,"setup",s("setup")),z.registerMethod("uninstall",AT,"uninstall",s("uninstall")),z.registerMethod("update",jT,"update",s("update")),z.registerMethod("context",ET,"context",s("context"))}var rr,Ta,xT,_h,TT,or,ir,Nh,ET,IT,AT,jT,Ea=y(()=>{"use strict";Zi();Au();rd();ju();Uu();Hu();Qi();zs();zu();Ju();id();qu();Ku();sd();rr=new nr,Ta=new as,xT=new Ys,_h=new Ws,TT=new Js,or=new Vs,ir=new ds,Nh=new qs,ET=new ps,IT=new Zs,AT=new yo,jT=new Qs;l(DT,"registerCategories");l(Lh,"registerAllCommands");Lh()});var ad=y(()=>{"use strict";hc();Rh();Ea();zs()});var Hh={};he(Hh,{shutdown:()=>cr,startDaemon:()=>$T});import Ft from"node:fs";import{createServer as RT}from"node:net";async function $T(s){let e=He.socket(),t=He.pid(),n=He.runDir();if(Ft.mkdirSync(n,{recursive:!0}),Ft.existsSync(t)){let r=parseInt(Ft.readFileSync(t,"utf-8").trim(),10);NT(r)&&(console.error(`Daemon already running (PID ${r})`),process.exit(1)),Ft.unlinkSync(t)}if(Ft.existsSync(e)&&Ft.unlinkSync(e),Be={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ma,idleTimer:null},Le=new yn,ar=RT(r=>MT(r)),ar.listen(e,()=>{Ft.chmodSync(e,384),Ft.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Uh()}),ar.on("error",r=>{console.error("Daemon socket error:",r.message),cr(1)}),!s.noHttp)try{let r=process.cwd(),o=await R.getProjectId(r);if(o){let i=s.port||ei;wo=Zo({port:i,projectId:o,projectPath:r,enableLogging:!1}),await wo.start()}}catch{}if(process.on("SIGTERM",()=>cr(0)),process.on("SIGINT",()=>cr(0)),process.on("SIGHUP",()=>{Le=new yn,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}function MT(s){let e="";s.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1187
+ `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await OT(o);s.write(gs(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(gs(i))}}}),s.on("error",()=>{})}async function OT(s){if(!Be||!Le)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Uh(),Be.commandsServed++,Be.lastActivity=Date.now(),s.command==="daemon")return _T(s);if(s.command==="__ping")return{id:s.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await FT(s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1152
1188
  `)||o.message||void 0,stderr:t.join(`
1153
- `)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function yT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Le.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Le.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Le.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Le.seal(r.cwd,{json:t.json===!0});case"verify":return Le.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Le.task(e,r.cwd,{md:n});case"done":return Le.done(r.cwd,{md:n});case"next":return Le.next(r.cwd,{md:n});case"pause":return Le.pause(e||"",r.cwd,{md:n});case"resume":return Le.resume(e,r.cwd,{md:n});case"bug":return Le.bug(e||"",r.cwd,{md:n});case"idea":return Le.idea(e||"",r.cwd,{md:n});case"ship":return Le.ship(e,r.cwd,{md:n});case"dash":return Le.dash(e||"default",r.cwd,{md:n});case"design":return Le.design(e||"",t);case"analyze":return Le.analyze(t);case"cleanup":return Le.cleanup(t);default:return G.execute(r.command,e,r.cwd)}}function wT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ue.socket(),uptime:We?Date.now()-We.startedAt:0,commandsServed:We?.commandsServed??0,lastActivity:We?new Date(We.lastActivity).toISOString():null,registeredCommands:G.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>ir(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Dh(){We&&(We.idleTimer&&clearTimeout(We.idleTimer),We.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${We.idleTimeoutMs/1e3/60} minutes, shutting down`),ir(0)},We.idleTimeoutMs),We.idleTimer.unref&&We.idleTimer.unref())}function ir(r){console.log("Daemon shutting down..."),We?.idleTimer&&clearTimeout(We.idleTimer),fo&&(fo.stop(),fo=null),or&&(or.close(),or=null);let e=Ue.socket(),t=Ue.pid();try{$t.existsSync(e)&&$t.unlinkSync(e)}catch{}try{$t.existsSync(t)&&$t.unlinkSync(t)}catch{}process.exit(r)}function ST(r){try{return process.kill(r,0),!0}catch{return!1}}var or,fo,Le,We,$h=y(()=>{"use strict";sd();Us();ba();Ve();wc();ho();or=null,fo=null,Le=null,We=null;l(gT,"startDaemon");l(fT,"handleConnection");l(hT,"handleRequest");l(yT,"executeCommand");l(wT,"handleDaemonCommand");l(Dh,"resetIdleTimer");l(ir,"shutdown");l(ST,"isProcessRunning")});var Oh={};ge(Oh,{runStart:()=>IT});import qt from"node:fs/promises";import rd from"node:os";import hn from"node:path";import W from"chalk";function CT(){console.clear(),console.log(kT),console.log(bT)}function Mh(r,e){console.log(`
1154
- ${W.bold(" Select AI providers to configure:")}
1155
- `),console.log(` ${W.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1156
- `),r.forEach((t,n)=>{let s=n===e?W.cyan("\u276F"):" ",o=t.selected?W.green("[\u2713]"):W.dim("[ ]"),i=t.installed?W.green("(installed)"):W.yellow("(will install)"),a=n===e?W.bold(t.displayName):t.displayName;console.log(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function vT(){let r=await an(),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}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,s=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Mh(e,n)},"render");Mh(e,n),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(`
1189
+ `)||o.error||void 0,result:o}}finally{console.log=n,console.error=r}}catch(e){return{id:s.id,success:!1,exitCode:1,stderr:e.message}}}async function FT(s){let e=s.args.join(" ")||null,t=s.options,n=t.md===!0;switch(s.command){case"sync":return Le.sync(s.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Le.status(s.cwd,{json:t.json===!0,md:n});case"stats":return Le.stats(s.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Le.seal(s.cwd,{json:t.json===!0});case"verify":return Le.verify(s.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Le.task(e,s.cwd,{md:n});case"done":return Le.done(s.cwd,{md:n});case"next":return Le.next(s.cwd,{md:n});case"pause":return Le.pause(e||"",s.cwd,{md:n});case"resume":return Le.resume(e,s.cwd,{md:n});case"bug":return Le.bug(e||"",s.cwd,{md:n});case"idea":return Le.idea(e||"",s.cwd,{md:n});case"ship":return Le.ship(e,s.cwd,{md:n});case"dash":return Le.dash(e||"default",s.cwd,{md:n});case"design":return Le.design(e||"",t);case"analyze":return Le.analyze(t);case"cleanup":return Le.cleanup(t);default:return z.execute(s.command,e,s.cwd)}}function _T(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:He.socket(),uptime:Be?Date.now()-Be.startedAt:0,commandsServed:Be?.commandsServed??0,lastActivity:Be?new Date(Be.lastActivity).toISOString():null,registeredCommands:z.list().length}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>cr(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Uh(){Be&&(Be.idleTimer&&clearTimeout(Be.idleTimer),Be.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Be.idleTimeoutMs/1e3/60} minutes, shutting down`),cr(0)},Be.idleTimeoutMs),Be.idleTimer.unref&&Be.idleTimer.unref())}function cr(s){console.log("Daemon shutting down..."),Be?.idleTimer&&clearTimeout(Be.idleTimer),wo&&(wo.stop(),wo=null),ar&&(ar.close(),ar=null);let e=He.socket(),t=He.pid();try{Ft.existsSync(e)&&Ft.unlinkSync(e)}catch{}try{Ft.existsSync(t)&&Ft.unlinkSync(t)}catch{}process.exit(s)}function NT(s){try{return process.kill(s,0),!0}catch{return!1}}var ar,wo,Le,Be,Gh=y(()=>{"use strict";ad();zs();Ea();qe();Ec();So();ar=null,wo=null,Le=null,Be=null;l($T,"startDaemon");l(MT,"handleConnection");l(OT,"handleRequest");l(FT,"executeCommand");l(_T,"handleDaemonCommand");l(Uh,"resetIdleTimer");l(cr,"shutdown");l(NT,"isProcessRunning")});var Bh={};he(Bh,{runStart:()=>qT});import _t from"node:fs/promises";import zh from"node:os";import Yt from"node:path";import V from"chalk";function HT(){console.clear(),console.log(LT),console.log(UT)}function Wh(s,e){console.log(`
1190
+ ${V.bold(" Select AI providers to configure:")}
1191
+ `),console.log(` ${V.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1192
+ `),s.forEach((t,n)=>{let r=n===e?V.cyan("\u276F"):" ",o=t.selected?V.green("[\u2713]"):V.dim("[ ]"),i=t.installed?V.green("(installed)"):V.yellow("(will install)"),a=n===e?V.bold(t.displayName):t.displayName;console.log(` ${r} ${o} ${a} ${i}`)}),console.log("")}async function GT(){let s=await cn(),e=[{name:"claude",displayName:"Claude Code",installed:s.claude.installed,selected:s.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:s.gemini.installed,selected:s.gemini.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,r=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Wh(e,n)},"render");Wh(e,n),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(`
1157
1193
  Cancelled.
1158
1194
  `),process.exit(0)),a==="\r"||a===`
1159
- `){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),s()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),s()),a===" "&&(e[n].selected=!e[n].selected,s())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1160
- ${W.bold(" Detected providers:")}
1161
- `),e.forEach(t=>{t.installed&&console.log(` ${W.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function xT(r){let e=Fe[r];if(!e.configDir)return!1;try{let t=hn.join(e.configDir,"commands");await qt.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(dt(),Ao)),s=n(),o=r==="claude"?"p.md":"p.toml",i=hn.join(s,"templates","commands",o),a=hn.join(t,o);return await P(i)?(await qt.copyFile(i,a),!0):!1}catch(t){return console.error(` ${W.yellow("\u26A0")} Failed to install ${r} router: ${w(t)}`),!1}}async function PT(r){let e=Fe[r];if(!e.configDir)return!1;try{await qt.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(dt(),Ao)),n=t(),s=r==="claude"?"CLAUDE.md":"GEMINI.md",o=hn.join(n,"templates","global",s),i=hn.join(e.configDir,s);if(await P(o)){let a=await qt.readFile(o,"utf-8");if(await P(i)){let c=await qt.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 m=c.substring(0,c.indexOf(u)),p=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await qt.writeFile(i,m+g+p)}else await qt.writeFile(i,`${c}
1162
-
1163
- ${a}`)}else await qt.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${W.yellow("\u26A0")} Failed to install ${r} config: ${w(t)}`),!1}}async function TT(r){let e=hn.join(rd.homedir(),".prjct-cli","config");await qt.mkdir(e,{recursive:!0});let t=hn.join(e,"installed-editors.json"),n={version:fe,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:hn.join(rd.homedir(),`.${r[0]}`,"commands")};await qt.writeFile(t,JSON.stringify(n,null,2))}function ET(r){console.log(`
1164
- ${W.green.bold(" \u2713 Setup complete!")}
1165
- `),console.log(` ${W.dim("Configured providers:")}`),r.forEach(e=>{let t=Fe[e];console.log(` ${W.green("\u2713")} ${t.displayName}`)}),console.log(`
1166
- ${W.bold("Next steps:")}
1167
-
1168
- ${W.cyan("1.")} Navigate to your project directory
1169
- ${W.cyan("2.")} Run ${W.bold("p. init")} to initialize prjct for that project
1170
- ${W.cyan("3.")} Start tracking with ${W.bold('p. task "your task"')}
1171
-
1172
- ${W.dim("Tips:")}
1173
- ${W.dim("\u2022")} Use ${W.bold("p. sync")} to analyze your codebase
1174
- ${W.dim("\u2022")} Use ${W.bold("p. done")} to complete tasks
1175
- ${W.dim("\u2022")} Use ${W.bold("p. ship")} to create PRs
1176
-
1177
- ${W.dim("Learn more: https://prjct.app/docs")}
1178
- `)}async function IT(){CT();let r=hn.join(rd.homedir(),".prjct-cli","config","installed-editors.json");if(await P(r)&&JSON.parse(await qt.readFile(r,"utf-8")).version===fe&&(console.log(` ${W.yellow("\u2139")} Already configured for v${fe}`),console.log(` ${W.dim("Run with --force to reconfigure")}
1179
- `),!process.argv.includes("--force")))return;let e=await vT();console.log(`
1180
- ${W.cyan("Setting up...")}
1181
- `);for(let t of e){let n=Fe[t];process.stdout.write(` ${W.dim("\u2022")} ${n.displayName}... `);let s=await xT(t),o=await PT(t);console.log(s&&o?W.green("\u2713"):s||o?W.yellow("partial"):W.yellow("skipped"))}await TT(e),ET(e)}var ar,cr,lr,ur,dr,kT,bT,Fh=y(()=>{"use strict";Be();_();xe();dt();ar=W.rgb(0,255,255),cr=W.rgb(80,180,255),lr=W.rgb(140,120,255),ur=W.rgb(200,80,220),dr=W.rgb(255,80,180),kT=`
1182
-
1183
- ${ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${lr(" \u2588\u2588\u2557")}${ur(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${dr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1184
- ${ar(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr(" \u2588\u2588\u2551")}${ur("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${dr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1185
- ${ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${lr(" \u2588\u2588\u2551")}${ur("\u2588\u2588\u2551 ")}${dr(" \u2588\u2588\u2551 ")}
1186
- ${ar(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr("\u2588\u2588 \u2588\u2588\u2551")}${ur("\u2588\u2588\u2551 ")}${dr(" \u2588\u2588\u2551 ")}
1187
- ${ar(" \u2588\u2588\u2551 ")}${cr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${lr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${ur("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${dr(" \u2588\u2588\u2551 ")}
1188
- ${ar(" \u255A\u2550\u255D ")}${cr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${lr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${ur(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${dr(" \u255A\u2550\u255D ")}
1189
-
1190
- `,bT=` ${W.white("Context Layer for AI Agents")} ${W.dim(`v${fe}`)}
1191
-
1192
- ${W.dim(`Project context layer for AI coding agents.
1195
+ `){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),r()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),r()),a===" "&&(e[n].selected=!e[n].selected,r())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1196
+ ${V.bold(" Detected providers:")}
1197
+ `),e.forEach(t=>{t.installed&&console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function zT(s){let e=Me[s];if(!e.configDir)return!1;try{let t=Yt.join(e.configDir,"commands");await _t.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(dt(),$o)),r=n(),o=s==="claude"?"p.md":"p.toml",i=Yt.join(r,"templates","commands",o),a=Yt.join(t,o);return await x(i)?(await _t.copyFile(i,a),!0):!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${s} router: ${w(t)}`),!1}}async function WT(s){let e=Me[s];if(!e.configDir)return!1;try{let t=s==="gemini"?Yt.join(e.configDir,"commands"):Yt.join(e.configDir,"commands","p");await _t.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=En("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=fe(`commands/${i}`);a&&await _t.writeFile(Yt.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${s} subcommands: ${w(t)}`),!1}}async function BT(s){let e=Me[s];if(!e.configDir)return!1;try{await _t.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(dt(),$o)),n=t(),r=s==="claude"?"CLAUDE.md":"GEMINI.md",o=Yt.join(n,"templates","global",r),i=Yt.join(e.configDir,r);if(await x(o)){let a=await _t.readFile(o,"utf-8");if(await x(i)){let c=await _t.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 m=c.substring(0,c.indexOf(u)),p=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await _t.writeFile(i,m+g+p)}else await _t.writeFile(i,`${c}
1198
+
1199
+ ${a}`)}else await _t.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${s} config: ${w(t)}`),!1}}async function VT(s){let e=Yt.join(zh.homedir(),".prjct-cli","config");await _t.mkdir(e,{recursive:!0});let t=Yt.join(e,"installed-editors.json"),n={version:Pe,providers:s,editor:s[0],provider:s[0],lastInstall:new Date().toISOString(),path:Yt.join(zh.homedir(),`.${s[0]}`,"commands")};await _t.writeFile(t,JSON.stringify(n,null,2))}function JT(s){console.log(`
1200
+ ${V.green.bold(" \u2713 Setup complete!")}
1201
+ `),console.log(` ${V.dim("Configured providers:")}`),s.forEach(e=>{let t=Me[e];console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(`
1202
+ ${V.bold("Next steps:")}
1203
+
1204
+ ${V.cyan("1.")} Navigate to your project directory
1205
+ ${V.cyan("2.")} Run ${V.bold("p. init")} to initialize prjct for that project
1206
+ ${V.cyan("3.")} Start tracking with ${V.bold('p. task "your task"')}
1207
+
1208
+ ${V.dim("Tips:")}
1209
+ ${V.dim("\u2022")} Use ${V.bold("p. sync")} to analyze your codebase
1210
+ ${V.dim("\u2022")} Use ${V.bold("p. done")} to complete tasks
1211
+ ${V.dim("\u2022")} Use ${V.bold("p. ship")} to create PRs
1212
+
1213
+ ${V.dim("Learn more: https://prjct.app/docs")}
1214
+ `)}async function qT(){HT();let s=await GT();console.log(`
1215
+ ${V.cyan("Setting up...")}
1216
+ `);for(let e of s){let t=Me[e];process.stdout.write(` ${V.dim("\u2022")} ${t.displayName}... `);let n=await zT(e),r=await WT(e),o=await BT(e);console.log(n&&r&&o?V.green("\u2713"):n||o?V.yellow("partial"):V.yellow("skipped"))}await VT(s),JT(s)}var lr,ur,dr,pr,mr,LT,UT,Vh=y(()=>{"use strict";In();Je();N();ve();dt();lr=V.rgb(0,255,255),ur=V.rgb(80,180,255),dr=V.rgb(140,120,255),pr=V.rgb(200,80,220),mr=V.rgb(255,80,180),LT=`
1217
+
1218
+ ${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${ur(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${dr(" \u2588\u2588\u2557")}${pr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${mr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1219
+ ${lr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${ur(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${dr(" \u2588\u2588\u2551")}${pr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${mr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1220
+ ${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${ur(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${dr(" \u2588\u2588\u2551")}${pr("\u2588\u2588\u2551 ")}${mr(" \u2588\u2588\u2551 ")}
1221
+ ${lr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${ur(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${dr("\u2588\u2588 \u2588\u2588\u2551")}${pr("\u2588\u2588\u2551 ")}${mr(" \u2588\u2588\u2551 ")}
1222
+ ${lr(" \u2588\u2588\u2551 ")}${ur(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${dr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${pr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${mr(" \u2588\u2588\u2551 ")}
1223
+ ${lr(" \u255A\u2550\u255D ")}${ur(" \u255A\u2550\u255D \u255A\u2550\u255D")}${dr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${pr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${mr(" \u255A\u2550\u255D ")}
1224
+
1225
+ `,UT=` ${V.white("Context Layer for AI Agents")} ${V.dim(`v${Pe}`)}
1226
+
1227
+ ${V.dim(`Project context layer for AI coding agents.
1193
1228
  Works with Claude Code, Gemini CLI, and more.`)}
1194
- ${W.cyan("https://prjct.app")}
1195
- `;l(CT,"showBanner");l(Mh,"showProviderSelection");l(vT,"selectProviders");l(xT,"installRouter");l(PT,"installGlobalConfig");l(TT,"saveSetupConfig");l(ET,"showCompletion");l(IT,"runStart")});import{exec as AT}from"node:child_process";import Lh from"node:fs/promises";import rn from"node:path";import{promisify as jT}from"node:util";async function pr(r,e=process.cwd(),t={}){let n=rn.isAbsolute(r)?r:rn.join(e,r),s;try{s=await Lh.readFile(n,"utf-8")}catch(g){if(v(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=rn.extname(r).toLowerCase(),i=OT[o]||"unknown",a=MT[i]||[],c=await FT(s,a,n,e),u=[];t.reverse&&(u=await NT(r,e));let d;t.depth&&t.depth>0&&(d=await Hh(r,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function FT(r,e,t,n){let s=[],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 p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await _T(c,t,n)),s.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return s}async function _T(r,e,t){let n=rn.dirname(e);if(r.startsWith("@/")){let o=rn.join(t,"src",r.slice(2));return Nh(o,t)}let s=rn.resolve(n,r);return Nh(s,t)}async function Nh(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let s=r+n;try{if((await Lh.stat(s)).isFile())return rn.relative(e,s)}catch{}}return null}async function NT(r,e){let t=[],n=rn.basename(r,rn.extname(r)),s=rn.dirname(r);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await DT(`grep -r -l -E '${i}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),c=a.trim().split(`
1196
- `).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function Hh(r,e,t,n=0,s=new Set){let o={file:r,imports:[],depth:n};if(n>=t||s.has(r))return o;s.add(r);let i=await pr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Hh(a.resolved,e,t,n+1,s);o.imports.push(c)}return o}var DT,_h,RT,$T,MT,OT,od=y(()=>{"use strict";_();DT=jT(AT),_h=[{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}],RT=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],$T=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],MT={typescript:_h,javascript:_h,python:RT,go:$T},OT={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(pr,"analyzeImports");l(FT,"extractImports");l(_T,"resolveImport");l(Nh,"tryResolve");l(NT,"findImportedBy");l(Hh,"buildDependencyTree")});import Uh from"node:fs/promises";import on from"node:path";async function Ca(r,e=process.cwd()){let t=on.isAbsolute(r)?r:on.join(e,r),n;try{n=await Uh.readFile(t,"utf-8")}catch(p){if(v(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Qn("")};throw p}let s=on.extname(r).toLowerCase(),o=Gh[s]||"unknown",i=await An(r,e),a=await pr(r,e),c=HT(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?UT(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=GT(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Zr(n,m)}}async function id(r,e=process.cwd(),t={}){let n=on.isAbsolute(r)?r:on.join(e,r),s=[];async function o(i){let a=await Uh.readdir(i,{withFileTypes:!0});for(let c of a){let u=on.join(i,c.name),d=on.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 m=on.extname(c.name).toLowerCase();if(Gh[m]){let p=await Ca(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function HT(r,e){let t=LT[e]||[],n=r.split(`
1229
+ ${V.cyan("https://prjct.app")}
1230
+ `;l(HT,"showBanner");l(Wh,"showProviderSelection");l(GT,"selectProviders");l(zT,"installRouter");l(WT,"installSubcommands");l(BT,"installGlobalConfig");l(VT,"saveSetupConfig");l(JT,"showCompletion");l(qT,"runStart")});import{exec as KT}from"node:child_process";import Kh from"node:fs/promises";import on from"node:path";import{promisify as YT}from"node:util";async function gr(s,e=process.cwd(),t={}){let n=on.isAbsolute(s)?s:on.join(e,s),r;try{r=await Kh.readFile(n,"utf-8")}catch(g){if(P(g))return{file:s,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=on.extname(s).toLowerCase(),i=tE[o]||"unknown",a=eE[i]||[],c=await nE(r,a,n,e),u=[];t.reverse&&(u=await rE(s,e));let d;t.depth&&t.depth>0&&(d=await Yh(s,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:s,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function nE(s,e,t,n){let r=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(s))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await sE(c,t,n)),r.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return r}async function sE(s,e,t){let n=on.dirname(e);if(s.startsWith("@/")){let o=on.join(t,"src",s.slice(2));return qh(o,t)}let r=on.resolve(n,s);return qh(r,t)}async function qh(s,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let r=s+n;try{if((await Kh.stat(r)).isFile())return on.relative(e,r)}catch{}}return null}async function rE(s,e){let t=[],n=on.basename(s,on.extname(s)),r=on.dirname(s);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await XT(`grep -r -l -E '${i}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),c=a.trim().split(`
1231
+ `).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==s);for(let u of c)t.push({file:u})}catch{}return t}async function Yh(s,e,t,n=0,r=new Set){let o={file:s,imports:[],depth:n};if(n>=t||r.has(s))return o;r.add(s);let i=await gr(s,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Yh(a.resolved,e,t,n+1,r);o.imports.push(c)}return o}var XT,Jh,QT,ZT,eE,tE,cd=y(()=>{"use strict";N();XT=YT(KT),Jh=[{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}],QT=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],ZT=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],eE={typescript:Jh,javascript:Jh,python:QT,go:ZT},tE={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(gr,"analyzeImports");l(nE,"extractImports");l(sE,"resolveImport");l(qh,"tryResolve");l(rE,"findImportedBy");l(Yh,"buildDependencyTree")});import Xh from"node:fs/promises";import an from"node:path";async function Ia(s,e=process.cwd()){let t=an.isAbsolute(s)?s:an.join(e,s),n;try{n=await Xh.readFile(t,"utf-8")}catch(p){if(P(p))return{file:s,purpose:"File not found",publicAPI:[],dependencies:[],metrics:ts("")};throw p}let r=an.extname(s).toLowerCase(),o=Qh[r]||"unknown",i=await $n(s,e),a=await gr(s,e),c=iE(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?aE(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=cE(c,u,d);return{file:s,purpose:c,publicAPI:u,dependencies:d,metrics:Zr(n,m)}}async function ld(s,e=process.cwd(),t={}){let n=an.isAbsolute(s)?s:an.join(e,s),r=[];async function o(i){let a=await Xh.readdir(i,{withFileTypes:!0});for(let c of a){let u=an.join(i,c.name),d=an.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 m=an.extname(c.name).toLowerCase();if(Qh[m]){let p=await Ia(d,e);r.push(p)}}}}return l(o,"processDir"),await o(n),r}function iE(s,e){let t=oE[e]||[],n=s.split(`
1197
1232
  `);for(let o=0;o<Math.min(30,n.length);o++){let i=n[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<n.length&&a.start.test(n[u].trim());)c.push(n[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<n.length&&(c+=`${n[u]}
1198
1233
  `,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
1199
- `).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.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 s=r.split(`
1200
- `)[0]||"";return`Module: ${on.basename(s,on.extname(s))}`}function UT(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1201
- `)[0].trim()}function GT(r,e,t){let n=[];if(n.push(`Purpose: ${r}`),n.push(""),e.length>0){n.push("Public API:");for(let s of e){let o=s.description?` - ${s.description}`:"";n.push(` ${s.type} ${s.name}: ${s.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
1202
- `)}var LT,Gh,zh=y(()=>{"use strict";_();od();_i();eo();LT={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}]},Gh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ca,"summarizeFile");l(id,"summarizeDirectory");l(HT,"extractFilePurpose");l(UT,"extractDescriptionFromDocstring");l(GT,"buildSummaryText")});var Wh=y(()=>{"use strict"});var Bh={};ge(Bh,{analyzeImports:()=>pr,combineMetrics:()=>Fi,countTokens:()=>Oi,extractDirectorySignatures:()=>El,extractSignatures:()=>An,findRelevantFiles:()=>Yr,formatCompressionRate:()=>av,formatCostSaved:()=>Tl,formatTokenCount:()=>iv,getRecentFiles:()=>Qr,measureCompression:()=>Zr,noCompression:()=>Qn,runContextTool:()=>zT,summarizeDirectory:()=>id,summarizeFile:()=>Ca});async function zT(r,e,t){let n=Date.now(),[s,...o]=r;try{let i;switch(s){case"files":i=await WT(o,t);break;case"signatures":i=await BT(o,t);break;case"imports":i=await VT(o,t);break;case"recent":i=await JT(o,t);break;case"summary":i=await qT(o,t);break;case"help":return{tool:"error",result:{error:QT(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${s}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=KT(i),u=YT(i);return await XT(e,{tool:s,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function WT(r,e){let t={},n=[];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:n.push(r[i]);let s=n.join(" ");return s?{tool:"files",result:await Yr(s,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function BT(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await El(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Fi(c.map(m=>m.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(m=>m.signatures.map(p=>({...p,file:m.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await An(t,e)}}async function VT(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 n={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?n.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(n.depth=parseInt(r[++o],10));return{tool:"imports",result:await pr(t,e,n)}}async function JT(r,e){let t={};for(let s=0;s<r.length;s++)r[s]==="--branch"||r[s]==="-b"?t.branch=!0:r[s]==="--max"&&r[s+1]?t.maxFiles=parseInt(r[++s],10):/^\d+$/.test(r[s])&&(t.commits=parseInt(r[s],10));return{tool:"recent",result:await Qr(e,t)}}async function qT(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 n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await id(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(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Fi(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ca(t,e)}}function KT(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 YT(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 XT(r,e){try{await un.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function QT(){return`
1234
+ `).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.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 r=s.split(`
1235
+ `)[0]||"";return`Module: ${an.basename(r,an.extname(r))}`}function aE(s){return s.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1236
+ `)[0].trim()}function cE(s,e,t){let n=[];if(n.push(`Purpose: ${s}`),n.push(""),e.length>0){n.push("Public API:");for(let r of e){let o=r.description?` - ${r.description}`:"";n.push(` ${r.type} ${r.name}: ${r.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
1237
+ `)}var oE,Qh,Zh=y(()=>{"use strict";N();cd();Gi();eo();oE={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}]},Qh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ia,"summarizeFile");l(ld,"summarizeDirectory");l(iE,"extractFilePurpose");l(aE,"extractDescriptionFromDocstring");l(cE,"buildSummaryText")});var ey=y(()=>{"use strict"});var ty={};he(ty,{analyzeImports:()=>gr,combineMetrics:()=>Hi,countTokens:()=>Ui,extractDirectorySignatures:()=>Ml,extractSignatures:()=>$n,findRelevantFiles:()=>es,formatCompressionRate:()=>yP,formatCostSaved:()=>$l,formatTokenCount:()=>hP,getRecentFiles:()=>Qr,measureCompression:()=>Zr,noCompression:()=>ts,runContextTool:()=>lE,summarizeDirectory:()=>ld,summarizeFile:()=>Ia});async function lE(s,e,t){let n=Date.now(),[r,...o]=s;try{let i;switch(r){case"files":i=await uE(o,t);break;case"signatures":i=await dE(o,t);break;case"imports":i=await pE(o,t);break;case"recent":i=await mE(o,t);break;case"summary":i=await gE(o,t);break;case"help":return{tool:"error",result:{error:wE(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${r}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=fE(i),u=hE(i);return await yE(e,{tool:r,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function uE(s,e){let t={},n=[];for(let i=0;i<s.length;i++)s[i]==="--max"&&s[i+1]?t.maxFiles=parseInt(s[++i],10):s[i]==="--min-score"&&s[i+1]?t.minScore=parseFloat(s[++i]):s[i]==="--include-tests"?t.includeTests=!0:n.push(s[i]);let r=n.join(" ");return r?{tool:"files",result:await es(r,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function dE(s,e){let t=s[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),r=await import("node:path"),o=r.isAbsolute(t)?t:r.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await Ml(t,e,{recursive:s.includes("--recursive")||s.includes("-r")}),u=Hi(c.map(m=>m.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(m=>m.signatures.map(p=>({...p,file:m.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await $n(t,e)}}async function pE(s,e){let t=s[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let n={};for(let o=1;o<s.length;o++)s[o]==="--reverse"||s[o]==="-r"?n.reverse=!0:(s[o]==="--depth"||s[o]==="-d")&&s[o+1]&&(n.depth=parseInt(s[++o],10));return{tool:"imports",result:await gr(t,e,n)}}async function mE(s,e){let t={};for(let r=0;r<s.length;r++)s[r]==="--branch"||s[r]==="-b"?t.branch=!0:s[r]==="--max"&&s[r+1]?t.maxFiles=parseInt(s[++r],10):/^\d+$/.test(s[r])&&(t.commits=parseInt(s[r],10));return{tool:"recent",result:await Qr(e,t)}}async function gE(s,e){let t=s[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),r=await import("node:path"),o=r.isAbsolute(t)?t:r.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await ld(t,e,{recursive:s.includes("--recursive")||s.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Hi(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ia(t,e)}}function fE(s){if(s.tool==="error")return 0;switch(s.tool){case"signatures":case"summary":return s.result.metrics.tokens.saved;case"files":return s.result.metrics.filesScanned*50-s.result.metrics.filesReturned*50;case"imports":return s.result.metrics.totalImports*20;case"recent":return s.result.metrics.totalFilesChanged*30;default:return 0}}function hE(s){if(s.tool==="error")return 0;switch(s.tool){case"signatures":case"summary":return s.result.metrics.compression;case"files":{let e=s.result.metrics.filesScanned,t=s.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function yE(s,e){try{await dn.recordSync(s,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function wE(){return`
1203
1238
  Context Tools - Smart context filtering for AI agents
1204
1239
 
1205
1240
  USAGE:
@@ -1260,7 +1295,7 @@ TOOLS:
1260
1295
  OUTPUT:
1261
1296
  All tools output JSON for easy parsing by AI agents.
1262
1297
  Each output includes metrics showing token savings.
1263
- `.trim()}var Vh=y(()=>{"use strict";zr();_();le();vl();od();xl();_i();zh();eo();eo();Wh();l(zT,"runContextTool");l(WT,"runFilesTool");l(BT,"runSignaturesTool");l(VT,"runImportsTool");l(JT,"runRecentTool");l(qT,"runSummaryTool");l(KT,"getTokensSaved");l(YT,"getCompressionRate");l(XT,"recordToolUsage");l(QT,"getHelpText")});var Yh={};ge(Yh,{hooksService:()=>oE});import He from"node:fs/promises";import Re from"node:path";import vt from"chalk";function qh(){return`#!/bin/sh
1298
+ `.trim()}var ny=y(()=>{"use strict";Wr();N();le();Li();cd();Dl();Gi();Zh();eo();eo();ey();l(lE,"runContextTool");l(uE,"runFilesTool");l(dE,"runSignaturesTool");l(pE,"runImportsTool");l(mE,"runRecentTool");l(gE,"runSummaryTool");l(fE,"getTokensSaved");l(hE,"getCompressionRate");l(yE,"recordToolUsage");l(wE,"getHelpText")});var iy={};he(iy,{hooksService:()=>xE});import Ue from"node:fs/promises";import Re from"node:path";import vt from"chalk";function ry(){return`#!/bin/sh
1264
1299
  # prjct auto-sync hook (post-commit)
1265
1300
  # Syncs project context after each commit
1266
1301
  # Installed by: prjct hooks install
@@ -1281,7 +1316,7 @@ if command -v prjct >/dev/null 2>&1; then
1281
1316
  fi
1282
1317
 
1283
1318
  exit 0
1284
- `}function Kh(){return`#!/bin/sh
1319
+ `}function oy(){return`#!/bin/sh
1285
1320
  # prjct auto-sync hook (post-checkout)
1286
1321
  # Syncs project context after branch switch
1287
1322
  # Installed by: prjct hooks install
@@ -1313,45 +1348,45 @@ if command -v prjct >/dev/null 2>&1; then
1313
1348
  fi
1314
1349
 
1315
1350
  exit 0
1316
- `}async function ad(r){let e=[];return(await P(Re.join(r,"lefthook.yml"))||await P(Re.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await P(Re.join(r,".husky"))||await P(Re.join(r,".husky","_")))&&e.push("husky"),await P(Re.join(r,".git"))&&e.push("direct"),e}function Jh(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function ZT(r,e){let t=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=Re.join(r,t),s=await He.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(s.includes(a))continue;let c=`
1351
+ `}async function ud(s){let e=[];return(await x(Re.join(s,"lefthook.yml"))||await x(Re.join(s,"lefthook.yaml")))&&e.push("lefthook"),(await x(Re.join(s,".husky"))||await x(Re.join(s,".husky","_")))&&e.push("husky"),await x(Re.join(s,".git"))&&e.push("direct"),e}function sy(s){return s.includes("lefthook")?"lefthook":s.includes("husky")?"husky":"direct"}async function kE(s,e){let t=await x(Re.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=Re.join(s,t),r=await Ue.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(r.includes(a))continue;let c=`
1317
1352
  ${i}:
1318
1353
  commands:
1319
1354
  ${a}:
1320
1355
  run: prjct sync --quiet --yes
1321
1356
  fail_text: "prjct sync failed (non-blocking)"
1322
- `,u=new RegExp(`^${i}:\\s*$`,"m");u.test(s)?s=s.replace(u,`${i}:
1357
+ `,u=new RegExp(`^${i}:\\s*$`,"m");u.test(r)?r=r.replace(u,`${i}:
1323
1358
  commands:
1324
1359
  ${a}:
1325
1360
  run: prjct sync --quiet --yes
1326
- fail_text: "prjct sync failed (non-blocking)"`):s=`${s.trimEnd()}
1327
- ${c}`}return await He.writeFile(n,s,"utf-8"),!0}async function eE(r,e){let t=Re.join(r,".husky");for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?qh():Kh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
1361
+ fail_text: "prjct sync failed (non-blocking)"`):r=`${r.trimEnd()}
1362
+ ${c}`}return await Ue.writeFile(n,r,"utf-8"),!0}async function SE(s,e){let t=Re.join(s,".husky");for(let n of e){let r=Re.join(t,n),o=n==="post-commit"?ry():oy();if(await x(r)){if((await Ue.readFile(r,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(r,`
1328
1363
  # prjct auto-sync
1329
1364
  prjct sync --quiet --yes &
1330
- `)}else await He.writeFile(s,o,{mode:493})}return!0}async function tE(r,e){let t=Re.join(r,".git","hooks");await P(t)||await He.mkdir(t,{recursive:!0});for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?qh():Kh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
1365
+ `)}else await Ue.writeFile(r,o,{mode:493})}return!0}async function bE(s,e){let t=Re.join(s,".git","hooks");await x(t)||await Ue.mkdir(t,{recursive:!0});for(let n of e){let r=Re.join(t,n),o=n==="post-commit"?ry():oy();if(await x(r)){if((await Ue.readFile(r,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(r,`
1331
1366
  # prjct auto-sync
1332
1367
  ${o.split(`
1333
1368
  `).slice(1).join(`
1334
- `)}`)}else await He.writeFile(s,o,{mode:493})}return!0}async function nE(r){let e=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Re.join(r,e);if(!await P(t))return!1;let n=await He.readFile(t,"utf-8");return n=n.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),n=n.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await He.writeFile(t,`${n.trimEnd()}
1335
- `,"utf-8"),!0}async function sE(r){let e=Re.join(r,".husky");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(!s.includes("prjct sync"))continue;let o=s.split(`
1369
+ `)}`)}else await Ue.writeFile(r,o,{mode:493})}return!0}async function CE(s){let e=await x(Re.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Re.join(s,e);if(!await x(t))return!1;let n=await Ue.readFile(t,"utf-8");return n=n.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),n=n.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await Ue.writeFile(t,`${n.trimEnd()}
1370
+ `,"utf-8"),!0}async function PE(s){let e=Re.join(s,".husky");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await x(n))continue;let r=await Ue.readFile(n,"utf-8");if(!r.includes("prjct sync"))continue;let o=r.split(`
1336
1371
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1337
- `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await He.unlink(n):await He.writeFile(n,o,{mode:493})}return!0}async function rE(r){let e=Re.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(s.includes("prjct sync"))if(s.includes("Installed by: prjct hooks install"))await He.unlink(n);else{let o=s.split(`
1372
+ `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await Ue.unlink(n):await Ue.writeFile(n,o,{mode:493})}return!0}async function vE(s){let e=Re.join(s,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await x(n))continue;let r=await Ue.readFile(n,"utf-8");if(r.includes("prjct sync"))if(r.includes("Installed by: prjct hooks install"))await Ue.unlink(n);else{let o=r.split(`
1338
1373
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1339
- `);await He.writeFile(n,o,{mode:493})}}return!0}var cd,oE,Xh=y(()=>{"use strict";Ve();he();_();xe();Nt();l(qh,"getPostCommitScript");l(Kh,"getPostCheckoutScript");l(ad,"detectHookManagers");l(Jh,"selectStrategy");l(ZT,"installLefthook");l(eE,"installHusky");l(tE,"installDirect");l(nE,"uninstallLefthook");l(sE,"uninstallHusky");l(rE,"uninstallDirect");cd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],s=await ad(e);if(s.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Jh(s);try{let i=!1;switch(o){case"lefthook":i=await ZT(e,n);break;case"husky":i=await eE(e,n);break;case"direct":i=await tE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",s=!1;switch(n){case"lefthook":s=await nE(e);break;case"husky":s=await sE(e);break;case"direct":s=await rE(e);break}return s&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:s}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await ad(e),n=await this.getHookConfig(e),s=["post-commit","post-checkout"],o=await Promise.all(s.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await R.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){h.start(),h.section("Git Hooks Installation");let t=await ad(e),n=Jh(t);console.log(` Strategy: ${vt.cyan(n)}`),console.log(` Hooks: ${vt.dim("post-commit, post-checkout")}`),console.log("");let s=await this.install(e,{strategy:n});if(s.success){h.done(`Hooks installed via ${s.strategy}`),console.log("");for(let o of s.hooksInstalled)console.log(` ${vt.green("\u2713")} ${o}`);console.log(""),console.log(vt.dim(" Context will auto-sync on commit and branch switch.")),console.log(vt.dim(" Remove with: prjct hooks uninstall"))}else h.fail(s.error||"Failed to install hooks");return console.log(""),h.end(),s.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${vt.green("Active")}`),console.log(` Strategy: ${vt.cyan(t.strategy)}`)):console.log(` Status: ${vt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let s=n.installed?vt.green("\u2713"):vt.dim("\u25CB"),o=n.installed?n.name:vt.dim(n.name);console.log(` ${s} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${vt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(vt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Re.join(e,o);return await P(i)?(await He.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=Re.join(e,".husky",t);return await P(o)?(await He.readFile(o,"utf-8")).includes("prjct sync"):!1}let s=Re.join(e,".git","hooks",t);return await P(s)?(await He.readFile(s,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await R.getProjectId(e);if(!t)return null;try{let n=$.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await R.getProjectId(e);if(n)try{let s=$.getDoc(n,"project")||{};s.hooks=t,$.setDoc(n,"project",s)}catch{}}},oE=new cd});var ey={};ge(ey,{DoctorService:()=>va,doctorService:()=>iE});import{execSync as ld}from"node:child_process";import Qh from"node:fs/promises";import Zh from"node:path";import Mn from"chalk";var va,iE,ty=y(()=>{"use strict";Ve();Ce();Ut();Nt();dt();va=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await R.getProjectId(e),this.projectId&&(this.globalPath=A.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),s=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:s,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,n,s,o){try{let a=ld(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:s}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:s}}}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}async checkPrjctConfig(){let e=Zh.join(this.projectPath,".prjct","prjct.config.json");try{return await Qh.access(e),{name:"prjct config",status:"ok",message:"initialized"}}catch{return{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=Zh.join(this.globalPath,"context","CLAUDE.md");try{let t=await Qh.stat(e),n=Date.now()-t.mtimeMs,s=Math.floor(n/(1e3*60*60)),o=Math.floor(s/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:s>0?i=`${s} hour${s>1?"s":""} ago`:i="recently",s>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{ld("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=ld("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1340
- `).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.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}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${fe}`)}printSection(e,t){h.section(e);let n=t.map(s=>{let o=this.getStatusIcon(s.status,s.optional),i=s.name.padEnd(14),a=s.version||s.message||"",c=s.optional&&s.status==="error"?Mn.dim(" (optional)"):"";return`${o} ${i} ${Mn.dim(a)}${c}`});for(let s of n)console.log(` ${s}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:Mn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Mn.dim("\u2500".repeat(40))),e.hasErrors?h.fail("Some required checks failed"):e.hasWarnings?h.warn("All required checks passed (some warnings)"):h.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return Mn.green("\u2713");case"warn":return Mn.yellow("\u26A0");case"error":return t?Mn.dim("\u25CB"):Mn.red("\u2717")}}},iE=new va});var ny={};ge(ny,{WatchService:()=>xa,watchService:()=>dE});import aE from"node:path";import tt from"chalk";import cE from"chokidar";var lE,uE,xa,dE,sy=y(()=>{"use strict";Ve();_();le();ku();lE=["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"],uE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],xa=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 R.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=cE.watch(lE,{cwd:this.projectPath,ignored:uE,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),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(tt.dim(`
1341
- \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 n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(tt.dim(` ${n} ${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 n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(tt.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);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=C().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
1342
- ${tt.dim(`[${t}]`)} ${tt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await as.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let s=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=s.length>0?` [${s.join(", ")}]`:"";console.log(`${tt.dim(`[${t}]`)} ${tt.green("\u2713")} Synced${o}`)}}else console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(tt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(tt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(tt.dim(` Project: ${aE.basename(this.projectPath)}`)),console.log(tt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(tt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(tt.dim(" Press Ctrl+C to stop")),console.log("")}},dE=new xa});var uy={};ge(uy,{formatAgentCommandHelp:()=>ay,formatCommandHelp:()=>cy,formatCommandList:()=>ly,formatMainHelp:()=>oy,formatTerminalCommandHelp:()=>iy,getHelp:()=>mE});import J from"chalk";function oy(){let r=[];r.push(""),r.push(`${J.cyan.bold("prjct")} v${fe} - Context layer for AI coding agents`),r.push(J.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(J.bold("QUICK START")),r.push(J.dim("\u2500".repeat(60))),r.push(` ${J.green("1.")} prjct start ${J.dim("# Configure AI providers")}`),r.push(` ${J.green("2.")} cd my-project && prjct init`),r.push(` ${J.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${J.green("4.")} p. sync ${J.dim("# Analyze project")}`),r.push(""),r.push(J.bold("TERMINAL COMMANDS")),r.push(J.dim("\u2500".repeat(60)));for(let t of ry){let n=`prjct ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(""),r.push(`${J.bold("AI AGENT COMMANDS")} ${J.dim("(inside Claude/Gemini/Cursor)")}`),r.push(J.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${J.dim("\u2500".repeat(56))}`);let e=tr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(` ${J.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(J.bold("FLAGS")),r.push(J.dim("\u2500".repeat(60)));for(let t of pE)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(J.bold("MORE INFO")),r.push(J.dim("\u2500".repeat(60))),r.push(` Documentation: ${J.cyan("https://prjct.app")}`),r.push(` GitHub: ${J.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
1343
- `)}function iy(r){let e=ry.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${J.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(J.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(J.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(J.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
1344
- `)}function ay(r){let e=tr.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${J.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(J.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(J.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(J.bold("FEATURES"));for(let s of e.features)t.push(` \u2022 ${s}`);t.push("")}e.blockingRules&&(t.push(J.bold("REQUIREMENTS")),t.push(` ${J.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=po[e.group];return n&&(t.push(J.dim(`Category: ${n.title}`)),e.isOptional&&t.push(J.dim("This is an optional command.")),t.push("")),t.join(`
1345
- `)}function cy(r){let e=iy(r);if(e)return e;let t=ay(r);return t||`
1346
- ${J.yellow(`Command '${r}' not found.`)}
1374
+ `);await Ue.writeFile(n,o,{mode:493})}}return!0}var dd,xE,ay=y(()=>{"use strict";qe();ye();N();ve();Gt();l(ry,"getPostCommitScript");l(oy,"getPostCheckoutScript");l(ud,"detectHookManagers");l(sy,"selectStrategy");l(kE,"installLefthook");l(SE,"installHusky");l(bE,"installDirect");l(CE,"uninstallLefthook");l(PE,"uninstallHusky");l(vE,"uninstallDirect");dd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],r=await ud(e);if(r.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||sy(r);try{let i=!1;switch(o){case"lefthook":i=await kE(e,n);break;case"husky":i=await SE(e,n);break;case"direct":i=await bE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",r=!1;switch(n){case"lefthook":r=await CE(e);break;case"husky":r=await PE(e);break;case"direct":r=await vE(e);break}return r&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:r}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await ud(e),n=await this.getHookConfig(e),r=["post-commit","post-checkout"],o=await Promise.all(r.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await R.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){h.start(),h.section("Git Hooks Installation");let t=await ud(e),n=sy(t);console.log(` Strategy: ${vt.cyan(n)}`),console.log(` Hooks: ${vt.dim("post-commit, post-checkout")}`),console.log("");let r=await this.install(e,{strategy:n});if(r.success){h.done(`Hooks installed via ${r.strategy}`),console.log("");for(let o of r.hooksInstalled)console.log(` ${vt.green("\u2713")} ${o}`);console.log(""),console.log(vt.dim(" Context will auto-sync on commit and branch switch.")),console.log(vt.dim(" Remove with: prjct hooks uninstall"))}else h.fail(r.error||"Failed to install hooks");return console.log(""),h.end(),r.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${vt.green("Active")}`),console.log(` Strategy: ${vt.cyan(t.strategy)}`)):console.log(` Status: ${vt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let r=n.installed?vt.green("\u2713"):vt.dim("\u25CB"),o=n.installed?n.name:vt.dim(n.name);console.log(` ${r} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${vt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(vt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await x(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Re.join(e,o);return await x(i)?(await Ue.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=Re.join(e,".husky",t);return await x(o)?(await Ue.readFile(o,"utf-8")).includes("prjct sync"):!1}let r=Re.join(e,".git","hooks",t);return await x(r)?(await Ue.readFile(r,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await x(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await R.getProjectId(e);if(!t)return null;try{let n=M.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await R.getProjectId(e);if(n)try{let r=M.getDoc(n,"project")||{};r.hooks=t,M.setDoc(n,"project",r)}catch{}}},xE=new dd});var uy={};he(uy,{DoctorService:()=>Aa,doctorService:()=>TE});import{execSync as pd}from"node:child_process";import cy from"node:fs/promises";import ly from"node:path";import _n from"chalk";var Aa,TE,dy=y(()=>{"use strict";qe();Se();Bt();Gt();dt();Aa=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await R.getProjectId(e),this.projectId&&(this.globalPath=I.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),r=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:r,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,n,r,o){try{let a=pd(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:r}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:r}}}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}async checkPrjctConfig(){let e=ly.join(this.projectPath,".prjct","prjct.config.json");try{return await cy.access(e),{name:"prjct config",status:"ok",message:"initialized"}}catch{return{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=ly.join(this.globalPath,"context","CLAUDE.md");try{let t=await cy.stat(e),n=Date.now()-t.mtimeMs,r=Math.floor(n/(1e3*60*60)),o=Math.floor(r/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:r>0?i=`${r} hour${r>1?"s":""} ago`:i="recently",r>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{pd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=pd("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1375
+ `).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.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}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${Pe}`)}printSection(e,t){h.section(e);let n=t.map(r=>{let o=this.getStatusIcon(r.status,r.optional),i=r.name.padEnd(14),a=r.version||r.message||"",c=r.optional&&r.status==="error"?_n.dim(" (optional)"):"";return`${o} ${i} ${_n.dim(a)}${c}`});for(let r of n)console.log(` ${r}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:_n.yellow("\u2022")})}printSummary(e){console.log(""),console.log(_n.dim("\u2500".repeat(40))),e.hasErrors?h.fail("Some required checks failed"):e.hasWarnings?h.warn("All required checks passed (some warnings)"):h.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return _n.green("\u2713");case"warn":return _n.yellow("\u26A0");case"error":return t?_n.dim("\u25CB"):_n.red("\u2717")}}},TE=new Aa});var py={};he(py,{WatchService:()=>ja,watchService:()=>DE});import EE from"node:path";import st from"chalk";import IE from"chokidar";var AE,jE,ja,DE,my=y(()=>{"use strict";qe();N();le();vu();AE=["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"],jE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],ja=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 R.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=IE.watch(AE,{cwd:this.projectPath,ignored:jE,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),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(st.dim(`
1376
+ \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 n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(st.dim(` ${n} ${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 n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(st.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);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=C().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
1377
+ ${st.dim(`[${t}]`)} ${st.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await us.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let r=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=r.length>0?` [${r.join(", ")}]`:"";console.log(`${st.dim(`[${t}]`)} ${st.green("\u2713")} Synced${o}`)}}else console.error(`${st.dim(`[${t}]`)} ${st.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${st.dim(`[${t}]`)} ${st.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(st.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(st.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(st.dim(` Project: ${EE.basename(this.projectPath)}`)),console.log(st.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(st.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(st.dim(" Press Ctrl+C to stop")),console.log("")}},DE=new ja});var Sy={};he(Sy,{formatAgentCommandHelp:()=>yy,formatCommandHelp:()=>wy,formatCommandList:()=>ky,formatMainHelp:()=>fy,formatTerminalCommandHelp:()=>hy,getHelp:()=>$E});import K from"chalk";function fy(){let s=[];s.push(""),s.push(`${K.cyan.bold("prjct")} v${Pe} - Context layer for AI coding agents`),s.push(K.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),s.push(""),s.push(K.bold("QUICK START")),s.push(K.dim("\u2500".repeat(60))),s.push(` ${K.green("1.")} prjct start ${K.dim("# Configure AI providers")}`),s.push(` ${K.green("2.")} cd my-project && prjct init`),s.push(` ${K.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),s.push(` ${K.green("4.")} p. sync ${K.dim("# Analyze project")}`),s.push(""),s.push(K.bold("TERMINAL COMMANDS")),s.push(K.dim("\u2500".repeat(60)));for(let t of gy){let n=`prjct ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(""),s.push(`${K.bold("AI AGENT COMMANDS")} ${K.dim("(inside Claude/Gemini/Cursor)")}`),s.push(K.dim("\u2500".repeat(60))),s.push(` ${"Command".padEnd(22)} Description`),s.push(` ${K.dim("\u2500".repeat(56))}`);let e=sr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(` ${K.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),s.push(""),s.push(K.bold("FLAGS")),s.push(K.dim("\u2500".repeat(60)));for(let t of RE)s.push(` ${t.flag.padEnd(22)} ${t.description}`);return s.push(""),s.push(K.bold("MORE INFO")),s.push(K.dim("\u2500".repeat(60))),s.push(` Documentation: ${K.cyan("https://prjct.app")}`),s.push(` GitHub: ${K.cyan("https://github.com/jlopezlira/prjct-cli")}`),s.push(" Per-command: prjct help <command>"),s.push(""),s.join(`
1378
+ `)}function hy(s){let e=gy.find(n=>n.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${K.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(K.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(K.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(K.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
1379
+ `)}function yy(s){let e=sr.find(r=>r.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${K.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(K.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(K.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(K.bold("FEATURES"));for(let r of e.features)t.push(` \u2022 ${r}`);t.push("")}e.blockingRules&&(t.push(K.bold("REQUIREMENTS")),t.push(` ${K.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=fo[e.group];return n&&(t.push(K.dim(`Category: ${n.title}`)),e.isOptional&&t.push(K.dim("This is an optional command.")),t.push("")),t.join(`
1380
+ `)}function wy(s){let e=hy(s);if(e)return e;let t=yy(s);return t||`
1381
+ ${K.yellow(`Command '${s}' not found.`)}
1347
1382
 
1348
1383
  Run 'prjct help' to see all available commands.
1349
- `}function ly(){let r=[];r.push(""),r.push(J.cyan.bold("All Commands")),r.push("");let e=Object.entries(po).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=tr.filter(o=>o.group===t);if(s.length!==0){r.push(`${J.bold(n.title)} ${J.dim(`(${s.length} commands)`)}`),r.push(J.dim(n.description)),r.push("");for(let o of s){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(J.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1350
- `)}function mE(r){return r?r==="commands"||r==="all"?ly():cy(r):oy()}var ry,pE,dy=y(()=>{"use strict";ed();dt();ry=[{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:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],pE=[{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(oy,"formatMainHelp");l(iy,"formatTerminalCommandHelp");l(ay,"formatAgentCommandHelp");l(cy,"formatCommandHelp");l(ly,"formatCommandList");l(mE,"getHelp")});var hy={};ge(hy,{installAntigravitySkill:()=>fy,needsAntigravityInstallation:()=>wE,run:()=>gy});import{execSync as gE}from"node:child_process";import q from"node:fs/promises";import us from"node:os";import re from"node:path";import me from"chalk";async function fE(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Fs.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${r.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),gE(`npm install -g ${e}`,{stdio:"inherit",timeout:Ts("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function gy(){let r=await an(),e=await Oa(),t=Fe[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let i of s){let a=Fe[i],c=r[i],u={provider:i,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!c.installed)if(i===e.provider)if(await fE(a))u.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${a.displayName} installation failed`);else continue;if(i==="claude"){if(await Ee.detectClaude()){let m=await Ee.syncCommands();m.success&&(u.commandsAdded=m.added,u.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let p=await Ee.installGlobalConfig();p.success&&(u.configAction=p.action,n.configAction||(n.configAction=p.action)),await Ee.installDocs(),await kE(),await bE()}}else if(i==="gemini"){await hE()&&(u.commandsAdded=1,n.commandsAdded+=1);let m=await yE();m.success&&(u.configAction=m.action)}n.providers.push(u)}(await ws()).installed&&(await fy()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),await Ba.saveConfig(fe,await Ee.getInstallPath(),e.provider),await SE();for(let i of n.providers)CE(i,Fe[i.provider]);return n}async function hE(){try{let r=re.join(us.homedir(),".gemini","commands"),e=re.join(r,"p.toml");await q.mkdir(r,{recursive:!0});let t=ve("commands/p.toml");if(t)return await q.writeFile(e,t,"utf-8"),!0;let n=re.join(pe,"templates","commands","p.toml");return await P(n)?(await q.copyFile(n,e),!0):!1}catch(r){return H.warn(`Gemini router warning: ${w(r)}`),!1}}async function yE(){try{let r=re.join(us.homedir(),".gemini"),e=re.join(r,"GEMINI.md");await q.mkdir(r,{recursive:!0});let t=ve("global/GEMINI.md");if(!t){let p=re.join(pe,"templates","global","GEMINI.md");t=await q.readFile(p,"utf-8")}let n="",s=!1;try{n=await q.readFile(e,"utf-8"),s=!0}catch(p){if(v(p))s=!1;else throw p}if(!s)return await q.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
1384
+ `}function ky(){let s=[];s.push(""),s.push(K.cyan.bold("All Commands")),s.push("");let e=Object.entries(fo).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let r=sr.filter(o=>o.group===t);if(r.length!==0){s.push(`${K.bold(n.title)} ${K.dim(`(${r.length} commands)`)}`),s.push(K.dim(n.description)),s.push("");for(let o of r){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;s.push(` ${i} ${a}`)}s.push("")}}return s.push(K.dim("Run 'prjct help <command>' for detailed help on a specific command.")),s.push(""),s.join(`
1385
+ `)}function $E(s){return s?s==="commands"||s==="all"?ky():wy(s):fy()}var gy,RE,by=y(()=>{"use strict";rd();dt();gy=[{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:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],RE=[{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(fy,"formatMainHelp");l(hy,"formatTerminalCommandHelp");l(yy,"formatAgentCommandHelp");l(wy,"formatCommandHelp");l(ky,"formatCommandList");l($E,"getHelp")});var Ey={};he(Ey,{installAntigravitySkill:()=>xy,installCodexSkill:()=>Ty,needsAntigravityInstallation:()=>NE,run:()=>vy});import{execSync as ME}from"node:child_process";import J from"node:fs/promises";import Nn from"node:os";import Z from"node:path";import me from"chalk";async function OE(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!_s.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${s.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${s.displayName} not found. Installing...`)),console.log(""),ME(`npm install -g ${e}`,{stdio:"inherit",timeout:Is("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${s.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${s.displayName}: ${n.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function vy(){let s=await cn(),e=await Wa(),t=Me[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let c=Me[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await OE(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ee.detectClaude()){let p=await Ee.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ee.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ee.installDocs(),await UE(),await HE()}}else if(a==="gemini"){await FE()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await _E();p.success&&(d.configAction=p.action)}n.providers.push(d)}(await Ss()).installed&&(await xy()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await za()).installed&&(await Ty()).success&&console.log(` ${me.green("\u2713")} Codex skill installed`),await ec.saveConfig(Pe,await Ee.getInstallPath(),e.provider),await LE();for(let a of n.providers)GE(a,Me[a.provider]);return n}async function FE(){try{let s=Z.join(Nn.homedir(),".gemini","commands"),e=Z.join(s,"p.toml");await J.mkdir(s,{recursive:!0});let t=fe("commands/p.toml");if(t)return await J.writeFile(e,t,"utf-8"),!0;let n=Z.join(de,"templates","commands","p.toml");return await x(n)?(await J.copyFile(n,e),!0):!1}catch(s){return U.warn(`Gemini router warning: ${w(s)}`),!1}}async function _E(){try{let s=Z.join(Nn.homedir(),".gemini"),e=Z.join(s,"GEMINI.md");await J.mkdir(s,{recursive:!0});let t=fe("global/GEMINI.md");if(!t){let p=Z.join(de,"templates","global","GEMINI.md");t=await J.readFile(p,"utf-8")}let n="",r=!1;try{n=await J.readFile(e,"utf-8"),r=!0}catch(p){if(P(p))r=!1;else throw p}if(!r)return await J.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
1351
1386
 
1352
- ${t}`;return await q.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await q.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return H.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function fy(){try{let r=re.join(us.homedir(),".gemini","antigravity","skills"),e=re.join(r,"prjct"),t=re.join(e,"SKILL.md");await q.mkdir(e,{recursive:!0});let n=await P(t),s=ve("antigravity/SKILL.md");if(!s){let o=re.join(pe,"templates","antigravity","SKILL.md");if(!await P(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await q.readFile(o,"utf-8")}return await q.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function wE(){let r=await ws();return r.installed&&!r.skillInstalled}async function SE(){try{let r=re.join(us.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await q.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=$.getDoc(n,"project");if(!s)continue;s.cliVersion!==fe&&(s.cliVersion=fe,$.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${fe}`)}catch(r){v(r)||H.warn(`Migration warning: ${w(r)}`)}}async function py(r,e){let t={};if(await P(r))try{t=JSON.parse(await q.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await q.writeFile(r,JSON.stringify(t,null,2))}async function kE(){try{let r=re.join(us.homedir(),".claude"),e=re.join(r,"settings.json"),t=re.join(r,"prjct-statusline.sh"),n=re.join(us.homedir(),".prjct-cli","statusline"),s=re.join(n,"statusline.sh"),o=re.join(n,"themes"),i=re.join(n,"lib"),a=re.join(n,"components"),c=re.join(n,"config.json"),u=re.join(pe,"assets","statusline"),d=re.join(u,"statusline.sh"),m=re.join(u,"themes"),p=re.join(u,"lib"),g=re.join(u,"components"),f=re.join(u,"default-config.json");if(await P(r)||await q.mkdir(r,{recursive:!0}),await P(n)||await q.mkdir(n,{recursive:!0}),await P(o)||await q.mkdir(o,{recursive:!0}),await P(i)||await q.mkdir(i,{recursive:!0}),await P(a)||await q.mkdir(a,{recursive:!0}),await P(s)){let S=await q.readFile(s,"utf8");if(S.includes("CLI_VERSION=")){let b=S.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==fe){let D=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${fe}"`);await q.writeFile(s,D,{mode:493})}await Pa(p,i),await Pa(g,a),await my(t,s),await py(e,t);return}}if(await P(d)){let S=await q.readFile(d,"utf8");if(S=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${fe}"`),await q.writeFile(s,S,{mode:493}),await Pa(p,i),await Pa(g,a),await P(m)){let b=await q.readdir(m);for(let D of b){let x=re.join(m,D),O=re.join(o,D);await q.copyFile(x,O)}}!await P(c)&&await P(f)&&await q.copyFile(f,c)}else{let S=`#!/bin/bash
1387
+ ${t}`;return await J.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await J.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(s){return U.warn(`Gemini config warning: ${w(s)}`),{success:!1,action:null}}}async function xy(){try{let s=Z.join(Nn.homedir(),".gemini","antigravity","skills"),e=Z.join(s,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await x(t),r=fe("antigravity/SKILL.md");if(!r){let o=Z.join(de,"templates","antigravity","SKILL.md");if(!await x(o))return U.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await J.readFile(o,"utf-8")}return await J.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return U.warn(`Antigravity skill warning: ${w(s)}`),{success:!1,action:null}}}async function NE(){let s=await Ss();return s.installed&&!s.skillInstalled}async function Ty(){try{let s=Z.join(Nn.homedir(),".codex","skills"),e=Z.join(s,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await x(t),r=fe("codex/SKILL.md");if(!r){let o=Z.join(de,"templates","codex","SKILL.md");if(!await x(o))return U.warn("Codex SKILL.md template not found"),{success:!1,action:null};r=await J.readFile(o,"utf-8")}return await J.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return U.warn(`Codex skill warning: ${w(s)}`),{success:!1,action:null}}}async function LE(){try{let s=Z.join(Nn.homedir(),".prjct-cli","projects");if(!await x(s))return;let e=(await J.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let r=M.getDoc(n,"project");if(!r)continue;r.cliVersion!==Pe&&(r.cliVersion=Pe,M.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${Pe}`)}catch(s){P(s)||U.warn(`Migration warning: ${w(s)}`)}}async function Cy(s,e){let t={};if(await x(s))try{t=JSON.parse(await J.readFile(s,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await J.writeFile(s,JSON.stringify(t,null,2))}async function UE(){try{let s=Z.join(Nn.homedir(),".claude"),e=Z.join(s,"settings.json"),t=Z.join(s,"prjct-statusline.sh"),n=Z.join(Nn.homedir(),".prjct-cli","statusline"),r=Z.join(n,"statusline.sh"),o=Z.join(n,"themes"),i=Z.join(n,"lib"),a=Z.join(n,"components"),c=Z.join(n,"config.json"),u=Z.join(de,"assets","statusline"),d=Z.join(u,"statusline.sh"),m=Z.join(u,"themes"),p=Z.join(u,"lib"),g=Z.join(u,"components"),f=Z.join(u,"default-config.json");if(await x(s)||await J.mkdir(s,{recursive:!0}),await x(n)||await J.mkdir(n,{recursive:!0}),await x(o)||await J.mkdir(o,{recursive:!0}),await x(i)||await J.mkdir(i,{recursive:!0}),await x(a)||await J.mkdir(a,{recursive:!0}),await x(r)){let k=await J.readFile(r,"utf8");if(k.includes("CLI_VERSION=")){let b=k.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==Pe){let D=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Pe}"`);await J.writeFile(r,D,{mode:493})}await Da(p,i),await Da(g,a),await Py(t,r),await Cy(e,t);return}}if(await x(d)){let k=await J.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Pe}"`),await J.writeFile(r,k,{mode:493}),await Da(p,i),await Da(g,a),await x(m)){let b=await J.readdir(m);for(let D of b){let v=Z.join(m,D),$=Z.join(o,D);await J.copyFile(v,$)}}!await x(c)&&await x(f)&&await J.copyFile(f,c)}else{let k=`#!/bin/bash
1353
1388
  # prjct Status Line for Claude Code
1354
- CLI_VERSION="${fe}"
1389
+ CLI_VERSION="${Pe}"
1355
1390
  input=$(cat)
1356
1391
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
1357
1392
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -1380,14 +1415,14 @@ if [ -f "$CONFIG" ]; then
1380
1415
  fi
1381
1416
  fi
1382
1417
  echo "prjct"
1383
- `;await q.writeFile(s,S,{mode:493})}await my(t,s),await py(e,t)}catch(r){v(r)||H.warn(`Status line warning: ${w(r)}`)}}async function bE(){try{let r=re.join(us.homedir(),".claude"),e=re.join(r,"mcp.json");await P(r)||await q.mkdir(r,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await P(e)){let n=await q.readFile(e,"utf-8"),s=JSON.parse(n);if(s.mcpServers?.context7)return;s.mcpServers=s.mcpServers||{},s.mcpServers.context7=t.mcpServers.context7,await q.writeFile(e,JSON.stringify(s,null,2),"utf-8")}else await q.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(r){H.warn(`Context7 MCP setup warning: ${w(r)}`)}}async function Pa(r,e){if(!await P(r))return;let t=await q.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=re.join(r,n),o=re.join(e,n);await q.copyFile(s,o),await q.chmod(o,493)}}async function my(r,e){try{if(await P(r)){if((await q.lstat(r)).isSymbolicLink()&&await q.readlink(r)===e)return;await q.unlink(r)}await q.symlink(e,r)}catch{try{await P(e)&&(await q.copyFile(e,r),await q.chmod(r,493))}catch(n){v(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function CE(r,e){if(console.log(""),r.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var vE,yy=y(()=>{"use strict";qn();ki();he();_();ln();xe();Ln();dt();Be();xn();Va();l(fE,"installAICLI");l(gy,"run");l(hE,"installGeminiRouter");l(yE,"installGeminiGlobalConfig");l(fy,"installAntigravitySkill");l(wE,"needsAntigravityInstallation");l(SE,"migrateProjectsCliVersion");l(py,"ensureStatusLineSettings");l(kE,"installStatusLine");l(bE,"installContext7MCP");l(Pa,"installStatusLineModules");l(my,"ensureStatusLineSymlink");l(CE,"showResults");vE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");vE&&gy().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var wy=Iy((qJ,xE)=>{xE.exports={name:"prjct-cli",version:"1.28.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:{"@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.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",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",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:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk","prompts"]}});var RE={};import Sy from"node:os";import Ta from"node:path";import $e from"chalk";async function PE(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let t=await Promise.resolve().then(()=>Ay(wy()));await jE(t.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(DE(),process.exit(0)),h.start();try{let t=G.getByName(r);if(!t){let d=EE(r),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Gn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${r}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:s}=AE(t,e),o=TE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await vn.expireIfStale(i),await vn.touch(i))}catch{}let c=new gn,u;if(r==="design"){let d=n.join(" ");u=await c.design(d,s)}else if(r==="analyze")u=await c.analyze(s);else if(r==="cleanup")u=await c.cleanup(s);else if(r==="setup")u=await c.setup(s);else if(r==="update")u=await c.update(s);else{let d=n.join(" ")||null,m=s.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:s.json===!0,export:s.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:s.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:s.agents?String(s.agents).split(","):void 0,preview:s.preview===!0||s["dry-run"]===!0,yes:s.yes===!0,json:s.json===!0,md:m,package:s.package?String(s.package):void 0,full:s.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:s.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:s.json===!0,semantic:s.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[r];if(g)u=await g(d);else throw new Error(`Command '${r}' has no handler`)}if(i){let d=Date.now()-a;try{await vn.trackCommand(i,r,d)}catch{}try{await zn.recordTiming(i,"command_duration",d,{command:r});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await zn.recordTiming(i,"startup_time",p)}await zn.recordMemory(i,{command:r})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(wo(t)),h.end(),process.exit(1)}}function TE(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 n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return Gn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function EE(r){let e=G.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=IE(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function IE(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}function AE(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function jE(r){let e=await an(),t=Ta.join(Sy.homedir(),".claude","commands","p.md"),n=Ta.join(Sy.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(n),P(Ta.join(process.cwd(),".cursor","commands","sync.md")),P(Ta.join(process.cwd(),".cursor"))]),c=await ws();if(console.log(`
1384
- ${$e.cyan("p/")} prjct v${r}
1418
+ `;await J.writeFile(r,k,{mode:493})}await Py(t,r),await Cy(e,t)}catch(s){P(s)||U.warn(`Status line warning: ${w(s)}`)}}async function HE(){try{let s=Z.join(Nn.homedir(),".claude"),e=Z.join(s,"mcp.json");await x(s)||await J.mkdir(s,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await x(e)){let n=await J.readFile(e,"utf-8"),r=JSON.parse(n);if(r.mcpServers?.context7)return;r.mcpServers=r.mcpServers||{},r.mcpServers.context7=t.mcpServers.context7,await J.writeFile(e,JSON.stringify(r,null,2),"utf-8")}else await J.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(s){U.warn(`Context7 MCP setup warning: ${w(s)}`)}}async function Da(s,e){if(!await x(s))return;let t=await J.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=Z.join(s,n),o=Z.join(e,n);await J.copyFile(r,o),await J.chmod(o,493)}}async function Py(s,e){try{if(await x(s)){if((await J.lstat(s)).isSymbolicLink()&&await J.readlink(s)===e)return;await J.unlink(s)}await J.symlink(e,s)}catch{try{await x(e)&&(await J.copyFile(e,s),await J.chmod(s,493))}catch(n){P(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function GE(s,e){if(console.log(""),s.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var zE,Iy=y(()=>{"use strict";In();vi();ye();N();un();ve();Gn();dt();Je();An();tc();l(OE,"installAICLI");l(vy,"run");l(FE,"installGeminiRouter");l(_E,"installGeminiGlobalConfig");l(xy,"installAntigravitySkill");l(NE,"needsAntigravityInstallation");l(Ty,"installCodexSkill");l(LE,"migrateProjectsCliVersion");l(Cy,"ensureStatusLineSettings");l(UE,"installStatusLine");l(HE,"installContext7MCP");l(Da,"installStatusLineModules");l(Py,"ensureStatusLineSymlink");l(GE,"showResults");zE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");zE&&vy().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});var Ay=Ly((kq,WE)=>{WE.exports={name:"prjct-cli",version:"1.30.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:{"@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.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",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",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:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk","prompts"]}});var QE={};import jy from"node:os";import Ra from"node:path";import $e from"chalk";async function BE(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let t=await Promise.resolve().then(()=>Uy(Ay()));await YE(t.version),process.exit(0)}["-h","--help",void 0].includes(s)&&(XE(),process.exit(0)),h.start();try{let t=z.getByName(s);if(!t){let d=JE(s),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Bn("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${s}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${s}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:r}=KE(t,e),o=VE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await Tn.expireIfStale(i),await Tn.touch(i))}catch{}let c=new yn,u;if(s==="design"){let d=n.join(" ");u=await c.design(d,r)}else if(s==="analyze")u=await c.analyze(r);else if(s==="cleanup")u=await c.cleanup(r);else if(s==="setup")u=await c.setup(r);else if(s==="update")u=await c.update(r);else{let d=n.join(" ")||null,m=r.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:r.json===!0,export:r.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:r.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:r.agents?String(r.agents).split(","):void 0,preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:m,package:r.package?String(r.package):void 0,full:r.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:r.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:r.json===!0,semantic:r.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[s];if(g)u=await g(d);else throw new Error(`Command '${s}' has no handler`)}if(i){let d=Date.now()-a;try{await Tn.trackCommand(i,s,d)}catch{}try{await Vn.recordTiming(i,"command_duration",d,{command:s});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Vn.recordTiming(i,"startup_time",p)}await Vn.recordMemory(i,{command:s})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(Co(t)),h.end(),process.exit(1)}}function VE(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return Bn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function JE(s){let e=z.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=qE(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}function qE(s,e){let t=s.length,n=e.length,r=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=n;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)r[o][i]=s[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][n]}function KE(s,e){let t=[],n={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function YE(s){let e=await cn(),t=Ra.join(jy.homedir(),".claude","commands","p.md"),n=Ra.join(jy.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([x(t),x(n),x(Ra.join(process.cwd(),".cursor","commands","sync.md")),x(Ra.join(process.cwd(),".cursor"))]),c=await Ss();if(console.log(`
1419
+ ${$e.cyan("p/")} prjct v${s}
1385
1420
  ${$e.dim("Context layer for AI coding agents")}
1386
1421
 
1387
- ${$e.dim("Providers:")}`),e.claude.installed){let u=s?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${$e.dim(d)}`)}else console.log(` Claude Code ${$e.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${$e.dim(d)}`)}else console.log(` Gemini CLI ${$e.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?$e.green("\u2713 ready"):$e.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${$e.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${$e.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${$e.green("\u2713 ready")} ${$e.dim("(use /sync, /task)")}`:a?` Cursor IDE ${$e.yellow("\u25CF detected")} ${$e.dim("(run prjct init)")}`:` Cursor IDE ${$e.dim("\u25CB no .cursor/ folder")}`),console.log(`
1422
+ ${$e.dim("Providers:")}`),e.claude.installed){let u=r?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${$e.dim(d)}`)}else console.log(` Claude Code ${$e.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${$e.dim(d)}`)}else console.log(` Gemini CLI ${$e.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?$e.green("\u2713 ready"):$e.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${$e.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${$e.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${$e.green("\u2713 ready")} ${$e.dim("(use /sync, /task)")}`:a?` Cursor IDE ${$e.yellow("\u25CF detected")} ${$e.dim("(run prjct init)")}`:` Cursor IDE ${$e.dim("\u25CB no .cursor/ folder")}`),console.log(`
1388
1423
  ${$e.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1389
1424
  ${$e.cyan("https://prjct.app")}
1390
- `)}function DE(){console.log(`
1425
+ `)}function XE(){console.log(`
1391
1426
  prjct - Context layer for AI coding agents
1392
1427
  Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
1393
1428
 
@@ -1446,15 +1481,15 @@ MORE INFO
1446
1481
  ---------
1447
1482
  Documentation: https://prjct.app
1448
1483
  GitHub: https://github.com/jlopezlira/prjct-cli
1449
- `)}var ky=y(()=>{"use strict";sd();Us();ba();Be();Ve();ei();Zo();_();Or();xe();Nt();l(PE,"main");l(TE,"validateCommandParams");l(EE,"findClosestCommand");l(IE,"editDistance");l(AE,"parseCommandArgs");l(jE,"displayVersion");l(DE,"displayHelp");PE().catch(r=>{console.error("Fatal error:",w(r)),process.env.DEBUG&&console.error(wo(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var mr=process.argv.slice(2),ud=mr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),$E=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(ud&&!$E.has(ud)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(ho(),md)),t=e.socket();if(r.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(ms(),ps)),s=await import("node:crypto"),o=[],i={};for(let a=0;a<mr.length;a++){let c=mr[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<mr.length&&!mr[a+1].startsWith("--")?i[u]=mr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:s.randomUUID(),command:ud,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 ME(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Be(),ut)),s=(await Promise.resolve().then(()=>(Ve(),_d))).default,o=(await Promise.resolve().then(()=>(Va(),Ld))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(wc(),_p)),{fileExists:c}=await Promise.resolve().then(()=>(xe(),ce)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ra(),Td)),{VERSION:d}=await Promise.resolve().then(()=>(dt(),Ao));async function m(){let x=r.homedir(),O=await n();if(O.claude.installed){let F=e.join(x,".claude","commands","p.md");if(!await c(F))return!1}if(O.gemini.installed){let F=e.join(x,".gemini","commands","p.toml");if(!await c(F))return!1}return!O.claude.installed&&!O.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(x=>x==="--quiet"||x==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:x}=await Promise.resolve().then(()=>(Nt(),Up));x(!0)}let S=p.indexOf("--refresh"),b=S!==-1;b&&(p.splice(S,1),await u());async function D(x){let O=Date.now();try{let F=await s.getProjectId(process.cwd());if(F){let{sessionTracker:K}=await Promise.resolve().then(()=>(Zo(),Wp));return await K.expireIfStale(F),await K.touch(F),()=>{let oe=Date.now()-O;K.trackCommand(F,x,oe).catch(()=>{}),Promise.resolve().then(()=>(ei(),Vp)).then(({performanceTracker:k})=>{k.recordTiming(F,"command_duration",oe,{command:x}).catch(()=>{}),k.recordMemory(F,{command:x}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let x=p[1]||"status";if(x==="start"){let{isDaemonRunning:O,spawnDaemon:F}=await Promise.resolve().then(()=>(ms(),ps));if(await O())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:oe}=await Promise.resolve().then(()=>($h(),Rh)),k=parseInt(p.find(ee=>ee.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await oe({port:k,noHttp:j,foreground:!0})}else await F()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(x==="stop"){let{isDaemonRunning:O,stopDaemon:F}=await Promise.resolve().then(()=>(ms(),ps));if(await O()){let K=await F();console.log(K?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=K?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(x==="status"){let{getDaemonStatus:O}=await Promise.resolve().then(()=>(ms(),ps)),F=await O();if(F.running){let K=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${K}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${x}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:x}=await Promise.resolve().then(()=>(Fh(),Oh));await x()}else if(p[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(p[0]==="web"||p[0]==="serve")try{let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a(O,x,F)}}catch(x){console.error("Server error:",x.message),process.exitCode=1}else if(p[0]==="context"){let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:K}=await Promise.resolve().then(()=>(Vh(),Bh)),oe=await K(p.slice(1),O,x);console.log(JSON.stringify(oe,null,2)),process.exitCode=oe.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let x=await D("hooks"),{hooksService:O}=await Promise.resolve().then(()=>(Xh(),Yh)),F=p[1]||"status",K=await O.run(process.cwd(),F);process.exitCode=K,x()}else if(p[0]==="doctor"){let x=await D("doctor"),{doctorService:O}=await Promise.resolve().then(()=>(ty(),ey)),F=await O.run(process.cwd());process.exitCode=F,x()}else if(p[0]==="uninstall"){let{uninstall:x}=await Promise.resolve().then(()=>(nd(),Eh)),O=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),K=p.includes("--dry-run")||p.includes("-n"),oe=p.includes("--keep-package"),k=await x({force:O,backup:F,dryRun:K,keepPackage:oe});process.exitCode=k.success?0:1}else if(p[0]==="watch"){let x=process.cwd();if(!await s.getProjectId(x))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(sy(),ny)),K=p.includes("--verbose")||p.includes("-v"),oe=p.find(it=>it.startsWith("--debounce=")),k=oe?parseInt(oe.split("=")[1],10):void 0,j=p.find(it=>it.startsWith("--interval=")),ee=j?parseInt(j.split("=")[1],10)*1e3:void 0,N=await F.start(x,{verbose:K,quiet:f,debounceMs:k,minIntervalMs:ee});N.success||(console.error(N.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:x}=await import("node:child_process"),O=await import("node:fs"),F=process.cwd(),K=await s.getProjectId(F);if(!K)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let oe=e.join(__dirname,"..","core","cli","linear.ts"),k=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),ee,N;if(O.existsSync(oe)?(ee=oe,N="bun"):O.existsSync(j)?(ee=j,N="node"):O.existsSync(k)?(ee=k,N="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,ee="",N=""),ee){let it=["--project",K,...p.slice(1)];x(N,[ee,...it],{stdio:"inherit",cwd:F}).on("close",gr=>{process.exitCode=gr||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:x}=await Promise.resolve().then(()=>(dy(),uy)),O=p[1];console.log(x(O)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let x=await n(b),O=r.homedir(),F=process.cwd(),[K,oe,k,j,ee,N]=await Promise.all([c(e.join(O,".claude","commands","p.md")),c(e.join(O,".gemini","commands","p.toml")),c(e.join(F,".cursor")),c(e.join(F,".cursor","rules","prjct.mdc")),c(e.join(F,".windsurf")),c(e.join(F,".windsurf","rules","prjct.md"))]);if(console.log(`
1484
+ `)}var Dy=y(()=>{"use strict";ad();zs();Ea();Je();qe();ri();si();N();Fr();ve();Gt();l(BE,"main");l(VE,"validateCommandParams");l(JE,"findClosestCommand");l(qE,"editDistance");l(KE,"parseCommandArgs");l(YE,"displayVersion");l(XE,"displayHelp");BE().catch(s=>{console.error("Fatal error:",w(s)),process.env.DEBUG&&console.error(Co(s)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var fr=process.argv.slice(2),md=fr.find(s=>!s.startsWith("--")&&!s.startsWith("-")),ZE=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(md&&!ZE.has(md)&&process.env.PRJCT_NO_DAEMON!=="1"){let s=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(So(),hd)),t=e.socket();if(s.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(hs(),fs)),r=await import("node:crypto"),o=[],i={};for(let a=0;a<fr.length;a++){let c=fr[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<fr.length&&!fr[a+1].startsWith("--")?i[u]=fr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:r.randomUUID(),command:md,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 eI(){let s=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Je(),ut)),r=(await Promise.resolve().then(()=>(qe(),Hd))).default,o=(await Promise.resolve().then(()=>(tc(),zd))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(Ec(),Hp)),{fileExists:c}=await Promise.resolve().then(()=>(ve(),ce)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(La(),Ad)),{VERSION:d}=await Promise.resolve().then(()=>(dt(),$o));async function m(){let v=s.homedir(),$=await n();if($.claude.installed){let F=e.join(v,".claude","commands","p.md");if(!await c(F))return!1}if($.gemini.installed){let F=e.join(v,".gemini","commands","p.toml");if(!await c(F))return!1}return!$.claude.installed&&!$.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(v=>v==="--quiet"||v==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:v}=await Promise.resolve().then(()=>(Gt(),Bp));v(!0)}let k=p.indexOf("--refresh"),b=k!==-1;b&&(p.splice(k,1),await u());async function D(v){let $=Date.now();try{let F=await r.getProjectId(process.cwd());if(F){let{sessionTracker:H}=await Promise.resolve().then(()=>(si(),qp));return await H.expireIfStale(F),await H.touch(F),()=>{let ee=Date.now()-$;H.trackCommand(F,v,ee).catch(()=>{}),Promise.resolve().then(()=>(ri(),Yp)).then(({performanceTracker:S})=>{S.recordTiming(F,"command_duration",ee,{command:v}).catch(()=>{}),S.recordMemory(F,{command:v}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let v=p[1]||"status";if(v==="start"){let{isDaemonRunning:$,spawnDaemon:F}=await Promise.resolve().then(()=>(hs(),fs));if(await $())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:ee}=await Promise.resolve().then(()=>(Gh(),Hh)),S=parseInt(p.find(te=>te.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await ee({port:S,noHttp:j,foreground:!0})}else await F()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(v==="stop"){let{isDaemonRunning:$,stopDaemon:F}=await Promise.resolve().then(()=>(hs(),fs));if(await $()){let H=await F();console.log(H?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=H?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(v==="status"){let{getDaemonStatus:$}=await Promise.resolve().then(()=>(hs(),fs)),F=await $();if(F.running){let H=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${H}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${v}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:v}=await Promise.resolve().then(()=>(Vh(),Bh));await v()}else if(p[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(p[0]==="web"||p[0]==="serve")try{let v=process.cwd(),$=await r.getProjectId(v);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a($,v,F)}}catch(v){console.error("Server error:",v.message),process.exitCode=1}else if(p[0]==="context"){let v=process.cwd(),$=await r.getProjectId(v);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:H}=await Promise.resolve().then(()=>(ny(),ty)),ee=await H(p.slice(1),$,v);console.log(JSON.stringify(ee,null,2)),process.exitCode=ee.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let v=await D("hooks"),{hooksService:$}=await Promise.resolve().then(()=>(ay(),iy)),F=p[1]||"status",H=await $.run(process.cwd(),F);process.exitCode=H,v()}else if(p[0]==="doctor"){let v=await D("doctor"),{doctorService:$}=await Promise.resolve().then(()=>(dy(),uy)),F=await $.run(process.cwd());process.exitCode=F,v()}else if(p[0]==="uninstall"){let{uninstall:v}=await Promise.resolve().then(()=>(id(),Fh)),$=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),H=p.includes("--dry-run")||p.includes("-n"),ee=p.includes("--keep-package"),S=await v({force:$,backup:F,dryRun:H,keepPackage:ee});process.exitCode=S.success?0:1}else if(p[0]==="watch"){let v=process.cwd();if(!await r.getProjectId(v))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(my(),py)),H=p.includes("--verbose")||p.includes("-v"),ee=p.find(_=>_.startsWith("--debounce=")),S=ee?parseInt(ee.split("=")[1],10):void 0,j=p.find(_=>_.startsWith("--interval=")),te=j?parseInt(j.split("=")[1],10)*1e3:void 0,Ve=await F.start(v,{verbose:H,quiet:f,debounceMs:S,minIntervalMs:te});Ve.success||(console.error(Ve.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:v}=await import("node:child_process"),$=await import("node:fs"),F=process.cwd(),H=await r.getProjectId(F);if(!H)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let ee=e.join(__dirname,"..","core","cli","linear.ts"),S=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),te,Ve;if($.existsSync(ee)?(te=ee,Ve="bun"):$.existsSync(j)?(te=j,Ve="node"):$.existsSync(S)?(te=S,Ve="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,te="",Ve=""),te){let _=["--project",H,...p.slice(1)];v(Ve,[te,..._],{stdio:"inherit",cwd:F}).on("close",ko=>{process.exitCode=ko||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:v}=await Promise.resolve().then(()=>(by(),Sy)),$=p[1];console.log(v($)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let v=await n(b),$=s.homedir(),F=process.cwd(),[H,ee,S,j,te,Ve]=await Promise.all([c(e.join($,".claude","commands","p.md")),c(e.join($,".gemini","commands","p.toml")),c(e.join(F,".cursor")),c(e.join(F,".cursor","rules","prjct.mdc")),c(e.join(F,".windsurf")),c(e.join(F,".windsurf","rules","prjct.md"))]);if(console.log(`
1450
1485
  ${t.cyan("p/")} prjct v${d}
1451
1486
  ${t.dim("Context layer for AI coding agents")}
1452
1487
 
1453
- ${t.dim("Providers:")}`),x.claude.installed){let it=K?t.green("\u2713 ready"):t.yellow("\u25CF installed"),On=x.claude.version?` (v${x.claude.version})`:"";console.log(` Claude Code ${it}${t.dim(On)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(x.gemini.installed){let it=oe?t.green("\u2713 ready"):t.yellow("\u25CF installed"),On=x.gemini.version?` (v${x.gemini.version})`:"";console.log(` Gemini CLI ${it}${t.dim(On)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(k){let it=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${it}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(ee){let it=N?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${it}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
1488
+ ${t.dim("Providers:")}`),v.claude.installed){let _=H?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ms=v.claude.version?` (v${v.claude.version})`:"";console.log(` Claude Code ${_}${t.dim(ms)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(v.gemini.installed){let _=ee?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ms=v.gemini.version?` (v${v.gemini.version})`:"";console.log(` Gemini CLI ${_}${t.dim(ms)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(S){let _=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${_}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(te){let _=Ve?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${_}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
1454
1489
  ${t.dim("Run 'prjct start' to configure (CLI providers)")}
1455
1490
  ${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1456
1491
  ${t.cyan("https://prjct.app")}
1457
- `)}else{let x=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),O=await m();if(!await c(x)||!O)console.log(`
1492
+ `)}else{let v=e.join(s.homedir(),".prjct-cli","config","installed-editors.json"),$=await m();if(!await c(v)||!$)console.log(`
1458
1493
  ${t.cyan.bold(" Welcome to prjct!")}
1459
1494
 
1460
1495
  Run ${t.bold("prjct start")} to configure your AI providers.
@@ -1463,4 +1498,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
1463
1498
  Claude Code, Gemini CLI, or both.`)}
1464
1499
  `),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
1465
1500
  ${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
1466
- `);let{default:K}=await Promise.resolve().then(()=>(yy(),hy));await K.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(ms(),ps)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(ky(),RE))}}}l(ME,"main");ME().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
1501
+ `);let{default:H}=await Promise.resolve().then(()=>(Iy(),Ey));await H.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(hs(),fs)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(Dy(),QE))}}}l(eI,"main");eI().catch(s=>{console.error("Fatal error:",s.message),process.exit(1)});