prjct-cli 1.30.1 → 1.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,15 +4,15 @@ import { dirname as __pathDirname } from 'path';
4
4
  var require = __createRequire(import.meta.url);
5
5
  var __filename = __fileURLToPath(import.meta.url);
6
6
  var __dirname = __pathDirname(__filename);
7
- var 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(`
7
+ var _y=Object.create;var wr=Object.defineProperty;var Ny=Object.getOwnPropertyDescriptor;var Ly=Object.getOwnPropertyNames;var Uy=Object.getPrototypeOf,Hy=Object.prototype.hasOwnProperty;var l=(s,e)=>wr(s,"name",{value:e,configurable:!0}),kr=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});var y=(s,e)=>()=>(s&&(e=s(s=0)),e);var Gy=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),ye=(s,e)=>{for(var t in e)wr(s,t,{get:e[t],enumerable:!0})},yd=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ly(e))!Hy.call(s,r)&&r!==t&&wr(s,r,{get:()=>e[r],enumerable:!(n=Ny(e,r))||n.enumerable});return s};var zy=(s,e,t)=>(t=s!=null?_y(Uy(s)):{},yd(e||!s||!s.__esModule?wr(t,"default",{value:s,enumerable:!0}):t,s)),Tt=s=>yd(wr({},"__esModule",{value:!0}),s);var wd={};ye(wd,{DAEMON_PATHS:()=>Ge,IDLE_TIMEOUT_MS:()=>_a,decodeMessage:()=>Wy,encodeMessage:()=>hs});function hs(s){return Buffer.from(`${JSON.stringify(s)}
8
+ `)}function Wy(s){return JSON.parse(s.trim())}var Ge,_a,Co=y(()=>{"use strict";Ge={runDir:l(()=>`${process.env.HOME||kr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ge.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ge.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ge.runDir()}/daemon.log`,"log")},_a=1800*1e3;l(hs,"encodeMessage");l(Wy,"decodeMessage")});var ys={};ye(ys,{executeViaDaemon:()=>Jy,getDaemonStatus:()=>Vy,isDaemonRunning:()=>kd,sendRequest:()=>Sr,spawnDaemon:()=>Sd,stopDaemon:()=>qy});import Po from"node:crypto";import Et from"node:fs";import{connect as By}from"node:net";async function kd(){let s=Ge.socket();if(!Et.existsSync(s))return!1;try{return(await Sr({id:Po.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Et.unlinkSync(s)}catch{}return!1}}async function Vy(){let s=Ge.socket(),e=Ge.pid();if(!Et.existsSync(s))return{running:!1};try{let t=await Sr({id:Po.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Et.existsSync(e)?{running:!1,pid:parseInt(Et.readFileSync(e,"utf-8").trim(),10),socketPath:s}:{running:!1}}function Sr(s){return new Promise((e,t)=>{let n=Ge.socket(),r=By(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(hs(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 Jy(s,e,t,n,r,o=!0){let i=Ge.socket();if(!Et.existsSync(i))return o&&Sd().catch(()=>{}),null;try{return await Sr({id:Po.randomUUID(),command:s,args:e,options:t,cwd:n,perfStartNs:r})}catch{return null}}async function qy(){try{return(await Sr({id:Po.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function Sd(){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(Et.existsSync(t))o=t,i="bun";else if(Et.existsSync(n))o=n,i="node";else if(Et.existsSync(r))o=r,i="node";else return!1;let a=Ge.runDir();Et.mkdirSync(a,{recursive:!0});let c=Ge.log(),u=Et.openSync(c,"a");return s(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Et.closeSync(u),await new Promise(m=>setTimeout(m,500)),kd()}var ws=y(()=>{"use strict";Co();l(kd,"isDaemonRunning");l(Vy,"getDaemonStatus");l(Sr,"sendRequest");l(Jy,"executeViaDaemon");l(qy,"stopDaemon");l(Sd,"spawnDaemon")});import{z as Xt}from"zod";function bd(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 hI,yI,wI,br,kI,Cr=y(()=>{"use strict";hI=Xt.enum(["opus","sonnet","haiku"]),yI=Xt.enum(["2.5-pro","2.5-flash","2.0-flash"]),wI=Xt.string().min(1),br=Xt.object({provider:Xt.string(),model:Xt.string(),cliVersion:Xt.string().optional(),recordedAt:Xt.string()}),kI=Xt.object({preferredModel:Xt.string().optional(),lastAnalysisModel:br.optional()});l(bd,"compareSemver")});function Cd(s){return s instanceof Error&&"code"in s}function P(s){return Cd(s)&&s.code==="ENOENT"}function w(s){return s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}function vo(s){if(s instanceof Error)return s.stack}var N=y(()=>{"use strict";l(Cd,"isNodeError");l(P,"isNotFoundError");l(w,"getErrorMessage");l(vo,"getErrorStack")});import xd from"node:fs/promises";async function Td(s,e){let t;try{t=await xd.readFile(s,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Pd(s,t),vd(s,"Malformed JSON"),null}let r=e.safeParse(n);return r.success?n:(await Pd(s,t),vd(s,Ky(r.error)),null)}async function Pd(s,e){let t=`${s}.backup`;try{await xd.writeFile(t,e,"utf-8")}catch{}}function vd(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 Ky(s){return s.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ed=y(()=>{"use strict";N();l(Td,"safeRead");l(Pd,"createBackup");l(vd,"logCorruption");l(Ky,"formatZodError")});var le={};ye(le,{appendLine:()=>Na,appendToFile:()=>Xy,atomicWrite:()=>Yy,copyFile:()=>sw,deleteDir:()=>ew,deleteFile:()=>Zy,dirExists:()=>xo,ensureDir:()=>Nt,fileExists:()=>x,getFileExtension:()=>aw,getFileModifiedTime:()=>nw,getFileNameWithoutExtension:()=>cw,getFileSize:()=>tw,listFiles:()=>bs,moveFile:()=>rw,prependToFile:()=>Qy,readFile:()=>Ss,readJson:()=>Un,readLines:()=>ow,writeFile:()=>Id,writeJson:()=>Pr,writeLines:()=>iw});import ke from"node:fs/promises";import ks from"node:path";async function Un(s,e=null,t){if(t)return await Td(s,t)??e;try{let n=await ke.readFile(s,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function Pr(s,e,t=2){let n=JSON.stringify(e,null,t);await ke.writeFile(s,n,"utf-8")}async function Ss(s,e=""){try{return await ke.readFile(s,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Id(s,e){let t=ks.dirname(s);await ke.mkdir(t,{recursive:!0}),await ke.writeFile(s,e,"utf-8")}async function Yy(s,e){let t=ks.dirname(s);await ke.mkdir(t,{recursive:!0});let n=`${s}.${Date.now()}.tmp`;await ke.writeFile(n,e,"utf-8"),await ke.rename(n,s)}async function Xy(s,e){await ke.appendFile(s,e,"utf-8")}async function Na(s,e){let t=ks.dirname(s);await ke.mkdir(t,{recursive:!0}),await ke.appendFile(s,`${e}
10
+ `,"utf-8")}async function Qy(s,e){try{let t=await ke.readFile(s,"utf-8");await ke.writeFile(s,e+t,"utf-8")}catch(t){if(P(t))await ke.writeFile(s,e,"utf-8");else throw t}}async function x(s){try{return await ke.access(s),!0}catch(e){if(P(e))return!1;throw e}}async function xo(s){try{return(await ke.stat(s)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Nt(s){await ke.mkdir(s,{recursive:!0})}async function Zy(s){try{return await ke.unlink(s),!0}catch(e){if(P(e))return!1;throw e}}async function ew(s){try{return await ke.rm(s,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function bs(s,e={}){try{let n=await ke.readdir(s,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(r=>r.isFile())),e.dirsOnly&&(n=n.filter(r=>r.isDirectory())),e.extension&&(n=n.filter(r=>r.name.endsWith(e.extension))),n.map(r=>r.name)}catch(t){if(P(t))return[];throw t}}async function tw(s){return(await ke.stat(s)).size}async function nw(s){return(await ke.stat(s)).mtime}async function sw(s,e){await ke.copyFile(s,e)}async function rw(s,e){await ke.rename(s,e)}async function ow(s){return(await Ss(s,"")).split(`
11
+ `)}async function iw(s,e){let t=e.join(`
12
+ `);await Id(s,t)}function aw(s){return ks.extname(s)}function cw(s){return ks.basename(s,ks.extname(s))}var Te=y(()=>{"use strict";Ed();N();l(Un,"readJson");l(Pr,"writeJson");l(Ss,"readFile");l(Id,"writeFile");l(Yy,"atomicWrite");l(Xy,"appendToFile");l(Na,"appendLine");l(Qy,"prependToFile");l(x,"fileExists");l(xo,"dirExists");l(Nt,"ensureDir");l(Zy,"deleteFile");l(ew,"deleteDir");l(bs,"listFiles");l(tw,"getFileSize");l(nw,"getFileModifiedTime");l(sw,"copyFile");l(rw,"moveFile");l(ow,"readLines");l(iw,"writeLines");l(aw,"getFileExtension");l(cw,"getFileNameWithoutExtension")});var Dd={};ye(Dd,{invalidateProviderCache:()=>dw,readProviderCache:()=>Ua,writeProviderCache:()=>Ha});import To from"node:fs/promises";import lw from"node:os";import Ad from"node:path";async function Ua(){try{let s=await To.readFile(La,"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>uw?null:e.detection}catch{return null}}async function Ha(s){let e={timestamp:new Date().toISOString(),detection:s};await To.mkdir(jd,{recursive:!0}),await To.writeFile(La,JSON.stringify(e,null,2))}async function dw(){try{await To.unlink(La)}catch{}}var jd,La,uw,Ga=y(()=>{"use strict";jd=Ad.join(lw.homedir(),".prjct-cli","cache"),La=Ad.join(jd,"providers.json"),uw=600*1e3;l(Ua,"readProviderCache");l(Ha,"writeProviderCache");l(dw,"invalidateProviderCache")});var pt={};ye(pt,{AntigravityProvider:()=>Wa,ClaudeProvider:()=>Eo,CodexProvider:()=>Ba,CursorProvider:()=>Md,GeminiProvider:()=>za,Providers:()=>Oe,WindsurfProvider:()=>Od,detectAllProviders:()=>cn,detectAntigravity:()=>Cs,detectCodex:()=>Va,detectCursorProject:()=>Nd,detectProvider:()=>Io,detectWindsurfProject:()=>Ld,getActiveProvider:()=>fw,getCommandsDir:()=>Cw,getGlobalContextPath:()=>kw,getGlobalSettingsPath:()=>Sw,getProjectCommandsPath:()=>Pw,getProviderBranding:()=>Ao,getSkillsPath:()=>bw,hasProviderConfig:()=>hw,needsCursorRouterRegeneration:()=>yw,needsWindsurfRouterRegeneration:()=>ww,selectProvider:()=>Ja,validateCliVersion:()=>_d});import{exec as pw}from"node:child_process";import kn from"node:os";import ze from"node:path";import{promisify as mw}from"node:util";async function Fd(s){try{let{stdout:e}=await Rd(`which ${s}`,{timeout:$d});return e.trim()}catch{return null}}async function gw(s){try{let{stdout:e}=await Rd(`${s} --version`,{timeout:$d}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Io(s){let e=Oe[s];if(!e.cliCommand)return{installed:!1};let t=await Fd(e.cliCommand);if(!t)return{installed:!1};let n=await gw(e.cliCommand),r=_d(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function _d(s,e){let t=Oe[s];return!t.minCliVersion||!e?null:bd(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 Ua();if(r)return r}let[e,t]=await Promise.all([Io("claude"),Io("gemini")]),n={claude:e,gemini:t};return await Ha(n).catch(()=>{}),n}async function fw(s){if(s&&Oe[s])return Oe[s];let e=await cn();return e.claude.installed&&!e.gemini.installed?Eo:e.gemini.installed&&!e.claude.installed?za:Eo}async function hw(s){let e=Oe[s];return e.configDir?x(e.configDir):!1}function Ao(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 Nd(s){let e=ze.join(s,".cursor"),t=ze.join(e,"rules"),n=ze.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 yw(s){let e=await Nd(s);return e.detected&&!e.routerInstalled}async function Ld(s){let e=ze.join(s,".windsurf"),t=ze.join(e,"rules"),n=ze.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 ww(s){let e=await Ld(s);return e.detected&&!e.routerInstalled}async function Cs(){let s=Wa.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=ze.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 Va(){let s=Ba.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Fd("codex"),t=ze.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 kw(s){let e=Oe[s];return e.configDir?ze.join(e.configDir,e.contextFile):null}function Sw(s){let e=Oe[s];return!e.configDir||!e.settingsFile?null:ze.join(e.configDir,e.settingsFile)}function bw(s){return Oe[s].skillsDir}function Cw(s){return Oe[s].commandsDir}function Pw(s,e){let t=Oe[s];return ze.join(e,t.commandsDir)}async function Ja(){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 Rd,$d,Eo,za,Wa,Md,Od,Ba,Oe,qe=y(()=>{"use strict";Cr();Te();Ga();Rd=mw(pw),$d=2e3,Eo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ze.join(kn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ze.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"},za={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ze.join(kn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ze.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"},Wa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ze.join(kn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ze.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},Md={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null},Od={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null},Ba={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ze.join(kn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ze.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},Oe={claude:Eo,gemini:za,cursor:Md,antigravity:Wa,windsurf:Od,codex:Ba};l(Fd,"whichCommand");l(gw,"getCliVersion");l(Io,"detectProvider");l(_d,"validateCliVersion");l(cn,"detectAllProviders");l(fw,"getActiveProvider");l(hw,"hasProviderConfig");l(Ao,"getProviderBranding");l(Nd,"detectCursorProject");l(yw,"needsCursorRouterRegeneration");l(Ld,"detectWindsurfProject");l(ww,"needsWindsurfRouterRegeneration");l(Cs,"detectAntigravity");l(Va,"detectCodex");l(kw,"getGlobalContextPath");l(Sw,"getGlobalSettingsPath");l(bw,"getSkillsPath");l(Cw,"getCommandsDir");l(Pw,"getProjectCommandsPath");l(Ja,"selectProvider")});import{z as Se}from"zod";function vw(s){return s instanceof Ps}function re(s){return vw(s)||s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var vs,VI,JI,qI,KI,YI,XI,Ps,jo,Do,vr,ln=y(()=>{"use strict";vs={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}},VI=vs.create("FileError",Se.object({path:Se.string(),operation:Se.enum(["read","write","delete","create","copy"]),reason:Se.string().optional()})),JI=vs.create("ValidationError",Se.object({field:Se.string(),expected:Se.string(),received:Se.string().optional(),message:Se.string().optional()})),qI=vs.create("PermissionError",Se.object({action:Se.string(),resource:Se.string(),reason:Se.string().optional()})),KI=vs.create("TaskError",Se.object({taskId:Se.string().optional(),operation:Se.enum(["create","update","complete","pause","resume","delete"]),reason:Se.string()})),YI=vs.create("SessionError",Se.object({sessionId:Se.string().optional(),reason:Se.string()})),XI=vs.create("SyncError",Se.object({projectId:Se.string().optional(),operation:Se.enum(["push","pull","auth","connect"]),reason:Se.string()})),Ps=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},jo=class s extends Ps{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new s("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new s(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new s(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Do=class s extends Ps{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new s(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new s(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},vr=class s extends Ps{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new s(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new s(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(vw,"isPrjctError");l(re,"getErrorMessage")});var B={};ye(B,{calculateDuration:()=>$w,formatDate:()=>Ro,formatDuration:()=>xr,formatMonth:()=>Tw,getDateKey:()=>Ew,getDateRange:()=>jw,getDaysAgo:()=>Sn,getDaysFromNow:()=>Aw,getEndOfDay:()=>Ow,getStartOfDay:()=>Mw,getTimestamp:()=>C,getTodayKey:()=>Ud,getYearMonthDay:()=>qa,isToday:()=>Dw,isWithinLastDays:()=>Rw,parseDate:()=>Iw,toRelative:()=>Fw});import{formatDistanceToNowStrict as xw}from"date-fns";function Ro(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 Tw(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Ud(){return Ro(new Date)}function Ew(s){return Ro(s)}function qa(s){return{year:s.getFullYear().toString(),month:(s.getMonth()+1).toString().padStart(2,"0"),day:s.getDate().toString().padStart(2,"0")}}function Iw(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 Aw(s){let e=new Date;return e.setDate(e.getDate()+s),e}function jw(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 Dw(s){return Ro(s)===Ud()}function Rw(s,e){let t=Sn(e);return s>=t}function xr(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 $w(s,e=new Date){let t=e.getTime()-s.getTime();return xr(t)}function Mw(s){let e=new Date(s);return e.setHours(0,0,0,0),e}function Ow(s){let e=new Date(s);return e.setHours(23,59,59,999),e}function Fw(s){let e=typeof s=="string"?new Date(s):s;return xw(e,{addSuffix:!0})}var ue=y(()=>{"use strict";l(Ro,"formatDate");l(Tw,"formatMonth");l(Ud,"getTodayKey");l(Ew,"getDateKey");l(qa,"getYearMonthDay");l(Iw,"parseDate");l(C,"getTimestamp");l(Sn,"getDaysAgo");l(Aw,"getDaysFromNow");l(jw,"getDateRange");l(Dw,"isToday");l(Rw,"isWithinLastDays");l(xr,"formatDuration");l($w,"calculateDuration");l(Mw,"getStartOfDay");l(Ow,"getEndOfDay");l(Fw,"toRelative")});var Oo={};ye(Oo,{PACKAGE_ROOT:()=>pe,VERSION:()=>xe,compareVersions:()=>Hd,getPackageInfo:()=>_w,getPackageRoot:()=>Xa,getVersion:()=>Hn,isCompatible:()=>Nw,needsMigration:()=>Lw});import Ka from"node:fs";import Mo from"node:path";function Xa(){if(Tr)return Tr;let s=__dirname;for(let e=0;e<5;e++){let t=Mo.join(s,"package.json");if(Ka.existsSync(t))try{if(JSON.parse(Ka.readFileSync(t,"utf-8")).name==="prjct-cli")return Tr=s,s}catch{}s=Mo.dirname(s)}return Tr=Mo.join(__dirname,"..","..",".."),Tr}function Hn(){if($o)return $o;try{let s=Mo.join(Xa(),"package.json"),e=JSON.parse(Ka.readFileSync(s,"utf-8"));return $o=e.version,Ya=e,$o}catch(s){return console.error("Failed to read version from package.json:",w(s)),"0.0.0"}}function _w(){return Ya||Hn(),Ya}function Hd(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 Nw(s){let e=Hn(),[t,n]=e.split(".").map(Number),[r,o]=s.split(".").map(Number);return t===r&&n===o}function Lw(s,e=null){let t=e||Hn();return Hd(s,t)<0}var $o,Ya,Tr,xe,pe,ct=y(()=>{"use strict";N();$o=null,Ya=null,Tr=null;l(Xa,"getPackageRoot");l(Hn,"getVersion");l(_w,"getPackageInfo");l(Hd,"compareVersions");l(Nw,"isCompatible");l(Lw,"needsMigration");xe=Hn(),pe=Xa()});import{exec as Uw}from"node:child_process";import{promisify as Hw}from"node:util";async function Fo(s){try{let{stdout:e}=await Gw(s,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function zw(){let s=await Fo("gh api user --jq .login");return s.success&&s.output||(s=await Fo("git config --global github.user"),s.success&&s.output)?s.output:null}async function Ww(){let s=await Fo("git config user.name");return s.success&&s.output?s.output:null}async function Bw(){let s=await Fo("git config user.email");return s.success&&s.output?s.output:null}async function xs(){let[s,e,t]=await Promise.all([zw(),Ww(),Bw()]);return{github:s,email:t,name:e||s||"Unknown"}}var Gw,_o=y(()=>{"use strict";Gw=Hw(Uw);l(Fo,"execCommand");l(zw,"detectGitHubUsername");l(Ww,"detectGitName");l(Bw,"detectGitEmail");l(xs,"detect")});import Vw from"node:crypto";import Qt from"node:fs/promises";import Za from"node:os";import G from"node:path";import{globSync as Jw}from"glob";var ec,qw,I,be=y(()=>{"use strict";ue();Te();ec=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(Za.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 Vw.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 xo(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}=qa(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 xo(t)}getDisplayPath(e){let t=Za.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(qe(),Tt(pt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(qe(),Tt(pt)).getActiveProvider();return(qe(),Tt(pt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return G.join(Za.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=Jw(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}},qw=new ec,I=qw});var zd={};ye(zd,{default:()=>R});import Gn from"node:fs/promises";import Kw from"node:path";import*as No from"jsonc-parser";function Gd(s){let e=[],t=No.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}: ${No.printParseErrorCode(n.error)}`)}return t}var tc,Yw,R,Ke=y(()=>{"use strict";ln();N();ue();ct();_o();be();l(Gd,"parseJsonc");tc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=I.getLocalConfigPath(e),n=await Gn.readFile(t,"utf-8");return Gd(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 Gn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Gn.writeFile(n,`${o}
14
+ `,"utf-8")}async readGlobalConfig(e){try{let t=I.getGlobalProjectConfigPath(e),n=await Gn.readFile(t,"utf-8");return Gd(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 Gn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Gn.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:xe,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:xe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=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 Gn.readdir(Kw.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 xs(),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))}}},Yw=new tc,R=Yw});var Bd={};ye(Bd,{default:()=>sc});import Ts from"node:fs/promises";import Xw from"node:os";import Wd from"node:path";var nc,Qw,sc,rc=y(()=>{"use strict";N();nc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Xw.homedir(),this.configDir=Wd.join(this.homeDir,".prjct-cli","config"),this.configFile=Wd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ts.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await Ts.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 Ts.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 Ts.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 Ts.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await Ts.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Qw=new nc,sc=Qw});function Zw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Er(){return Zw()==="bun"}var oc=y(()=>{"use strict";l(Zw,"detectRuntime");l(Er,"isBun")});import ic from"node:fs";import Vd from"node:path";function ek(s){if(Er()){let{Database:r}=kr("bun:sqlite");return new r(s,{create:!0})}let e=kr("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var tk,Lo,M,q,we=y(()=>{"use strict";be();oc();l(ek,"openDatabase");tk=[{version:1,name:"initial-schema",up:l(s=>{s.run(`
16
16
  -- =======================================================================
17
17
  -- Document storage (backward-compatible with JSON file pattern)
18
18
  -- =======================================================================
@@ -243,13 +243,13 @@ var My=Object.create;var hr=Object.defineProperty;var Oy=Object.getOwnPropertyDe
243
243
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
244
244
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
245
245
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
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(`
246
+ `)},"up")}],Lo=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Vd.join(I.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),r=Vd.dirname(n);ic.existsSync(r)||ic.mkdirSync(r,{recursive:!0});let o=ek(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 ic.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(`
247
247
  CREATE TABLE IF NOT EXISTS _migrations (
248
248
  version INTEGER PRIMARY KEY,
249
249
  name TEXT NOT NULL,
250
250
  applied_at TEXT NOT NULL
251
251
  )
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
252
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of tk)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 Lo,q=M});var Jd=y(()=>{"use strict"});import Ir from"node:fs/promises";import bn from"node:path";import{z as de}from"zod";async function ik(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 Ir.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 ak(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 dk(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let c=ok[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 ck(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 Ir.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 lk(s,e){let t=Date.now();try{let n=await pk(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 uk(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 Ir.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 qd(s,e){let t=Date.now(),n=await Promise.all([ik(s,e),ak(s,e),ck(s,e),lk(s,e),uk(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 dk(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Ir.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 pk(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Ir.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 nk,sk,rk,ac,zA,ok,cc=y(()=>{"use strict";N();Cr();nk=de.enum(["draft","verified","sealed"]),sk=de.object({name:de.string(),description:de.string(),location:de.string().optional()}),rk=de.object({issue:de.string(),file:de.string(),suggestion:de.string()}),ac=de.object({projectId:de.string(),languages:de.array(de.string()),frameworks:de.array(de.string()),packageManager:de.string().optional(),sourceDir:de.string().optional(),testDir:de.string().optional(),configFiles:de.array(de.string()),fileCount:de.number(),patterns:de.array(sk),antiPatterns:de.array(rk),analyzedAt:de.string(),modelMetadata:br.optional(),status:nk.default("draft"),commitHash:de.string().optional(),signature:de.string().optional(),sealedAt:de.string().optional(),verifiedAt:de.string().optional()}),zA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},ok={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(ik,"verifyFrameworks");l(ak,"verifyLanguages");l(ck,"verifyPatternLocations");l(lk,"verifyFileCount");l(uk,"verifyAntiPatternFiles");l(qd,"semanticVerify");l(dk,"getProjectExtensions");l(pk,"countProjectFiles")});import{z as Fe}from"zod";var Uo,Cn,mk,JA,lc,Kd,Ar=y(()=>{"use strict";Uo=Fe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Cn=Fe.object({primaryDomain:Uo,secondaryDomains:Fe.array(Uo),confidence:Fe.number().min(0).max(1),filePatterns:Fe.array(Fe.string()),relevantAgents:Fe.array(Fe.string())}),mk=Fe.object({classification:Cn,classifiedAt:Fe.string(),source:Fe.enum(["cache","history","llm","heuristic"]),descriptionHash:Fe.string(),projectId:Fe.string()}),JA=Fe.object({entries:Fe.record(Fe.string(),mk),confirmedPatterns:Fe.array(Fe.object({descriptionHash:Fe.string(),classification:Cn,confirmedAt:Fe.string(),taskDescription:Fe.string()}))}),lc={entries:{},confirmedPatterns:[]},Kd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as W}from"zod";var gk,fk,Yd,hk,yk,wk,kk,Sk,Xd,YA,uc=y(()=>{"use strict";gk=W.enum(["low","medium","high"]),fk=W.enum(["pending","converted","completed","archived","dormant"]),Yd=W.enum(["high","medium","low"]),hk=W.object({impact:Yd,effort:Yd}),yk=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()}),wk=W.object({name:W.string(),description:W.string()}),kk=W.object({name:W.string(),description:W.string().optional()}),Sk=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:gk,status:fk,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:hk.optional(),implementationNotes:W.string().optional(),stack:yk.optional(),modules:W.array(wk).optional(),roles:W.array(kk).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),Xd=W.object({ideas:W.array(Sk),lastUpdated:W.string()}),YA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Zd(s){return{provider:s,lastSync:"",staleAfter:18e5,issues:{}}}var Qd,bk,Ck,Pk,vk,ej,tj,dc=y(()=>{"use strict";Qd=Y.enum(["linear","jira","github","monday","asana","none"]),bk=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Ck=Y.enum(["none","urgent","high","medium","low"]),Pk=Y.enum(["feature","bug","improvement","task","chore","epic"]),vk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:bk,priority:Ck,type:Pk.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()}),ej=Y.object({provider:Qd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),vk)}),tj=Y.object({provider:Qd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Zd,"createEmptyIssues")});var rp={};ye(rp,{AgentAssignmentSchema:()=>ep,OUTPUT_SCHEMAS:()=>np,SubtaskBreakdownSchema:()=>tp,TaskClassificationSchema:()=>Cn,renderSchemaForPrompt:()=>pc});import{z as Ye}from"zod";function pc(s){let e=np[s];return e?`## OUTPUT FORMAT
253
253
 
254
254
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
255
255
 
@@ -258,28 +258,28 @@ ${e.example}
258
258
  \`\`\`
259
259
 
260
260
  Fields:
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
+ ${xk(e.schema)}`:null}function xk(s){if(s instanceof Ye.ZodObject){let e=s.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${sp(n)}`).join(`
262
+ `)}return"(see example above)"}function sp(s){return s instanceof Ye.ZodString?"string":s instanceof Ye.ZodNumber?"number":s instanceof Ye.ZodEnum?`one of: ${s.options.join(", ")}`:s instanceof Ye.ZodArray?`array of ${sp(s.element)}`:s instanceof Ye.ZodObject?"object":"any"}var ep,tp,np,Ho=y(()=>{"use strict";Ar();Ar();ep=Ye.object({agentName:Ye.string(),reasoning:Ye.string(),confidence:Ye.number().min(0).max(1)}),tp=Ye.object({subtasks:Ye.array(Ye.object({description:Ye.string(),domain:Uo,agent:Ye.string(),dependsOn:Ye.array(Ye.number())})),effort:Ye.enum(["low","medium","high"])}),np={classification:{schema:Cn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:ep,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:tp,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(pc,"renderSchemaForPrompt");l(xk,"describeSchema");l(sp,"describeField")});import{z as E}from"zod";var op,Tk,Ek,ip,Ik,Ak,jk,Dk,Rk,$k,Mk,ap,Ok,Fk,lj,cp,lp,up,dp,_k,Go,mc=y(()=>{"use strict";op=E.number().min(1).max(5),Tk=E.enum(["exceeded","met","partial","failed"]),Ek=E.enum(["definitely","probably","maybe","no"]),ip=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Ik=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:ip.optional(),explanation:E.string().optional()})}),Ak=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),jk=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),Dk=E.object({metrics:E.array(Ak),acceptanceCriteria:E.array(jk),overallSuccess:Tk,successScore:E.number().min(0).max(100)}),Rk=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),$k=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(Rk)}),Mk=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:Ek,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),ap=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:op,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),Ok=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:Ik,success:Dk.optional(),learnings:$k,roi:Mk,rating:op,taskOutcomes:E.array(ap).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),Fk=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:ip,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),lj=E.object({outcomes:E.array(Ok),taskOutcomes:E.array(ap).optional(),aggregates:Fk.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),cp={outcomes:[],taskOutcomes:[],lastUpdated:""},lp=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"),up=l((s,e)=>e<=0?s*10:Math.round(s*10/e*100)/100,"calculateROIScore"),dp=l(s=>s>=100?"exceeded":s>=80?"met":s>=50?"partial":"failed","determineSuccessLevel"),_k=l(s=>Math.max(0,100-Math.abs(s)),"calculateEstimationAccuracy"),Go=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=>_k(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 We}from"zod";function zk(){let s={};for(let e of Uk)s[e]="allow";for(let e of Hk)s[e]="ask";for(let e of Gk)s[e]="deny";return{bash:s,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var zo,mj,Nk,gc,Lk,gj,Uk,Hk,Gk,fj,pp=y(()=>{"use strict";zo=We.enum(["allow","deny","ask"]),mj=We.enum(["read","write","delete","create"]),Nk=We.record(We.string(),zo),gc=We.record(We.string(),zo),Lk=We.object({enabled:We.boolean().default(!0),allowedDomains:We.array(We.string()).optional(),blockedDomains:We.array(We.string()).optional()}),gj=We.object({bash:Nk.optional(),files:We.object({read:gc.optional(),write:gc.optional(),delete:gc.optional()}).optional(),web:Lk.optional(),skills:We.record(We.string(),zo).optional(),doomLoop:We.object({enabled:We.boolean().default(!0),maxRetries:We.number().default(3)}).optional(),externalDirectories:zo.default("ask")}),Uk=["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*"],Hk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Gk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(zk,"buildDefaultPermissions");fj=zk()});import{z as lt}from"zod";var kj,Sj,mp=y(()=>{"use strict";kj=lt.object({projectId:lt.string(),name:lt.string(),repoPath:lt.string(),description:lt.string().optional(),version:lt.string().optional(),cliVersion:lt.string().optional(),techStack:lt.array(lt.string()),fileCount:lt.number(),commitCount:lt.number(),createdAt:lt.string(),lastSync:lt.string(),lastSyncCommit:lt.string().optional(),lastSyncBranch:lt.string().optional()}),Sj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Wk,Bk,Vk,Jk,qk,Kk,Yk,Xk,Qk,Zk,eS,tS,nS,sS,rS,oS,iS,aS,vj,xj,gp=y(()=>{"use strict";Wk=A.enum(["planned","active","completed","shipped"]),Bk=A.enum(["low","medium","high"]),Vk=A.enum(["feature","breaking_change","refactor","infrastructure"]),Jk=A.enum(["completed","active","planned"]),qk=A.enum(["planned","active","completed"]),Kk=A.enum(["git","git-branch","manual","prd"]),Yk=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),Xk=A.object({id:A.string(),name:A.string(),status:Jk,completedAt:A.string().optional()}),Qk=A.object({goal:A.string(),phases:A.array(Xk),successMetrics:A.array(A.string()).optional()}),Zk=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),eS=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),tS=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),nS=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),sS=A.object({estimated:tS.nullable(),actual:nS.nullable()}),rS=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),oS=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:rS.optional(),status:qk,startDate:A.string().optional(),endDate:A.string().optional()}),iS=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Wk,impact:Bk,effort:A.string().optional(),progress:A.number(),type:Vk.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(Yk),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Zk.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:Kk.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:sS.optional(),valueScore:A.number().optional(),commits:A.array(eS).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),aS=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()}),vj=A.object({strategy:Qk.nullable().optional(),features:A.array(iS),backlog:A.array(A.union([A.string(),aS])),lastUpdated:A.string(),quarters:A.array(oS).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),xj={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 cS from"node:crypto";import{homedir as lS}from"node:os";import{join as uS}from"node:path";function fe(){return cS.randomUUID()}var dS,fp=y(()=>{"use strict";l(fe,"generateUUID");dS=uS(lS(),".prjct-cli","projects")});import{z as Q}from"zod";var pS,hp,mS,gS,fS,hS,yS,wS,kS,yp,fc=y(()=>{"use strict";pS=Q.enum(["feature","fix","improvement","refactor"]),hp=Q.enum(["pass","warning","fail","skipped"]),mS=Q.enum(["added","changed","fixed","removed"]),gS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),fS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),hS=Q.object({description:Q.string(),type:mS.optional()}),yS=Q.object({lintStatus:hp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:hp.nullable().optional(),testDetails:Q.string().optional()}),wS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),kS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:pS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(hS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:wS.optional(),codeMetrics:fS.optional(),qualityMetrics:yS.optional(),quantitativeImpact:Q.string().optional(),duration:gS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),yp=Q.object({shipped:Q.array(kS),lastUpdated:Q.string()})});import{z as T}from"zod";var SS,kp,bS,CS,PS,hc,Sp,vS,xS,bp,wp,TS,ES,Cp,Pp,vp,IS,AS,Nj,Wo=y(()=>{"use strict";Cr();SS=T.enum(["low","medium","high","critical"]),kp=T.enum(["feature","bug","improvement","chore"]),bS=T.enum(["active","backlog","previously_active"]),CS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),PS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),hc=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()}),Sp=T.object({output:T.string().min(1,"Subtask output is required"),summary:hc}),vS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:CS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:hc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),xS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),bp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(vS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:xS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:br.optional()}),wp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),TS=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()}),ES=T.object({taskId:T.string(),title:T.string(),classification:kp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(hc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:TS.optional()}),Cp=T.object({currentTask:bp.nullable(),previousTask:wp.nullable().optional(),pausedTasks:T.array(wp).optional(),taskHistory:T.array(ES).optional(),lastUpdated:T.string()}),Pp=T.object({id:T.string(),description:T.string(),priority:SS,type:kp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:bS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),vp=T.object({tasks:T.array(Pp),lastUpdated:T.string()}),IS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),AS=T.object({type:PS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),Nj=T.object({projectId:T.string(),currentTask:bp.nullable(),queue:T.array(Pp),stats:IS,recentActivity:T.array(AS),lastSync:T.string()})});import{z as ae}from"zod";var jS,DS,xp,Gj,zj,Wj,Pn,Tp,Es=y(()=>{"use strict";jS=ae.enum(["improving","stable","declining"]),DS=ae.object({sprintNumber:ae.number(),startDate:ae.string(),endDate:ae.string(),pointsCompleted:ae.number(),tasksCompleted:ae.number(),avgVariance:ae.number(),estimationAccuracy:ae.number()}),xp=ae.object({category:ae.string(),avgVariance:ae.number(),taskCount:ae.number()}),Gj=ae.object({totalPoints:ae.number(),sprints:ae.number(),estimatedDate:ae.string()}),zj=ae.object({sprints:ae.array(DS),averageVelocity:ae.number(),velocityTrend:jS,estimationAccuracy:ae.number(),overEstimated:ae.array(xp),underEstimated:ae.array(xp),lastUpdated:ae.string()}),Wj=ae.object({sprintLengthDays:ae.number().min(1).max(90).default(7),startDay:ae.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ae.number().min(1).max(52).default(6),accuracyTolerance:ae.number().min(0).max(100).default(20)}),Pn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Tp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Lt=y(()=>{"use strict";Jd();cc();Ar();uc();dc();Ho();Cr();mc();pp();mp();gp();fp();fc();Wo();Es()});var Zt,yc,St,vn=y(()=>{"use strict";Lt();ue();we();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},yc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=fe(),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(fe(),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}},St=new yc});var Ep=y(()=>{"use strict"});var Bo,Ip=y(()=>{"use strict";Bo={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 Is,Vo=y(()=>{"use strict";Is={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 Ap=y(()=>{"use strict"});var jp=y(()=>{"use strict";Ap()});function Jo(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var O,Dp,As=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"},Dp=["frontend","backend","devops","docs","testing","database","general"];l(Jo,"calculateConfidence")});var wc=y(()=>{"use strict"});var kc=y(()=>{"use strict";Ep();Ip();Vo();N();jp();As();wc()});function js(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 OS[s]}var oe,Sc,bc,qo,OS,It,Rp,jr,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"},Sc=["feature","spec","design","refactor","migrate"],bc=["ship","cleanup","git","migrate"],qo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],OS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(js,"getTimeout");It={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},Rp={HISTORY_MAX:100},jr={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 _S(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if(FS.has(s)||s.includes("prjct"))return{level:Ds.debug,name:"debug"};let e=Ds[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function Ko(s,e,t){return $p>=s?(...n)=>console[t](e,...n):LS}var Ds,FS,$p,NS,LS,US,U,zn=y(()=>{"use strict";Ds={error:0,warn:1,info:2,debug:3},FS=new Set(["1","true","*"]);l(_S,"getLogLevel");({level:$p,name:NS}=_S()),LS=l(()=>{},"noop");l(Ko,"createLogMethod");US={error:Ko(Ds.error,"[prjct:error]","error"),warn:Ko(Ds.warn,"[prjct:warn]","warn"),info:Ko(Ds.info,"[prjct:info]","log"),debug:Ko(Ds.debug,"[prjct:debug]","log"),isEnabled:l(()=>$p>=0,"isEnabled"),level:l(()=>NS,"level")},U=US});var Yo,HS,Mp=y(()=>{"use strict";ln();we();kc();un();zn();Yo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Rp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),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(Bo.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(Bo.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())}},HS=new Yo});var Xo,Qo,Op=y(()=>{"use strict";be();ue();Te();Xo=class{static{l(this,"SyncEventBus")}async publish(e){let t=I.getSyncPendingPath(e.projectId),n=await Un(t,[])??[];n.push(e),await Pr(t,n)}async getPending(e){let t=I.getSyncPendingPath(e);return await Un(t,[])??[]}async clearPending(e){let t=I.getSyncPendingPath(e);await Pr(t,[])}async updateLastSync(e){let t=I.getLastSyncPath(e),n={timestamp:C(),success:!0};await Pr(t,n)}async getLastSync(e){let t=I.getLastSyncPath(e);return await Un(t,null)}},Qo=new Xo});var Cc=y(()=>{"use strict";Mp();Op()});var Ut,Zo=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 Be,en=y(()=>{"use strict";Cc();Zo();ue();we();Be=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 Qo.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 Pc,Ze,Dr=y(()=>{"use strict";Lt();uc();ue();vn();en();Pc=class extends Be{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Xd)}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:fe(),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;St.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}},Ze=new Pc});var vc,Ee,Rr=y(()=>{"use strict";Lt();Wo();ue();vn();en();vc=class extends Be{static{l(this,"QueueStorage")}constructor(){super("queue.json",vp)}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:fe(),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:fe(),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;St.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()})}},Ee=new vc});var xc,mt,$r=y(()=>{"use strict";Lt();fc();ue();vn();en();xc=class extends Be{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",yp)}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:fe(),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;St.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}},mt=new xc});var Mr,Tc,Wn,Ec=y(()=>{"use strict";Mr={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"}},Tc=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=Mr[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 Mr[e]}getPrompt(e){return Mr[e].prompt}getValidCommands(e){return Mr[e].transitions}formatNextSteps(e){return Mr[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}`}})}},Wn=new Tc});var Ic,L,Or=y(()=>{"use strict";Lt();Wo();ue();Ec();vn();en();Ic=class extends Be{static{l(this,"StateStorage")}constructor(){super("state.json",Cp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Wn.getCurrentState(e),r=Wn.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:fe()};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[];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),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=Sp.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:
263
263
  ${f.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(`
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 Ic});import zS from"node:fs/promises";import WS from"node:path";import{Hono as BS}from"hono";function VS(s){return I.getGlobalProjectPath(s)}function Fp(s,e){let t=new BS,n=VS(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 Ee.read(s);return r.json(o)}),t.get("/ideas",async r=>{let o=await Ze.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 mt.read(s);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([L.read(s),Ee.read(s),Ze.read(s),mt.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=WS.join(n,"context",`${o}.md`),c=await zS.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 _p=y(()=>{"use strict";be();we();Dr();Rr();$r();Or();N();zn();l(VS,"getProjectDataPath");l(Fp,"createRoutes")});import Rs from"node:fs/promises";import JS from"node:path";import{Hono as qS}from"hono";function ei(s){return M.getDoc(s,"project")}async function Ac(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 Np(){let s=new qS;return s.get("/projects",async e=>{try{await Rs.mkdir($s,{recursive:!0});let n=(await Rs.readdir($s,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(n.map(async o=>{let i=ei(o),a=await L.read(o),c=await Ee.read(o),u=await Ze.read(o),d=await mt.read(o),m=a?.currentTask,p=await Ac(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(ei(t)),L.read(t),Ee.read(t),Ze.read(t),mt.read(t)]),c=M.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await Ac(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),Ee.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===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 Ze.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 Rs.mkdir($s,{recursive:!0});let n=(await Rs.readdir($s,{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 Ee.read(c),m=await Ze.read(c),p=await mt.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 Rs.mkdir($s,{recursive:!0});let r=(await Rs.readdir($s,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=ei(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=ei(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Ac(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 KS,$s,Lp=y(()=>{"use strict";be();we();Dr();Rr();$r();Or();KS=I.getGlobalBasePath(),$s=JS.join(KS,"projects");l(ei,"getProjectConfig");l(Ac,"calculateDuration");l(Np,"createExtendedRoutes")});import{streamSSE as YS}from"hono/streaming";function Hp(){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()>Up&&t(i)},XS),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 YS(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)}},QS),p=setTimeout(()=>{t(a)},Up);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 Up,XS,QS,Gp=y(()=>{"use strict";wc();Up=3600*1e3,XS=300*1e3,QS=3e4;l(Hp,"createSSEManager")});var zp={};ye(zp,{DEFAULT_PORT:()=>ni,createServer:()=>ti,startServer:()=>nb});import{Hono as ZS}from"hono";import{cors as eb}from"hono/cors";import{logger as tb}from"hono/logger";function ti(s){let e=new ZS,t=Hp();s.enableCors!==!1&&e.use("*",eb({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),s.enableLogging!==!1&&e.use("*",tb()),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=Fp(s.projectId,s.projectPath);e.route("/api",n);let r=Np();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(Er())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: ${Er()?"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 nb(s,e,t=ni){let n=ti({port:t,projectId:s,projectPath:e});return await n.start(),n}var ni,jc=y(()=>{"use strict";oc();_p();Lp();Gp();l(ti,"createServer");ni=3478;l(nb,"startServer")});import Bn from"chalk";var Wp,sb,rb,Ht,Bp=y(()=>{"use strict";qe();Wp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],sb=80,rb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Wp,speed:sb},cli:{header:l(()=>`${Bn.cyan.bold("\u26A1")} ${Bn.cyan("prjct")}`,"header"),footer:l(()=>Bn.dim("\u26A1 prjct"),"footer"),spin:l((s,e)=>`${Bn.cyan("\u26A1")} ${Bn.cyan("prjct")} ${Bn.cyan(Wp[s%10])} ${Bn.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")=>Ao(s).commitFooter,"getCommitFooter"),getSignature:l((s="claude")=>Ao(s).signature,"getSignature")},Ht=rb});function Vn(s,e){return{...Is[s],...e}}function Fr(s,e,t){return{message:s,hint:e,...t}}var _r=y(()=>{"use strict";Vo();Vo();l(Vn,"getError");l(Fr,"createError")});var Jp={};ye(Jp,{ERRORS:()=>Is,ICONS:()=>xn,OUTPUT_TIERS:()=>Vp,createError:()=>Fr,default:()=>h,formatForHuman:()=>lb,getError:()=>Vn,getOutputTier:()=>ib,getTierConfig:()=>ri,isQuietMode:()=>cb,limitLines:()=>si,setOutputTier:()=>ob,setQuietMode:()=>ab});import se from"chalk";function ob(s){Os=s}function ib(){return Os}function ri(){return Vp[Os]}function ab(s){ut=s}function cb(){return ut}function si(s,e){let t=e??ri().maxLines;if(t===1/0||t===0)return s;let n=s.split(`
265
265
  `);if(n.length<=t)return s;let r=n.slice(0,t),o=n.length-t;return`${r.join(`
266
266
  `)}
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+=`
267
+ ${se.dim(`...${o} more lines`)}`}function lb(s){let e=ri();if(Os==="silent")return"";if(Os==="verbose")return JSON.stringify(s,null,2);if(typeof s!="object"||s===null)return At(String(s),e.maxCharsPerLine);let t=s;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${At(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&&Os==="compact"&&o.push(se.dim(String(t.url))),si(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} ${At(String(a.title),It.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?si(r.map(o=>`${o}: ${At(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
270
+ `),e.maxLines):si(JSON.stringify(s,null,2),e.maxLines)}var UR,Dc,Vp,Os,xn,Ms,Rc,ut,At,ub,db,h,Gt=y(()=>{"use strict";Bp();un();_r();_r();UR=Ht.spinner.frames,Dc=Ht.spinner.speed,Vp={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}},Os="compact";l(ob,"setOutputTier");l(ib,"getOutputTier");l(ri,"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")},Ms=null,Rc=0,ut=!1;l(ab,"setQuietMode");l(cb,"isQuietMode");At=l((s,e)=>{let t=e??(ri().maxCharsPerLine||It.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate");l(si,"limitLines");l(lb,"formatForHuman");ub=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(It.CLEAR_WIDTH)}\r`):!0,"clear"),db={start(){return ut||console.log(Ht.cli.header()),this},end(){return ut||console.log(Ht.cli.footer()),this},spin(s){return ut?this:(this.stop(),process.stdout.isTTY?(Ms=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Rc++,At(s,It.SPINNER_MSG))}`)},Dc),this):(process.stdout.write(`${Ht.cli.spin(0,At(s,It.SPINNER_MSG))}
271
+ `),this))},done(s,e){if(this.stop(),!ut){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} ${At(s,It.DONE_MSG)}${t}`)}return this},fail(s){return this.stop(),console.error(`${xn.fail} ${At(s,It.FAIL_MSG)}`),this},failWithHint(s){this.stop();let e=typeof s=="string"?Vn(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(),ut||console.log(`${xn.warn} ${At(s,It.WARN_MSG)}`),this},info(s){return this.stop(),ut||console.log(`${xn.info} ${s}`),this},debug(s){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ut&&e&&console.log(`${xn.debug} ${se.dim(s)}`),this},success(s,e){return this.done(s,e)},list(s,e={}){if(this.stop(),ut)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(),ut||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(),ut)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(),ut?this:(console.log(`
273
+ ${se.bold(s)}`),console.log(se.dim("\u2500".repeat(s.length))),this)},stop(){return Ms&&(clearInterval(Ms),Ms=null,ub()),this},step(s,e,t){if(ut)return this;this.stop();let n=se.dim(`[${s}/${e}]`);return process.stdout.isTTY?(Ms=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Rc++,`${n} ${At(t,It.STEP_MSG)}`)}`)},Dc),this):(process.stdout.write(`${Ht.cli.spin(0,`${n} ${At(t,It.STEP_MSG)}`)}
274
+ `),this)},progress(s,e,t){if(ut)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?` ${At(t,It.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Ms=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Rc++,`[${i}] ${n}%${a}`)}`)},Dc),this):(process.stdout.write(`${Ht.cli.spin(0,`[${i}] ${n}%${a}`)}
275
+ `),this)}},h=db});var Yp={};ye(Yp,{default:()=>mb,sessionTracker:()=>Tn});var pb,qp,Kp,$c,Tn,mb,oi=y(()=>{"use strict";we();ue();pb=1800*1e3,qp=50,Kp=200,$c=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:pb}}}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>qp&&(r.current.commands=r.current.commands.slice(-qp)),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>Kp&&(r.current.files=r.current.files.slice(-Kp)),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:xr(r-o),idleSince:n.lastActivity,idleMs:a,expiresIn:xr(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 $c,mb=Tn});var Qp={};ye(Qp,{default:()=>Jn,performanceTracker:()=>Xp});var Mc,Xp,Jn,ii=y(()=>{"use strict";we();Mc=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}},Xp=new Mc,Jn=Xp});function Fc(s){if(Dp.includes(s))return[s];let e=s.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,r]of Object.entries(ai))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 Oc,ai,qn,Nr,Lr,Ur=y(()=>{"use strict";we();As();ue();Oc={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)},ai={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(Fc,"resolveCanonicalDomains");qn=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}},Nr=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},Lr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts: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 Hr,_c=y(()=>{"use strict";we();As();ue();Ur();Hr=class s extends qn{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=Jo(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=Jo(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:Jo(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 Kn,Nc=y(()=>{"use strict";Lt();As();ue();Ur();Kn=class extends qn{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:fe(),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=Oc[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of n){let c=ai[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 Fc(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 Lc,gb,Ie,Fs=y(()=>{"use strict";Ur();_c();Nc();Ur();_c();Nc();Lc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Kn,this._patternStore=new Hr,this._historyStore=new Lr,this._sessionStore=new Nr}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()}},gb=new Lc,Ie=gb});import{exec as fb}from"node:child_process";import bt from"node:fs/promises";import zt from"node:path";import{promisify as hb}from"node:util";var Yn,Uc,yb,Xe,Zp=y(()=>{"use strict";N();Yn=hb(fb),Uc=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 bt.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 bt.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 bt.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 bt.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 bt.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 bt.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 bt.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 bt.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 bt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Yn('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 bt.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 bt.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 Yn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Yn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Yn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Yn('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 Yn('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 bt.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 bt.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Yn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
278
+ `).filter(Boolean)}catch{return[]}}},yb=new Uc,Xe=yb});import Gc from"node:fs";import wb from"node:fs/promises";import ci from"node:path";function zc(){if(em)return Hc;em=!0;let s=ci.join(pe,"dist","templates.json");try{let e=Gc.readFileSync(s,"utf-8");return Hc=JSON.parse(e),Hc}catch{return null}}function Sb(s){let e=Xn.indexOf(s);e>-1&&Xn.splice(e,1),Xn.push(s)}function bb(){for(;_s.size>=kb&&Xn.length>0;){let s=Xn.shift();s&&_s.delete(s)}}function li(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 tm(s){if(_s.has(s))return Sb(s),_s.get(s);let e,t=zc();if(t){let r=`commands/${s}.md`;e=t[r]}if(!e){let r=ci.join(pe,"templates","commands",`${s}.md`);try{e=await wb.readFile(r,"utf-8")}catch{throw Do.notFound(s)}}let n=li(e);return bb(),_s.set(s,n),Xn.push(s),n}async function Cb(s){return(await tm(s)).frontmatter["allowed-tools"]||[]}function Pb(){_s.clear(),Xn.length=0}function he(s){let e=zc();if(e?.[s])return e[s];let t=ci.join(pe,"templates",s);try{return Gc.readFileSync(t,"utf-8")}catch{return null}}function En(s){let e=zc();if(e)return Object.keys(e).filter(n=>n.startsWith(s));let t=ci.join(pe,"templates",s);try{return Gc.readdirSync(t).map(r=>`${s}${r}`)}catch{return[]}}var kb,_s,Xn,Hc,em,vb,Wc,In=y(()=>{"use strict";ln();ct();kb=50,_s=new Map,Xn=[],Hc=null,em=!1;l(zc,"loadBundle");l(Sb,"updateLruOrder");l(bb,"evictLru");l(li,"parseFrontmatter");l(tm,"load");l(Cb,"getAllowedTools");l(Pb,"clearCache");l(he,"getTemplateContent");l(En,"listTemplates");vb={load:tm,parseFrontmatter:li,getAllowedTools:Cb,clearCache:Pb,getTemplateContent:he,listTemplates:En},Wc=vb});import X from"node:fs/promises";import Vc from"node:os";import ne from"node:path";async function xb(){try{let s=he("global/modules/module-config.json");if(s)return JSON.parse(s);let e=ne.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Tb(s){let e=await xb();if(!e){let i=he("global/CLAUDE.md");if(i)return i;let a=ne.join(pe,"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=he("global/CLAUDE.md");if(a)return a;let c=ne.join(pe,"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=he(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=ne.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(`
280
+ `)}async function Eb(){try{let s=ne.join(Vc.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=he(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(pe,"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 Ib(){let s=(qe(),Tt(pt)),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(pe,"templates","global",e.contextFile),i="";try{let u=he(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Tb()}catch{let d=he("global/CLAUDE.md");if(d)i=d;else{let m=ne.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=he("global/CLAUDE.md");if(d)i=d;else{let m=ne.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(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 nm(){let s=Vc.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 Bc,Ab,Ae,An=y(()=>{"use strict";In();N();ct();l(xb,"loadModuleConfig");l(Tb,"composeGlobalTemplate");l(Eb,"installDocs");l(Ib,"installGlobalConfig");Bc=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Vc.homedir(),this.templatesDir=ne.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(qe(),Tt(pt)).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(qe(),Tt(pt)).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=he(`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(he(`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(qe(),Tt(pt)).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=he(`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(qe(),Tt(pt)).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=he(`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 Ib()}async installDocs(){return Eb()}};l(nm,"getProviderPaths");Ab=new Bc,Ae=Ab});import{z as _e}from"zod";function im(s,e="default"){let t=sm[e]||sm.default;return s/1e3*t}function ui(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var jb,Db,rm,om,sm,di=y(()=>{"use strict";jb=_e.object({date:_e.string(),tokensSaved:_e.number(),syncs:_e.number(),avgCompressionRate:_e.number(),totalDuration:_e.number()}),Db=_e.object({agentName:_e.string(),usageCount:_e.number(),tokensSaved:_e.number()}),rm=_e.object({totalTokensSaved:_e.number(),avgCompressionRate:_e.number(),syncCount:_e.number(),watchTriggers:_e.number(),avgSyncDuration:_e.number(),totalSyncDuration:_e.number(),agentUsage:_e.array(Db),dailyStats:_e.array(jb),firstSync:_e.string(),lastUpdated:_e.string()}),om={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},sm={"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(im,"estimateCostSaved");l(ui,"formatCost")});function Rb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function $b(s){let e=[],t=Rb(),n,r=0;for(;(n=t.exec(s))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${r++}`,c=s.indexOf(Jc,o+i.length);if(c===-1)continue;let u=c+Jc.length,d=s.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function qc(s,e){let t=$b(e);if(t.length===0)return s;let n=s.trimEnd();n+=`
283
283
 
284
284
  ---
285
285
 
@@ -290,9 +290,54 @@ ${i}`;return await X.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r
290
290
  `;for(let r of t)n+=r.content,n+=`
291
291
 
292
292
  `;return`${n.trimEnd()}
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:`
293
+ `}function Kc(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(Jc)&&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 Jc,Yc=y(()=>{"use strict";Jc="<!-- /prjct:preserve -->";l(Rb,"createPreserveStartRegex");l($b,"extractPreservedSections");l(qc,"mergePreservedSections");l(Kc,"validatePreserveBlocks")});function Gr(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&Mb.has(e.code))return!0;if(e.code&&cm.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 mi(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&cm.has(e.code))}function am(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 Xc(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 Ob(s){jn.delete(s)}var Mb,cm,jn,pi,lm,zr,gi=y(()=>{"use strict";Mb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),cm=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Gr,"isTransientError");l(mi,"isPermanentError");jn=new Map;l(am,"isCircuitOpen");l(Xc,"recordFailure");l(Ob,"recordSuccess");pi=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(am(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 Ob(t),o}catch(o){if(n=o,r++,mi(o))throw Xc(t,this.options.circuitBreakerThreshold),o;if(!(Gr(o)&&r<this.options.maxAttempts))throw Xc(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 Xc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Gr(e)}isCircuitOpen(e){return am(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return jn.get(e)}resetCircuit(e){jn.delete(e)}resetAllCircuits(){jn.clear()}},lm=new pi({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),zr=new pi({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var um=y(()=>{"use strict";Yc();gi()});import fi from"node:fs/promises";import Qc from"node:path";var Zc,dm,pm=y(()=>{"use strict";Ke();be();N();Zc=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 fi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let r=n.replace(".md",""),o=await fi.readFile(Qc.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=Qc.join(this.agentsPath,`${e}.md`),n=await fi.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=Qc.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 fi.appendFile(r,o)}catch(r){P(r)||console.error(`Agent usage log error: ${w(r)}`)}}},dm=Zc});import mm from"node:path";async function Nb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await x(mm.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await x(mm.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Lb(){return{...Fb}}function Ub(){return{..._b}}async function gm(){return hi||(hi=await Nb()?Lb():Ub(),hi)}var hi,Fb,_b,fm=y(()=>{"use strict";Te();hi=null,Fb={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}},_b={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(Nb,"isClaudeEnvironment");l(Lb,"getClaudeAgent");l(Ub,"getTerminalAgent");l(gm,"detect")});import Wr from"node:fs/promises";var el,hm,ym=y(()=>{"use strict";N();el=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${w(t)}`)}return await Wr.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${w(n)}`)}await Wr.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${w(t)}`)}return await Wr.readdir(e)}async fileExists(e){try{return await Wr.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await Wr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
296
+ ${e.map((t,n)=>`${n+1}. ${t}`).join(`
297
+ `)}`}formatRecap(e){return`\u{1F4CA} Recap
298
+
299
+ \u{1F3AF} Current: ${e.currentTask||"None"}
300
+ \u{1F680} Shipped: ${e.shippedCount}
301
+ \u{1F4DD} Queue: ${e.queuedCount}
302
+ \u{1F4A1} Ideas: ${e.ideasCount}
303
+ ${e.recentActivity?`
304
+ ${e.recentActivity}`:""}`}formatProgress(e){let t=e.velocity>e.previousVelocity?"\u{1F4C8}":e.velocity<e.previousVelocity?"\u{1F4C9}":"\u27A1\uFE0F";return`\u{1F4CA} ${e.period}
305
+
306
+ Shipped: ${e.count}
307
+ Velocity: ${e.velocity.toFixed(1)}/day ${t}
308
+ ${e.recentFeatures||""}`}getHelpContent(e){let t={debugging:`\u{1F50D} 1. Isolate code causing error
309
+ 2. Add logs at key points
310
+ 3. Search exact error message`,design:`\u{1F3A8} 1. Define problem clearly
311
+ 2. Start with simplest solution
312
+ 3. Ship MVP, iterate`,performance:`\u26A1 1. Profile/measure first
313
+ 2. Optimize slowest parts
314
+ 3. Cache expensive operations`,default:`\u{1F4A1} 1. Break into smaller tasks
315
+ 2. Start with simplest part
316
+ 3. Ship it`},n=Object.keys(t).find(r=>e.toLowerCase().includes(r))||"default";return t[n]}suggestNextAction(e){return{taskCompleted:`What's next?
317
+ \u2022 "start [task]" \u2192 Begin working
318
+ \u2022 "ship feature" \u2192 Track & celebrate
319
+ \u2022 "add idea" \u2192 Brainstorm
320
+
321
+ Or: /p:now | /p:ship | /p:idea`,featureShipped:`Keep the momentum!
322
+ \u2022 "start next task" \u2192 Keep building
323
+ \u2022 "see progress" \u2192 View stats
324
+ \u2022 "plan ahead" \u2192 Strategic thinking
325
+
326
+ Or: /p:now | /p:recap | /p:roadmap`,ideaCaptured:`Ready to start?
327
+ \u2022 "start this" \u2192 Begin now
328
+ \u2022 "plan more" \u2192 Keep brainstorming
329
+ \u2022 "see ideas" \u2192 View backlog
330
+
331
+ Or: /p:now | /p:idea | /p:recap`,initialized:`Ready to start? Tell me what you want to build!
332
+
333
+ Or type /p:help to see all options`,stuck:`Let's break it down:
334
+ \u2022 "start the first part"
335
+ \u2022 "add as tasks"
336
+ \u2022 "think more"
337
+
338
+ Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
339
+
340
+ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},hm=el});var Gb,yi,Ns,wm=y(()=>{"use strict";pm();ln();fm();ym();gi();Gb=["claude"],yi=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new dm}async initialize(){return this.agent?this.agent:await lm.execute(async()=>{if(this.agentInfo=await gm(),!this.agentInfo?.isSupported)throw vr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Gb.includes(e))throw vr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new hm,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:`
296
341
  AGENTIC EXECUTION:
297
342
  - Read: templates/agentic/orchestrator.md
298
343
  - Analyze task: "${e}"
@@ -300,9 +345,9 @@ ${i}`;return await X.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r
300
345
  - Claude decides which agent(s) to use
301
346
  - Always prefer specialists over generalist
302
347
  - Fragment complex tasks into subtasks
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(`
348
+ `}}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}},Ns=new yi});var wi,ki,km=y(()=>{"use strict";wi=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"}},ki=new wi});import zb from"node:crypto";import Si from"node:fs/promises";import Sm from"node:path";function bm(){return{version:Wt,lastUpdated:"",checksums:{}}}var Wt,tl,et,Br=y(()=>{"use strict";be();N();ue();we();Wt="1.0.0";l(bm,"getDefaultChecksums");tl=class{static{l(this,"IndexStorage")}getIndexPath(e){return Sm.join(I.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Si.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 bm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Si.readFile(e);return zb.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 Si.readdir(t);await Promise.all(n.map(r=>Si.unlink(Sm.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)}},et=new tl});var Cm,Wb,bi,Bb,Pm=y(()=>{"use strict";Br();Cm=8e4,Wb={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"]},bi=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||Cm,[c,u,d]=await Promise.all([et.readIndex(t),et.readDomains(t),et.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(Wb))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 et.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 et.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return et.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,r=t.minScore||30,o=t.tokenBudget||Cm,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)}},Bb=new bi});import vm from"node:path";var nl,Ci,Vb,xm=y(()=>{"use strict";Br();ue();nl=[{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"}],Ci=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 nl)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=vm.dirname(i.path);n.get(u).add(`**/${vm.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=nl.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 nl)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 et.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 et.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([et.readDomains(e),et.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 et.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 et.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 et.writeCategories(e,m)}return o}},Vb=new Ci});import sl from"node:path";var rl,Jb,qb,Pi,Tm,ol=y(()=>{"use strict";rl=30,Jb=[/^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$/],qb=[/^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],Pi=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=rl){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=sl.basename(e.path);for(let n of Jb)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=sl.basename(e.path);for(let r of qb)if(r.test(t))return 15;let n=sl.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}},Tm=new Pi});import{execSync as il}from"node:child_process";var vi,al,xi,Ls,Ti=y(()=>{"use strict";_r();vi={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"}},al=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=vi[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=vi[e],r=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new xi(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=vi[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
349
+ `);throw new xi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
350
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(vi),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=il(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:Fr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return il(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return il(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Fr(`${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())}},xi=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}},Ls=new al});import{exec as Kb}from"node:child_process";import{promisify as Yb}from"node:util";var KM,Em=y(()=>{"use strict";un();Ti();KM=Yb(Kb)});var Ei,gt,cl=y(()=>{"use strict";Ke();vn();we();Ei=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);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&&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}}},gt=new Ei});var Im=y(()=>{"use strict";be();Te()});import{exec as Qb}from"node:child_process";import{promisify as Zb}from"node:util";var dO,Am=y(()=>{"use strict";Br();ue();ol();dO=Zb(Qb)});import{createHash as eC}from"node:crypto";var ll,Ct,Ii=y(()=>{"use strict";cc();ue();en();ll=class extends Be{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"};ac.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 ac.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 qd(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 eC("sha256").update(JSON.stringify(t)).digest("hex")}},Ct=new ll});var ul,dn,Vr=y(()=>{"use strict";di();ue();en();ul=class extends Be{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",rm)}getDefault(){return{...om}}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:im(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 ul});import dt from"node:fs/promises";import me from"node:path";async function Jr(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=me.join(n,"storage"),o=me.join(n,"index"),i=me.join(n,"memory");t.backupDir=await tC(r,o,i),M.getDb(s);for(let{filename:a,key:c}of ml){let u=me.join(r,a),d=await Qn(u);if(d===null){t.skippedFiles.push(a);continue}try{M.setDoc(s,c,d),jm(s,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of pl){let u=me.join(o,a),d=await Qn(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()),Dm(s,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await lC(s,o,t),await uC(s,o,t),await dC(s,i,t),await pC(s,i,t),t.errors.length===0&&await mC(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 tC(s,e,t){let n=me.join(s,"backup");return await dt.mkdir(n,{recursive:!0}),await dt.mkdir(me.join(n,"index"),{recursive:!0}),await dt.mkdir(me.join(n,"memory"),{recursive:!0}),await dl(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await dl(e,me.join(n,"index")),await dl(t,me.join(n,"memory")),n}async function dl(s,e,t){try{let n=await dt.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=me.join(s,r.name),i=me.join(e,r.name);await dt.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function jm(s,e,t){switch(e){case"state":nC(s,t);break;case"queue":sC(s,t);break;case"ideas":rC(s,t);break;case"shipped":oC(s,t);break;case"metrics":iC(s,t);break;case"analysis":aC(s,t);break}}function nC(s,e){let t=M.getDb(s),n=t.prepare(`
306
351
  INSERT OR REPLACE INTO tasks
307
352
  (id, description, type, status, parent_description, branch, linear_id,
308
353
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -313,79 +358,77 @@ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return
313
358
  (id, task_id, description, status, domain, agent, sort_order,
314
359
  depends_on, started_at, completed_at, output, summary)
315
360
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
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(`
361
+ `),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 sC(s,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
317
362
  INSERT OR REPLACE INTO queue_tasks
318
363
  (id, description, type, priority, section, created_at, completed, completed_at,
319
364
  feature_id, feature_name)
320
365
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
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(`
366
+ `);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 rC(s,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
322
367
  INSERT OR REPLACE INTO ideas
323
368
  (id, text, status, priority, tags, added_at, converted_to, details, data)
324
369
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
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(`
370
+ `);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 oC(s,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
326
371
  INSERT OR REPLACE INTO shipped_features
327
372
  (id, name, shipped_at, version, description, type, duration, data)
328
373
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
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(`
374
+ `);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 iC(s,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
330
375
  INSERT OR REPLACE INTO metrics_daily
331
376
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
332
377
  VALUES (?, ?, ?, ?, ?)
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(`
378
+ `);for(let o of t)r.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function aC(s,e){let n=M.getDb(s).prepare(`
334
379
  INSERT OR REPLACE INTO analysis
335
380
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
336
381
  VALUES (?, ?, ?, ?, ?, ?, ?)
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(`
382
+ `),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 Dm(s,e,t){e==="categories-cache"&&cC(s,t)}function cC(s,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
338
383
  INSERT OR REPLACE INTO index_files
339
384
  (path, categories, domain, score, size, mtime, language)
340
385
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
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(`
386
+ `);for(let o of t)r.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function lC(s,e,t){let n=me.join(e,"checksums.json"),r=await Qn(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 uC(s,e,t){let n=me.join(e,"file-scores.json"),r=await Qn(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(`
342
387
  INSERT OR REPLACE INTO index_files
343
388
  (path, score, size, mtime, language, categories, domain)
344
389
  VALUES (?, ?, ?, ?, NULL,
345
390
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
346
391
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
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(`
366
- Detected: ${e}
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(`
368
- Setup cancelled. Run again anytime.
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(`
392
+ `);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 dC(s,e,t){let n=me.join(e,"events.jsonl");try{let o=(await dt.readFile(n,"utf-8")).split(`
393
+ `).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 pC(s,e,t){let n=me.join(e,"learnings.jsonl");try{let o=(await dt.readFile(n,"utf-8")).split(`
394
+ `).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 mC(s,e,t,n){let r=l(async(i,a)=>{try{await dt.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of ml)await r(me.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(me.join(e,i),`cleanup:index/${i}`);await r(me.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(me.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Qn(s){try{let e=await dt.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Ai(s){let e=I.getGlobalProjectPath(s),t=me.join(e,"storage"),n=0;M.getDb(s);for(let{filename:u,key:d}of ml){let m=me.join(t,u),p=await Qn(m);if(p!==null){M.setDoc(s,d,p),jm(s,d,p);try{await dt.unlink(m)}catch{}n++}}let r=me.join(e,"project.json"),o=await Qn(r);if(o!==null){M.setDoc(s,"project",o);try{await dt.unlink(r)}catch{}n++}let i=me.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=me.join(i,u);try{let p=(await dt.readFile(d,"utf-8")).split(`
395
+ `).filter(f=>f.trim());if(p.length===0){await dt.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 dt.unlink(d),n++}catch{}}let a=me.join(e,"index"),c=[...pl.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=me.join(a,u),m=await Qn(d);if(m===null)continue;let p=pl.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()),Dm(s,p.key,m));try{await dt.unlink(d)}catch{}n++}return n}var ml,pl,ji=y(()=>{"use strict";be();N();we();ml=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],pl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Jr,"migrateJsonToSqlite");l(tC,"createBackup");l(dl,"copyFiles");l(jm,"populateNormalized");l(nC,"populateTasksFromState");l(sC,"populateQueueTasks");l(rC,"populateIdeas");l(oC,"populateShippedFeatures");l(iC,"populateMetricsDaily");l(aC,"populateAnalysis");l(Dm,"populateIndexTables");l(cC,"populateCategoriesIndex");l(lC,"migrateChecksums");l(uC,"migrateFileScores");l(dC,"migrateEventsJsonl");l(pC,"migrateLearningsJsonl");l(mC,"cleanupJsonFiles");l(Qn,"readJsonSafe");l(Ai,"sweepLegacyJson")});var Rm=y(()=>{"use strict";Cc();N()});var gl,fl,hl=y(()=>{"use strict";Es();en();gl=class extends Be{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Tp,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}},fl=new gl});var Bt=y(()=>{"use strict";Ii();vn();we();Dr();Br();Vr();ji();Rr();$r();Or();Rm();en();hl()});function gC(){return`\u26A1 prjct
396
+
397
+ ---`}function fC(){return`---
398
+ \u26A1 prjct \xB7 v${Hn()}`}function Ce(...s){return hC(gC(),...s.filter(Boolean),fC())}function yl(s,e){let t=`| ${s.join(" | ")} |`,n=`|${s.map(()=>"---").join("|")}|`,r=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...r].join(`
399
+ `)}function ot(s,e,t=3){return`### ${s}
400
+ ${e}`}function jt(s,e=!1){return s.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
401
+ `)}function wl(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}`),s.status&&e.push(`Status: ${s.status}`);let t=e.length>0?`
402
+ > ${e.join(" | ")}`:"";return`## \u26A1 ${s.description}${t}`}function $m(s,e){let t=["#","Status","Description"],n=s.map((r,o)=>{let i=String(o+1),a;r.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${r.description}${c}`]});return`### Subtasks
403
+ ${yl(t,n)}`}function Mm(s){return s.length===0?"":`### Relevant Files
404
+ ${s.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",r=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${r}`}).join(`
405
+ `)}`}function Om(s){return`### Rules
406
+ ${jt(s)}`}function tt(s){let e=["Command","Action"],t=s.map(n=>[`\`${n.command}\``,n.label]);return`### Next
407
+ ${yl(e,t)}`}function Dt(s){let e=Object.entries(s).filter(([,r])=>r!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([r,o])=>[r,String(o)]);return yl(t,n)}function tn(s,e){return e?`## \u2705 ${s}
408
+ > ${e}`:`## \u2705 ${s}`}function Fm(s){return`> \u26A0\uFE0F **${s}**`}function hC(...s){return s.filter(Boolean).join(`
409
+
410
+ `)}function pn(s,e,t,n){console.log(JSON.stringify({status:s,reason:e,...n,options:t}))}var Us=y(()=>{"use strict";ct();l(gC,"mdHeader");l(fC,"mdFooter");l(Ce,"mdOutput");l(yl,"mdTable");l(ot,"mdSection");l(jt,"mdList");l(wl,"mdTaskHeader");l($m,"mdSubtasks");l(Mm,"mdRelevantFiles");l(Om,"mdRules");l(tt,"mdNextSteps");l(Dt,"mdStats");l(tn,"mdDone");l(Fm,"mdWarn");l(hC,"mdJoin");l(pn,"mdActionRequired")});import qr from"chalk";function Pt(s,e={}){if(e.quiet)return;let t=Nm[s]||"idle",n=Wn.getValidCommands(t);if(n.length===0)return;let r=n.map(o=>({cmd:`p. ${o}`,desc:_m[o]||o}));console.log(qr.dim(`
411
+ Next:`));for(let o of r){let i=qr.cyan(o.cmd.padEnd(12));console.log(qr.dim(` ${i} \u2192 ${o.desc}`))}}function Di(s){let e=Nm[s]||"idle";return Wn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:_m[n]||n}))}function Kr(s){let e=Wn.getStateInfo(s);console.log(qr.dim(`\u{1F4CD} State: ${qr.white(s.toUpperCase())} - ${e.description}`))}var _m,Nm,Hs=y(()=>{"use strict";Ec();_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"},Nm={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(Pt,"showNextSteps");l(Di,"getNextSteps");l(Kr,"showStateInfo")});import*as ie from"@clack/prompts";import Zn from"chalk";var Ri,Lm,Gs,Um=y(()=>{"use strict";Gt();Ri=[{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."}],Lm=[{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"}],Gs=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}async run(){ie.intro(Zn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(this.currentStep++,!await t.run()||this.aborted)return this.buildResult(!0);return ie.outro(Zn.green("Setup complete!")),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=Ri.findIndex(n=>n.value===this.detectedType),t=await ie.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Ri.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Ri[e].value:void 0});return ie.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ie.multiselect({message:"Which AI agents do you use?",options:Lm.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ie.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);ie.note(e,"Detected stack");let t=await ie.confirm({message:"Is this stack correct?",initialValue:!0});if(ie.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ie.group({language:l(()=>ie.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ie.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await ie.group({verbosity:l(()=>ie.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>ie.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Zn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Zn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Zn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Zn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Zn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
412
+ `);ie.note(e,"Configuration Summary");let t=await ie.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ie.isCancel(t)||!t?(ie.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),r=[];try{await e.access(t.join(n.homedir(),".claude")),r.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),r.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),r.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),r.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),r.push("gemini")}catch{}return r.length>0?r:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let r=await e.readdir(this.projectPath);if(r.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",r.includes("bun.lockb")?n.packageManager="Bun":r.includes("pnpm-lock.yaml")?n.packageManager="pnpm":r.includes("yarn.lock")?n.packageManager="Yarn":r.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else r.includes("pyproject.toml")||r.includes("requirements.txt")?n.language="Python":r.includes("go.mod")?n.language="Go":r.includes("Cargo.toml")?n.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,ie.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Ri.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Lm.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 kl from"node:path";var yC,wC,$i,kC,ft,es=y(()=>{"use strict";be();Lt();Te();yC="outcomes",wC="outcomes.jsonl",$i=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=I.getGlobalProjectPath(e);return kl.join(t,yC)}getOutcomesPath(e){return kl.join(this.getOutcomesDir(e),wC)}async record(e,t){let n={...t,id:fe()},r=this.getOutcomesPath(e);return await Nt(kl.dirname(r)),await Na(r,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await x(t))return[];let n=await Ss(t);return n.trim()?n.trim().split(`
413
+ `).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}},kC=new $i,ft=kC});var Mi,SC,Sl,Hm=y(()=>{"use strict";es();Mi=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await ft.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 ft.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 ft.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 ft.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 ft.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}},SC=new Mi,Sl=SC});var Yr,Oi,bl,Cl=y(()=>{"use strict";As();ue();Yr=3,Oi=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>=Yr){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}/${Yr} 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>=Yr){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}/${Yr} 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>=Yr&&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(`
414
+ `)}},bl=new Oi});var Fi,Gm,Pl=y(()=>{"use strict";mc();en();ue();Fi=class extends Be{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...cp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Go([t,...n.outcomes]),lastUpdated: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?Go(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Go(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=lp(n,r),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=up(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:dp(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}},Gm=new Fi});var vl=y(()=>{"use strict";Um();Hm();Cl();es();Pl()});import nn from"chalk";function bC(s){return zm[s.toLowerCase()]||zm.default}var zm,xl,_i,Wm=y(()=>{"use strict";zm={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(bC,"getIcon");xl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(nn.cyan(`
372
415
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
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:
416
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let r=bC(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})`)}
417
+ `),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`}},_i=new xl});import nt from"chalk";function CC(s){let e=0;for(let n of s)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Bm.length;return Bm[t]}function PC(s,e,t="\u25B6"){let n=nt.dim(String(s+1).padStart(2)),o=CC(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=nt.green("\u2713 Complete");break;case"in_progress":a=nt.yellow(`${t} Working...`);break;case"pending":a=nt.gray("\u25CB Pending");break;case"failed":a=nt.red("\u2717 Failed");break;case"blocked":a=nt.gray("\u2298 Blocked");break;default:a=nt.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function vC(s){if(s.length===0)return"";let e=[];e.push(""),e.push(` ${nt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${nt.dim("\u2500".repeat(58))}`);for(let t=0;t<s.length;t++)e.push(PC(t,s[t]));return e.push(""),e.join(`
418
+ `)}function Vm(s){console.log(vC(s))}var Bm,Jm=y(()=>{"use strict";Bm=[nt.cyan,nt.magenta,nt.yellow,nt.blue,nt.green,nt.redBright,nt.magentaBright,nt.cyanBright];l(CC,"getDomainColor");l(PC,"formatSubtaskLine");l(vC,"renderSubtaskProgress");l(Vm,"printSubtaskProgress")});function xC(s){return qm.includes(s)}async function TC(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 EC(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(`
419
+ `)}var qm,IC,Ni,Km=y(()=>{"use strict";qm=["ship","feature","spec","cleanup","migrate"];l(xC,"requiresReasoning");l(TC,"reason");l(EC,"formatPlan");IC={requiresReasoning:xC,reason:TC,formatPlan:EC,REASONING_REQUIRED_COMMANDS:qm},Ni=IC});import Xr from"node:fs/promises";var Tl,AC,ht,El=y(()=>{"use strict";Ke();be();N();Zo();Tl=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 Xr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Xr.readFile(d,"utf-8"),Xr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},r=n[t]||n.default;return this.loadState(e,r)}async batchRead(e){let t=new Map,n=[];for(let r of e){let o=this._cache.get(r);o!==null?t.set(r,o.content):n.push(r)}if(n.length>0){let r=n.map(async i=>{try{let a=await Xr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(r);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await Xr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},AC=new Tl,ht=AC});import{exec as jC}from"node:child_process";import je from"node:fs/promises";import Ym from"node:os";import Dn from"node:path";import{promisify as DC}from"node:util";function Xm(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 Il(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function $C(s){if(s.verified||s.warnings.length===0)return null;let e=` Ground Truth Warnings:
377
420
  `;return s.warnings.forEach(t=>{e+=` - ${t}
378
421
  `}),s.recommendations.length>0&&(e+=`
379
422
  Recommendations:
380
423
  `,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 '
424
+ `})),e}async function Qm(s){let e=[],t=[],n={},r=s.paths.now;try{let a=await je.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=Xm(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 je.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 je.access(Dn.dirname(i),je.constants.W_OK),n.metricsWritable=!0}catch(a){if(P(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Zm(s){let e=[],t=[],n={};try{let{stdout:i}=await RC("git status --porcelain",{cwd:s.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
425
+ `).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 je.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 je.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}.*${Il(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 je.readFile(r,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function eg(s){let e=[],t=[],n={},r=s.paths.next;try{let a=await je.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 je.readFile(o,"utf-8");n.roadmapExists=!0;let c=s.params.description||s.params.feature;c&&new RegExp(Il(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 je.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function tg(s){let e=[],t=[],n={},r=s.paths.now;try{let i=await je.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 je.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!s.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ng(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let i=await je.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(Ym.homedir(),".prjct-cli");try{await je.access(o,je.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await je.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function sg(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let a=await je.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(Ym.homedir(),".prjct-cli/projects",o||"");try{await je.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function rg(s){let e=[],t=[],n={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of r)try{await je.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 je.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 og(s){let e=[],t=[],n={},r=s.paths.specs;try{await je.access(r),n.specsExists=!0;let i=await je.readdir(r);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=s.params.feature||s.params.name||s.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ag(s,e,t){let n=ig[s];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${w(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function MC(s,e,t){let n=await ag(s,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:s}}}function OC(s){return["done","ship","feature","spec","now","init","sync","analyze"].includes(s)}var RC,ig,FC,Li,cg=y(()=>{"use strict";N();RC=DC(jC);l(Xm,"formatDuration");l(Il,"escapeRegex");l($C,"formatWarnings");l(Qm,"verifyDone");l(Zm,"verifyShip");l(eg,"verifyFeature");l(tg,"verifyNow");l(ng,"verifyInit");l(sg,"verifySync");l(rg,"verifyAnalyze");l(og,"verifySpec");ig={done:Qm,ship:Zm,feature:eg,now:tg,init:ng,sync:sg,analyze:rg,spec:og};l(ag,"verify");l(MC,"prepareCommand");l(OC,"requiresVerification");FC={verify:ag,prepareCommand:MC,requiresVerification:OC,verifiers:ig,formatWarnings:$C,formatDuration:Xm,escapeRegex:Il,verifyDone:Qm,verifyShip:Zm,verifyFeature:eg,verifyNow:tg,verifyInit:ng,verifySync:sg,verifyAnalyze:rg,verifySpec:og},Li=FC});function NC(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 LC(s){if(!s||typeof s!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of _C)if(e.test(s))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:NC(t)};return{detected:!1}}function UC(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 HC(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 GC(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 zC(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 _C,Al,WC,zs,lg=y(()=>{"use strict";_C=[{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(NC,"getHallucinationSuggestion");l(LC,"detectHallucination");l(UC,"isSimilarError");l(HC,"analyzeErrorPattern");l(GC,"generateEscalationMessage");l(zC,"generateSuggestion");Al=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=>UC(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=HC(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:GC(e,o,this.maxAttempts),suggestion:zC(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 LC(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}}},WC=new Al,zs=WC});function jl(s,e){let t=Qr(e),n=BC[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 VC(s,e){let t=Qr(e),n=new Date(s);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function JC(s,e,t){let n=Qr(t),r=jl(s,t),o=jl(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Ui(s,e=Pn){let t=Qr(e);if(s.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=qC(s,e),r=KC(n,t.accuracyTolerance),o=r.slice(-t.windowSize),i=QC(o),a=YC(o),c=XC(s,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=ZC(s);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function dg(s,e,t=Pn){let n=Qr(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 qC(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=JC(i,r,e);if(!t.has(a)){let c=jl(i,e),u=VC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function KC(s,e){let t=[];for(let[,n]of s){let r=n.outcomes.reduce((u,d)=>u+eP(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Rl(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 YC(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 XC(s,e){let t=s.filter(r=>r.variance);if(t.length===0)return 0;let n=t.filter(r=>{let o=Rl(r);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function QC(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 ZC(s){let e=new Map;for(let r of s){if(!r.variance)continue;let o=Rl(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 Rl(s){if(!s.variance)return 0;let e=Dl(s.estimatedDuration),t=Dl(s.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Dl(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 pg(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(`
426
+ `)}function eP(s){if(!s.estimatedDuration)return 0;let e=Dl(s.estimatedDuration);if(e<=0)return 0;let t=ug[0],n=Number.POSITIVE_INFINITY;for(let r of ug){let o=Math.abs(r.typical-e);o<n&&(n=o,t=r)}return t.points}function Qr(s){return{sprintLengthDays:s.sprintLengthDays??7,startDay:s.startDay??"monday",windowSize:s.windowSize??6,accuracyTolerance:s.accuracyTolerance??20}}var BC,ug,$l=y(()=>{"use strict";Es();BC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(jl,"getSprintStart");l(VC,"getSprintEnd");l(JC,"getSprintNumber");l(Ui,"calculateVelocity");l(dg,"projectCompletion");l(qC,"bucketBySprint");l(KC,"buildSprintVelocities");l(YC,"detectTrend");l(XC,"calculateOverallAccuracy");l(QC,"calculateAverageVelocity");l(ZC,"detectEstimationPatterns");l(Rl,"parseVariancePercent");l(Dl,"parseDurationMinutes");l(pg,"formatVelocityContext");ug=[{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(eP,"derivePoints");l(Qr,"resolveConfig")});import{exec as tP}from"node:child_process";import nP from"node:fs/promises";import Hi from"node:path";import{promisify as sP}from"node:util";async function ts(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=cP(s),c=await lP(e),u=await uP(e),d=[];for(let p of c){if(!i&&pP(p))continue;let g=dP(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 cP(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 lP(s){let e=[];async function t(n,r=""){try{let o=await nP.readdir(n,{withFileTypes:!0});for(let i of o){let a=Hi.join(n,i.name),c=Hi.join(r,i.name);if(i.isDirectory()){if(aP.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Hi.extname(i.name).toLowerCase();iP.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(s),e}async function uP(s){let e=new Map;try{let{stdout:t}=await rP(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
384
427
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
385
428
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
386
429
  END { for (f in files) print files[f], lastmod[f], f }
387
430
  '`,{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 '
431
+ `).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 dP(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(oP))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=Hi.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 pP(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 rP,oP,iP,aP,Gi=y(()=>{"use strict";N();rP=sP(tP),oP={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"]},iP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),aP=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(ts,"findRelevantFiles");l(cP,"extractKeywords");l(lP,"getAllCodeFiles");l(uP,"getGitRecency");l(dP,"scoreFile");l(pP,"isTestFile")});import{exec as mP}from"node:child_process";import{promisify as gP}from"node:util";async function eo(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 yP(s);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await hP(s,t);return o=o.filter(c=>!wP(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 hP(s,e){let{stdout:t}=await Zr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
389
432
  /^[0-9]+$/ { timestamp=$1; next }
390
433
  NF {
391
434
  count[$0]++
@@ -395,8 +438,8 @@ Recommendations:
395
438
  for (f in count) print count[f], lastmod[f], f
396
439
  }
397
440
  ' | 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(`
399
- `).filter(Boolean),{stdout:i}=await Xr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
441
+ `).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 yP(s){let{stdout:e}=await Zr("git branch --show-current",{cwd:s}),t=e.trim(),n="main";try{await Zr("git rev-parse --verify main",{cwd:s})}catch{n="master"}let{stdout:r}=await Zr(`git diff --name-only ${n}...HEAD`,{cwd:s}),o=r.trim().split(`
442
+ `).filter(Boolean),{stdout:i}=await Zr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
400
443
  /^[0-9]+$/ { timestamp=$1; next }
401
444
  NF {
402
445
  count[$0]++
@@ -406,10 +449,10 @@ Recommendations:
406
449
  for (f in count) print count[f], lastmod[f], f
407
450
  }
408
451
  '`,{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(`
452
+ `).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 wP(s){let e=s.split("/").pop()||"";for(let t of fP)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Zr,fP,Ml=y(()=>{"use strict";Zr=gP(mP),fP=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(eo,"getRecentFiles");l(hP,"getHotFilesFromCommits");l(yP,"getBranchOnlyFiles");l(wP,"shouldIgnore")});function zi(s){return!s||s.length===0?0:Math.ceil(s.length/4)}function mg(s,e){let t=kP[e],n=s/1e3*t.input,r=s/1e3*t.output*.3;return{inputSaved:n,outputPotential:r,total:n+r}}function Fl(s){return s<.001?"<$0.01":s<.01?`$${s.toFixed(3)}`:`$${s.toFixed(2)}`}function to(s,e){let t=zi(s),n=zi(e),r=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=mg(r,SP),a=Ol.map(c=>({model:c,...mg(r,c)}));return{tokens:{original:t,filtered:n,saved:r},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Fl(i.total),byModel:a}}}function ns(s){let e=zi(s);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Ol.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Wi(s){if(s.length===0)return ns("");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=Ol.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:Fl(i),byModel:o}}}function bP(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function CP(s){return`${Math.round(s*100)}%`}var kP,SP,Ol,no=y(()=>{"use strict";kP={"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}},SP="claude-sonnet-4.5";l(zi,"countTokens");Ol=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(mg,"calculateModelCost");l(Fl,"formatCostSaved");l(to,"measureCompression");l(ns,"noCompression");l(Wi,"combineMetrics");l(bP,"formatTokenCount");l(CP,"formatCompressionRate")});import hg 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 hg.readFile(t,"utf-8")}catch(u){if(P(u))return{file:s,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:ns("")};throw u}let r=Rn.extname(s).toLowerCase(),o=yg[r]||"unknown",i=TP[o];if(!i||i.length===0)return{file:s,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:ns(n)};let a=EP(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
453
+ `);return{file:s,language:o,signatures:a,fallback:!1,metrics:to(n,c)}}async function _l(s,e=process.cwd(),t={}){let n=Rn.isAbsolute(s)?s:Rn.join(e,s),r=[];async function o(i){let a=await hg.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(yg[m]){let p=await $n(d,e);r.push(p)}}}}return l(o,"processDir"),await o(n),r}function EP(s,e){let t=[],n=s.split(`
411
454
  `),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.
455
+ `).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:IP(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function IP(s){return s.replace(/\{$/,"").replace(/\s+/g," ").trim()}var yg,gg,PP,vP,xP,fg,TP,Bi=y(()=>{"use strict";N();no();yg={".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"},gg=[{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}],PP=[{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}],vP=[{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}],xP=[{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}],fg=[{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}],TP={typescript:gg,javascript:gg,python:PP,go:vP,rust:xP,java:fg,csharp:fg,php:[],ruby:[],unknown:[]};l($n,"extractSignatures");l(_l,"extractDirectorySignatures");l(EP,"extractFromContent");l(IP,"cleanSignature")});import{createHash as AP}from"node:crypto";import Sg from"node:fs/promises";import bg from"node:path";function wg(s){return AP("sha256").update(s.toLowerCase().trim()).digest("hex").slice(0,16)}async function kg(s){try{let e=bg.join(s,"storage","classification-cache.json"),t=await Sg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?lc:(console.warn("[classifier] Failed to load cache:",w(e)),lc)}}async function Nl(s,e){try{let t=bg.join(s,"storage","classification-cache.json");await Sg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function DP(s,e,t){let n=s.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>jP?null:n.classification}function RP(s,e){return s.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function $P(s,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Cg(e),r=pc("classification")||"",o=`Classify this software engineering task into a domain.
413
456
 
414
457
  Task: "${s}"
415
458
 
@@ -417,19 +460,19 @@ Available domains in this project: ${n.join(", ")}
417
460
  Available agents: ${e.agents.join(", ")||"none"}
418
461
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
419
462
 
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??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=_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(`
463
+ ${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 OP(s,e){let t=Cg(e),n=new Map;for(let[p,g]of Object.entries(MP)){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 Kd;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=FP(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 Cg(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 FP(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 jP,MP,Ll,_P,Pg,vg=y(()=>{"use strict";Ar();Ho();N();jP=3600*1e3;l(wg,"hashDescription");l(kg,"loadCache");l(Nl,"saveCache");l(DP,"lookupCache");l(RP,"lookupPatterns");l($P,"classifyWithLLM");MP={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(OP,"classifyWithHeuristic");l(Cg,"buildAvailableDomains");l(FP,"getFilePatterns");Ll=class{static{l(this,"DomainClassifier")}async classify(e,t,n,r){let o=wg(e),i=await kg(n),a=DP(i,o,t);if(a)return{classification:a,source:"cache"};let c=RP(i,o);if(c)return{classification:c,source:"history"};let u=await $P(e,r);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Nl(n,i),{classification:u,source:"llm"};let d=OP(e,r);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Nl(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let r=wg(e),o=await kg(n);o.confirmedPatterns.some(i=>i.descriptionHash===r)||(o.confirmedPatterns.push({descriptionHash:r,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Nl(n,o))}},_P=new Ll,Pg=_P});import{exec as NP}from"node:child_process";import so from"node:fs/promises";import LP from"node:os";import ss from"node:path";import{promisify as UP}from"node:util";var xg,Tg,Ul,HP,Vi,Hl=y(()=>{"use strict";$l();Ke();be();Es();Bt();Gi();Ml();Bi();N();es();vg();In();xg=UP(NP),Tg=["database","backend","frontend","testing","devops"],Ul=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),ts(e,t,{maxFiles:10,minScore:.15}),eo(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(`
464
+ `);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([xg("git branch --show-current",{cwd:e}),xg("git status --porcelain",{cwd:e})]),r=t.stdout.trim()||"main",o=n.stdout.trim().split(`
465
+ `).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 Ct.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await ft.getAll(e);if(t.length===0)return null;let n=Ui(t,Pn);return n.sprints.length===0?null:pg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ss.join(e,"analysis","repo-analysis.json"),n=await so.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 Pg.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=ss.join(e,"agents");return(await so.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=I.getGlobalProjectPath(t),r=ss.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=ss.join(r,u);try{let m=await so.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=li(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=ss.join(LP.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=ss.join(t,`${i}.md`),c=ss.join(t,i,"SKILL.md");try{let u=await so.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await so.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=Tg.indexOf(a),d=Tg.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?"...":""}`}},HP=new Ul,Vi=HP});function GP(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 Gl,zP,Ne,Eg=y(()=>{"use strict";Lt();ue();un();un();l(GP,"generateApprovalPrompt");Gl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Sc.includes(e)}isDestructive(e){return bc.includes(e)}isToolAllowedInPlanning(e){return qo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>qo.includes(n)):t}startPlanning(e,t,n){let r={id:fe(),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 GP(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(`
466
+ `)}_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`}},zP=new Gl,Ne=zP});function WP(s){let e=s.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Ji[t]?Ji[t]:Ji[e]?Ji[e]:e}function qi(s){let e=new Set,t=[];for(let n of s){let r=WP(n);e.has(r)||(e.add(r),t.push(n))}return t}var Ji,zl=y(()=>{"use strict";Ji={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(WP,"normalizeFrameworkName");l(qi,"deduplicateTechStack")});import{z as Le}from"zod";function Ig(s){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
467
+ `);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=qi(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])=>BP[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
468
  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(`
469
+ `)}var mN,BP,Ag=y(()=>{"use strict";zl();mN=Le.object({projectPath:Le.string(),language:Le.string().optional(),framework:Le.string().optional(),techStack:Le.array(Le.string()).default([]),domains:Le.object({hasFrontend:Le.boolean().default(!1),hasBackend:Le.boolean().default(!1),hasDatabase:Le.boolean().default(!1),hasTesting:Le.boolean().default(!1),hasDocker:Le.boolean().default(!1)}).optional(),fileCount:Le.number().optional(),availableAgents:Le.array(Le.string()).default([]),analysisLanguages:Le.array(Le.string()).default([]),analysisFrameworks:Le.array(Le.string()).default([]),analysisPackageManager:Le.string().optional()}),BP={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Ig,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var VP,jg,Dg=y(()=>{"use strict";VP=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),jg=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),VP).refine(s=>"*"in s,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Wl(s,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(s)).length}function Rg(s,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),r=e.frontmatter?.["allowed-tools"]||[],o=`${s} ${t} ${n}`,i=Wl(o,JP),a=Wl(o,qP),c=Wl(o,KP);return r.some(d=>YP.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 JP,qP,KP,YP,$g=y(()=>{"use strict";JP=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],qP=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],KP=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],YP=["Write","Edit","Bash"];l(Wl,"countMatches");l(Rg,"classifyCommand")});import Bl from"node:fs/promises";import XP from"node:path";async function Og(){if(ro)return ro;let s=await Bl.readFile(Vl,"utf-8"),e=JSON.parse(s);return ro=jg.parse(e),ro}function QP(s){return Fg.get(s)}function ZP(s,e){Fg.set(s,e)}function tv(s,e){let t=s,n=Mg.get(t);return n&&sv(n.entry,e)?(n.count++,n.count>=ev):(Mg.set(t,{entry:e,count:1}),!1)}async function nv(s,e){let t=await Bl.readFile(Vl,"utf-8"),n=JSON.parse(t);n.commands[s]=e,await Bl.writeFile(Vl,`${JSON.stringify(n,null,2)}
470
+ `,"utf-8"),ro=null}function sv(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=QP(e);if(n)return{entry:n,source:"cache"};if(t){let r=Rg(e,t);return ZP(e,r),tv(e,r)&&nv(e,r).catch(()=>{}),{entry:r,source:"classified"}}return{entry:s.commands["*"],source:"wildcard"}}var Vl,ro,Fg,Mg,ev,Ng=y(()=>{"use strict";Dg();ct();$g();Vl=XP.join(pe,"core/config/command-context.config.json"),ro=null;l(Og,"loadCommandContextConfig");Fg=new Map;l(QP,"getCachedClassification");l(ZP,"cacheClassification");Mg=new Map,ev=3;l(tv,"trackClassification");l(nv,"persistClassification");l(sv,"isSameEntry");l(_g,"resolveCommandContextFull")});import rv from"node:os";import{z as sn}from"zod";function ov(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function iv(s){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[s]??s}function Lg(s){let e=s.platform??rv.platform(),t=s.runtime??ov(),n=s.date??new Date().toISOString().split("T")[0];return`<env>
471
+ ${[["project",s.projectName],["path",s.projectPath],["git",s.isGitRepo?"true":"false"],["branch",s.gitBranch],["platform",iv(e)],["runtime",t],["date",n],["model",s.model],["provider",s.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
429
472
  `)}
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}
473
+ </env>`}var AN,Ug=y(()=>{"use strict";AN=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(ov,"detectRuntime");l(iv,"normalizePlatform");l(Lg,"buildEnvironmentBlock")});function Gg(s){let e=s.getAllocationFor("injection");return{...Yi,totalPrompt:e}}function rs(s,e){let t=e*zg;return s.length<=t?s:`${s.substring(0,t)}
474
+ ... (truncated to ~${e} tokens)`}function Hg(s){return Math.ceil(s.length/zg)}function Wg(s,e){if(e.length===0||s.length===0)return s;let t=new Set;for(let n of e){let r=av[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 Yi,zg,av,Ki,Bg=y(()=>{"use strict";Yi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Gg,"budgetsFromCoordinator");zg=4;l(rs,"truncateToTokenBudget");l(Hg,"estimateTokens");av={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(Wg,"filterSkillsByDomains");Ki=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Yi,...e}}addSection(e,t){let n=rs(e,t),r=Hg(n);if(this.used+r>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=rs(n,o);return this.used+=Hg(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 Vg from"node:fs/promises";import os from"node:path";var Jl,cv,Jg,qg=y(()=>{"use strict";Bt();N();Te();ct();vl();Ag();Ng();Ug();Bg();zl();In();Jl=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 Vg.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?Gg(this._coordinator):Yi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=he(`global/modules/${e}`);if(t)return t;let n=os.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=En("checklists/");if(n.length>0){for(let r of n)if(r.endsWith(".md")){let o=he(r);if(o){let i=os.basename(r,".md");t[i]=o}}}else{let r=os.join(pe,"templates","checklists");if(await x(r)){let o=(await Vg.readdir(r)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=os.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),Ee.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 Sl.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(`
475
+ `);return rs(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=os.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 Og();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
476
  `),r.role&&d.push(`Role: ${r.role}
434
477
  `),r.skills?.length&&d.push(`Skills: ${r.skills.join(", ")}
435
478
  `),d.push(`
@@ -438,7 +481,7 @@ Apply specialized expertise. Read agent file for details if needed.
438
481
  `)),d.push(`TASK: ${e.frontmatter.description}
439
482
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
440
483
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
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(`
484
+ `);let k=t.projectPath;if(k){let S=u?.project?.id?os.basename(k):os.basename(k),j=Lg({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
442
485
  ${j}
443
486
  `)}if(u){let S=u.sealedAnalysis;if(d.push(`
444
487
  ## PROJECT ANALYSIS (Sealed)
@@ -473,14 +516,14 @@ Stack: ${j}
473
516
  `),j.effort&&d.push(`Effort: ${j.effort}
474
517
  `),j.model&&d.push(`Model: ${j.model}
475
518
  `),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
476
- `);let te=ss(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
519
+ `);let te=rs(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
477
520
  ${te}
478
521
  \`\`\`
479
522
 
480
- `)}}let S=Ug(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
523
+ `)}}let S=Wg(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
481
524
 
482
525
  `);for(let j of S){d.push(`#### Skill: ${j.name}
483
- `);let te=ss(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
526
+ `);let te=rs(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
484
527
  ${te}
485
528
  \`\`\`
486
529
 
@@ -492,8 +535,8 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
492
535
  `)),c?.requiresApproval&&d.push(`
493
536
  ## APPROVAL REQUIRED
494
537
  Show changes, list affected files, ask for confirmation.
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)}
538
+ `),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:qi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Je=>Je.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
539
+ ${Ig(te)}
497
540
  `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let S=u.contextDegradation;d.push(`
498
541
  ### CONTEXT DEGRADATION NOTICE
499
542
 
@@ -575,7 +618,7 @@ Read files before modifying.
575
618
  **Context for this subtask:**
576
619
  ${j.outputForNextAgent}
577
620
  `)}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(`
621
+ `)}let ee=this.getSchemaTypeForCommand(m);if(ee){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(Ho(),rp)),j=S(ee);j&&d.push(`
579
622
  ${j}
580
623
  `)}if(p.checklist){let S=await this.loadChecklistRouting(),j=await this.loadChecklists();S&&Object.keys(j).length>0&&(d.push(`
581
624
  ## QUALITY CHECKLISTS
@@ -583,7 +626,7 @@ ${j}
583
626
  `),d.push(`Available: ${Object.keys(j).join(", ")}
584
627
  `),d.push(`Path: templates/checklists/{name}.md
585
628
  `),d.push(`Use Read tool to load checklists you determine are relevant.
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}
629
+ `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Ki({totalPrompt:t.stateData}),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}
587
630
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
588
631
 
589
632
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -600,7 +643,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
600
643
  `);a&&t.push(a)}let r=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(r){let a=r[0].substring(0,300);t.push(`
601
644
  Avoid:
602
645
  ${a}`)}let o=t.join(`
603
- `);return ss(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
646
+ `);return rs(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
604
647
  ## RULES (CRITICAL)
605
648
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
606
649
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -617,7 +660,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
617
660
  - Prefer structured output (JSON) over free text when applicable.
618
661
 
619
662
  EXECUTE: Follow flow. Use tools. Decide.
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:`
663
+ `}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}}}},cv=new Jl,Jg=cv});import Kg from"node:fs/promises";import Rt from"node:path";var lv,uv,ql,Kl,Xi,Yl=y(()=>{"use strict";Ke();be();N();lv=["task","done","ship","resume","bug","enrich"],uv=["init","sync","pause","next","dash","history","undo","redo"],ql=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Rt.dirname(kr.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(qe(),Tt(pt)).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 lv.includes(e)?!0:!uv.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Kg.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 Kg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
621
664
  ## Agentic Execution Mode
622
665
 
623
666
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -700,13 +743,13 @@ When fragmenting tasks:
700
743
  2. Track progress: currentSubtaskIndex, subtaskProgress
701
744
  3. Each completed subtask generates a summary
702
745
  4. Pass summary to next agent for context handoff
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:`
746
+ `,context:e,requiresOrchestration:t}}},Kl=new ql,Xi=Kl});import{exec as dv}from"node:child_process";import Yg from"node:fs/promises";import{promisify as pv}from"node:util";var mv,is,Qe,Xl=y(()=>{"use strict";gi();mv=pv(dv),is={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())}};is.register("Read",async s=>{try{return await zr.execute(async()=>await Yg.readFile(s,"utf-8"),`read-${s}`)}catch(e){return mi(e)||Gr(e),null}});is.register("Write",async(s,e)=>{try{return await zr.execute(async()=>await Yg.writeFile(s,e,"utf-8"),`write-${s}`),!0}catch(t){return mi(t)||Gr(t),!1}});is.register("Bash",async s=>{try{return await zr.execute(async()=>await mv(s),`bash-${s}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});is.register("GetTimestamp",async()=>new Date().toISOString());is.register("GetDate",async()=>new Date().toISOString().split("T")[0]);is.register("GetDateTime",async()=>new Date().toISOString());Qe=is});import Ql from"node:fs/promises";import gv from"node:os";import Xg from"node:path";async function fv(s){try{let e=Xg.dirname(Qi);await x(e)||await Ql.mkdir(e,{recursive:!0}),await Ql.writeFile(Qi,`/p:${s}`)}catch{}}async function hv(){try{await x(Qi)&&await Ql.unlink(Qi)}catch{}}var Qi,Zl,yv,Zi,eu=y(()=>{"use strict";N();Wm();Te();Jm();Km();El();cg();lg();Fs();Hl();Eg();qg();Yl();In();Xl();Qi=Xg.join(gv.homedir(),".prjct-cli",".running");l(fv,"signalStart");l(hv,"signalEnd");Zl=class{static{l(this,"CommandExecutor")}async signalStart(e){await fv(e)}async signalEnd(){await hv()}async execute(e,t,n){await this.signalStart(e);let r=t.task||t.description||"";if(zs.shouldEscalate(e,r)){let o=zs.getEscalationInfo(e,r);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Wc.load(e),i=await ht.build(n,t),a=Ne.requiresPlanning(e),c=Ne.isDestructive(e),u=Ne.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ne.startPlanning(i.projectId,e,t):u&&(d=Ne.getActivePlan(i.projectId));let m=null;if(Li.requiresVerification(e)){let S=await ht.loadStateForCommand(i,e);m=await Li.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Li.formatWarnings(m))}let p=null;if(Ni.requiresReasoning(e)){let S=await ht.loadStateForCommand(i,e);p=await Ni.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ni.formatPlan(p)))}let g=t.task||t.description||"",f=await Xi.buildContext(e,g,n),k=Xi.buildAgenticPrompt(f),b=null;if(Xi.requiresOrchestration(e)&&g)try{b=await Vi.execute(e,g,n),b.detectedDomains.length>0&&_i.orchestrate(b.detectedDomains);for(let S of b.agents){let j=S.domain||S.name.replace(".md","");_i.startAgent(S.name,j,`Loading ${j} specialist...`),_i.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}));Vm(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 ht.loadState(i),$=null,F=null;i.projectId&&($={commit_footer:await Ie.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ie.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ie.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ie.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Ie.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let H={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ne.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ee=await Jg.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}`),zs.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=>Ie.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,te)=>Ie.autoRemember(i.projectId,S,j,te),"autoRemember"),search:l(S=>Ie.searchMemories(i.projectId,S),"search"),findByTags:l(S=>Ie.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>Ie.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>Ne.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>Ne.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>Ne.proposePlan(i.projectId,S),"propose"),approve:l(S=>Ne.approvePlan(i.projectId,S),"approve"),reject:l(S=>Ne.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>Ne.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ne.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ne.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>Ne.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>Ne.failStep(i.projectId,S),"failStep"),abort:l(S=>Ne.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>Ne.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ne.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=zs.recordAttempt(e,r,{success:!1,error:w(o)});if(i.shouldEscalate){let a=zs.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(!Qe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let r=Qe.get(e);if(!r)throw new Error(`Tool ${e} not found`);return await r(...t)}async executeSimple(e,t,n){try{let o=(await Wc.load(e)).frontmatter["allowed-tools"]||[],i=await ht.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)}}}},yv=new Zl,Zi=yv});import ea from"node:fs/promises";import wv from"node:https";import kv from"node:os";import tu from"node:path";import Jt from"chalk";var nu,Qg,Zg=y(()=>{"use strict";N();Te();nu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=tu.join(kv.homedir(),".prjct-cli","config"),this.cacheFile=tu.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=tu.join(__dirname,"..","..","package.json");return JSON.parse(await ea.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=wv.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 ea.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await x(this.cacheDir)||await ea.mkdir(this.cacheDir,{recursive:!0}),await ea.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
747
  `+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
748
  `+Jt.yellow("\u2502")+" "+Jt.bold("Update available!")+" "+Jt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Jt.yellow("\u2502")+`
706
749
  `+Jt.yellow("\u2502")+" "+Jt.yellow("\u2502")+`
707
750
  `+Jt.yellow("\u2502")+" Run: "+Jt.cyan("npm update -g prjct-cli")+" "+Jt.yellow("\u2502")+`
708
751
  `+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
752
+ `}},Qg=nu});var Pe,it=y(()=>{"use strict";eu();El();Xl();Ke();be();Zg();On();ue();Te();Gt();Pe=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Qg,this.updateNotificationShown=!1,this.commandExecutor=Zi}get agent(){return Ns.getAgent()}get agentInfo(){return Ns.getInfo()}get currentAuthor(){return Mn.getCurrentAuthor()}async initializeAgent(){return Ns.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 gt.log(e,t,n,r.name)}async _detectEmptyDirectory(e){return Mn.isEmptyDirectory(e)}async _detectExistingCode(e){return Mn.hasExistingCode(e)}_breakdownFeatureTasks(e){return ki.breakdownFeature(e)}_detectBugSeverity(e){return ki.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Ns.assignForTask(e,t,n)}}});var ef={};ye(ef,{PlanningCommands:()=>cs});import as from"node:path";async function Sv(){if(!su){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(na(),tf));su=new s}return su}var su,cs,ta=y(()=>{"use strict";_o();An();Lt();Bt();N();Us();Hs();vl();it();su=null;l(Sv,"getAnalysisCommands");cs=class extends Pe{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 Gs(t).runNonInteractive());else if(a=await new Gs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await xs(),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
710
753
 
711
754
  No current task. Use \`/p:now\` to set focus.
712
755
  `,"core/next.md":`# NEXT
@@ -726,7 +769,7 @@ No current task. Use \`/p:now\` to set focus.
726
769
  `,"planning/roadmap.md":`# ROADMAP
727
770
 
728
771
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
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
772
+ `,"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 Qe.get("Write")(as.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 Sv();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=as.join(p,"planning","architect-session.md"),v=`# Architect Session
730
773
 
731
774
  ## Idea
732
775
  ${b}
@@ -735,8 +778,8 @@ ${b}
735
778
  Initialized - awaiting stack recommendation
736
779
 
737
780
  Generated: ${new Date().toLocaleString()}
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.
781
+ `;return await Qe.get("Write")(D,v),await Ae.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ae.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 ht.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=fe(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Ee.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 ht.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 Ee.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(Ce(ot("Bug Reported",e),Dt({Severity:a,Priority:m,Agent:u}),tt([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),Pt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(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
782
+ `);let r=await this.getGlobalProjectPath(t),o=as.join(r,"planning","architect-session.md"),i;try{i=await le.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
740
783
 
741
784
  Create a plan first:
742
785
  1. Run /p:init in an empty directory
@@ -757,7 +800,7 @@ The architect plan is ready. Claude will now:
757
800
  4. Create starter files with boilerplate
758
801
  `),console.log(`
759
802
  \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.
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
803
+ `),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=as.join(c,"planning","architect-session.md"),d=`# Architect Session
761
804
 
762
805
  ## Idea
763
806
  ${e}
@@ -772,14 +815,14 @@ Initialized - awaiting architecture design
772
815
  4. Generate roadmap
773
816
 
774
817
  Generated: ${new Date().toLocaleString()}
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(`
818
+ `;return await Qe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ce(ot("Idea Captured",e),Dt({Mode:"architecture"}),tt([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
776
819
  \u{1F4A1} Use /p:architect execute to continue planning
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(`
820
+ `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ze.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ce(ot("Idea Captured",e),Dt({Mode:"capture"}),tt([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),Pt("idea")),{success:!0,mode:"capture",idea:e}}catch(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=as.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(`
778
821
  \u{1F4A1} Create one with /p:spec "feature name"
779
822
  `),{success:!0,specs:[]}):(console.log(`
780
823
  \u{1F4CB} SPECIFICATIONS
781
824
  `),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}
825
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=I.getGlobalProjectPath(r),i=as.join(o,"planning","specs");await le.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=as.join(i,`${a}.md`),u=`# Specification: ${e}
783
826
 
784
827
  ## Overview
785
828
  [Brief description of the feature]
@@ -809,28 +852,28 @@ Generated: ${new Date().toLocaleString()}
809
852
  ---
810
853
  Created: ${new Date().toLocaleString()}
811
854
  Status: Draft
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(`
855
+ `;return await Qe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:B.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
813
856
  \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(`
857
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var sa,Mn,nf=y(()=>{"use strict";ln();_o();Ke();be();N();Te();Gt();sa=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(()=>(ta(),ef)),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 jo.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 xs();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 bs(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 bs(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 sa});import{exec as bv}from"node:child_process";import{promisify as Cv}from"node:util";var ru,Pv,ra,oo,sf=y(()=>{"use strict";we();N();oi();ru=Cv(bv),Pv={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ra=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Pv,...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 ru("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([ru(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),ru(`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
858
  `).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
859
  `)}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
860
  `);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?`
861
+ `)}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}},oo=l((s,e)=>new ra(s,e),"createStalenessChecker")});import rf from"node:fs/promises";import oa from"node:path";function io(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 Ev(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...io(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(...io(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(...io(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(...io(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...io(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&&!xv.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function of(s,e){let t=[],n=await rf.readdir(s,{withFileTypes:!0});for(let r of n){if(Tv.has(r.name))continue;let o=oa.join(s,r.name);if(r.isDirectory())t.push(...await of(o,e));else if(r.isFile()){let i=oa.extname(r.name).toLowerCase();vv.has(i)&&t.push(oa.relative(e,o))}}return t}async function Iv(s){let e=await of(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 rf.readFile(oa.join(s,d),"utf-8"),p=Ev(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 jv(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,Av,t)}async function af(s,e){let t=await Iv(s);return jv(e,t),t}var vv,xv,Tv,Av,cf=y(()=>{"use strict";we();vv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),xv=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"]),Tv=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(io,"splitIdentifier");l(Ev,"tokenizeFile");l(of,"listFiles");l(Iv,"buildIndex");Av="bm25-index";l(jv,"saveIndex");l(af,"indexProject")});import ou from"node:fs/promises";import mn from"node:path";function Ov(s){let e=[],t,n=new RegExp(Mv.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function Fv(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 $v){let o=n+r;try{if((await ou.stat(o)).isFile())return mn.relative(t,o)}catch{}}return null}async function lf(s,e){let t=[],n=await ou.readdir(s,{withFileTypes:!0});for(let r of n){if(Rv.has(r.name))continue;let o=mn.join(s,r.name);if(r.isDirectory())t.push(...await lf(o,e));else if(r.isFile()){let i=mn.extname(r.name).toLowerCase();Dv.has(i)&&t.push(mn.relative(e,o))}}return t}async function _v(s){let e=await lf(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 ou.readFile(mn.join(s,u),"utf-8"),m=Ov(d),p=[];for(let g of m){let f=await Fv(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 Nv(s,e){q.setDoc(s,uf,e)}function df(s){return q.getDoc(s,uf)}async function pf(s,e){let t=await _v(s);return Nv(e,t),t}var Dv,Rv,$v,Mv,uf,iu=y(()=>{"use strict";we();Dv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Rv=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),$v=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Mv=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Ov,"extractImportSources");l(Fv,"resolveImport");l(lf,"listFiles");l(_v,"buildGraph");uf="import-graph";l(Nv,"saveGraph");l(df,"loadGraph");l(pf,"indexImports")});function mf(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=df(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 gf(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 ff=y(()=>{"use strict";iu();l(mf,"propagateChanges");l(gf,"affectedDomains")});import au from"node:fs/promises";import ia from"node:path";async function hf(s,e){let t=[],n=await au.readdir(s,{withFileTypes:!0}).catch(()=>[]);for(let r of n){let o=String(r.name);if(Uv.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=ia.join(s,o);if(r.isDirectory())t.push(...await hf(i,e));else if(r.isFile()){let a=ia.extname(o).toLowerCase();Lv.has(a)&&t.push(ia.relative(e,i))}}return t}function Hv(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 Gv(s){let e=await hf(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=ia.join(s,a),[u,d]=await Promise.all([au.readFile(c,"utf-8"),au.stat(c)]);return{path:a,hash:Hv(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 zv(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 cu(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 Wv(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 lu(s,e){let[t,n]=await Promise.all([Gv(s),Promise.resolve(Wv(e))]);return{diff:zv(t,n),currentHashes:t}}function yf(s){return q.hasDoc(s,"file-hashes-meta")}var Lv,Uv,wf=y(()=>{"use strict";we();Lv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Uv=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(hf,"listProjectFiles");l(Hv,"hashContent");l(Gv,"computeHashes");l(zv,"diffHashes");l(cu,"saveHashes");l(Wv,"loadHashes");l(lu,"detectChanges");l(yf,"hasHashRegistry")});import{exec as Bv}from"node:child_process";import{promisify as Vv}from"node:util";async function Kv(s,e=100){try{let{stdout:t}=await Jv(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:s,maxBuffer:10485760}),n=[],r=null;for(let o of t.split(`
862
+ `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=Sf&&n.push(r),r=new Set):i&&r&&Yv(i)&&r.add(i)}return r&&r.size>0&&r.size<=Sf&&n.push(r),n}catch{return[]}}function Yv(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 Xv(s,e=100){let t=await Kv(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=Qv(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<kf||m<kf)continue;let p=d+m-a,g=p>0?a/p:0;g<qv||(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 Qv(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function ex(s,e){q.setDoc(s,Zv,e)}async function bf(s,e,t=100){let n=await Xv(s,t);return ex(e,n),n}var Jv,qv,kf,Sf,Zv,Cf=y(()=>{"use strict";we();Jv=Vv(Bv),qv=.1,kf=2,Sf=30;l(Kv,"parseGitLog");l(Yv,"isSourceFile");l(Xv,"buildMatrix");l(Qv,"pairKey");Zv="cochange-index";l(ex,"saveMatrix");l(bf,"indexCoChanges")});function $t(s){return`<!-- source: ${s.file}, ${s.type} -->`}function ls(){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 uu=y(()=>{"use strict";l($t,"cite");l(ls,"defaultSources")});function ao(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
863
+ `)}function co(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
864
+ `)}function Pf(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
865
  ### Project Structure
823
866
 
824
867
  ${e.join(`
825
868
  `)}
826
- `:""}function Yv(s){let e=[];return s.patterns?.length>0&&e.push(`
869
+ `:""}function tx(s){let e=[];return s.patterns?.length>0&&e.push(`
827
870
  ### Code Patterns (Follow These)
828
871
 
829
- ${oo(s.patterns)}`),s.antiPatterns?.length>0&&e.push(`
872
+ ${ao(s.patterns)}`),s.antiPatterns?.length>0&&e.push(`
830
873
  ### Anti-Patterns (Avoid These)
831
874
 
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
875
+ ${co(s.antiPatterns)}`),e.push(Pf(s)),e.join(`
876
+ `)}function nx(s,e){let t=s.sources||ls();return`# ${s.name} - Project Rules
834
877
  <!-- projectId: ${s.projectId} -->
835
878
  <!-- Generated: ${new Date().toISOString()} -->
836
879
  <!-- Ecosystem: ${s.ecosystem} | Type: ${s.projectType} -->
@@ -859,7 +902,7 @@ ${$t(t.languages)}
859
902
  - **Languages**: ${s.languages.join(", ")||"Not detected"}
860
903
  ${$t(t.frameworks)}
861
904
  - **Frameworks**: ${s.frameworks.join(", ")||"Not detected"}
862
- ${s.analysis?Yv(s.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
905
+ ${s.analysis?tx(s.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
863
906
  ---
864
907
 
865
908
  ## PRJCT RULES
@@ -903,13 +946,13 @@ Load from \`~/.prjct-cli/projects/${s.projectId}/agents/\`:
903
946
 
904
947
  **Workflow**: ${s.agents.workflow.join(", ")}
905
948
  **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()}
949
+ `}function sx(s,e){let t=s.sources||ls(),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(ao(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(co(s.analysis.antiPatterns)),n.push(""));let r=Pf(s.analysis);r&&(n.push(r.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
950
+ `)}function rx(s,e){let t=s.sources||ls(),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(ao(s.analysis.patterns,5)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(co(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(`
951
+ `)}function ox(s,e){let t=s.sources||ls(),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(ao(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(co(s.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
952
+ `)}function ix(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(`
953
+ `),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 ax(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(ao(s.analysis.patterns)),t.push("")),s.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(co(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(`
954
+ `)}function vf(s){return{claude:nx,cursor:sx,copilot:rx,windsurf:ox,continue:ix,codex:ax}[s]||null}var du=y(()=>{"use strict";uu();l(ao,"formatPatterns");l(co,"formatAntiPatterns");l(Pf,"formatStructure");l(tx,"formatAnalysisForClaude");l(nx,"formatForClaude");l(sx,"formatForCursor");l(rx,"formatForCopilot");l(ox,"formatForWindsurf");l(ix,"formatForContinue");l(ax,"formatForCodex");l(vf,"getFormatter")});import{exec as cx}from"node:child_process";import lx from"node:os";import Ws from"node:path";import{promisify as ux}from"node:util";function xf(s){return ca[s]||null}async function aa(s){try{return await dx(`which ${s}`),!0}catch{return!1}}async function la(s=process.cwd()){let e=[];return await aa("claude")&&e.push("claude"),(await aa("cursor")||await x(Ws.join(s,".cursor")))&&e.push("cursor"),await x(Ws.join(s,".github"))&&e.push("copilot"),(await aa("windsurf")||await x(Ws.join(s,".windsurf")))&&e.push("windsurf"),(await x(Ws.join(s,".continue"))||await x(Ws.join(lx.homedir(),".continue")))&&e.push("continue"),(await aa("codex")||await x(Ws.join(s,".agents")))&&e.push("codex"),e}async function Tf(s,e=process.cwd()){if(s==="auto"){let t=await la(e);return t.length>0?t:["claude"]}return s==="all"?px:s.filter(t=>ca[t])}var dx,ca,lo,px,pu=y(()=>{"use strict";Te();dx=ux(cx),ca={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"}},lo=["claude"],px=Object.keys(ca);l(xf,"getAIToolConfig");l(aa,"commandExists");l(la,"detectInstalledTools");l(Tf,"resolveToolIds")});import mu from"node:fs/promises";import gu from"node:path";async function Ef(s,e,t,n=lo){let r=[];for(let o of n){let i=xf(o);if(!i){r.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await mx(s,i,e,t);r.push(a)}return r}async function mx(s,e,t,n){let r=vf(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=gu.join(n,e.outputFile):i=gu.join(t,"context",e.outputFile),await mu.mkdir(gu.dirname(i),{recursive:!0});try{let a=await mu.readFile(i,"utf-8"),c=Kc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=qc(o,a)}catch{}return await mu.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 If=y(()=>{"use strict";N();Yc();du();pu();l(Ef,"generateAIToolContexts");l(mx,"generateForTool")});var Af=y(()=>{"use strict";du();If();pu()});import uo from"node:fs/promises";import po from"node:path";var fu,jf,hu,Df,Rf=y(()=>{"use strict";N();fu=".prjct/.prjct-state.md",jf=".prjct-state.md",hu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=po.join(e,fu);await uo.mkdir(po.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await uo.writeFile(n,r,"utf-8");try{let o=po.join(e,jf);await uo.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[fu,jf])try{await uo.unlink(po.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=po.join(e,fu);try{return await uo.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
955
+ `)}},Df=new hu});import yu from"node:fs/promises";import gx from"node:os";import $f from"node:path";function wu(){return $f.join(gx.homedir(),".prjct-cli","skills",fx)}function hx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function mo(){try{let s=await yu.readFile(wu(),"utf-8");return JSON.parse(s)}catch{return hx()}}async function ku(s){let e=wu();await yu.mkdir($f.dirname(e),{recursive:!0}),s.generatedAt=new Date().toISOString(),await yu.writeFile(e,JSON.stringify(s,null,2),"utf-8")}async function yx(s){let e=await mo();e.skills[s.name]=s,await ku(e)}async function wx(s){let e=await mo();return s in e.skills?(delete e.skills[s],await ku(e),!0):!1}async function kx(s){return(await mo()).skills[s]||null}async function Sx(){return(await mo()).skills}function bx(){return wu()}var fx,go,Mf=y(()=>{"use strict";fx=".skill-lock.json";l(wu,"getLockFilePath");l(hx,"createEmptyLockFile");l(mo,"read");l(ku,"write");l(yx,"addEntry");l(wx,"removeEntry");l(kx,"getEntry");l(Sx,"getAll");l(bx,"getPath");go={read:mo,write:ku,addEntry:yx,removeEntry:wx,getEntry:kx,getAll:Sx,getPath:bx}});import{exec as Cx}from"node:child_process";import gn from"node:fs/promises";import bu from"node:os";import at from"node:path";import{promisify as Px}from"node:util";import{glob as Of}from"glob";function _f(s){if(s.startsWith("./")||s.startsWith("/")||s.startsWith("~")){let n=s.startsWith("~")?at.join(bu.homedir(),s.slice(1)):at.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 Nf(s){let e=[];try{let r=at.join(s,"SKILL.md");await gn.access(r);let o=at.basename(s);e.push({name:o,filePath:r})}catch{}let t=await Of("*/SKILL.md",{cwd:s,absolute:!0});for(let r of t){let o=at.basename(at.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let n=await Of("skills/*/SKILL.md",{cwd:s,absolute:!0});for(let r of n){let o=at.basename(at.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function vx(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
956
  ${r.join(`
914
957
  `)}`;return s.replace(o,`---
915
958
  ${c}
@@ -918,10 +961,10 @@ ${r.join(`
918
961
  `)}
919
962
  ---
920
963
 
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=[`
964
+ ${s}`}function Cu(){return at.join(bu.homedir(),".claude","skills")}async function Su(s,e,t,n){let r=Cu(),o=at.join(r,e),i=at.join(o,"SKILL.md"),a=await gn.readFile(s,"utf-8"),c=vx(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 xx(s){let e={installed:[],skipped:[],errors:[]};if(!Ls.isAvailable("git")){let n=Ls.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=at.join(bu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${s.owner}/${s.repo}.git`;await Ff(`git clone --depth 1 ${n} ${t}`,{timeout:js("GIT_CLONE")});let r;try{let{stdout:a}=await Ff("git rev-parse HEAD",{cwd:t,timeout:js("TOOL_CHECK")});r=a.trim()}catch{}let o=await Nf(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 Su(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 go.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 Tx(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=at.basename(at.dirname(t));try{let o=await Su(t,r,s),i={name:r,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await go.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let r=await Nf(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 Su(o.filePath,o.name,s),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await go.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function Ex(s){let e=Cu(),t=at.join(e,s);try{await gn.rm(t,{recursive:!0,force:!0})}catch{}let n=at.join(e,`${s}.md`);try{await gn.rm(n,{force:!0})}catch{}return go.removeEntry(s)}async function Ix(s){let e=_f(s);switch(e.type){case"github":return xx(e);case"local":return Tx(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Ff,Lf,Uf=y(()=>{"use strict";N();un();Ti();Mf();Ff=Px(Cx);l(_f,"parseSource");l(Nf,"discoverSkills");l(vx,"injectSourceMetadata");l(Cu,"getInstallDir");l(Su,"installSkillFile");l(xx,"installFromGitHub");l(Tx,"installFromLocal");l(Ex,"remove");l(Ix,"install");Lf={install:Ix,remove:Ex,parseSource:_f,getInstallDir:Cu}});import Mt from"node:fs/promises";import Ax from"node:os";import vt from"node:path";async function Hf(s,e,t,n){let r=[],o=vt.join(s,"agents");try{let c=await Mt.readdir(o);for(let u of c)u.endsWith(".md")&&await Mt.unlink(vt.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=>jx(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=>Dx(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 Gf(s){let e=vt.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 zf(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=he(`subagents/${o}.md`);if(!i){let a=vt.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 jx(s,e){let t="";try{let n=vt.join(__dirname,"..","..","templates","subagents","workflow",`${s}.md`);t=await Mt.readFile(n,"utf-8"),t=await zf(t)}catch(n){U.debug("Workflow agent template not found, generating minimal",{name:s,error:re(n)}),t=$x(s)}await Mt.writeFile(vt.join(e,`${s}.md`),t,"utf-8")}async function Dx(s,e,t,n,r){let o="";try{let i=vt.join(__dirname,"..","..","templates","subagents","domain",`${s}.md`);o=await Mt.readFile(i,"utf-8"),o=await zf(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=Mx(s,t,n)}o=Rx(o,s,r),await Mt.writeFile(vt.join(e,`${s}.md`),o,"utf-8")}function Rx(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=[`
922
965
  ## Recent Learnings (from completed tasks)
923
966
  `];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`---
967
+ `)}function $x(s){return`---
925
968
  name: ${s}
926
969
  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"}
927
970
  tools: Read, Write, Glob
@@ -937,7 +980,7 @@ When invoked:
937
980
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
938
981
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
939
982
  3. Execute requested operation
940
- `}function Ax(s,e,t){return`---
983
+ `}function Mx(s,e,t){return`---
941
984
  name: ${s}
942
985
  description: ${s.charAt(0).toUpperCase()+s.slice(1)} specialist for ${e.name}
943
986
  tools: Read, Write, Glob, Grep
@@ -957,17 +1000,17 @@ Domain specialist for ${s} tasks.
957
1000
  ## Your Role
958
1001
 
959
1002
  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(`
1003
+ `}function Wf(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(vt.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 Bf(s){let e=[];try{let t=vt.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=vt.join(Ax.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=vt.join(a,d,"SKILL.md"),p=vt.join(a,`${d}.md`),g=!1;try{await 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 Lf.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 Vf=y(()=>{"use strict";In();ln();ue();zn();Uf();l(Hf,"generateAgents");l(Gf,"loadExistingAgents");l(zf,"resolveTemplateIncludes");l(jx,"generateWorkflowAgent");l(Dx,"generateDomainAgent");l(Rx,"injectFeedbackSection");l($x,"generateMinimalWorkflowAgent");l(Mx,"generateMinimalDomainAgent");l(Wf,"configureSkills");l(Bf,"autoInstallSkills")});import Jf from"node:fs/promises";import qf from"node:path";var ua,Kf=y(()=>{"use strict";ua=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=qf.join(this.projectPath,"package.json"),t=await Jf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Jf.access(qf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as Ox}from"node:child_process";import Yf from"node:fs/promises";import Pu from"node:path";import{promisify as Fx}from"node:util";async function Xf(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await us("git branch --show-current",{cwd:s});e.branch=t.trim()||"main";let{stdout:n}=await us("git rev-list --count HEAD",{cwd:s});e.commits=parseInt(n.trim(),10)||0;let{stdout:r}=await us("git shortlog -sn --all | wc -l",{cwd:s});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await us("git status --porcelain",{cwd:s}),i=o.trim().split(`
1004
+ `).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 us('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:s});e.recentCommits=a.split(`
1005
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await us('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 Yf.access(Pu.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:Pu.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await us('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=Pu.join(s,"package.json"),n=JSON.parse(await Yf.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 Zf(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 eh(s,e){let t=ls(),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 th(s){return new ua(s).detect()}var us,nh=y(()=>{"use strict";ln();uu();zn();Kf();us=Fx(Ox);l(Xf,"analyzeGit");l(rn,"fileExists");l(Qf,"gatherStats");l(Zf,"detectCommands");l(eh,"buildSources");l(th,"detectStack")});import{exec as _x}from"node:child_process";import vu from"node:fs/promises";import da from"node:path";import{promisify as Nx}from"node:util";var Lx,xu,Tu,sh,rh=y(()=>{"use strict";Bt();N();Lx=Nx(_x),xu={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=da.join(s,r);try{await vu.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=da.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=da.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 vu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await vu.readFile(da.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}}},Tu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[xu.contextFilesExist(t),xu.jsonFilesValid(t),xu.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 Lx(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}}}},sh=new Tu});import pa from"node:fs/promises";import ma from"node:path";var ga,ds,Eu=y(()=>{"use strict";Fs();cf();ff();wf();Cf();iu();ln();An();Ke();be();Ii();vn();we();Dr();Vr();ji();Rr();$r();Or();Af();ue();zn();Cl();Pl();Rf();cl();Vf();nh();rh();ga=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 la(e)).filter(i=>!lo.includes(i));r=[...lo,...o]}else t.aiTools[0]==="auto"?(r=await la(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Tf("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 Jr(this.projectId);try{let _=await Ai(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([Xf(this.projectPath),Qf(this.projectPath),Zf(this.projectPath),th(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&yf(this.projectId))try{let{diff:_,currentHashes:fs}=await lu(this.projectPath,this.projectId),bo=_.added.length+_.modified.length+_.deleted.length;if(bo===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Fa=mf(_,this.projectId);f=gf(Fa.allAffected);let Oy=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=Fa.allAffected.some(Ln=>{let Fy=Ln.substring(Ln.lastIndexOf("."));return Oy.has(Fy)}),g=Fa.directlyChanged.some(Ln=>Ln==="package.json"||Ln==="tsconfig.json"||Ln.includes("Dockerfile")||Ln.includes("docker-compose")),m={isIncremental:!0,filesChanged:bo,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}cu(this.projectId,fs)}catch(_){U.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await lu(this.projectPath,this.projectId);cu(this.projectId,_)}catch(_){U.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([af(this.projectPath,this.projectId),pf(this.projectPath,this.projectId),bf(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 Hf(this.globalPath,u,a,k):await Gf(this.globalPath),D=Wf(b,this.projectId,this.globalPath),v=g?await Bf(b):[],$=eh(a,c),F=[],H;try{let _=await Ct.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 Ef(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 Ae.installGlobalConfig(),await Ae.syncCommands();let Je;try{let _=await R.readConfig(this.projectPath);Je=await sh.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:Je,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=>pa.mkdir(ma.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 Df.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=ma.join(this.globalPath,m),g=await pa.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=ma.join(this.globalPath,"agents",`${m.name}.md`),g=await pa.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 Ct.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([mt.archiveOldShipped(this.projectId).catch(()=>0),Ze.markDormantIdeas(this.projectId).catch(()=>0),Ee.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),gt.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=St.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 Kn,n=await bl.learnFromTaskHistory(this.projectId,e,t);try{let r=await Gm.getFeatureOutcomes(this.projectId);r.length>0&&await bl.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=ma.join(__dirname,"..","..","package.json");return JSON.parse(await pa.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:[]}}},ds=new ga});var On=y(()=>{"use strict";um();wm();km();Pm();xm();ol();Em();cl();Im();Am();nf();sf();Eu()});import fn from"chalk";function oh(s){return Math.ceil(s.length/Ux)}function ih(s){let e=s.split(`
963
1006
  `),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(`
1007
+ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Iu(s){return s.includes("<!-- prjct:preserve")}function ah(s,e){let t=ih(s),n=ih(e),r={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:oh(s),tokensAfter:oh(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)Iu(a.content)&&r.preserved.push({name:a.name,lineCount:a.content.split(`
1008
+ `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Iu(u.content)||(r.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
966
1009
  `).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(`
1010
+ `).length}),r.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Iu(a.content)&&(r.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1011
+ `).length}),r.hasChanges=!0)}return r}function ch(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
1012
  `);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(`
1013
+ `)}function lh(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
1014
  `))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(`
972
1015
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
973
1016
  `).length>5&&n.push(a(` ... ${c.before.split(`
@@ -978,11 +1021,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xu(s){return s.incl
978
1021
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
979
1022
  `).length>5&&n.push(a(` ... ${c.before.split(`
980
1023
  `).length-5} more lines`))}n.push("")}return n.join(`
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
1024
+ `)}var Ux,uh=y(()=>{"use strict";Ux=4;l(oh,"estimateTokens");l(ih,"parseMarkdownSections");l(Iu,"isPreservedSection");l(ah,"generateSyncDiff");l(ch,"formatDiffPreview");l(lh,"formatFullDiff")});import Hx from"node:path";async function Au(s,e){let t=Date.now()-e,n=s.contextFiles.length+(s.aiTools?.filter(p=>p.success).length||0),r=s.agents.length,o=s.agents.filter(p=>p.type==="domain").length;await Ae.installGlobalConfig(),h.done(`Synced ${s.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=s.syncMetrics?.compressionRate?Math.round(s.syncMetrics.compressionRate*100):0,a=s.stats.frameworks.length>0?` (${s.stats.frameworks[0]})`:"",c=[`${s.stats.fileCount} files \u2192 ${n} context | ${r} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${s.stats.ecosystem}${a} | Branch: ${s.git.branch}`];h.box("Sync Summary",c.join(`
1025
+ `));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 Pt("sync"),{success:!0,data:s,metrics:{elapsed:t,contextFilesCount:n,agentCount:r,fileCount:s.stats.fileCount}}}async function dh(s){try{let e=await gt.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 fo(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function ju(s){return s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(1)}s`}function ph(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 mh(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 | ${fo(s.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(s.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ui(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 | ${ju(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: ${fo(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(`
1026
+ `)}function gh(s,e){let t=[];t.push(`# Repository Analysis
984
1027
  `),t.push(`Generated: ${new Date().toLocaleString()}
985
- `);let n=Fx.basename(e);if(t.push(`## Project: ${n}
1028
+ `);let n=Hx.basename(e);if(t.push(`## Project: ${n}
986
1029
  `),t.push(`## Stack Detected
987
1030
  `),s.packageJson){let i=s.packageJson;if(t.push(`### JavaScript/TypeScript
988
1031
  `),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
@@ -998,22 +1041,22 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xu(s){return s.incl
998
1041
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
999
1042
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1000
1043
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
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!
1044
+ `)}var fh=y(()=>{"use strict";An();di();On();Hs();Gt();it();l(Au,"showSyncResult");l(dh,"getSessionActivity");l(fo,"formatTokens");l(ju,"formatDuration");l(ph,"generateSparkline");l(mh,"generateStatsMarkdown");l(gh,"generateAnalysisSummary")});var tf={};ye(tf,{AnalysisCommands:()=>ms});import Du from"node:fs/promises";import hh from"node:path";import*as ps from"@clack/prompts";var ms,na=y(()=>{"use strict";Fs();Zp();An();di();On();uh();Ii();we();Vr();N();Us();Hs();Gt();fh();it();ms=class extends Pe{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1045
+ `),Xe.init(t);let n=await ht.build(t,e),r={packageJson:await Xe.readPackageJson(),cargoToml:await Xe.readCargoToml(),goMod:await Xe.readGoMod(),requirements:await Xe.readRequirements(),directories:await Xe.listDirectories(),fileCount:await Xe.countFiles(),gitStats:await Xe.getGitStats(),gitLog:await Xe.getGitLog(20),hasDockerfile:await Xe.fileExists("Dockerfile"),hasDockerCompose:await Xe.fileExists("docker-compose.yml"),hasReadme:await Xe.fileExists("README.md"),hasTsconfig:await Xe.fileExists("tsconfig.json"),hasViteConfig:await Xe.fileExists("vite.config.ts")||await Xe.fileExists("vite.config.js"),hasNextConfig:await Xe.fileExists("next.config.js")||await Xe.fileExists("next.config.mjs")},o=gh(r,t),i=await R.getProjectId(t),a=n.paths.analysis||I.getFilePath(i,"analysis","repo-summary.md");await Qe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:B.getTimestamp(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits});let u=await(qe(),Tt(pt)).getActiveProvider(),d=await Ae.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${I.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1003
1046
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
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(`
1047
+ `),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 ds.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(Ce(tn(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=hh.join(o,"context","CLAUDE.md"),c=null;try{c=await Du.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 ds.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ce("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await Du.readFile(a,"utf-8")}catch{p=""}let g=ah(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(Ce(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 Du.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=Ce("## \u26A1 Sync Preview",b.length>0?ot("Changes",jt(b)):"No section changes.",Dt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(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(ch(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await ps.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(ps.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
1048
+ ${lh(g)}`);let b=await ps.confirm({message:"Apply these changes?",initialValue:!0});if(ps.isCancel(b)||!b)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),Au(m,i)}t.md||h.spin("Syncing project...");let d=await ds.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ce("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Di("sync"),k=Ce(tn("Sync Complete"),Dt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),d.git.hasChanges?Fm("Uncommitted changes detected"):null,tt(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 Au(d,i)}catch(n){return t.md?console.log(Ce("## \u274C 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 dh(r),c=await Ie.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: ${fo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ui(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${ju(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=ph(i);if(console.log(` ${p} ${fo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=mh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",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=oo(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await Ct.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=hh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ce(`## \u26A1 Status: ${u}`,Dt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?ot("Analysis",jt(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),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 Ct.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 Ct.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 Ct.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 fa,z,Bs=y(()=>{"use strict";Ke();be();N();ue();fa=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 fa});import Gx from"node:path";var Vs,Ru=y(()=>{"use strict";On();Bt();N();Us();it();Bs();Vs=class extends Pe{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=Gx.basename(t),a=await L.getCurrentTask(o),c=await Ee.getActiveTasks(o),u=await mt.getRecent(o,5),d=await Ze.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(`
1006
1049
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1007
1050
  `),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
1051
  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(`
1052
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ht.build(t),p=await Qe.get("Read")(m.paths.roadmap);if(console.log(`
1010
1053
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1011
1054
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1012
1055
  `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let b=f.split(`
1013
1056
  `)[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(`
1057
+ `),{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=Ce(`## \u26A1 Dashboard: ${i}`,ot("Current Focus",m),ot(`Queue (${c.length})`,jt(p,!0)),ot("Recent Ships",jt(g)),ot("Ideas",`${d.length} pending`),tt([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1015
1058
  \u{1F4CA} DASHBOARD - ${i}
1016
- `),console.log("\u2550".repeat(50));let m=so(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1059
+ `),console.log("\u2550".repeat(50));let m=oo(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1017
1060
  ${g}`),console.log(`
1018
1061
  \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(`
1019
1062
  \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(`
@@ -1035,7 +1078,7 @@ ${"\u2550".repeat(50)}
1035
1078
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1036
1079
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1037
1080
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
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}
1081
+ `),{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 zx from"node:fs/promises";import Wx from"node:path";var gs,iz,$u=y(()=>{"use strict";Hl();Ke();be();Bt();N();gs=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 Vi.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=Wx.join(e,"analysis","repo-analysis.json"),n=await zx.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}}},iz=new gs});async function ha(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 ya(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 Mu(s={},e=process.cwd()){try{if(s.memory===!0||s.type==="memory"){h.spin("cleaning memory...");let a=await ha(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 Ze.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 Ee.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 ya(e),await gt.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 Ou=y(()=>{"use strict";On();Bt();we();N();it();l(ha,"cleanupMemory");l(ya,"cleanupMemoryInternal");l(Mu,"cleanup")});import yh from"node:path";async function Fu(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=yh.join(I.getGlobalProjectPath(i),"planning","designs");await le.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1039
1082
 
1040
1083
  *Use templates/design/architecture.md for full design*
1041
1084
  `;break;case"api":c=`# API Design: ${o}
@@ -1050,12 +1093,12 @@ ${"\u2550".repeat(50)}
1050
1093
  `;break;case"flow":c=`# Flow Design: ${o}
1051
1094
 
1052
1095
  *Use templates/design/flow.md for full design*
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(`
1096
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=yh.join(a,u);return await le.writeFile(d,c),await gt.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 _u=y(()=>{"use strict";On();N();it();l(Fu,"design")});import Js from"node:path";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"};h.spin("checking for abandoned sessions...");let t=I.getFilePath(e,"progress","sessions/current.json"),n=null;try{let r=await le.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(`
1054
1097
  Found abandoned session:
1055
1098
  `),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(`
1056
1099
  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
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(`
1100
+ `),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Lu(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=Js.join(I.getGlobalProjectPath(e),"snapshots");await le.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=Js.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await le.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 le.writeFile(a,JSON.stringify(c,null,2)),await gt.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 Uu(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=Js.join(I.getGlobalProjectPath(e),"snapshots"),n=Js.join(t,"history.json"),r;try{let i=await le.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(`
1101
+ `).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 le.writeFile(n,JSON.stringify(r,null,2)),await gt.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 Hu(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=Js.join(I.getGlobalProjectPath(e),"snapshots"),n=Js.join(t,"history.json"),r;try{let o=await le.readFile(n);r=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1059
1102
  SNAPSHOT HISTORY
1060
1103
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1061
1104
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1063,32 +1106,32 @@ ${"\u2550".repeat(50)}
1063
1106
  `),console.log("=".repeat(50)),r.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1064
1107
  `)):(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
1065
1108
  `)),console.log(`${"=".repeat(50)}
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(`
1067
- ${je.dim("No performance data yet.")}`),console.log(`${je.dim("Metrics are collected automatically as you use the CLI.")}
1109
+ `),{success:!0,snapshots:r.snapshots,current:r.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Gu=y(()=>{"use strict";On();N();it();l(Nu,"recover");l(Lu,"undo");l(Uu,"redo");l(Hu,"history")});var qs,zu=y(()=>{"use strict";it();Ou();_u();Gu();Ou();_u();Gu();qs=class extends Pe{static{l(this,"MaintenanceCommands")}_cleanupMemory=ha;_cleanupMemoryInternal=ya;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Mu(e,t):n}async design(e=null,t={},n=process.cwd()){let r=await this.ensureProjectInit(n);return r.success?Fu(e,t,n):r}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Lu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Uu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Hu(e):t}}});import De from"chalk";function wa(s,e,t){return t==="below"?s<=e?De.green("\u2713"):De.yellow("\u26A0"):s>=e?De.green("\u2713"):De.yellow("\u26A0")}var Fn,Ks,Wu=y(()=>{"use strict";ii();N();it();Fn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(wa,"statusIcon");Ks=class extends Pe{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 Jn.getReport(r,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1110
+ ${De.dim("No performance data yet.")}`),console.log(`${De.dim("Metrics are collected automatically as you use the CLI.")}
1068
1111
  `),{success:!0,message:"No data"};if(console.log(`
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}...
1071
- `),!(await Ee.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1112
+ ${De.cyan("Performance Report")} ${De.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=wa(i.startup.avg,Fn.startup.max,"below");console.log(` Startup: avg ${De.bold(`${i.startup.avg}ms`)} ${De.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${De.dim(`target: <${Fn.startup.max}ms`)}`)}if(i.memory){let c=wa(i.memory.peakHeapMB,Fn.heapMB.max,"below");console.log(` Memory: avg ${De.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${De.dim(`target: <${Fn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=wa(i.contextCorrectness.rate,Fn.contextRate.min,"above");console.log(` Context: ${De.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${De.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${De.dim(`target: ${Fn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=wa(i.subtaskHandoff.rate,Fn.handoffRate.min,"above");console.log(` Handoff: ${De.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${De.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${De.dim(`target: ${Fn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1113
+ ${De.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${De.bold(`${u.avg}ms`)} ${De.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 Bu from"node:fs/promises";import Bx from"node:path";import ce from"chalk";var Ys,Vu=y(()=>{"use strict";An();be();N();Te();ct();it();Ys=class extends Pe{static{l(this,"SetupCommands")}async start(){let t=await(qe(),Tt(pt)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1114
+ `),!(await Ae.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1072
1115
 
1073
1116
  Please install it first:
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(`
1117
+ - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let r=await Ae.installCommands();if(!r.success)return{success:!1,message:`\u274C Installation failed: ${r.error}`};if(console.log(`
1075
1118
  \u2705 Installed ${r.installed?.length??0} commands to:
1076
1119
  ${I.getDisplayPath(r.path||"")}`),(r.errors?.length??0)>0){console.log(`
1077
1120
  \u26A0\uFE0F ${r.errors?.length??0} errors:`);for(let o of r.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1078
1121
  \u{1F389} Setup complete!`),console.log(`
1079
1122
  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...
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(`
1123
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ae.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ae.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1081
1124
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1082
1125
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}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(`
1126
+ \u{1F4DD} Installing global configuration...`);let n=await Ae.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(qe(),Tt(pt)).getActiveProvider()).name==="claude"){console.log(`
1084
1127
  \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(`
1085
1128
  \u{1F389} Setup complete!
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
1129
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=I.getClaudeDir(),t=I.getClaudeSettingsPath(),n=Bx.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
1087
1130
  # prjct Status Line for Claude Code
1088
1131
  # Shows version update notifications and current task
1089
1132
 
1090
1133
  # Current CLI version (embedded at install time)
1091
- CLI_VERSION="${Pe}"
1134
+ CLI_VERSION="${xe}"
1092
1135
 
1093
1136
  # Read JSON context from stdin (provided by Claude Code)
1094
1137
  read -r json
@@ -1139,16 +1182,16 @@ fi
1139
1182
 
1140
1183
  # Default: show prjct branding
1141
1184
  echo "\u26A1 prjct"
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)}
1185
+ `;await Bu.writeFile(n,r,{mode:493});let o={};if(await x(t))try{o=JSON.parse(await Bu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Bu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ce.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(ce.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(ce.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(ce.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(ce.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(ce.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(ce.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(` ${ce.bold.cyan("prjct")}${ce.magenta("/")}${ce.green("cli")} ${ce.dim.white(`v${xe} installed`)}`),console.log(""),console.log(` ${ce.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ce.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ce.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ce.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(ce.bold.cyan("\u{1F680} Quick Start")),console.log(ce.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(` ${ce.bold("1.")} Initialize your project:`),console.log(` ${ce.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ce.bold("2.")} Start your first task:`),console.log(` ${ce.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ce.bold("3.")} Ship & celebrate:`),console.log(` ${ce.green('prjct ship "user login"')}`),console.log(""),console.log(ce.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(` ${ce.dim("Documentation:")} ${ce.cyan("https://prjct.app")}`),console.log(` ${ce.dim("Report issues:")} ${ce.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ce.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import yt from"node:path";async function Vx(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(yt.join(s,"pnpm-lock.yaml"))?"pnpm":await x(yt.join(s,"yarn.lock"))?"yarn":await x(yt.join(s,"bun.lockb"))||await x(yt.join(s,"bun.lock"))?"bun":(await x(yt.join(s,"package-lock.json")),"npm")}function wh(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function Jx(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function Ju(s){let e=yt.join(s,"package.json"),t=await Un(e,null);if(t){let o=await Vx(s,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:wh(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:wh(o,"typecheck")}),i.test&&(a.test={tool:o,command:Jx(o)}),a}if(await x(yt.join(s,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Ss(yt.join(s,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await x(yt.join(s,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await x(yt.join(s,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await bs(s)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await x(yt.join(s,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await x(yt.join(s,"gradlew"))&&(await x(yt.join(s,"build.gradle"))||await x(yt.join(s,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var kh=y(()=>{"use strict";Te();l(Vx,"detectPackageManager");l(wh,"pmRun");l(Jx,"pmTest");l(Ju,"detectProjectCommands")});import{exec as qx}from"node:child_process";import{promisify as Kx}from"node:util";import qt from"chalk";function ho(s,e){return`workflow:${s}_${e}`}async function Sh(s,e){let t=ho(e.hook,e.command);switch(e.scope){case"permanent":await Ie.recordDecision(s,t,e.action,"workflow");break;case"session":ka.set(t,e);break;case"once":Xs.set(t,e);break}}async function Xx(s,e){let t={};for(let n of["before","after","skip"]){let r=ho(n,e),o=Xs.get(r);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ka.get(r);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Ie.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 Xx(s,t);if(r.skip)return{success:!0,skipped:[t]};let o=r[e];if(!o)return{success:!0};let i=ho(e,t);Xs.has(i)&&Xs.delete(i),console.log(`
1186
+ ${qt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await Yx(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(`
1187
+ `)[0])),{success:!1,failed:o,output:c}}}async function qu(s){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let r of t)for(let o of n){let i=ho(o,r),a=Xs.get(i);if(a){e.push({key:`${o} ${r}`,action:a.action,scope:"once"});continue}let c=ka.get(i);if(c){e.push({key:`${o} ${r}`,action:c.action,scope:"session"});continue}let u=await Ie.getSmartDecision(s,i);u&&e.push({key:`${o} ${r}`,action:u,scope:"permanent"})}return e}async function bh(s,e,t){let n=ho(e,t);return Xs.delete(n),ka.delete(n),await Ie.recordDecision(s,n,"","workflow:remove"),!0}function Ch(s){if(s.length===0)return`${qt.dim(jr.NO_PREFERENCES)}
1145
1188
 
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}
1189
+ Set one: "${jr.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: "${jr.MODIFY_EXAMPLE}"`)),e.push(qt.dim(`Remove: "${jr.REMOVE_EXAMPLE}"`)),e.join(`
1190
+ `)}var Yx,ka,Xs,Ku=y(()=>{"use strict";Fs();N();un();Yx=Kx(qx),ka=new Map,Xs=new Map;l(ho,"prefKey");l(Sh,"setWorkflowPreference");l(Xx,"getWorkflowPreferences");l(hn,"runWorkflowHooks");l(qu,"listWorkflowPreferences");l(bh,"removeWorkflowPreference");l(Ch,"formatWorkflowPreferences")});import Ph from"node:path";var Qs,Yu=y(()=>{"use strict";Fs();Bt();N();Us();Hs();kh();Ku();it();Qs=class extends Pe{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Qe.get("Bash"),r=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(r),i=`${o.stdout}
1148
1191
  ${o.stderr}`.trim(),a=i.split(`
1149
1192
  `),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(`
1150
1193
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
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
1194
+ `).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 mt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:B.getTimestamp()}),await Ie.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Ie.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Ie.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=Di("ship"),k=Ce(tn(`Shipped: ${i}`,`Version: ${d}`),ot("Results",jt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`])),tt(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(k)}else h.done(`v${d} shipped`),Pt("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 Ju(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 Ju(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=Ph.join(e,"package.json"),n=await le.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 le.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=Ph.join(n,"CHANGELOG.md"),o=await le.readFile(r,`# Changelog
1152
1195
 
1153
1196
  `),i=`## [${t}] - ${B.formatDate(new Date)}
1154
1197
 
@@ -1159,46 +1202,46 @@ ${o.stderr}`.trim(),a=i.split(`
1159
1202
 
1160
1203
  `,`# Changelog
1161
1204
 
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}
1205
+ ${i}`);await le.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 Qe.get("Bash")("git add .");let n=`feat: ${e}
1163
1206
 
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(`
1166
- ${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
1167
- `),{success:!0,message:"No data"};let a=_i(i,o);await pl.saveMetrics(r,a),console.log(`
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(`
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
1207
+ Generated with [p/](https://www.prjct.app/)`;return await Qe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Qe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import Qx from"node:fs/promises";import Zx from"node:path";import Zs from"chalk";var er,Xu=y(()=>{"use strict";Ke();be();ji();N();Gt();it();er=class extends Pe{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(Zs.dim(`[dry-run] Would update ${o.length} project(s)
1208
+ `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Zs.dim("would update")} ${m}`);continue}try{let p=await Jr(d),g=await Ai(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Zs.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Zs.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Zs.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Zs.red("\u2717")} ${m}: ${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=Zx.join(I.getGlobalBasePath(),"projects");try{return(await Qx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import Re from"chalk";var tr,Qu=y(()=>{"use strict";$l();Es();hl();N();es();it();tr=class extends Pe{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 ft.getAll(r);if(i.length===0)return console.log(`
1209
+ ${Re.dim("No velocity data yet.")}`),console.log(`${Re.dim("Complete tasks with estimates to build velocity history.")}
1210
+ `),{success:!0,message:"No data"};let a=Ui(i,o);await fl.saveMetrics(r,a),console.log(`
1211
+ ${Re.cyan("Sprint Velocity")} ${Re.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?Re.green:m.estimationAccuracy>=60?Re.yellow:Re.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Re.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Re.green("\u2191"):a.velocityTrend==="declining"?Re.red("\u2193"):Re.dim("\u2192");if(console.log(` Average: ${Re.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Re.bold(`${a.estimationAccuracy}%`)} ${Re.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1212
+ ${Re.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Re.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Re.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Re.green("\u2713")} ${m.category} tasks estimated within ${Re.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=dg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1213
+ ${Re.dim("Projection:")}`),console.log(` Backlog: ${Re.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Re.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(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 eT,tT,xh,Sa,vh,Th,Eh=y(()=>{"use strict";es();eT=[1,2,3,5,8,13,21],tT={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}},xh=l(s=>eT.includes(s),"isValidPoint"),Sa=l(s=>tT[s],"pointsToMinutes"),vh=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"),Th=l(s=>{let e=Sa(s);return`${vh(e.min)}\u2013${vh(e.max)}`},"pointsToTimeRange")});function Zu(){st.clear(),Kt.clear(),nr.clear(),sr.clear()}function ed(){return{issues:st.stats(),assignedIssues:Kt.stats(),teams:nr.stats(),projects:sr.stats()}}var ba,st,Kt,nr,sr,td=y(()=>{"use strict";Zo();ba=300*1e3,st=new Ut({ttl:ba,maxSize:100}),Kt=new Ut({ttl:ba,maxSize:10}),nr=new Ut({ttl:ba,maxSize:5}),sr=new Ut({ttl:ba,maxSize:5});l(Zu,"clearLinearCache");l(ed,"getLinearCacheStats")});import{exec as nT}from"node:child_process";import{promisify as sT}from"node:util";async function Ca(s){if(process.platform!=="darwin")return Ih(s);try{let{stdout:e}=await rT(`security find-generic-password -s "${oT}" -a "${s}" -w 2>/dev/null`);return e.trim()||null}catch{return Ih(s)}}function Ih(s){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[s];return process.env[t]||null}var rT,oT,nd=y(()=>{"use strict";N();rT=sT(nT),oT="prjct-cli";l(Ca,"getCredential");l(Ih,"getEnvFallback")});var iT,aT,Ah,Pa,wt,sd=y(()=>{"use strict";N();nd();iT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},aT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Ah={none:0,urgent:1,high:2,medium:3,low:4},Pa=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 Ca("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?Ah[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=Ah[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:iT[t?.type||"backlog"]||"backlog",priority:aT[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):[]}},wt=new Pa});var va,Ot,rd=y(()=>{"use strict";td();sd();va=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&wt.isConfigured()}async initialize(e){this.initialized||(await wt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Kt.get(t);if(n)return n;let r=await wt.fetchAssignedIssues(e);Kt.set(t,r);for(let o of r)st.set(`issue:${o.id}`,o),st.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 wt.fetchTeamIssues(e,t);Kt.set(n,o);for(let i of o)st.set(`issue:${i.id}`,i),st.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=st.get(t);if(n)return n;let r=await wt.fetchIssue(e);return r&&(st.set(`issue:${r.id}`,r),st.set(`issue:${r.externalId}`,r)),r}async createIssue(e){this.ensureInitialized();let t=await wt.createIssue(e);return st.set(`issue:${t.id}`,t),st.set(`issue:${t.externalId}`,t),Kt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await wt.updateIssue(e,t);return st.set(`issue:${n.id}`,n),st.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await wt.markInProgress(e),st.delete(`issue:${e}`),Kt.clear()}async markDone(e){this.ensureInitialized(),await wt.markDone(e),st.delete(`issue:${e}`),Kt.clear()}async addComment(e,t){this.ensureInitialized(),await wt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=nr.get("teams");if(e)return e;let t=await wt.getTeams();return nr.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=sr.get("projects");if(e)return e;let t=await wt.getProjects();return sr.set("projects",t),t}clearCache(){Zu()}getCacheStats(){return ed()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ot=new va});var jh,xa,cT,Dh=y(()=>{"use strict";dc();we();N();rd();jh=1800*1e3,xa=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:jh,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||jh;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=Zd("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}}},cT=new xa});var Rh=y(()=>{"use strict";td();sd();rd();Dh()});import lT from"node:fs/promises";import uT from"node:os";import dT from"node:path";function pT(s){return dT.join(uT.homedir(),".prjct-cli","projects",s,"config","credentials.json")}async function Ta(s){let e=pT(s);if(!await x(e))return{};try{return JSON.parse(await lT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function od(s){let e=await Ta(s);return e.linear?.apiKey?e.linear.apiKey:Ca("linear-api-key")}var $h=y(()=>{"use strict";N();Te();nd();l(pT,"getCredentialsPath");l(Ta,"getProjectCredentials");l(od,"getLinearApiKey")});import mT from"node:fs/promises";import gT from"node:path";function Mh(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 fT(){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 hT(s){try{let e=gT.join(s,"analysis","repo-analysis.json"),t=await mT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}function yT(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=Dt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
1214
+ ${jt(g)}`}return[u?`### Project
1172
1215
  ${u}`:null,m].filter(Boolean).join(`
1173
1216
 
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)
1217
+ `)||null}function wT(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 Om(e)}function kT(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
1218
  ${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)
1219
+ `)}`)}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
1220
  ${r.join(`
1178
1221
  `)}`)}return e.length>0?e.join(`
1179
1222
 
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,`
1223
+ `):null}function ST(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 rr,id=y(()=>{"use strict";eu();Yl();Eh();be();Rh();Lt();Bt();Gi();N();Us();Hs();$h();Ku();es();it();rr=class extends Pe{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 Ta(o),k=await od(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:fe(),description:c,sessionId:fe(),linearId:a});let k=I.getGlobalProjectPath(o),[b,D,v,$]=await Promise.all([fT(),Ct.getActive(o).catch(()=>null),hT(k),ts(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=wl({description:c,branch:b,linearId:a}),H=yT(D,v),ee=Mm($.files.map(Je=>({path:Je.path,description:Je.reasons.join(", ")}))),S=wT(v),j=kT(D),te=tt([{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(Ce(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 Zi.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:fe(),description:c,sessionId:fe(),linearId:a});let m=await Kl.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}),Kr("working"),Pt("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:xh,pointsToMinutes:Sa,pointsToTimeRange:Th,storeEstimate:l(async f=>{let k=Sa(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=wl({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?$m(u,d):"",p=tt([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ce(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 ft.record(r,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Mh(d):"0m",actualDuration:c||"0m",variance:d?ST(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 (${Mh(d)}) \u2192 ${b}${k}%`}await L.completeTask(r,t.feedback);let g=o.linearId;if(g)try{let f=await Ta(r),k=await od(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(Ce(tn("Completed",`${a}${f}`),Dt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),tt([{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}`),Kr("completed"),Pt("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 Ee.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(Ce(ot("Queue",`${o.length} task${o.length!==1?"s":""}`),jt(i,!0),tt([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),Pt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(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(Ce(tn("Task Paused",`**Paused:** ${i.description}`),Dt({Reason:e||void 0,"Duration worked":a||void 0}),tt([{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})`:""}`),Kr("paused"),Pt("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(Ce(tn("Task Resumed",`**Resumed:** ${a.description}`),tt([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Kr("working"),Pt("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 qu(r);return console.log(Ch(o)),{success:!0,preferences:o}}return{success:!0,projectId:r,input:e,setWorkflowPreference:l(async o=>{await Sh(r,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await bh(r,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>qu(r),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Mh,"formatMinutesToDuration");l(fT,"getGitBranch");l(hT,"loadRepoAnalysis");l(yT,"buildProjectContext");l(wT,"buildRules");l(kT,"buildPatterns");l(ST,"formatVariance")});var yn,nV,Oh=y(()=>{"use strict";na();Ru();$u();zu();Wu();ta();Vu();Yu();Xu();Qu();id();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 rr,this.planning=new cs,this.shipping=new Qs,this.analytics=new Vs,this.performanceCmds=new Ks,this.maintenance=new qs,this.analysis=new ms,this.setupCmds=new Ys,this.updateCmds=new er,this.velocityCmds=new tr,this.contextCmds=new gs,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)}},nV=new yn});var yo,or,ad=y(()=>{"use strict";yo={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}},or=[{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 Lh={};ye(Lh,{UninstallCommands:()=>ko,uninstall:()=>Nh});import{execSync as Ea}from"node:child_process";import kt from"node:fs/promises";import bT from"node:os";import wn from"node:path";import CT from"node:readline";import ve from"chalk";async function cd(s){let e=0;try{let t=await kt.readdir(s,{withFileTypes:!0});for(let n of t){let r=wn.join(s,n.name);if(n.isDirectory())e+=await cd(r);else try{let o=await kt.stat(r);e+=o.size}catch{}}}catch{}return e}function Fh(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 PT(s){try{return(await kt.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function vT(){let s={homebrew:!1,npm:!1};try{Ea("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{Ea("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}async function xT(){let s=[],e=nm(),t=I.getGlobalBasePath(),n=await x(t),r=n?await PT(wn.join(t,"projects")):0,o=n?await cd(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 kt.readFile(i,"utf-8");c=H.includes(Ia)&&H.includes(wo)}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 cd(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 kt.readFile(v,"utf-8");F=H.includes(Ia)&&H.includes(wo)}catch{}return $&&F&&s.push({path:v,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}async function TT(s){try{let e=await kt.readFile(s,"utf-8");if(!e.includes(Ia)||!e.includes(wo))return!1;let t=e.indexOf(Ia),n=e.indexOf(wo)+wo.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
1181
1224
 
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(`
1225
+ `).trim(),!r||r.trim().length===0?await kt.unlink(s):await kt.writeFile(s,`${r}
1226
+ `,"utf-8"),!0}catch{return!1}}async function ET(){let s=bT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=wn.join(s,`.prjct-backup-${e}`);try{await kt.mkdir(t,{recursive:!0});let n=I.getGlobalBasePath();return await x(n)&&await _h(n,wn.join(t,".prjct-cli")),t}catch{return null}}async function _h(s,e){await kt.mkdir(e,{recursive:!0});let t=await kt.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 _h(r,o):await kt.copyFile(r,o)}}async function IT(s,e,t){let n=[],r=[];for(let o of s)if(o.exists)try{o.type==="section"?await TT(o.path)&&n.push(o.path):o.type==="directory"?(await kt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await kt.unlink(o.path),n.push(o.path))}catch(i){r.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ea(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||Ea("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 AT(s){let e=CT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(s,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Nh(s={},e=process.cwd()){let t=await xT(),n=vT(),r=t.filter(c=>c.exists);if(r.length===0&&!n.homebrew&&!n.npm)return console.log(ve.yellow(`
1227
+ 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(ve.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ve.white("The following will be permanently deleted:")),console.log("");for(let c of r){let u=I.getDisplayPath(c.path),d="";c.type==="section"?d=ve.dim("(section only)"):c.size&&(d=ve.dim(`(${Fh(c.size)})`)),console.log(` ${ve.cyan(u.padEnd(35))} ${d}`),console.log(` ${ve.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ve.cyan("Homebrew".padEnd(35))} ${ve.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ve.cyan("npm global".padEnd(35))} ${ve.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ve.dim(` Total size: ${Fh(o)}`)),console.log("")),s.dryRun)return console.log(ve.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(s.backup){console.log(ve.blue("Creating backup..."));let c=await ET();c?(console.log(ve.green(`Backup created: ${I.getDisplayPath(c)}`)),console.log("")):console.log(ve.yellow("Failed to create backup, continuing..."))}if(!s.force&&(console.log(ve.yellow('Type "uninstall" to confirm:')),!await AT("> ")))return console.log(ve.yellow(`
1228
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ve.blue("Removing prjct..."));let{deleted:i,errors:a}=await IT(t,n,s);if(console.log(""),i.length>0&&console.log(ve.green(`Removed ${i.length} items`)),a.length>0){console.log(ve.yellow(`
1229
+ ${a.length} errors:`));for(let c of a)console.log(ve.red(` - ${c}`))}return console.log(""),console.log(ve.green("prjct has been uninstalled.")),console.log(ve.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Ia,wo,ko,ld=y(()=>{"use strict";An();be();N();Te();it();Ia="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",wo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(cd,"getDirectorySize");l(Fh,"formatSize");l(PT,"countDirectoryItems");l(vT,"detectInstallation");l(xT,"gatherUninstallItems");l(TT,"removePrjctSection");l(ET,"createBackup");l(_h,"copyDirectory");l(IT,"performUninstall");l(AT,"promptConfirmation");l(Nh,"uninstall");ko=class extends Pe{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Nh(e,t)}}});function FT(){for(let[s,e]of Object.entries(yo))z.registerCategory(s,e)}function Gh(){if(z.has("work"))return;FT();let s=l(e=>or.find(t=>t.name===e),"getMeta");z.registerMethod("task",ir,"now",s("task")),z.registerMethod("done",ir,"done",s("done")),z.registerMethod("next",ir,"next",s("next")),z.registerMethod("pause",ir,"pause",s("pause")),z.registerMethod("resume",ir,"resume",s("resume")),z.registerMethod("workflow",ir,"workflow",s("workflow")),z.registerMethod("init",Aa,"init",s("init")),z.registerMethod("bug",Aa,"bug",s("bug")),z.registerMethod("idea",Aa,"idea",s("idea")),z.registerMethod("spec",Aa,"spec",s("spec")),z.registerMethod("ship",jT,"ship",s("ship")),z.registerMethod("dash",Uh,"dash",s("dash")),z.registerMethod("help",Uh,"help",s("help")),z.registerMethod("perf",DT,"perf",s("perf")),z.registerMethod("velocity",$T,"velocity",s("velocity")),z.registerMethod("cleanup",ar,"cleanup",s("cleanup")),z.registerMethod("design",ar,"design",s("design")),z.registerMethod("recover",ar,"recover",s("recover")),z.registerMethod("undo",ar,"undo",s("undo")),z.registerMethod("redo",ar,"redo",s("redo")),z.registerMethod("history",ar,"history",s("history")),z.registerMethod("analyze",cr,"analyze",s("analyze")),z.registerMethod("sync",cr,"sync",s("sync")),z.registerMethod("stats",cr,"stats",s("stats")),z.registerMethod("status",cr,"status",s("status")),z.registerMethod("seal",cr,"seal",s("seal")),z.registerMethod("verify",cr,"verify",s("verify")),z.registerMethod("start",Hh,"start",s("start")),z.registerMethod("setup",Hh,"setup",s("setup")),z.registerMethod("uninstall",MT,"uninstall",s("uninstall")),z.registerMethod("update",OT,"update",s("update")),z.registerMethod("context",RT,"context",s("context"))}var ir,Aa,jT,Uh,DT,ar,cr,Hh,RT,$T,MT,OT,ja=y(()=>{"use strict";na();Ru();ad();$u();zu();Wu();ta();Bs();Vu();Yu();ld();Xu();Qu();id();ir=new rr,Aa=new cs,jT=new Qs,Uh=new Vs,DT=new Ks,ar=new qs,cr=new ms,Hh=new Ys,RT=new gs,$T=new tr,MT=new ko,OT=new er;l(FT,"registerCategories");l(Gh,"registerAllCommands");Gh()});var ud=y(()=>{"use strict";kc();Oh();ja();Bs()});var Wh={};ye(Wh,{shutdown:()=>ur,startDaemon:()=>NT});import Ft from"node:fs";import{createServer as _T}from"node:net";async function NT(s){let e=Ge.socket(),t=Ge.pid(),n=Ge.runDir();if(Ft.mkdirSync(n,{recursive:!0}),Ft.existsSync(t)){let r=parseInt(Ft.readFileSync(t,"utf-8").trim(),10);zT(r)&&(console.error(`Daemon already running (PID ${r})`),process.exit(1)),Ft.unlinkSync(t)}if(Ft.existsSync(e)&&Ft.unlinkSync(e),Ve={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:_a,idleTimer:null},Ue=new yn,lr=_T(r=>LT(r)),lr.listen(e,()=>{Ft.chmodSync(e,384),Ft.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),zh()}),lr.on("error",r=>{console.error("Daemon socket error:",r.message),ur(1)}),!s.noHttp)try{let r=process.cwd(),o=await R.getProjectId(r);if(o){let i=s.port||ni;So=ti({port:i,projectId:o,projectPath:r,enableLogging:!1}),await So.start()}}catch{}if(process.on("SIGTERM",()=>ur(0)),process.on("SIGINT",()=>ur(0)),process.on("SIGHUP",()=>{Ue=new yn,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}function LT(s){let e="";s.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1230
+ `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await UT(o);s.write(hs(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(hs(i))}}}),s.on("error",()=>{})}async function UT(s){if(!Ve||!Ue)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(zh(),Ve.commandsServed++,Ve.lastActivity=Date.now(),s.command==="daemon")return GT(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 HT(s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1188
1231
  `)||o.message||void 0,stderr:t.join(`
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(`
1232
+ `)||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 HT(s){let e=s.args.join(" ")||null,t=s.options,n=t.md===!0;switch(s.command){case"sync":return Ue.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 Ue.status(s.cwd,{json:t.json===!0,md:n});case"stats":return Ue.stats(s.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Ue.seal(s.cwd,{json:t.json===!0});case"verify":return Ue.verify(s.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Ue.task(e,s.cwd,{md:n});case"done":return Ue.done(s.cwd,{md:n});case"next":return Ue.next(s.cwd,{md:n});case"pause":return Ue.pause(e||"",s.cwd,{md:n});case"resume":return Ue.resume(e,s.cwd,{md:n});case"bug":return Ue.bug(e||"",s.cwd,{md:n});case"idea":return Ue.idea(e||"",s.cwd,{md:n});case"ship":return Ue.ship(e,s.cwd,{md:n});case"dash":return Ue.dash(e||"default",s.cwd,{md:n});case"design":return Ue.design(e||"",t);case"analyze":return Ue.analyze(t);case"cleanup":return Ue.cleanup(t);default:return z.execute(s.command,e,s.cwd)}}function GT(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ge.socket(),uptime:Ve?Date.now()-Ve.startedAt:0,commandsServed:Ve?.commandsServed??0,lastActivity:Ve?new Date(Ve.lastActivity).toISOString():null,registeredCommands:z.list().length}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>ur(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function zh(){Ve&&(Ve.idleTimer&&clearTimeout(Ve.idleTimer),Ve.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ve.idleTimeoutMs/1e3/60} minutes, shutting down`),ur(0)},Ve.idleTimeoutMs),Ve.idleTimer.unref&&Ve.idleTimer.unref())}function ur(s){console.log("Daemon shutting down..."),Ve?.idleTimer&&clearTimeout(Ve.idleTimer),So&&(So.stop(),So=null),lr&&(lr.close(),lr=null);let e=Ge.socket(),t=Ge.pid();try{Ft.existsSync(e)&&Ft.unlinkSync(e)}catch{}try{Ft.existsSync(t)&&Ft.unlinkSync(t)}catch{}process.exit(s)}function zT(s){try{return process.kill(s,0),!0}catch{return!1}}var lr,So,Ue,Ve,Bh=y(()=>{"use strict";ud();Bs();ja();Ke();jc();Co();lr=null,So=null,Ue=null,Ve=null;l(NT,"startDaemon");l(LT,"handleConnection");l(UT,"handleRequest");l(HT,"executeCommand");l(GT,"handleDaemonCommand");l(zh,"resetIdleTimer");l(ur,"shutdown");l(zT,"isProcessRunning")});var qh={};ye(qh,{runStart:()=>ZT});import _t from"node:fs/promises";import Vh from"node:os";import Yt from"node:path";import V from"chalk";function VT(){console.clear(),console.log(WT),console.log(BT)}function Jh(s,e){console.log(`
1190
1233
  ${V.bold(" Select AI providers to configure:")}
1191
1234
  `),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(`
1235
+ `),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 JT(){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"),Jh(e,n)},"render");Jh(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(`
1193
1236
  Cancelled.
1194
1237
  `),process.exit(0)),a==="\r"||a===`
1195
1238
  `){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
1239
  ${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}
1240
+ `),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 qT(s){let e=Oe[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(()=>(ct(),Oo)),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 KT(s){let e=Oe[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=he(`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 YT(s){let e=Oe[s];if(!e.configDir)return!1;try{await _t.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(ct(),Oo)),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
1241
 
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(`
1242
+ ${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 XT(s){let e=Yt.join(Vh.homedir(),".prjct-cli","config");await _t.mkdir(e,{recursive:!0});let t=Yt.join(e,"installed-editors.json"),n={version:xe,providers:s,editor:s[0],provider:s[0],lastInstall:new Date().toISOString(),path:Yt.join(Vh.homedir(),`.${s[0]}`,"commands")};await _t.writeFile(t,JSON.stringify(n,null,2))}function QT(s){console.log(`
1200
1243
  ${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(`
1244
+ `),console.log(` ${V.dim("Configured providers:")}`),s.forEach(e=>{let t=Oe[e];console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(`
1202
1245
  ${V.bold("Next steps:")}
1203
1246
 
1204
1247
  ${V.cyan("1.")} Navigate to your project directory
@@ -1211,30 +1254,30 @@ ${V.green.bold(" \u2713 Setup complete!")}
1211
1254
  ${V.dim("\u2022")} Use ${V.bold("p. ship")} to create PRs
1212
1255
 
1213
1256
  ${V.dim("Learn more: https://prjct.app/docs")}
1214
- `)}async function qT(){HT();let s=await GT();console.log(`
1257
+ `)}async function ZT(){VT();let s=await JT();console.log(`
1215
1258
  ${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=`
1259
+ `);for(let e of s){let t=Oe[e];process.stdout.write(` ${V.dim("\u2022")} ${t.displayName}... `);let n=await qT(e),r=await KT(e),o=await YT(e);console.log(n&&r&&o?V.green("\u2713"):n||o?V.yellow("partial"):V.yellow("skipped"))}await XT(s),QT(s)}var dr,pr,mr,gr,fr,WT,BT,Kh=y(()=>{"use strict";In();qe();N();Te();ct();dr=V.rgb(0,255,255),pr=V.rgb(80,180,255),mr=V.rgb(140,120,255),gr=V.rgb(200,80,220),fr=V.rgb(255,80,180),WT=`
1217
1260
 
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 ")}
1261
+ ${dr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${pr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${mr(" \u2588\u2588\u2557")}${gr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${fr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1262
+ ${dr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${pr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${mr(" \u2588\u2588\u2551")}${gr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${fr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1263
+ ${dr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${pr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${mr(" \u2588\u2588\u2551")}${gr("\u2588\u2588\u2551 ")}${fr(" \u2588\u2588\u2551 ")}
1264
+ ${dr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${pr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${mr("\u2588\u2588 \u2588\u2588\u2551")}${gr("\u2588\u2588\u2551 ")}${fr(" \u2588\u2588\u2551 ")}
1265
+ ${dr(" \u2588\u2588\u2551 ")}${pr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${mr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${gr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${fr(" \u2588\u2588\u2551 ")}
1266
+ ${dr(" \u255A\u2550\u255D ")}${pr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${mr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${gr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${fr(" \u255A\u2550\u255D ")}
1224
1267
 
1225
- `,UT=` ${V.white("Context Layer for AI Agents")} ${V.dim(`v${Pe}`)}
1268
+ `,BT=` ${V.white("Context Layer for AI Agents")} ${V.dim(`v${xe}`)}
1226
1269
 
1227
1270
  ${V.dim(`Project context layer for AI coding agents.
1228
1271
  Works with Claude Code, Gemini CLI, and more.`)}
1229
1272
  ${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(`
1273
+ `;l(VT,"showBanner");l(Jh,"showProviderSelection");l(JT,"selectProviders");l(qT,"installRouter");l(KT,"installSubcommands");l(YT,"installGlobalConfig");l(XT,"saveSetupConfig");l(QT,"showCompletion");l(ZT,"runStart")});import{exec as eE}from"node:child_process";import Qh from"node:fs/promises";import on from"node:path";import{promisify as tE}from"node:util";async function hr(s,e=process.cwd(),t={}){let n=on.isAbsolute(s)?s:on.join(e,s),r;try{r=await Qh.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=iE[o]||"unknown",a=oE[i]||[],c=await aE(r,a,n,e),u=[];t.reverse&&(u=await lE(s,e));let d;t.depth&&t.depth>0&&(d=await Zh(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 aE(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 cE(c,t,n)),r.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return r}async function cE(s,e,t){let n=on.dirname(e);if(s.startsWith("@/")){let o=on.join(t,"src",s.slice(2));return Xh(o,t)}let r=on.resolve(n,s);return Xh(r,t)}async function Xh(s,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let r=s+n;try{if((await Qh.stat(r)).isFile())return on.relative(e,r)}catch{}}return null}async function lE(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 nE(`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(`
1274
+ `).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==s);for(let u of c)t.push({file:u})}catch{}return t}async function Zh(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 hr(s,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Zh(a.resolved,e,t,n+1,r);o.imports.push(c)}return o}var nE,Yh,sE,rE,oE,iE,dd=y(()=>{"use strict";N();nE=tE(eE),Yh=[{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}],sE=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],rE=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],oE={typescript:Yh,javascript:Yh,python:sE,go:rE},iE={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(hr,"analyzeImports");l(aE,"extractImports");l(cE,"resolveImport");l(Xh,"tryResolve");l(lE,"findImportedBy");l(Zh,"buildDependencyTree")});import ey from"node:fs/promises";import an from"node:path";async function Da(s,e=process.cwd()){let t=an.isAbsolute(s)?s:an.join(e,s),n;try{n=await ey.readFile(t,"utf-8")}catch(p){if(P(p))return{file:s,purpose:"File not found",publicAPI:[],dependencies:[],metrics:ns("")};throw p}let r=an.extname(s).toLowerCase(),o=ty[r]||"unknown",i=await $n(s,e),a=await hr(s,e),c=dE(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?pE(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=mE(c,u,d);return{file:s,purpose:c,publicAPI:u,dependencies:d,metrics:to(n,m)}}async function pd(s,e=process.cwd(),t={}){let n=an.isAbsolute(s)?s:an.join(e,s),r=[];async function o(i){let a=await ey.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(ty[m]){let p=await Da(d,e);r.push(p)}}}}return l(o,"processDir"),await o(n),r}function dE(s,e){let t=uE[e]||[],n=s.split(`
1232
1275
  `);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]}
1233
1276
  `,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
1234
1277
  `).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`
1278
+ `)[0]||"";return`Module: ${an.basename(r,an.extname(r))}`}function pE(s){return s.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1279
+ `)[0].trim()}function mE(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(`
1280
+ `)}var uE,ty,ny=y(()=>{"use strict";N();dd();Bi();no();uE={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}]},ty={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Da,"summarizeFile");l(pd,"summarizeDirectory");l(dE,"extractFilePurpose");l(pE,"extractDescriptionFromDocstring");l(mE,"buildSummaryText")});var sy=y(()=>{"use strict"});var ry={};ye(ry,{analyzeImports:()=>hr,combineMetrics:()=>Wi,countTokens:()=>zi,extractDirectorySignatures:()=>_l,extractSignatures:()=>$n,findRelevantFiles:()=>ts,formatCompressionRate:()=>CP,formatCostSaved:()=>Fl,formatTokenCount:()=>bP,getRecentFiles:()=>eo,measureCompression:()=>to,noCompression:()=>ns,runContextTool:()=>gE,summarizeDirectory:()=>pd,summarizeFile:()=>Da});async function gE(s,e,t){let n=Date.now(),[r,...o]=s;try{let i;switch(r){case"files":i=await fE(o,t);break;case"signatures":i=await hE(o,t);break;case"imports":i=await yE(o,t);break;case"recent":i=await wE(o,t);break;case"summary":i=await kE(o,t);break;case"help":return{tool:"error",result:{error:PE(),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=SE(i),u=bE(i);return await CE(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 fE(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 ts(r,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function hE(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 _l(t,e,{recursive:s.includes("--recursive")||s.includes("-r")}),u=Wi(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 yE(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 hr(t,e,n)}}async function wE(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 eo(e,t)}}async function kE(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 pd(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:Wi(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Da(t,e)}}function SE(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 bE(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 CE(s,e){try{await dn.recordSync(s,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function PE(){return`
1238
1281
  Context Tools - Smart context filtering for AI agents
1239
1282
 
1240
1283
  USAGE:
@@ -1295,7 +1338,7 @@ TOOLS:
1295
1338
  OUTPUT:
1296
1339
  All tools output JSON for easy parsing by AI agents.
1297
1340
  Each output includes metrics showing token savings.
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
1341
+ `.trim()}var oy=y(()=>{"use strict";Vr();N();ue();Gi();dd();Ml();Bi();ny();no();no();sy();l(gE,"runContextTool");l(fE,"runFilesTool");l(hE,"runSignaturesTool");l(yE,"runImportsTool");l(wE,"runRecentTool");l(kE,"runSummaryTool");l(SE,"getTokensSaved");l(bE,"getCompressionRate");l(CE,"recordToolUsage");l(PE,"getHelpText")});var ly={};ye(ly,{hooksService:()=>jE});import He from"node:fs/promises";import $e from"node:path";import xt from"chalk";function ay(){return`#!/bin/sh
1299
1342
  # prjct auto-sync hook (post-commit)
1300
1343
  # Syncs project context after each commit
1301
1344
  # Installed by: prjct hooks install
@@ -1316,7 +1359,7 @@ if command -v prjct >/dev/null 2>&1; then
1316
1359
  fi
1317
1360
 
1318
1361
  exit 0
1319
- `}function oy(){return`#!/bin/sh
1362
+ `}function cy(){return`#!/bin/sh
1320
1363
  # prjct auto-sync hook (post-checkout)
1321
1364
  # Syncs project context after branch switch
1322
1365
  # Installed by: prjct hooks install
@@ -1348,7 +1391,7 @@ if command -v prjct >/dev/null 2>&1; then
1348
1391
  fi
1349
1392
 
1350
1393
  exit 0
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=`
1394
+ `}async function md(s){let e=[];return(await x($e.join(s,"lefthook.yml"))||await x($e.join(s,"lefthook.yaml")))&&e.push("lefthook"),(await x($e.join(s,".husky"))||await x($e.join(s,".husky","_")))&&e.push("husky"),await x($e.join(s,".git"))&&e.push("direct"),e}function iy(s){return s.includes("lefthook")?"lefthook":s.includes("husky")?"husky":"direct"}async function vE(s,e){let t=await x($e.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=$e.join(s,t),r=await He.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(r.includes(a))continue;let c=`
1352
1395
  ${i}:
1353
1396
  commands:
1354
1397
  ${a}:
@@ -1359,34 +1402,34 @@ ${i}:
1359
1402
  ${a}:
1360
1403
  run: prjct sync --quiet --yes
1361
1404
  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,`
1405
+ ${c}`}return await He.writeFile(n,r,"utf-8"),!0}async function xE(s,e){let t=$e.join(s,".husky");for(let n of e){let r=$e.join(t,n),o=n==="post-commit"?ay():cy();if(await x(r)){if((await He.readFile(r,"utf-8")).includes("prjct sync"))continue;await He.appendFile(r,`
1363
1406
  # prjct auto-sync
1364
1407
  prjct sync --quiet --yes &
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,`
1408
+ `)}else await He.writeFile(r,o,{mode:493})}return!0}async function TE(s,e){let t=$e.join(s,".git","hooks");await x(t)||await He.mkdir(t,{recursive:!0});for(let n of e){let r=$e.join(t,n),o=n==="post-commit"?ay():cy();if(await x(r)){if((await He.readFile(r,"utf-8")).includes("prjct sync"))continue;await He.appendFile(r,`
1366
1409
  # prjct auto-sync
1367
1410
  ${o.split(`
1368
1411
  `).slice(1).join(`
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(`
1412
+ `)}`)}else await He.writeFile(r,o,{mode:493})}return!0}async function EE(s){let e=await x($e.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=$e.join(s,e);if(!await x(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()}
1413
+ `,"utf-8"),!0}async function IE(s){let e=$e.join(s,".husky");for(let t of["post-commit","post-checkout"]){let n=$e.join(e,t);if(!await x(n))continue;let r=await He.readFile(n,"utf-8");if(!r.includes("prjct sync"))continue;let o=r.split(`
1371
1414
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
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(`
1415
+ `);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 AE(s){let e=$e.join(s,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=$e.join(e,t);if(!await x(n))continue;let r=await He.readFile(n,"utf-8");if(r.includes("prjct sync"))if(r.includes("Installed by: prjct hooks install"))await He.unlink(n);else{let o=r.split(`
1373
1416
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
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||`
1417
+ `);await He.writeFile(n,o,{mode:493})}}return!0}var gd,jE,uy=y(()=>{"use strict";Ke();we();N();Te();Gt();l(ay,"getPostCommitScript");l(cy,"getPostCheckoutScript");l(md,"detectHookManagers");l(iy,"selectStrategy");l(vE,"installLefthook");l(xE,"installHusky");l(TE,"installDirect");l(EE,"uninstallLefthook");l(IE,"uninstallHusky");l(AE,"uninstallDirect");gd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],r=await md(e);if(r.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||iy(r);try{let i=!1;switch(o){case"lefthook":i=await vE(e,n);break;case"husky":i=await xE(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",r=!1;switch(n){case"lefthook":r=await EE(e);break;case"husky":r=await IE(e);break;case"direct":r=await AE(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 md(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 md(e),n=iy(t);console.log(` Strategy: ${xt.cyan(n)}`),console.log(` Hooks: ${xt.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(` ${xt.green("\u2713")} ${o}`);console.log(""),console.log(xt.dim(" Context will auto-sync on commit and branch switch.")),console.log(xt.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: ${xt.green("Active")}`),console.log(` Strategy: ${xt.cyan(t.strategy)}`)):console.log(` Status: ${xt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let r=n.installed?xt.green("\u2713"):xt.dim("\u25CB"),o=n.installed?n.name:xt.dim(n.name);console.log(` ${r} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${xt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(xt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await x($e.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=$e.join(e,o);return await x(i)?(await He.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=$e.join(e,".husky",t);return await x(o)?(await He.readFile(o,"utf-8")).includes("prjct sync"):!1}let r=$e.join(e,".git","hooks",t);return await x(r)?(await He.readFile(r,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await x($e.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{}}},jE=new gd});var my={};ye(my,{DoctorService:()=>Ra,doctorService:()=>DE});import{execSync as fd}from"node:child_process";import dy from"node:fs/promises";import py from"node:path";import _n from"chalk";var Ra,DE,gy=y(()=>{"use strict";Ke();be();Bt();Gt();ct();Ra=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=fd(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=py.join(this.projectPath,".prjct","prjct.config.json");try{return await dy.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=py.join(this.globalPath,"context","CLAUDE.md");try{let t=await dy.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{fd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=fd("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1418
+ `).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${xe}`)}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")}}},DE=new Ra});var fy={};ye(fy,{WatchService:()=>$a,watchService:()=>FE});import RE from"node:path";import rt from"chalk";import $E from"chokidar";var ME,OE,$a,FE,hy=y(()=>{"use strict";Ke();N();ue();Eu();ME=["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"],OE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],$a=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=$E.watch(ME,{cwd:this.projectPath,ignored:OE,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(rt.dim(`
1419
+ \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(rt.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(rt.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(`
1420
+ ${rt.dim(`[${t}]`)} ${rt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await ds.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(`${rt.dim(`[${t}]`)} ${rt.green("\u2713")} Synced${o}`)}}else console.error(`${rt.dim(`[${t}]`)} ${rt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${rt.dim(`[${t}]`)} ${rt.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(rt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(rt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(rt.dim(` Project: ${RE.basename(this.projectPath)}`)),console.log(rt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(rt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(rt.dim(" Press Ctrl+C to stop")),console.log("")}},FE=new $a});var Py={};ye(Py,{formatAgentCommandHelp:()=>Sy,formatCommandHelp:()=>by,formatCommandList:()=>Cy,formatMainHelp:()=>wy,formatTerminalCommandHelp:()=>ky,getHelp:()=>NE});import K from"chalk";function wy(){let s=[];s.push(""),s.push(`${K.cyan.bold("prjct")} v${xe} - 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 yy){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=or.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 _E)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(`
1421
+ `)}function ky(s){let e=yy.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(`
1422
+ `)}function Sy(s){let e=or.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=yo[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(`
1423
+ `)}function by(s){let e=ky(s);if(e)return e;let t=Sy(s);return t||`
1381
1424
  ${K.yellow(`Command '${s}' not found.`)}
1382
1425
 
1383
1426
  Run 'prjct help' to see all available commands.
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}
1427
+ `}function Cy(){let s=[];s.push(""),s.push(K.cyan.bold("All Commands")),s.push("");let e=Object.entries(yo).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let r=or.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(`
1428
+ `)}function NE(s){return s?s==="commands"||s==="all"?Cy():by(s):wy()}var yy,_E,vy=y(()=>{"use strict";ad();ct();yy=[{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"]}],_E=[{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(wy,"formatMainHelp");l(ky,"formatTerminalCommandHelp");l(Sy,"formatAgentCommandHelp");l(by,"formatCommandHelp");l(Cy,"formatCommandList");l(NE,"getHelp")});var jy={};ye(jy,{installAntigravitySkill:()=>Iy,installCodexSkill:()=>Ay,needsAntigravityInstallation:()=>zE,run:()=>Ey});import{execSync as LE}from"node:child_process";import J from"node:fs/promises";import Nn from"node:os";import Z from"node:path";import ge from"chalk";async function UE(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Ls.isAvailable("npm"))return console.log(`${ge.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ge.dim(`Install ${s.displayName} using one of:`)}`),console.log(ge.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ge.dim(` \u2022 Use Homebrew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(ge.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(ge.yellow(`\u{1F4E6} ${s.displayName} not found. Installing...`)),console.log(""),LE(`npm install -g ${e}`,{stdio:"inherit",timeout:js("NPM_INSTALL")}),console.log(""),console.log(`${ge.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(ge.yellow(`\u26A0\uFE0F Installation timed out for ${s.displayName}`)),console.log(""),console.log(ge.dim("The npm install took too long. Try:")),console.log(ge.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(ge.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(ge.yellow(`\u26A0\uFE0F Failed to install ${s.displayName}: ${n.message}`)),console.log(""),console.log(ge.dim("Alternative installation methods:")),console.log(ge.dim(` \u2022 npm: npm install -g ${e}`)),console.log(ge.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(ge.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(ge.dim(` \u2022 brew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Ey(){let s=await cn(),e=await Ja(),t=Oe[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=Oe[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await UE(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ae.detectClaude()){let p=await Ae.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ae.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ae.installDocs(),await BE(),await VE()}}else if(a==="gemini"){await HE()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await GE();p.success&&(d.configAction=p.action)}n.providers.push(d)}(await Cs()).installed&&(await Iy()).success&&console.log(` ${ge.green("\u2713")} Antigravity skill installed`),(await Va()).installed&&(await Ay()).success&&console.log(` ${ge.green("\u2713")} Codex skill installed`),await sc.saveConfig(xe,await Ae.getInstallPath(),e.provider),await WE();for(let a of n.providers)JE(a,Oe[a.provider]);return n}async function HE(){try{let s=Z.join(Nn.homedir(),".gemini","commands"),e=Z.join(s,"p.toml");await J.mkdir(s,{recursive:!0});let t=he("commands/p.toml");if(t)return await J.writeFile(e,t,"utf-8"),!0;let n=Z.join(pe,"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 GE(){try{let s=Z.join(Nn.homedir(),".gemini"),e=Z.join(s,"GEMINI.md");await J.mkdir(s,{recursive:!0});let t=he("global/GEMINI.md");if(!t){let p=Z.join(pe,"templates","global","GEMINI.md");t=await J.readFile(p,"utf-8")}let n="",r=!1;try{n=await J.readFile(e,"utf-8"),r=!0}catch(p){if(P(p))r=!1;else throw p}if(!r)return await J.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
1386
1429
 
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
1430
+ ${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 Iy(){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=he("antigravity/SKILL.md");if(!r){let o=Z.join(pe,"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 zE(){let s=await Cs();return s.installed&&!s.skillInstalled}async function Ay(){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=he("codex/SKILL.md");if(!r){let o=Z.join(pe,"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 WE(){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!==xe&&(r.cliVersion=xe,M.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${ge.green("\u2713")} Updated ${t} project(s) to v${xe}`)}catch(s){P(s)||U.warn(`Migration warning: ${w(s)}`)}}async function xy(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 BE(){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(pe,"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]!==xe){let D=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`);await J.writeFile(r,D,{mode:493})}await Ma(p,i),await Ma(g,a),await Ty(t,r),await xy(e,t);return}}if(await x(d)){let k=await J.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`),await J.writeFile(r,k,{mode:493}),await Ma(p,i),await Ma(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
1388
1431
  # prjct Status Line for Claude Code
1389
- CLI_VERSION="${Pe}"
1432
+ CLI_VERSION="${xe}"
1390
1433
  input=$(cat)
1391
1434
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
1392
1435
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -1415,14 +1458,14 @@ if [ -f "$CONFIG" ]; then
1415
1458
  fi
1416
1459
  fi
1417
1460
  echo "prjct"
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.1",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}
1420
- ${$e.dim("Context layer for AI coding agents")}
1421
-
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(`
1423
- ${$e.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1424
- ${$e.cyan("https://prjct.app")}
1425
- `)}function XE(){console.log(`
1461
+ `;await J.writeFile(r,k,{mode:493})}await Ty(t,r),await xy(e,t)}catch(s){P(s)||U.warn(`Status line warning: ${w(s)}`)}}async function VE(){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 Ma(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 Ty(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 JE(s,e){if(console.log(""),s.cliInstalled?console.log(` ${ge.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ge.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(` ${ge.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${ge.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${ge.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${ge.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${ge.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var qE,Dy=y(()=>{"use strict";In();Ti();we();N();un();Te();zn();ct();qe();An();rc();l(UE,"installAICLI");l(Ey,"run");l(HE,"installGeminiRouter");l(GE,"installGeminiGlobalConfig");l(Iy,"installAntigravitySkill");l(zE,"needsAntigravityInstallation");l(Ay,"installCodexSkill");l(WE,"migrateProjectsCliVersion");l(xy,"ensureStatusLineSettings");l(BE,"installStatusLine");l(VE,"installContext7MCP");l(Ma,"installStatusLineModules");l(Ty,"ensureStatusLineSymlink");l(JE,"showResults");qE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");qE&&Ey().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});var Ry=Gy((xq,KE)=>{KE.exports={name:"prjct-cli",version:"1.31.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@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",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{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"]}});var sI={};import $y from"node:os";import Oa from"node:path";import Me from"chalk";async function YE(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let t=await Promise.resolve().then(()=>zy(Ry()));await tI(t.version),process.exit(0)}["-h","--help",void 0].includes(s)&&(nI(),process.exit(0)),h.start();try{let t=z.getByName(s);if(!t){let d=QE(s),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Vn("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}=eI(t,e),o=XE(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 Jn.recordTiming(i,"command_duration",d,{command:s});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Jn.recordTiming(i,"startup_time",p)}await Jn.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(vo(t)),h.end(),process.exit(1)}}function XE(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 Vn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function QE(s){let e=z.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=ZE(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}function ZE(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 eI(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 tI(s){let e=await cn(),t=Oa.join($y.homedir(),".claude","commands","p.md"),n=Oa.join($y.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([x(t),x(n),x(Oa.join(process.cwd(),".cursor","commands","sync.md")),x(Oa.join(process.cwd(),".cursor"))]),c=await Cs();if(console.log(`
1462
+ ${Me.cyan("p/")} prjct v${s}
1463
+ ${Me.dim("Context layer for AI coding agents")}
1464
+
1465
+ ${Me.dim("Providers:")}`),e.claude.installed){let u=r?Me.green("\u2713 ready"):Me.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${Me.dim(d)}`)}else console.log(` Claude Code ${Me.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?Me.green("\u2713 ready"):Me.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${Me.dim(d)}`)}else console.log(` Gemini CLI ${Me.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?Me.green("\u2713 ready"):Me.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${Me.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${Me.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${Me.green("\u2713 ready")} ${Me.dim("(use /sync, /task)")}`:a?` Cursor IDE ${Me.yellow("\u25CF detected")} ${Me.dim("(run prjct init)")}`:` Cursor IDE ${Me.dim("\u25CB no .cursor/ folder")}`),console.log(`
1466
+ ${Me.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1467
+ ${Me.cyan("https://prjct.app")}
1468
+ `)}function nI(){console.log(`
1426
1469
  prjct - Context layer for AI coding agents
1427
1470
  Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
1428
1471
 
@@ -1481,11 +1524,11 @@ MORE INFO
1481
1524
  ---------
1482
1525
  Documentation: https://prjct.app
1483
1526
  GitHub: https://github.com/jlopezlira/prjct-cli
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(`
1527
+ `)}var My=y(()=>{"use strict";ud();Bs();ja();qe();Ke();ii();oi();N();_r();Te();Gt();l(YE,"main");l(XE,"validateCommandParams");l(QE,"findClosestCommand");l(ZE,"editDistance");l(eI,"parseCommandArgs");l(tI,"displayVersion");l(nI,"displayHelp");YE().catch(s=>{console.error("Fatal error:",w(s)),process.env.DEBUG&&console.error(vo(s)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var yr=process.argv.slice(2),hd=yr.find(s=>!s.startsWith("--")&&!s.startsWith("-")),rI=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(hd&&!rI.has(hd)&&process.env.PRJCT_NO_DAEMON!=="1"){let s=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Co(),wd)),t=e.socket();if(s.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(ws(),ys)),r=await import("node:crypto"),o=[],i={};for(let a=0;a<yr.length;a++){let c=yr[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<yr.length&&!yr[a+1].startsWith("--")?i[u]=yr[++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:hd,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 oI(){let s=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(qe(),pt)),r=(await Promise.resolve().then(()=>(Ke(),zd))).default,o=(await Promise.resolve().then(()=>(rc(),Bd))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(jc(),zp)),{fileExists:c}=await Promise.resolve().then(()=>(Te(),le)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ga(),Dd)),{VERSION:d}=await Promise.resolve().then(()=>(ct(),Oo));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(),Jp));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(()=>(oi(),Yp));return await H.expireIfStale(F),await H.touch(F),()=>{let ee=Date.now()-$;H.trackCommand(F,v,ee).catch(()=>{}),Promise.resolve().then(()=>(ii(),Qp)).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(()=>(ws(),ys));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(()=>(Bh(),Wh)),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(()=>(ws(),ys));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(()=>(ws(),ys)),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(()=>(Kh(),qh));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(()=>(oy(),ry)),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(()=>(uy(),ly)),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(()=>(gy(),my)),F=await $.run(process.cwd());process.exitCode=F,v()}else if(p[0]==="uninstall"){let{uninstall:v}=await Promise.resolve().then(()=>(ld(),Lh)),$=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(()=>(hy(),fy)),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,Je=await F.start(v,{verbose:H,quiet:f,debounceMs:S,minIntervalMs:te});Je.success||(console.error(Je.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,Je;if($.existsSync(ee)?(te=ee,Je="bun"):$.existsSync(j)?(te=j,Je="node"):$.existsSync(S)?(te=S,Je="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,te="",Je=""),te){let _=["--project",H,...p.slice(1)];v(Je,[te,..._],{stdio:"inherit",cwd:F}).on("close",bo=>{process.exitCode=bo||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:v}=await Promise.resolve().then(()=>(vy(),Py)),$=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,Je]=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(`
1485
1528
  ${t.cyan("p/")} prjct v${d}
1486
1529
  ${t.dim("Context layer for AI coding agents")}
1487
1530
 
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(`
1531
+ ${t.dim("Providers:")}`),v.claude.installed){let _=H?t.green("\u2713 ready"):t.yellow("\u25CF installed"),fs=v.claude.version?` (v${v.claude.version})`:"";console.log(` Claude Code ${_}${t.dim(fs)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(v.gemini.installed){let _=ee?t.green("\u2713 ready"):t.yellow("\u25CF installed"),fs=v.gemini.version?` (v${v.gemini.version})`:"";console.log(` Gemini CLI ${_}${t.dim(fs)}`)}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 _=Je?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(`
1489
1532
  ${t.dim("Run 'prjct start' to configure (CLI providers)")}
1490
1533
  ${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1491
1534
  ${t.cyan("https://prjct.app")}
@@ -1498,4 +1541,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
1498
1541
  Claude Code, Gemini CLI, or both.`)}
1499
1542
  `),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
1500
1543
  ${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
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)});
1544
+ `);let{default:H}=await Promise.resolve().then(()=>(Dy(),jy));await H.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(ws(),ys)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(My(),sI))}}}l(oI,"main");oI().catch(s=>{console.error("Fatal error:",s.message),process.exit(1)});