prjct-cli 1.31.0 → 1.32.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 _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(`
7
+ var Wy=Object.create;var Cr=Object.defineProperty;var By=Object.getOwnPropertyDescriptor;var Vy=Object.getOwnPropertyNames;var Jy=Object.getPrototypeOf,qy=Object.prototype.hasOwnProperty;var l=(r,e)=>Cr(r,"name",{value:e,configurable:!0}),vr=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var y=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ky=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),we=(r,e)=>{for(var t in e)Cr(r,t,{get:e[t],enumerable:!0})},bd=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Vy(e))!qy.call(r,s)&&s!==t&&Cr(r,s,{get:()=>e[s],enumerable:!(n=By(e,s))||n.enumerable});return r};var Yy=(r,e,t)=>(t=r!=null?Wy(Jy(r)):{},bd(e||!r||!r.__esModule?Cr(t,"default",{value:r,enumerable:!0}):t,r)),It=r=>bd(Cr({},"__esModule",{value:!0}),r);var Cd={};we(Cd,{DAEMON_PATHS:()=>Ge,IDLE_TIMEOUT_MS:()=>Ha,decodeMessage:()=>Xy,encodeMessage:()=>Ss});function Ss(r){return Buffer.from(`${JSON.stringify(r)}
8
+ `)}function Xy(r){return JSON.parse(r.trim())}var Ge,Ha,Po=y(()=>{"use strict";Ge={runDir:l(()=>`${process.env.HOME||vr("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")},Ha=1800*1e3;l(Ss,"encodeMessage");l(Xy,"decodeMessage")});var bs={};we(bs,{executeViaDaemon:()=>ew,getDaemonStatus:()=>Zy,isDaemonRunning:()=>vd,sendRequest:()=>xr,spawnDaemon:()=>xd,stopDaemon:()=>tw});import To from"node:crypto";import At from"node:fs";import{connect as Qy}from"node:net";async function vd(){let r=Ge.socket();if(!At.existsSync(r))return!1;try{return(await xr({id:To.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{At.unlinkSync(r)}catch{}return!1}}async function Zy(){let r=Ge.socket(),e=Ge.pid();if(!At.existsSync(r))return{running:!1};try{let t=await xr({id:To.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return At.existsSync(e)?{running:!1,pid:parseInt(At.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function xr(r){return new Promise((e,t)=>{let n=Ge.socket(),s=Qy(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(Ss(r))}),s.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),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function ew(r,e,t,n,s,o=!0){let i=Ge.socket();if(!At.existsSync(i))return o&&xd().catch(()=>{}),null;try{return await xr({id:To.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function tw(){try{return(await xr({id:To.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function xd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),s=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(At.existsSync(t))o=t,i="bun";else if(At.existsSync(n))o=n,i="node";else if(At.existsSync(s))o=s,i="node";else return!1;let a=Ge.runDir();At.mkdirSync(a,{recursive:!0});let c=Ge.log(),u=At.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),At.closeSync(u),await new Promise(m=>setTimeout(m,500)),vd()}var Cs=y(()=>{"use strict";Po();l(vd,"isDaemonRunning");l(Zy,"getDaemonStatus");l(xr,"sendRequest");l(ew,"executeViaDaemon");l(tw,"stopDaemon");l(xd,"spawnDaemon")});import{z as Zt}from"zod";function Pd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var TI,EI,II,Pr,AI,Tr=y(()=>{"use strict";TI=Zt.enum(["opus","sonnet","haiku"]),EI=Zt.enum(["2.5-pro","2.5-flash","2.0-flash"]),II=Zt.string().min(1),Pr=Zt.object({provider:Zt.string(),model:Zt.string(),cliVersion:Zt.string().optional(),recordedAt:Zt.string()}),AI=Zt.object({preferredModel:Zt.string().optional(),lastAnalysisModel:Pr.optional()});l(Pd,"compareSemver")});function Td(r){return r instanceof Error&&"code"in r}function v(r){return Td(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function Eo(r){if(r instanceof Error)return r.stack}var N=y(()=>{"use strict";l(Td,"isNodeError");l(v,"isNotFoundError");l(w,"getErrorMessage");l(Eo,"getErrorStack")});import Ad from"node:fs/promises";async function jd(r,e){let t;try{t=await Ad.readFile(r,"utf-8")}catch(o){if(v(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Ed(r,t),Id(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Ed(r,t),Id(r,nw(s.error)),null)}async function Ed(r,e){let t=`${r}.backup`;try{await Ad.writeFile(t,e,"utf-8")}catch{}}function Id(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function nw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Dd=y(()=>{"use strict";N();l(jd,"safeRead");l(Ed,"createBackup");l(Id,"logCorruption");l(nw,"formatZodError")});var ue={};we(ue,{appendLine:()=>Ua,appendToFile:()=>rw,atomicWrite:()=>sw,copyFile:()=>uw,deleteDir:()=>aw,deleteFile:()=>iw,dirExists:()=>Io,ensureDir:()=>Lt,fileExists:()=>P,getFileExtension:()=>gw,getFileModifiedTime:()=>lw,getFileNameWithoutExtension:()=>fw,getFileSize:()=>cw,listFiles:()=>Ps,moveFile:()=>dw,prependToFile:()=>ow,readFile:()=>xs,readJson:()=>zn,readLines:()=>pw,writeFile:()=>Rd,writeJson:()=>Er,writeLines:()=>mw});import be from"node:fs/promises";import vs from"node:path";async function zn(r,e=null,t){if(t)return await jd(r,t)??e;try{let n=await be.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(v(n))return e;throw n}}async function Er(r,e,t=2){let n=JSON.stringify(e,null,t);await be.writeFile(r,n,"utf-8")}async function xs(r,e=""){try{return await be.readFile(r,"utf-8")}catch(t){if(v(t))return e;throw t}}async function Rd(r,e){let t=vs.dirname(r);await be.mkdir(t,{recursive:!0}),await be.writeFile(r,e,"utf-8")}async function sw(r,e){let t=vs.dirname(r);await be.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await be.writeFile(n,e,"utf-8"),await be.rename(n,r)}async function rw(r,e){await be.appendFile(r,e,"utf-8")}async function Ua(r,e){let t=vs.dirname(r);await be.mkdir(t,{recursive:!0}),await be.appendFile(r,`${e}
10
+ `,"utf-8")}async function ow(r,e){try{let t=await be.readFile(r,"utf-8");await be.writeFile(r,e+t,"utf-8")}catch(t){if(v(t))await be.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await be.access(r),!0}catch(e){if(v(e))return!1;throw e}}async function Io(r){try{return(await be.stat(r)).isDirectory()}catch(e){if(v(e))return!1;throw e}}async function Lt(r){await be.mkdir(r,{recursive:!0})}async function iw(r){try{return await be.unlink(r),!0}catch(e){if(v(e))return!1;throw e}}async function aw(r){try{return await be.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(v(e))return!1;throw e}}async function Ps(r,e={}){try{let n=await be.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(v(t))return[];throw t}}async function cw(r){return(await be.stat(r)).size}async function lw(r){return(await be.stat(r)).mtime}async function uw(r,e){await be.copyFile(r,e)}async function dw(r,e){await be.rename(r,e)}async function pw(r){return(await xs(r,"")).split(`
11
+ `)}async function mw(r,e){let t=e.join(`
12
+ `);await Rd(r,t)}function gw(r){return vs.extname(r)}function fw(r){return vs.basename(r,vs.extname(r))}var Te=y(()=>{"use strict";Dd();N();l(zn,"readJson");l(Er,"writeJson");l(xs,"readFile");l(Rd,"writeFile");l(sw,"atomicWrite");l(rw,"appendToFile");l(Ua,"appendLine");l(ow,"prependToFile");l(P,"fileExists");l(Io,"dirExists");l(Lt,"ensureDir");l(iw,"deleteFile");l(aw,"deleteDir");l(Ps,"listFiles");l(cw,"getFileSize");l(lw,"getFileModifiedTime");l(uw,"copyFile");l(dw,"moveFile");l(pw,"readLines");l(mw,"writeLines");l(gw,"getFileExtension");l(fw,"getFileNameWithoutExtension")});var Od={};we(Od,{invalidateProviderCache:()=>ww,readProviderCache:()=>za,writeProviderCache:()=>Wa});import Ao from"node:fs/promises";import hw from"node:os";import $d from"node:path";async function za(){try{let r=await Ao.readFile(Ga,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>yw?null:e.detection}catch{return null}}async function Wa(r){let e={timestamp:new Date().toISOString(),detection:r};await Ao.mkdir(Md,{recursive:!0}),await Ao.writeFile(Ga,JSON.stringify(e,null,2))}async function ww(){try{await Ao.unlink(Ga)}catch{}}var Md,Ga,yw,Ba=y(()=>{"use strict";Md=$d.join(hw.homedir(),".prjct-cli","cache"),Ga=$d.join(Md,"providers.json"),yw=600*1e3;l(za,"readProviderCache");l(Wa,"writeProviderCache");l(ww,"invalidateProviderCache")});var mt={};we(mt,{AntigravityProvider:()=>Ja,ClaudeProvider:()=>jo,CodexProvider:()=>qa,CursorProvider:()=>Nd,GeminiProvider:()=>Va,Providers:()=>Oe,WindsurfProvider:()=>Ld,detectAllProviders:()=>un,detectAntigravity:()=>Ts,detectCodex:()=>Ka,detectCursorProject:()=>Gd,detectProvider:()=>Do,detectWindsurfProject:()=>zd,getActiveProvider:()=>Cw,getCommandsDir:()=>Aw,getGlobalContextPath:()=>Tw,getGlobalSettingsPath:()=>Ew,getProjectCommandsPath:()=>jw,getProviderBranding:()=>Ro,getSkillsPath:()=>Iw,hasProviderConfig:()=>vw,needsCursorRouterRegeneration:()=>xw,needsWindsurfRouterRegeneration:()=>Pw,selectProvider:()=>Ya,validateCliVersion:()=>Ud});import{exec as kw}from"node:child_process";import bn from"node:os";import ze from"node:path";import{promisify as Sw}from"node:util";async function Hd(r){try{let{stdout:e}=await Fd(`which ${r}`,{timeout:_d});return e.trim()}catch{return null}}async function bw(r){try{let{stdout:e}=await Fd(`${r} --version`,{timeout:_d}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Do(r){let e=Oe[r];if(!e.cliCommand)return{installed:!1};let t=await Hd(e.cliCommand);if(!t)return{installed:!1};let n=await bw(e.cliCommand),s=Ud(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Ud(r,e){let t=Oe[r];return!t.minCliVersion||!e?null:Pd(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function un(r=!1){if(!r){let s=await za();if(s)return s}let[e,t]=await Promise.all([Do("claude"),Do("gemini")]),n={claude:e,gemini:t};return await Wa(n).catch(()=>{}),n}async function Cw(r){if(r&&Oe[r])return Oe[r];let e=await un();return e.claude.installed&&!e.gemini.installed?jo:e.gemini.installed&&!e.claude.installed?Va:jo}async function vw(r){let e=Oe[r];return e.configDir?P(e.configDir):!1}function Ro(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Gd(r){let e=ze.join(r,".cursor"),t=ze.join(e,"rules"),n=ze.join(t,"prjct.mdc"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function xw(r){let e=await Gd(r);return e.detected&&!e.routerInstalled}async function zd(r){let e=ze.join(r,".windsurf"),t=ze.join(e,"rules"),n=ze.join(t,"prjct.md"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Pw(r){let e=await zd(r);return e.detected&&!e.routerInstalled}async function Ts(){let r=Ja.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=ze.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Ka(){let r=qa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Hd("codex"),t=ze.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([P(r),P(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Tw(r){let e=Oe[r];return e.configDir?ze.join(e.configDir,e.contextFile):null}function Ew(r){let e=Oe[r];return!e.configDir||!e.settingsFile?null:ze.join(e.configDir,e.settingsFile)}function Iw(r){return Oe[r].skillsDir}function Aw(r){return Oe[r].commandsDir}function jw(r,e){let t=Oe[r];return ze.join(e,t.commandsDir)}async function Ya(){let r=await un(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var Fd,_d,jo,Va,Ja,Nd,Ld,qa,Oe,Je=y(()=>{"use strict";Tr();Te();Ba();Fd=Sw(kw),_d=2e3,jo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ze.join(bn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ze.join(bn.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"},Va={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ze.join(bn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ze.join(bn.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"},Ja={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ze.join(bn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ze.join(bn.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},Nd={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},Ld={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},qa={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ze.join(bn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ze.join(bn.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:jo,gemini:Va,cursor:Nd,antigravity:Ja,windsurf:Ld,codex:qa};l(Hd,"whichCommand");l(bw,"getCliVersion");l(Do,"detectProvider");l(Ud,"validateCliVersion");l(un,"detectAllProviders");l(Cw,"getActiveProvider");l(vw,"hasProviderConfig");l(Ro,"getProviderBranding");l(Gd,"detectCursorProject");l(xw,"needsCursorRouterRegeneration");l(zd,"detectWindsurfProject");l(Pw,"needsWindsurfRouterRegeneration");l(Ts,"detectAntigravity");l(Ka,"detectCodex");l(Tw,"getGlobalContextPath");l(Ew,"getGlobalSettingsPath");l(Iw,"getSkillsPath");l(Aw,"getCommandsDir");l(jw,"getProjectCommandsPath");l(Ya,"selectProvider")});import{z as Ce}from"zod";function Dw(r){return r instanceof Es}function re(r){return Dw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Is,nA,sA,rA,oA,iA,aA,Es,$o,Mo,Ir,dn=y(()=>{"use strict";Is={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},nA=Is.create("FileError",Ce.object({path:Ce.string(),operation:Ce.enum(["read","write","delete","create","copy"]),reason:Ce.string().optional()})),sA=Is.create("ValidationError",Ce.object({field:Ce.string(),expected:Ce.string(),received:Ce.string().optional(),message:Ce.string().optional()})),rA=Is.create("PermissionError",Ce.object({action:Ce.string(),resource:Ce.string(),reason:Ce.string().optional()})),oA=Is.create("TaskError",Ce.object({taskId:Ce.string().optional(),operation:Ce.enum(["create","update","complete","pause","resume","delete"]),reason:Ce.string()})),iA=Is.create("SessionError",Ce.object({sessionId:Ce.string().optional(),reason:Ce.string()})),aA=Is.create("SyncError",Ce.object({projectId:Ce.string().optional(),operation:Ce.enum(["push","pull","auth","connect"]),reason:Ce.string()})),Es=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)}},$o=class r extends Es{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Mo=class r extends Es{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Ir=class r extends Es{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(Dw,"isPrjctError");l(re,"getErrorMessage")});var z={};we(z,{calculateDuration:()=>Hw,formatDate:()=>Oo,formatDuration:()=>pn,formatMonth:()=>$w,getDateKey:()=>Mw,getDateRange:()=>_w,getDaysAgo:()=>Cn,getDaysFromNow:()=>Fw,getEndOfDay:()=>Gw,getStartOfDay:()=>Uw,getTimestamp:()=>C,getTodayKey:()=>Wd,getYearMonthDay:()=>Xa,isToday:()=>Nw,isWithinLastDays:()=>Lw,parseDate:()=>Ow,toRelative:()=>zw});import{formatDistanceToNowStrict as Rw}from"date-fns";function Oo(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function $w(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Wd(){return Oo(new Date)}function Mw(r){return Oo(r)}function Xa(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Ow(r){return new Date(r)}function C(){return new Date().toISOString()}function Cn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Fw(r){let e=new Date;return e.setDate(e.getDate()+r),e}function _w(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Nw(r){return Oo(r)===Wd()}function Lw(r,e){let t=Cn(e);return r>=t}function pn(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function Hw(r,e=new Date){let t=e.getTime()-r.getTime();return pn(t)}function Uw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Gw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function zw(r){let e=typeof r=="string"?new Date(r):r;return Rw(e,{addSuffix:!0})}var ae=y(()=>{"use strict";l(Oo,"formatDate");l($w,"formatMonth");l(Wd,"getTodayKey");l(Mw,"getDateKey");l(Xa,"getYearMonthDay");l(Ow,"parseDate");l(C,"getTimestamp");l(Cn,"getDaysAgo");l(Fw,"getDaysFromNow");l(_w,"getDateRange");l(Nw,"isToday");l(Lw,"isWithinLastDays");l(pn,"formatDuration");l(Hw,"calculateDuration");l(Uw,"getStartOfDay");l(Gw,"getEndOfDay");l(zw,"toRelative")});var No={};we(No,{PACKAGE_ROOT:()=>pe,VERSION:()=>Pe,compareVersions:()=>Bd,getPackageInfo:()=>Ww,getPackageRoot:()=>ec,getVersion:()=>Wn,isCompatible:()=>Bw,needsMigration:()=>Vw});import Qa from"node:fs";import _o from"node:path";function ec(){if(Ar)return Ar;let r=__dirname;for(let e=0;e<5;e++){let t=_o.join(r,"package.json");if(Qa.existsSync(t))try{if(JSON.parse(Qa.readFileSync(t,"utf-8")).name==="prjct-cli")return Ar=r,r}catch{}r=_o.dirname(r)}return Ar=_o.join(__dirname,"..","..",".."),Ar}function Wn(){if(Fo)return Fo;try{let r=_o.join(ec(),"package.json"),e=JSON.parse(Qa.readFileSync(r,"utf-8"));return Fo=e.version,Za=e,Fo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Ww(){return Za||Wn(),Za}function Bd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Bw(r){let e=Wn(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Vw(r,e=null){let t=e||Wn();return Bd(r,t)<0}var Fo,Za,Ar,Pe,pe,lt=y(()=>{"use strict";N();Fo=null,Za=null,Ar=null;l(ec,"getPackageRoot");l(Wn,"getVersion");l(Ww,"getPackageInfo");l(Bd,"compareVersions");l(Bw,"isCompatible");l(Vw,"needsMigration");Pe=Wn(),pe=ec()});import{exec as Jw}from"node:child_process";import{promisify as qw}from"node:util";async function Lo(r){try{let{stdout:e}=await Kw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Yw(){let r=await Lo("gh api user --jq .login");return r.success&&r.output||(r=await Lo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Xw(){let r=await Lo("git config user.name");return r.success&&r.output?r.output:null}async function Qw(){let r=await Lo("git config user.email");return r.success&&r.output?r.output:null}async function As(){let[r,e,t]=await Promise.all([Yw(),Xw(),Qw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Kw,Ho=y(()=>{"use strict";Kw=qw(Jw);l(Lo,"execCommand");l(Yw,"detectGitHubUsername");l(Xw,"detectGitName");l(Qw,"detectGitEmail");l(As,"detect")});import Zw from"node:crypto";import en from"node:fs/promises";import nc from"node:os";import W from"node:path";import{globSync as ek}from"glob";var sc,tk,E,ke=y(()=>{"use strict";ae();Te();sc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?W.resolve(e):W.join(nc.homedir(),".prjct-cli"),this.globalProjectsDir=W.join(this.globalBaseDir,"projects"),this.globalConfigDir=W.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=W.resolve(e),this.globalProjectsDir=W.join(this.globalBaseDir,"projects"),this.globalConfigDir=W.join(this.globalBaseDir,"config")}generateProjectId(e){return Zw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return W.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return W.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return W.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return W.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Io(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Lt(this.globalBaseDir),await Lt(this.globalProjectsDir),await Lt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Lt(W.join(t,s));return await Lt(W.join(t,"planning","tasks")),await Lt(W.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Xa(t);return W.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Lt(n),n}async listSessions(e,t=null,n=null){let s=W.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await en.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=W.join(s,a.name),u=await en.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=W.join(c,d.name),p=await en.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:W.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 W.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await en.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 Io(t)}getDisplayPath(e){let t=nc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return W.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return W.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return W.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return W.join(this.globalBaseDir,".running")}getDocsPath(){return W.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Je(),It(mt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Je(),It(mt)).getActiveProvider();return(Je(),It(mt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return W.join(nc.homedir(),".claude")}getClaudeSettingsPath(){return W.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?W.join(this.getGlobalProjectPath(e),"agents"):W.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return W.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return W.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=W.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=W.join(e,"package.json");if(await P(s))try{let o=await en.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await en.readFile(W.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
13
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=W.join(e,"package.json"),i=await en.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=W.join(e,"lerna.json");if(await P(c)){let u=await en.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=W.join(e,"package.json"),i=await en.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=ek(o,{cwd:e,absolute:!1});for(let a of i){let c=W.join(e,a),u=W.join(c,"package.json");if(await P(u))try{let d=await en.readFile(u,"utf-8"),m=JSON.parse(d),p=W.join(c,"PRJCT.md");n.push({name:m.name||W.basename(a),path:c,relativePath:a,hasPrjctMd:await P(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=W.resolve(e);for(let s of t.packages){let o=W.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=W.resolve(e),n=W.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=W.dirname(t)}return null}},tk=new sc,E=tk});var Jd={};we(Jd,{default:()=>$});import Bn from"node:fs/promises";import nk from"node:path";import*as Uo from"jsonc-parser";function Vd(r){let e=[],t=Uo.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Uo.printParseErrorCode(n.error)}`)}return t}var rc,sk,$,qe=y(()=>{"use strict";dn();N();ae();lt();Ho();ke();l(Vd,"parseJsonc");rc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=E.getLocalConfigPath(e),n=await Bn.readFile(t,"utf-8");return Vd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${re(t)}`),null}}async writeConfig(e,t){let n=E.getLocalConfigPath(e),s=E.getLegacyPrjctPath(e);await Bn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Bn.writeFile(n,`${o}
14
+ `,"utf-8")}async readGlobalConfig(e){try{let t=E.getGlobalProjectConfigPath(e),n=await Bn.readFile(t,"utf-8");return Vd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read global config for ${e}: ${re(t)}`),null}}async writeGlobalConfig(e,t){let n=E.getGlobalProjectConfigPath(e),s=E.getGlobalProjectPath(e);await Bn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Bn.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=E.generateProjectId(e),s=E.getGlobalProjectPath(n),o=E.getDisplayPath(s),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version: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 E.hasLegacyStructure(e))return!1;if(!await E.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=E.getGlobalProjectPath(s.projectId);try{return(await Bn.readdir(nk.join(o,"core"))).length===0}catch(i){return v(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:E.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=C(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await As(),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=E.generateProjectId(e);return{projectId:n,dataPath:E.getDisplayPath(E.getGlobalProjectPath(n))}}},sk=new rc,$=sk});var Kd={};we(Kd,{default:()=>ic});import js from"node:fs/promises";import rk from"node:os";import qd from"node:path";var oc,ok,ic,ac=y(()=>{"use strict";N();oc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=rk.homedir(),this.configDir=qd.join(this.homeDir,".prjct-cli","config"),this.configFile=qd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await js.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await js.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await js.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await js.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 js.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await js.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},ok=new oc,ic=ok});function ik(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function jr(){return ik()==="bun"}var cc=y(()=>{"use strict";l(ik,"detectRuntime");l(jr,"isBun")});import lc from"node:fs";import Yd from"node:path";function ak(r){if(jr()){let{Database:s}=vr("bun:sqlite");return new s(r,{create:!0})}let e=vr("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var ck,Go,R,q,fe=y(()=>{"use strict";ke();cc();l(ak,"openDatabase");ck=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
16
16
  -- =======================================================================
17
17
  -- Document storage (backward-compatible with JSON file pattern)
18
18
  -- =======================================================================
@@ -226,7 +226,7 @@ var _y=Object.create;var wr=Object.defineProperty;var Ny=Object.getOwnPropertyDe
226
226
  started_at TEXT,
227
227
  ended_at TEXT
228
228
  );
229
- `)},"up")},{version:2,name:"archives-table",up:l(s=>{s.run(`
229
+ `)},"up")},{version:2,name:"archives-table",up:l(r=>{r.run(`
230
230
  -- =======================================================================
231
231
  -- Archives: Stale data moved out of active storage (PRJ-267)
232
232
  -- =======================================================================
@@ -243,13 +243,13 @@ var _y=Object.create;var wr=Object.defineProperty;var Ny=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")}],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(`
246
+ `)},"up")}],Go=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Yd.join(E.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Yd.dirname(n);lc.existsSync(s)||lc.mkdirSync(s,{recursive:!0});let o=ak(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 lc.existsSync(this.getDbPath(e))}getDoc(e,t){let s=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,n){let s=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,n,s){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let s=this.getDb(e);return t?s.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):s.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){return this.getDb(e).prepare(t).all(...n)}run(e,t,...n){this.getDb(e).prepare(t).run(...n)}get(e,t,...n){return this.getDb(e).prepare(t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
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 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
252
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of ck)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}},R=new Go,q=R});var Xd=y(()=>{"use strict"});import Dr from"node:fs/promises";import vn from"node:path";import{z as de}from"zod";async function mk(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=vn.join(e,"package.json"),s=await Dr.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function gk(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await wk(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=pk[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function fk(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=vn.join(e,a);try{await Dr.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function hk(r,e){let t=Date.now();try{let n=await kk(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function yk(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],s=[];for(let o of r.antiPatterns){let i=vn.join(e,o.file);try{await Dr.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Qd(r,e){let t=Date.now(),n=await Promise.all([mk(r,e),gk(r,e),fk(r,e),hk(r,e),yk(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function wk(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Dr.readdir(s,{withFileTypes:!0});for(let i of o){let a=vn.join(s,i.name),c=vn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=vn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function kk(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Dr.readdir(s,{withFileTypes:!0});for(let i of o){let a=vn.join(s,i.name),c=vn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var lk,uk,dk,uc,ZA,pk,dc=y(()=>{"use strict";N();Tr();lk=de.enum(["draft","verified","sealed"]),uk=de.object({name:de.string(),description:de.string(),location:de.string().optional()}),dk=de.object({issue:de.string(),file:de.string(),suggestion:de.string()}),uc=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(uk),antiPatterns:de.array(dk),analyzedAt:de.string(),modelMetadata:Pr.optional(),status:lk.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"},pk={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(mk,"verifyFrameworks");l(gk,"verifyLanguages");l(fk,"verifyPatternLocations");l(hk,"verifyFileCount");l(yk,"verifyAntiPatternFiles");l(Qd,"semanticVerify");l(wk,"getProjectExtensions");l(kk,"countProjectFiles")});import{z as Fe}from"zod";var zo,xn,Sk,sj,pc,Zd,Rr=y(()=>{"use strict";zo=Fe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),xn=Fe.object({primaryDomain:zo,secondaryDomains:Fe.array(zo),confidence:Fe.number().min(0).max(1),filePatterns:Fe.array(Fe.string()),relevantAgents:Fe.array(Fe.string())}),Sk=Fe.object({classification:xn,classifiedAt:Fe.string(),source:Fe.enum(["cache","history","llm","heuristic"]),descriptionHash:Fe.string(),projectId:Fe.string()}),sj=Fe.object({entries:Fe.record(Fe.string(),Sk),confirmedPatterns:Fe.array(Fe.object({descriptionHash:Fe.string(),classification:xn,confirmedAt:Fe.string(),taskDescription:Fe.string()}))}),pc={entries:{},confirmedPatterns:[]},Zd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as B}from"zod";var bk,Ck,ep,vk,xk,Pk,Tk,Ek,tp,ij,mc=y(()=>{"use strict";bk=B.enum(["low","medium","high"]),Ck=B.enum(["pending","converted","completed","archived","dormant"]),ep=B.enum(["high","medium","low"]),vk=B.object({impact:ep,effort:ep}),xk=B.object({frontend:B.string().optional(),backend:B.string().optional(),payments:B.string().optional(),ai:B.string().optional(),deploy:B.string().optional(),other:B.array(B.string()).optional()}),Pk=B.object({name:B.string(),description:B.string()}),Tk=B.object({name:B.string(),description:B.string().optional()}),Ek=B.object({id:B.string(),text:B.string(),details:B.string().optional(),priority:bk,status:Ck,tags:B.array(B.string()),addedAt:B.string(),completedAt:B.string().optional(),convertedTo:B.string().optional(),source:B.string().optional(),sourceFiles:B.array(B.string()).optional(),painPoints:B.array(B.string()).optional(),solutions:B.array(B.string()).optional(),filesAffected:B.array(B.string()).optional(),impactEffort:vk.optional(),implementationNotes:B.string().optional(),stack:xk.optional(),modules:B.array(Pk).optional(),roles:B.array(Tk).optional(),risks:B.array(B.string()).optional(),risksCount:B.number().optional()}),tp=B.object({ideas:B.array(Ek),lastUpdated:B.string()}),ij={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function sp(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var np,Ik,Ak,jk,Dk,uj,dj,gc=y(()=>{"use strict";np=Y.enum(["linear","jira","github","monday","asana","none"]),Ik=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Ak=Y.enum(["none","urgent","high","medium","low"]),jk=Y.enum(["feature","bug","improvement","task","chore","epic"]),Dk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:Ik,priority:Ak,type:jk.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()}),uj=Y.object({provider:np,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),Dk)}),dj=Y.object({provider:np,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(sp,"createEmptyIssues")});var cp={};we(cp,{AgentAssignmentSchema:()=>rp,OUTPUT_SCHEMAS:()=>ip,SubtaskBreakdownSchema:()=>op,TaskClassificationSchema:()=>xn,renderSchemaForPrompt:()=>fc});import{z as Ke}from"zod";function fc(r){let e=ip[r];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
- ${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:
261
+ ${Rk(e.schema)}`:null}function Rk(r){if(r instanceof Ke.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${ap(n)}`).join(`
262
+ `)}return"(see example above)"}function ap(r){return r instanceof Ke.ZodString?"string":r instanceof Ke.ZodNumber?"number":r instanceof Ke.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ke.ZodArray?`array of ${ap(r.element)}`:r instanceof Ke.ZodObject?"object":"any"}var rp,op,ip,Wo=y(()=>{"use strict";Rr();Rr();rp=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),op=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:zo,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),ip={classification:{schema:xn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:rp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:op,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(fc,"renderSchemaForPrompt");l(Rk,"describeSchema");l(ap,"describeField")});import{z as I}from"zod";var lp,$k,Mk,up,Ok,Fk,_k,Nk,Lk,Hk,Uk,dp,Gk,zk,kj,pp,mp,gp,fp,Wk,Bo,hc=y(()=>{"use strict";lp=I.number().min(1).max(5),$k=I.enum(["exceeded","met","partial","failed"]),Mk=I.enum(["definitely","probably","maybe","no"]),up=I.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Ok=I.object({estimated:I.object({hours:I.number(),confidence:I.enum(["low","medium","high"]).optional(),source:I.enum(["prd","manual","historical"]).optional()}),actual:I.object({hours:I.number(),commits:I.number().optional(),linesAdded:I.number().optional(),linesRemoved:I.number().optional(),sessions:I.number().optional()}),variance:I.object({hours:I.number(),percentage:I.number(),reason:up.optional(),explanation:I.string().optional()})}),Fk=I.object({name:I.string(),baseline:I.number().nullable(),target:I.number(),actual:I.number(),unit:I.string(),achieved:I.boolean(),percentOfTarget:I.number()}),_k=I.object({criteria:I.string(),met:I.boolean(),notes:I.string().optional()}),Nk=I.object({metrics:I.array(Fk),acceptanceCriteria:I.array(_k),overallSuccess:$k,successScore:I.number().min(0).max(100)}),Lk=I.object({category:I.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:I.string(),actionable:I.boolean(),action:I.string().optional()}),Hk=I.object({whatWorked:I.array(I.string()),whatDidnt:I.array(I.string()),surprises:I.array(I.string()),recommendations:I.array(Lk)}),Uk=I.object({valueDelivered:I.number().min(1).max(10),userImpact:I.enum(["none","low","medium","high","critical"]),businessImpact:I.enum(["none","low","medium","high","critical"]),roiScore:I.number(),worthIt:Mk,worthItReason:I.string().optional(),alternativeConsidered:I.string().optional(),betterAlternativeExists:I.boolean().optional()}),dp=I.object({id:I.string(),taskId:I.string(),description:I.string(),estimatedMinutes:I.number().optional(),actualMinutes:I.number(),completedAsPlanned:I.boolean(),qualityScore:lp,blockers:I.array(I.string()),agentUsed:I.string().optional(),skillsUsed:I.array(I.string()).optional(),startedAt:I.string(),completedAt:I.string()}),Gk=I.object({id:I.string(),featureId:I.string(),featureName:I.string(),prdId:I.string().nullable(),version:I.string().optional(),branch:I.string().optional(),prUrl:I.string().optional(),effort:Ok,success:Nk.optional(),learnings:Hk,roi:Uk,rating:lp,taskOutcomes:I.array(dp).optional(),startedAt:I.string(),shippedAt:I.string(),reviewedAt:I.string().optional(),reviewedBy:I.string().optional(),legacy:I.boolean().optional()}),zk=I.object({totalFeatures:I.number(),averageEstimationAccuracy:I.number(),averageSuccessRate:I.number(),averageROI:I.number(),bySuccessLevel:I.object({exceeded:I.number(),met:I.number(),partial:I.number(),failed:I.number()}),variancePatterns:I.array(I.object({reason:up,count:I.number(),averageVariance:I.number()})),topLearnings:I.array(I.object({insight:I.string(),frequency:I.number()}))}),kj=I.object({outcomes:I.array(Gk),taskOutcomes:I.array(dp).optional(),aggregates:zk.optional(),lastUpdated:I.string(),lastAggregated:I.string().optional()}),pp={outcomes:[],taskOutcomes:[],lastUpdated:""},mp=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),gp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),fp=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Wk=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Bo=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Wk(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as We}from"zod";function Yk(){let r={};for(let e of Jk)r[e]="allow";for(let e of qk)r[e]="ask";for(let e of Kk)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Vo,vj,Bk,yc,Vk,xj,Jk,qk,Kk,Pj,hp=y(()=>{"use strict";Vo=We.enum(["allow","deny","ask"]),vj=We.enum(["read","write","delete","create"]),Bk=We.record(We.string(),Vo),yc=We.record(We.string(),Vo),Vk=We.object({enabled:We.boolean().default(!0),allowedDomains:We.array(We.string()).optional(),blockedDomains:We.array(We.string()).optional()}),xj=We.object({bash:Bk.optional(),files:We.object({read:yc.optional(),write:yc.optional(),delete:yc.optional()}).optional(),web:Vk.optional(),skills:We.record(We.string(),Vo).optional(),doomLoop:We.object({enabled:We.boolean().default(!0),maxRetries:We.number().default(3)}).optional(),externalDirectories:Vo.default("ask")}),Jk=["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*"],qk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Kk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Yk,"buildDefaultPermissions");Pj=Yk()});import{z as ut}from"zod";var Aj,jj,yp=y(()=>{"use strict";Aj=ut.object({projectId:ut.string(),name:ut.string(),repoPath:ut.string(),description:ut.string().optional(),version:ut.string().optional(),cliVersion:ut.string().optional(),techStack:ut.array(ut.string()),fileCount:ut.number(),commitCount:ut.number(),createdAt:ut.string(),lastSync:ut.string(),lastSyncCommit:ut.string().optional(),lastSyncBranch:ut.string().optional()}),jj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Xk,Qk,Zk,eS,tS,nS,sS,rS,oS,iS,aS,cS,lS,uS,dS,pS,mS,gS,Mj,Oj,wp=y(()=>{"use strict";Xk=A.enum(["planned","active","completed","shipped"]),Qk=A.enum(["low","medium","high"]),Zk=A.enum(["feature","breaking_change","refactor","infrastructure"]),eS=A.enum(["completed","active","planned"]),tS=A.enum(["planned","active","completed"]),nS=A.enum(["git","git-branch","manual","prd"]),sS=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),rS=A.object({id:A.string(),name:A.string(),status:eS,completedAt:A.string().optional()}),oS=A.object({goal:A.string(),phases:A.array(rS),successMetrics:A.array(A.string()).optional()}),iS=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),aS=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),cS=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),lS=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),uS=A.object({estimated:cS.nullable(),actual:lS.nullable()}),dS=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),pS=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:dS.optional(),status:tS,startDate:A.string().optional(),endDate:A.string().optional()}),mS=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Xk,impact:Qk,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(sS),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:iS.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:nS.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:uS.optional(),valueScore:A.number().optional(),commits:A.array(aS).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),gS=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()}),Mj=A.object({strategy:oS.nullable().optional(),features:A.array(mS),backlog:A.array(A.union([A.string(),gS])),lastUpdated:A.string(),quarters:A.array(pS).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),Oj={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 fS from"node:crypto";import{homedir as hS}from"node:os";import{join as yS}from"node:path";function he(){return fS.randomUUID()}var wS,kp=y(()=>{"use strict";l(he,"generateUUID");wS=yS(hS(),".prjct-cli","projects")});import{z as it}from"zod";var Wj,Sp=y(()=>{"use strict";Wj=it.object({sessionId:it.string(),projectId:it.string(),projectPath:it.string(),projectName:it.string().optional(),taskDescription:it.string(),taskStatus:it.enum(["active","paused"]),activeSubtaskIndex:it.number().optional(),subtaskCount:it.number().optional(),branch:it.string().optional(),linearId:it.string().optional(),filesModified:it.array(it.string()).optional(),durationWorkedSec:it.number().optional(),timestamp:it.string(),resumeHint:it.string()})});import{z as Q}from"zod";var kS,bp,SS,bS,CS,vS,xS,PS,TS,Cp,wc=y(()=>{"use strict";kS=Q.enum(["feature","fix","improvement","refactor"]),bp=Q.enum(["pass","warning","fail","skipped"]),SS=Q.enum(["added","changed","fixed","removed"]),bS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),CS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),vS=Q.object({description:Q.string(),type:SS.optional()}),xS=Q.object({lintStatus:bp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:bp.nullable().optional(),testDetails:Q.string().optional()}),PS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),TS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:kS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(vS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:PS.optional(),codeMetrics:CS.optional(),qualityMetrics:xS.optional(),quantitativeImpact:Q.string().optional(),duration:bS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),Cp=Q.object({shipped:Q.array(TS),lastUpdated:Q.string()})});import{z as T}from"zod";var ES,xp,IS,AS,jS,kc,Pp,DS,RS,Tp,vp,$S,MS,Ep,Ip,Ap,OS,FS,Xj,Jo=y(()=>{"use strict";Tr();ES=T.enum(["low","medium","high","critical"]),xp=T.enum(["feature","bug","improvement","chore"]),IS=T.enum(["active","backlog","previously_active"]),AS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),jS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),kc=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()}),Pp=T.object({output:T.string().min(1,"Subtask output is required"),summary:kc}),DS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:AS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:kc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),RS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Tp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(DS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:RS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:Pr.optional()}),vp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),$S=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()}),MS=T.object({taskId:T.string(),title:T.string(),classification:xp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(kc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:$S.optional()}),Ep=T.object({currentTask:Tp.nullable(),previousTask:vp.nullable().optional(),pausedTasks:T.array(vp).optional(),taskHistory:T.array(MS).optional(),lastUpdated:T.string()}),Ip=T.object({id:T.string(),description:T.string(),priority:ES,type:xp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:IS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Ap=T.object({tasks:T.array(Ip),lastUpdated:T.string()}),OS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),FS=T.object({type:jS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),Xj=T.object({projectId:T.string(),currentTask:Tp.nullable(),queue:T.array(Ip),stats:OS,recentActivity:T.array(FS),lastSync:T.string()})});import{z as ce}from"zod";var _S,NS,jp,tD,nD,sD,Pn,Dp,Ds=y(()=>{"use strict";_S=ce.enum(["improving","stable","declining"]),NS=ce.object({sprintNumber:ce.number(),startDate:ce.string(),endDate:ce.string(),pointsCompleted:ce.number(),tasksCompleted:ce.number(),avgVariance:ce.number(),estimationAccuracy:ce.number()}),jp=ce.object({category:ce.string(),avgVariance:ce.number(),taskCount:ce.number()}),tD=ce.object({totalPoints:ce.number(),sprints:ce.number(),estimatedDate:ce.string()}),nD=ce.object({sprints:ce.array(NS),averageVelocity:ce.number(),velocityTrend:_S,estimationAccuracy:ce.number(),overEstimated:ce.array(jp),underEstimated:ce.array(jp),lastUpdated:ce.string()}),sD=ce.object({sprintLengthDays:ce.number().min(1).max(90).default(7),startDay:ce.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ce.number().min(1).max(52).default(6),accuracyTolerance:ce.number().min(0).max(100).default(20)}),Pn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Dp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ht=y(()=>{"use strict";Xd();dc();Rr();mc();gc();Wo();Tr();hc();hp();yp();wp();kp();Sp();wc();Jo();Ds()});var tn,Sc,bt,Tn=y(()=>{"use strict";Ht();ae();fe();tn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Sc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=he(),s=C();return R.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return R.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(he(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?R.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):R.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=R.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=R.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(R.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);R.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return R.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},bt=new Sc});var Rp=y(()=>{"use strict"});var qo,$p=y(()=>{"use strict";qo={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 Rs,Ko=y(()=>{"use strict";Rs={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 Mp=y(()=>{"use strict"});var Op=y(()=>{"use strict";Mp()});function Yo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var O,Fp,$s=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"},Fp=["frontend","backend","devops","docs","testing","database","general"];l(Yo,"calculateConfidence")});var bc=y(()=>{"use strict"});var Cc=y(()=>{"use strict";Rp();$p();Ko();N();Op();$s();bc()});function Ms(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return GS[r]}var oe,vc,xc,Xo,GS,jt,_p,$r,mn=y(()=>{"use strict";oe={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},vc=["feature","spec","design","refactor","migrate"],xc=["ship","cleanup","git","migrate"],Xo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],GS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ms,"getTimeout");jt={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},_p={HISTORY_MAX:100},$r={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 WS(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(zS.has(r)||r.includes("prjct"))return{level:Os.debug,name:"debug"};let e=Os[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Qo(r,e,t){return Np>=r?(...n)=>console[t](e,...n):VS}var Os,zS,Np,BS,VS,JS,H,Vn=y(()=>{"use strict";Os={error:0,warn:1,info:2,debug:3},zS=new Set(["1","true","*"]);l(WS,"getLogLevel");({level:Np,name:BS}=WS()),VS=l(()=>{},"noop");l(Qo,"createLogMethod");JS={error:Qo(Os.error,"[prjct:error]","error"),warn:Qo(Os.warn,"[prjct:warn]","warn"),info:Qo(Os.info,"[prjct:info]","log"),debug:Qo(Os.debug,"[prjct:debug]","log"),isEnabled:l(()=>Np>=0,"isEnabled"),level:l(()=>BS,"level")},H=JS});var Zo,qS,Lp=y(()=>{"use strict";dn();fe();Cc();mn();Vn();Zo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=_p.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(qo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(qo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw H.error("Event callback error:",n),n}}async logEvent(e){try{R.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",re(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},qS=new Zo});var ei,ti,Hp=y(()=>{"use strict";ke();ae();Te();ei=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await zn(t,[])??[];n.push(e),await Er(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await zn(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await Er(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:C(),success:!0};await Er(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await zn(t,null)}},ti=new ei});var Pc=y(()=>{"use strict";Lp();Hp()});var Ut,ni=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,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Be,nn=y(()=>{"use strict";Pc();ni();ae();fe();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=R.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){R.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await ti.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return R.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Tc,et,Mr=y(()=>{"use strict";Ht();mc();ae();Tn();nn();Tc=class extends Be{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",tp)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:he(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Cn(tn.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},et=new Tc});var Ec,Ee,Or=y(()=>{"use strict";Ht();Jo();ae();Tn();nn();Ec=class extends Be{static{l(this,"QueueStorage")}constructor(){super("queue.json",Ap)}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:he(),createdAt:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id:he(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Cn(tn.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Ee=new Ec});var Ic,gt,Fr=y(()=>{"use strict";Ht();wc();ae();Tn();nn();Ic=class extends Be{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Cp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:he(),shippedAt:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Cn(tn.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},gt=new Ic});var _r,Ac,Jn,jc=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"}},Ac=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=_r[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return _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}`}})}},Jn=new Ac});var Dc,L,Nr=y(()=>{"use strict";Ht();Jo();ae();jc();Tn();nn();Dc=class extends Be{static{l(this,"StateStorage")}constructor(){super("state.json",Ep)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Jn.getCurrentState(e),s=Jn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:he()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];bt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Pp.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 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
- `);if(n.length<=t)return s;let r=n.slice(0,t),o=n.length-t;return`${r.join(`
264
+ `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new Dc});import YS from"node:fs/promises";import XS from"node:path";import{Hono as QS}from"hono";function ZS(r){return E.getGlobalProjectPath(r)}function Up(r,e){let t=new QS,n=ZS(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Ee.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await et.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=R.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await gt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Ee.read(r),et.read(r),gt.read(r)]),u=R.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=XS.join(n,"context",`${o}.md`),c=await YS.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||H.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Gp=y(()=>{"use strict";ke();fe();Mr();Or();Fr();Nr();N();Vn();l(ZS,"getProjectDataPath");l(Up,"createRoutes")});import Fs from"node:fs/promises";import eb from"node:path";import{Hono as tb}from"hono";function si(r){return R.getDoc(r,"project")}async function Rc(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function zp(){let r=new tb;return r.get("/projects",async e=>{try{await Fs.mkdir(_s,{recursive:!0});let n=(await Fs.readdir(_s,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=si(o),a=await L.read(o),c=await Ee.read(o),u=await et.read(o),d=await gt.read(o),m=a?.currentTask,p=await Rc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(si(t)),L.read(t),Ee.read(t),et.read(t),gt.read(t)]),c=R.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await Rc(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),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===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await et.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Fs.mkdir(_s,{recursive:!0});let n=(await Fs.readdir(_s,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await Ee.read(c),m=await et.read(c),p=await gt.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Fs.mkdir(_s,{recursive:!0});let s=(await Fs.readdir(_s,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=si(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=si(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Rc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var nb,_s,Wp=y(()=>{"use strict";ke();fe();Mr();Or();Fr();Nr();nb=E.getGlobalBasePath(),_s=eb.join(nb,"projects");l(si,"getProjectConfig");l(Rc,"calculateDuration");l(zp,"createExtendedRoutes")});import{streamSSE as sb}from"hono/streaming";function Vp(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Bp&&t(i)},rb),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return sb(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)}},ob),p=setTimeout(()=>{t(a)},Bp);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}var Bp,rb,ob,Jp=y(()=>{"use strict";bc();Bp=3600*1e3,rb=300*1e3,ob=3e4;l(Vp,"createSSEManager")});var qp={};we(qp,{DEFAULT_PORT:()=>oi,createServer:()=>ri,startServer:()=>lb});import{Hono as ib}from"hono";import{cors as ab}from"hono/cors";import{logger as cb}from"hono/logger";function ri(r){let e=new ib,t=Vp();r.enableCors!==!1&&e.use("*",ab({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",cb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Up(r.projectId,r.projectPath);e.route("/api",n);let s=zp();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(jr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${jr()?"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 lb(r,e,t=oi){let n=ri({port:t,projectId:r,projectPath:e});return await n.start(),n}var oi,$c=y(()=>{"use strict";cc();Gp();Wp();Jp();l(ri,"createServer");oi=3478;l(lb,"startServer")});import qn from"chalk";var Kp,ub,db,Gt,Yp=y(()=>{"use strict";Je();Kp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ub=80,db={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Kp,speed:ub},cli:{header:l(()=>`${qn.cyan.bold("\u26A1")} ${qn.cyan("prjct")}`,"header"),footer:l(()=>qn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${qn.cyan("\u26A1")} ${qn.cyan("prjct")} ${qn.cyan(Kp[r%10])} ${qn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>Ro(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Ro(r).signature,"getSignature")},Gt=db});function Kn(r,e){return{...Rs[r],...e}}function Lr(r,e,t){return{message:r,hint:e,...t}}var Hr=y(()=>{"use strict";Ko();Ko();l(Kn,"getError");l(Lr,"createError")});var Qp={};we(Qp,{ERRORS:()=>Rs,ICONS:()=>En,OUTPUT_TIERS:()=>Xp,createError:()=>Lr,default:()=>h,formatForHuman:()=>hb,getError:()=>Kn,getOutputTier:()=>mb,getTierConfig:()=>ai,isQuietMode:()=>fb,limitLines:()=>ii,setOutputTier:()=>pb,setQuietMode:()=>gb});import se from"chalk";function pb(r){Ls=r}function mb(){return Ls}function ai(){return Xp[Ls]}function gb(r){dt=r}function fb(){return dt}function ii(r,e){let t=e??ai().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
265
+ `);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
266
266
  `)}
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+=`
267
+ ${se.dim(`...${o} more lines`)}`}function hb(r){let e=ai();if(Ls==="silent")return"";if(Ls==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Dt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Dt(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&&Ls==="compact"&&o.push(se.dim(String(t.url))),ii(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} ${Dt(String(a.title),jt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(se.dim(`...${o.length-e.maxLines} more`)),i.join(`
269
+ `)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?ii(s.map(o=>`${o}: ${Dt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
270
+ `),e.maxLines):ii(JSON.stringify(r,null,2),e.maxLines)}var e$,Mc,Xp,Ls,En,Ns,Oc,dt,Dt,yb,wb,h,zt=y(()=>{"use strict";Yp();mn();Hr();Hr();e$=Gt.spinner.frames,Mc=Gt.spinner.speed,Xp={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}},Ls="compact";l(pb,"setOutputTier");l(mb,"getOutputTier");l(ai,"getTierConfig");En={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")},Ns=null,Oc=0,dt=!1;l(gb,"setQuietMode");l(fb,"isQuietMode");Dt=l((r,e)=>{let t=e??(ai().maxCharsPerLine||jt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(ii,"limitLines");l(hb,"formatForHuman");yb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(jt.CLEAR_WIDTH)}\r`):!0,"clear"),wb={start(){return dt||console.log(Gt.cli.header()),this},end(){return dt||console.log(Gt.cli.footer()),this},spin(r){return dt?this:(this.stop(),process.stdout.isTTY?(Ns=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Oc++,Dt(r,jt.SPINNER_MSG))}`)},Mc),this):(process.stdout.write(`${Gt.cli.spin(0,Dt(r,jt.SPINNER_MSG))}
271
+ `),this))},done(r,e){if(this.stop(),!dt){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(`${En.success} ${Dt(r,jt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${En.fail} ${Dt(r,jt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Kn(r):r;return console.error(),console.error(`${En.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),dt||console.log(`${En.warn} ${Dt(r,jt.WARN_MSG)}`),this},info(r){return this.stop(),dt||console.log(`${En.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!dt&&e&&console.log(`${En.debug} ${se.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),dt)return this;let t=e.bullet||En.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),dt||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(se.dim(s)),console.log(se.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),dt)return this;let t=e.split(`
272
+ `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(se.dim(`\u250C${s}\u2510`)),console.log(`${se.dim("\u2502")} ${se.bold(r.padEnd(n))} ${se.dim("\u2502")}`),console.log(se.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${se.dim("\u2502")} ${o.padEnd(n)} ${se.dim("\u2502")}`);return console.log(se.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),dt?this:(console.log(`
273
+ ${se.bold(r)}`),console.log(se.dim("\u2500".repeat(r.length))),this)},stop(){return Ns&&(clearInterval(Ns),Ns=null,yb()),this},step(r,e,t){if(dt)return this;this.stop();let n=se.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Ns=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Oc++,`${n} ${Dt(t,jt.STEP_MSG)}`)}`)},Mc),this):(process.stdout.write(`${Gt.cli.spin(0,`${n} ${Dt(t,jt.STEP_MSG)}`)}
274
+ `),this)},progress(r,e,t){if(dt)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=se.cyan("\u2588".repeat(s))+se.dim("\u2591".repeat(o)),a=t?` ${Dt(t,jt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Ns=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Oc++,`[${i}] ${n}%${a}`)}`)},Mc),this):(process.stdout.write(`${Gt.cli.spin(0,`[${i}] ${n}%${a}`)}
275
+ `),this)}},h=wb});var tm={};we(tm,{default:()=>Sb,sessionTracker:()=>In});var kb,Zp,em,Fc,In,Sb,ci=y(()=>{"use strict";fe();ae();kb=1800*1e3,Zp=50,em=200,Fc=class{static{l(this,"SessionTracker")}async read(e){try{return R.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){R.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:kb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Zp&&(s.current.commands=s.current.commands.slice(-Zp)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>em&&(s.current.files=s.current.files.slice(-em)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:pn(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:pn(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}},In=new Fc,Sb=In});var sm={};we(sm,{default:()=>Yn,performanceTracker:()=>nm});var _c,nm,Yn,li=y(()=>{"use strict";fe();_c=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){q.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)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 s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,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=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,b)=>k+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},nm=new _c,Yn=nm});function Lc(r){if(Fp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ui))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var Nc,ui,Xn,Ur,Gr,zr=y(()=>{"use strict";fe();$s();ae();Nc={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)},ui={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(Lc,"resolveCanonicalDomains");Xn=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),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Ur=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()}},Gr=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(s=>JSON.parse(s.data))}}});var Wr,Hc=y(()=>{"use strict";fe();$s();ae();zr();Wr=class r extends Xn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Yo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Yo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Yo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=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,Uc=y(()=>{"use strict";Ht();$s();ae();zr();Qn=class extends Xn{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:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:he(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),x=(p.tags||[]).filter(M=>D.includes(M));g.tagMatch=Math.min(20,x.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),x=0;for(let M of D)p.content.toLowerCase().includes(M)&&(x+=2),p.title.toLowerCase().includes(M)&&(x+=3);g.keywords=Math.min(15,x)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=Nc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ui[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return Lc(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(s=>s.length>2&&!n.has(s))}_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(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){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}${s?`
276
+ Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Gc,bb,Ie,Hs=y(()=>{"use strict";zr();Hc();Uc();zr();Hc();Uc();Gc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Qn,this._patternStore=new Wr,this._historyStore=new Gr,this._sessionStore=new Ur}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},bb=new Gc,Ie=bb});import{exec as Cb}from"node:child_process";import Ct from"node:fs/promises";import Wt from"node:path";import{promisify as vb}from"node:util";var Zn,zc,xb,Ye,rm=y(()=>{"use strict";N();Zn=vb(Cb),zc=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Wt.join(this.projectPath,"package.json"),t=await Ct.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Wt.join(this.projectPath,"Cargo.toml");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=Wt.join(this.projectPath,"requirements.txt");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=Wt.join(this.projectPath,"go.mod");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=Wt.join(this.projectPath,"Gemfile");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=Wt.join(this.projectPath,"mix.exs");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=Wt.join(this.projectPath,"pom.xml");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=Wt.join(this.projectPath,"composer.json"),t=await Ct.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Wt.join(this.projectPath,"pyproject.toml");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Zn('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 s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Ct.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(v(e))return[];throw e}}async listDirectories(){try{return(await Ct.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(v(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Zn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Zn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Zn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Zn('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 Zn('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 Ct.access(Wt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=Wt.join(this.projectPath,e);return await Ct.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Zn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
278
+ `).filter(Boolean)}catch{return[]}}},xb=new zc,Ye=xb});import Bc from"node:fs";import Pb from"node:fs/promises";import di from"node:path";function Vc(){if(om)return Wc;om=!0;let r=di.join(pe,"dist","templates.json");try{let e=Bc.readFileSync(r,"utf-8");return Wc=JSON.parse(e),Wc}catch{return null}}function Eb(r){let e=es.indexOf(r);e>-1&&es.splice(e,1),es.push(r)}function Ib(){for(;Us.size>=Tb&&es.length>0;){let r=es.shift();r&&Us.delete(r)}}function pi(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
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:s.trim()}}async function im(r){if(Us.has(r))return Eb(r),Us.get(r);let e,t=Vc();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=di.join(pe,"templates","commands",`${r}.md`);try{e=await Pb.readFile(s,"utf-8")}catch{throw Mo.notFound(r)}}let n=pi(e);return Ib(),Us.set(r,n),es.push(r),n}async function Ab(r){return(await im(r)).frontmatter["allowed-tools"]||[]}function jb(){Us.clear(),es.length=0}function ye(r){let e=Vc();if(e?.[r])return e[r];let t=di.join(pe,"templates",r);try{return Bc.readFileSync(t,"utf-8")}catch{return null}}function An(r){let e=Vc();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=di.join(pe,"templates",r);try{return Bc.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Tb,Us,es,Wc,om,Db,Jc,jn=y(()=>{"use strict";dn();lt();Tb=50,Us=new Map,es=[],Wc=null,om=!1;l(Vc,"loadBundle");l(Eb,"updateLruOrder");l(Ib,"evictLru");l(pi,"parseFrontmatter");l(im,"load");l(Ab,"getAllowedTools");l(jb,"clearCache");l(ye,"getTemplateContent");l(An,"listTemplates");Db={load:im,parseFrontmatter:pi,getAllowedTools:Ab,clearCache:jb,getTemplateContent:ye,listTemplates:An},Jc=Db});import X from"node:fs/promises";import Kc from"node:os";import ne from"node:path";async function Rb(){try{let r=ye("global/modules/module-config.json");if(r)return JSON.parse(r);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 $b(r){let e=await Rb();if(!e){let i=ye("global/CLAUDE.md");if(i)return i;let a=ne.join(pe,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ye("global/CLAUDE.md");if(a)return a;let c=ne.join(pe,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=ye(`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 Mb(){try{let r=ne.join(Kc.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=An("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ye(s);if(o){let i=ne.basename(s);await X.writeFile(ne.join(r,i),o,"utf-8")}}return{success:!0}}let t=ne.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=ne.join(t,s),i=ne.join(r,s),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function Ob(){let r=(Je(),It(mt)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await X.mkdir(e.configDir,{recursive:!0});let s=ne.join(e.configDir,e.contextFile),o=ne.join(pe,"templates","global",e.contextFile),i="";try{let u=ye(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await $b()}catch{let d=ye("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=ye("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(s,"utf-8"),c=!0}catch(u){if(v(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await X.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
281
+
282
+ ${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function am(){let r=Kc.homedir();return{claude:{commands:ne.join(r,".claude","commands","p"),config:ne.join(r,".claude"),router:ne.join(r,".claude","commands","p.md")},gemini:{commands:ne.join(r,".gemini","commands"),config:ne.join(r,".gemini"),router:ne.join(r,".gemini","commands","p.toml")}}}var qc,Fb,Ae,Dn=y(()=>{"use strict";jn();N();lt();l(Rb,"loadModuleConfig");l($b,"composeGlobalTemplate");l(Mb,"installDocs");l(Ob,"installGlobalConfig");qc=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Kc.homedir(),this.templatesDir=ne.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Je(),It(mt)).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(v(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=An("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Je(),It(mt)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=ne.join(this.claudeCommandsPath,a),u=ye(`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(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=ne.join(this.claudeCommandsPath,s);await X.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(v(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(ye(`commands/${e}.md`))return!0;try{let n=ne.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(v(n))return!1;throw n}}async installRouter(){let t=await(Je(),It(mt)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=ne.join(t.configDir,"commands",n);await X.mkdir(ne.dirname(s),{recursive:!0});let o=ye(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=ne.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(s,a,"utf-8"),!0}catch(s){if(v(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Je(),It(mt)).getActiveProvider(),n=ne.join(t.configDir,"commands"),s=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(ne.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(v(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=ne.join(this.claudeCommandsPath,o),a=n.includes(o),c=ye(`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?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Ob()}async installDocs(){return Mb()}};l(am,"getProviderPaths");Fb=new qc,Ae=Fb});import{z as _e}from"zod";function dm(r,e="default"){let t=cm[e]||cm.default;return r/1e3*t}function mi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var _b,Nb,lm,um,cm,gi=y(()=>{"use strict";_b=_e.object({date:_e.string(),tokensSaved:_e.number(),syncs:_e.number(),avgCompressionRate:_e.number(),totalDuration:_e.number()}),Nb=_e.object({agentName:_e.string(),usageCount:_e.number(),tokensSaved:_e.number()}),lm=_e.object({totalTokensSaved:_e.number(),avgCompressionRate:_e.number(),syncCount:_e.number(),watchTriggers:_e.number(),avgSyncDuration:_e.number(),totalSyncDuration:_e.number(),agentUsage:_e.array(Nb),dailyStats:_e.array(_b),firstSync:_e.string(),lastUpdated:_e.string()}),um={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},cm={"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(dm,"estimateCostSaved");l(mi,"formatCost")});function Lb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Hb(r){let e=[],t=Lb(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Yc,o+i.length);if(c===-1)continue;let u=c+Yc.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Xc(r,e){let t=Hb(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
283
283
 
284
284
  ---
285
285
 
@@ -287,12 +287,12 @@ ${i}`;return await X.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r
287
287
 
288
288
  `,n+=`_The sections below are preserved during sync. Edit freely._
289
289
 
290
- `;for(let r of t)n+=r.content,n+=`
290
+ `;for(let s of t)n+=s.content,n+=`
291
291
 
292
292
  `;return`${n.trimEnd()}
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:
293
+ `}function Qc(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
294
+ `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(Yc)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var Yc,Zc=y(()=>{"use strict";Yc="<!-- /prjct:preserve -->";l(Lb,"createPreserveStartRegex");l(Hb,"extractPreservedSections");l(Xc,"mergePreservedSections");l(Qc,"validatePreserveBlocks")});function Br(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Ub.has(e.code))return!0;if(e.code&&mm.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 hi(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&mm.has(e.code))}function pm(r,e,t){let n=Rn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Rn.delete(r),!1):!0:!1}function el(r,e){let t=Rn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Rn.set(r,t)}function Gb(r){Rn.delete(r)}var Ub,mm,Rn,fi,gm,Vr,yi=y(()=>{"use strict";Ub=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),mm=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Br,"isTransientError");l(hi,"isPermanentError");Rn=new Map;l(pm,"isCircuitOpen");l(el,"recordFailure");l(Gb,"recordSuccess");fi=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(pm(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Gb(t),o}catch(o){if(n=o,s++,hi(o))throw el(t,this.options.circuitBreakerThreshold),o;if(!(Br(o)&&s<this.options.maxAttempts))throw el(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw el(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Br(e)}isCircuitOpen(e){return pm(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Rn.get(e)}resetCircuit(e){Rn.delete(e)}resetAllCircuits(){Rn.clear()}},gm=new fi({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Vr=new fi({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var fm=y(()=>{"use strict";Zc();yi()});import wi from"node:fs/promises";import tl from"node:path";var nl,hm,ym=y(()=>{"use strict";qe();ke();N();nl=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=E.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await wi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await wi.readFile(tl.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return v(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=tl.join(this.agentsPath,`${e}.md`),n=await wi.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return v(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=tl.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 wi.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},hm=nl});import wm from"node:path";async function Bb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(wm.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(wm.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Vb(){return{...zb}}function Jb(){return{...Wb}}async function km(){return ki||(ki=await Bb()?Vb():Jb(),ki)}var ki,zb,Wb,Sm=y(()=>{"use strict";Te();ki=null,zb={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}},Wb={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(Bb,"isClaudeEnvironment");l(Vb,"getClaudeAgent");l(Jb,"getTerminalAgent");l(km,"detect")});import Jr from"node:fs/promises";var sl,bm,Cm=y(()=>{"use strict";N();sl=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 Jr.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 Jr.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 Jr.readdir(e)}async fileExists(e){try{return await Jr.access(e),!0}catch(t){if(v(t))return!1;throw t}}async createDirectory(e){await Jr.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
296
  ${e.map((t,n)=>`${n+1}. ${t}`).join(`
297
297
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
298
298
 
@@ -313,7 +313,7 @@ ${e.recentFeatures||""}`}getHelpContent(e){let t={debugging:`\u{1F50D} 1. Isolat
313
313
  2. Optimize slowest parts
314
314
  3. Cache expensive operations`,default:`\u{1F4A1} 1. Break into smaller tasks
315
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?
316
+ 3. Ship it`},n=Object.keys(t).find(s=>e.toLowerCase().includes(s))||"default";return t[n]}suggestNextAction(e){return{taskCompleted:`What's next?
317
317
  \u2022 "start [task]" \u2192 Begin working
318
318
  \u2022 "ship feature" \u2192 Track & celebrate
319
319
  \u2022 "add idea" \u2192 Brainstorm
@@ -337,98 +337,98 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
337
337
 
338
338
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
339
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:`
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}}},bm=sl});var Kb,Si,Gs,vm=y(()=>{"use strict";ym();dn();Sm();Cm();yi();Kb=["claude"],Si=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new hm}async initialize(){return this.agent?this.agent:await gm.execute(async()=>{if(this.agentInfo=await km(),!this.agentInfo?.isSupported)throw Ir.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Kb.includes(e))throw Ir.notSupported(this.agentInfo?.type??"unknown");return this.agent=new bm,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
341
341
  AGENTIC EXECUTION:
342
342
  - Read: templates/agentic/orchestrator.md
343
343
  - Analyze task: "${e}"
344
- - Available specialists: ${r.join(", ")}
344
+ - Available specialists: ${s.join(", ")}
345
345
  - Claude decides which agent(s) to use
346
346
  - Always prefer specialists over generalist
347
347
  - Fragment complex tasks into subtasks
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(`
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}},Gs=new Si});var bi,Ci,xm=y(()=>{"use strict";bi=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"}},Ci=new bi});import Yb from"node:crypto";import vi from"node:fs/promises";import Pm from"node:path";function Tm(){return{version:Bt,lastUpdated:"",checksums:{}}}var Bt,rl,tt,qr=y(()=>{"use strict";ke();N();ae();fe();Bt="1.0.0";l(Tm,"getDefaultChecksums");rl=class{static{l(this,"IndexStorage")}getIndexPath(e){return Pm.join(E.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await vi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Bt?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 Tm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await vi.readFile(e);return Yb.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Bt,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{R.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await vi.readdir(t);await Promise.all(n.map(s=>vi.unlink(Pm.join(t,s))))}catch(n){if(!v(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Bt?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!==Bt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=R.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=R.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},tt=new rl});var Em,Xb,xi,Qb,Im=y(()=>{"use strict";qr();Em=8e4,Xb={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"]},xi=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||Em,[c,u,d]=await Promise.all([tt.readIndex(t),tt.readDomains(t),tt.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let x of m){let M=d.domainIndex[x]||[];for(let F of M)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let M of x)p.add(M)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,M)=>M.score-x.score);let f=0,k=[];for(let x of g){let M=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+M>a||k.length>=s)break;k.push(x),f+=M}let b=Math.ceil(c.relevantFiles.reduce((x,M)=>x+M.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(),s=new Set;for(let[o,i]of Object.entries(Xb))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await tt.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await tt.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return tt.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||Em,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},Qb=new xi});import Am from"node:path";var ol,Pi,Zb,jm=y(()=>{"use strict";qr();ae();ol=[{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"}],Pi=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of ol)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Am.dirname(i.path);n.get(u).add(`**/${Am.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=ol.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of ol)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Bt,projectId:e,domains:t,discoveredAt:s};await tt.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:Bt,lastUpdate:s,fileCategories:n,domainIndex:i};await tt.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([tt.readDomains(e),tt.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await tt.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await tt.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:Bt,lastUpdate:C(),fileCategories:u,domainIndex:d};await tt.writeCategories(e,m)}return o}},Zb=new Pi});import il from"node:path";var al,eC,tC,Ti,Dm,cl=y(()=>{"use strict";al=30,eC=[/^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$/],tC=[/^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],Ti=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=al){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=il.basename(e.path);for(let n of eC)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=il.basename(e.path);for(let s of tC)if(s.test(t))return 15;let n=il.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},Dm=new Ti});import{execSync as ll}from"node:child_process";var Ei,ul,Ii,zs,Ai=y(()=>{"use strict";Hr();Ei={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},ul=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=Ei[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Ei[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Ii(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=Ei[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
349
+ `);throw new Ii({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(Ei),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=ll(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Lr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return ll(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return ll(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Lr(`${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())}},Ii=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}},zs=new ul});import{exec as nC}from"node:child_process";import{promisify as sC}from"node:util";var lO,Rm=y(()=>{"use strict";mn();Ai();lO=sC(nC)});var ji,ft,dl=y(()=>{"use strict";qe();Tn();fe();ji=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;q.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?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 s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?q.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;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(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=tn.MEMORY_MAX_ENTRIES)return 0;let s=n-tn.MEMORY_MAX_ENTRIES,o=q.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);bt.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),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},ft=new ji});var $m=y(()=>{"use strict";ke();Te()});import{exec as oC}from"node:child_process";import{promisify as iC}from"node:util";var PO,Mm=y(()=>{"use strict";qr();ae();cl();PO=iC(oC)});import{createHash as aC}from"node:crypto";var pl,vt,Di=y(()=>{"use strict";dc();ae();nn();pl=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"};uc.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return uc.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await Qd(s,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return aC("sha256").update(JSON.stringify(t)).digest("hex")}},vt=new pl});var ml,gn,Kr=y(()=>{"use strict";gi();ae();nn();ml=class extends Be{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",lm)}getDefault(){return{...um}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(M=>M.agentName===D);x>=0?b[x]={...b[x],usageCount:b[x].usageCount+1,tokensSaved:b[x].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:k,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:dm(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},gn=new ml});import pt from"node:fs/promises";import me from"node:path";async function Yr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(R.exists(r)&&R.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=E.getGlobalProjectPath(r),s=me.join(n,"storage"),o=me.join(n,"index"),i=me.join(n,"memory");t.backupDir=await cC(s,o,i),R.getDb(r);for(let{filename:a,key:c}of hl){let u=me.join(s,a),d=await ts(u);if(d===null){t.skippedFiles.push(a);continue}try{R.setDoc(r,c,d),Om(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of fl){let u=me.join(o,a),d=await ts(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{R.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Fm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await hC(r,o,t),await yC(r,o,t),await wC(r,i,t),await kC(r,i,t),t.errors.length===0&&await SC(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function cC(r,e,t){let n=me.join(r,"backup");return await pt.mkdir(n,{recursive:!0}),await pt.mkdir(me.join(n,"index"),{recursive:!0}),await pt.mkdir(me.join(n,"memory"),{recursive:!0}),await gl(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await gl(e,me.join(n,"index")),await gl(t,me.join(n,"memory")),n}async function gl(r,e,t){try{let n=await pt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=me.join(r,s.name),i=me.join(e,s.name);await pt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Om(r,e,t){switch(e){case"state":lC(r,t);break;case"queue":uC(r,t);break;case"ideas":dC(r,t);break;case"shipped":pC(r,t);break;case"metrics":mC(r,t);break;case"analysis":gC(r,t);break}}function lC(r,e){let t=R.getDb(r),n=t.prepare(`
351
351
  INSERT OR REPLACE INTO tasks
352
352
  (id, description, type, status, parent_description, branch, linear_id,
353
353
  linear_uuid, session_id, feature_id, started_at, completed_at,
354
354
  shipped_at, paused_at, pause_reason, pr_url, expected_value, data)
355
355
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
356
- `),r=t.prepare(`
356
+ `),s=t.prepare(`
357
357
  INSERT OR REPLACE INTO subtasks
358
358
  (id, task_id, description, status, domain, agent, sort_order,
359
359
  depends_on, started_at, completed_at, output, summary)
360
360
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
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(`
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];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function uC(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
362
362
  INSERT OR REPLACE INTO queue_tasks
363
363
  (id, description, type, priority, section, created_at, completed, completed_at,
364
364
  feature_id, feature_name)
365
365
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
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(`
366
+ `);for(let o of t)s.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function dC(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
367
367
  INSERT OR REPLACE INTO ideas
368
368
  (id, text, status, priority, tags, added_at, converted_to, details, data)
369
369
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
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(`
370
+ `);for(let o of t)s.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function pC(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
371
371
  INSERT OR REPLACE INTO shipped_features
372
372
  (id, name, shipped_at, version, description, type, duration, data)
373
373
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
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(`
374
+ `);for(let o of t)s.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function mC(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
375
375
  INSERT OR REPLACE INTO metrics_daily
376
376
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
377
377
  VALUES (?, ?, ?, ?, ?)
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(`
378
+ `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function gC(r,e){let n=R.getDb(r).prepare(`
379
379
  INSERT OR REPLACE INTO analysis
380
380
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
381
381
  VALUES (?, ?, ?, ?, ?, ?, ?)
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(`
382
+ `),s=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&s(e.draft,"draft"),e.sealed&&s(e.sealed,"sealed")}function Fm(r,e,t){e==="categories-cache"&&fC(r,t)}function fC(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
383
383
  INSERT OR REPLACE INTO index_files
384
384
  (path, categories, domain, score, size, mtime, language)
385
385
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
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(`
386
+ `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function hC(r,e,t){let n=me.join(e,"checksums.json"),s=await ts(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=R.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function yC(r,e,t){let n=me.join(e,"file-scores.json"),s=await ts(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=R.getDb(r),a=i.prepare(`
387
387
  INSERT OR REPLACE INTO index_files
388
388
  (path, score, size, mtime, language, categories, domain)
389
389
  VALUES (?, ?, ?, ?, NULL,
390
390
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
391
391
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
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(`
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 wC(r,e,t){let n=me.join(e,"events.jsonl");try{let o=(await pt.readFile(n,"utf-8")).split(`
393
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=R.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function kC(r,e,t){let n=me.join(e,"learnings.jsonl");try{let o=(await pt.readFile(n,"utf-8")).split(`
394
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=R.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function SC(r,e,t,n){let s=l(async(i,a)=>{try{await pt.unlink(i)}catch(c){v(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of hl)await s(me.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(me.join(e,i),`cleanup:index/${i}`);await s(me.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(me.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function ts(r){try{let e=await pt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async function Ri(r){let e=E.getGlobalProjectPath(r),t=me.join(e,"storage"),n=0;R.getDb(r);for(let{filename:u,key:d}of hl){let m=me.join(t,u),p=await ts(m);if(p!==null){R.setDoc(r,d,p),Om(r,d,p);try{await pt.unlink(m)}catch{}n++}}let s=me.join(e,"project.json"),o=await ts(s);if(o!==null){R.setDoc(r,"project",o);try{await pt.unlink(s)}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 pt.readFile(d,"utf-8")).split(`
395
+ `).filter(f=>f.trim());if(p.length===0){await pt.unlink(d),n++;continue}let g=R.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let 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()}`,x=b.tags;f.run(D,x?.[0]??null,k,1,b.timestamp??new Date().toISOString())}catch{}})()}await pt.unlink(d),n++}catch{}}let a=me.join(e,"index"),c=[...fl.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=me.join(a,u),m=await ts(d);if(m===null)continue;let p=fl.find(g=>g.filename===u);p&&(R.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Fm(r,p.key,m));try{await pt.unlink(d)}catch{}n++}return n}var hl,fl,$i=y(()=>{"use strict";ke();N();fe();hl=[{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"}],fl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Yr,"migrateJsonToSqlite");l(cC,"createBackup");l(gl,"copyFiles");l(Om,"populateNormalized");l(lC,"populateTasksFromState");l(uC,"populateQueueTasks");l(dC,"populateIdeas");l(pC,"populateShippedFeatures");l(mC,"populateMetricsDaily");l(gC,"populateAnalysis");l(Fm,"populateIndexTables");l(fC,"populateCategoriesIndex");l(hC,"migrateChecksums");l(yC,"migrateFileScores");l(wC,"migrateEventsJsonl");l(kC,"migrateLearningsJsonl");l(SC,"cleanupJsonFiles");l(ts,"readJsonSafe");l(Ri,"sweepLegacyJson")});var _m=y(()=>{"use strict";Pc();N()});var yl,wl,kl=y(()=>{"use strict";Ds();nn();yl=class extends Be{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Dp,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}},wl=new yl});var Vt=y(()=>{"use strict";Di();Tn();fe();Mr();qr();Kr();$i();Or();Fr();Nr();_m();nn();kl()});function bC(){return`\u26A1 prjct
396
+
397
+ ---`}function CC(){return`---
398
+ \u26A1 prjct \xB7 v${Wn()}`}function Se(...r){return vC(bC(),...r.filter(Boolean),CC())}function Sl(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
399
+ `)}function nt(r,e,t=3){return`### ${r}
400
+ ${e}`}function xt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
401
+ `)}function bl(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
402
+ > ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Nm(r,e){let t=["#","Status","Description"],n=r.map((s,o)=>{let i=String(o+1),a;s.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${s.description}${c}`]});return`### Subtasks
403
+ ${Sl(t,n)}`}function Lm(r){return r.length===0?"":`### Relevant Files
404
+ ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
405
+ `)}`}function Hm(r){return`### Rules
406
+ ${xt(r)}`}function Xe(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
407
+ ${Sl(e,t)}`}function Rt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Sl(t,n)}function Jt(r,e){return e?`## \u2705 ${r}
408
+ > ${e}`:`## \u2705 ${r}`}function Um(r){return`> \u26A0\uFE0F **${r}**`}function vC(...r){return r.filter(Boolean).join(`
409
+
410
+ `)}function sn(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Ws=y(()=>{"use strict";lt();l(bC,"mdHeader");l(CC,"mdFooter");l(Se,"mdOutput");l(Sl,"mdTable");l(nt,"mdSection");l(xt,"mdList");l(bl,"mdTaskHeader");l(Nm,"mdSubtasks");l(Lm,"mdRelevantFiles");l(Hm,"mdRules");l(Xe,"mdNextSteps");l(Rt,"mdStats");l(Jt,"mdDone");l(Um,"mdWarn");l(vC,"mdJoin");l(sn,"mdActionRequired")});import Xr from"chalk";function Pt(r,e={}){if(e.quiet)return;let t=zm[r]||"idle",n=Jn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Gm[o]||o}));console.log(Xr.dim(`
411
+ Next:`));for(let o of s){let i=Xr.cyan(o.cmd.padEnd(12));console.log(Xr.dim(` ${i} \u2192 ${o.desc}`))}}function Mi(r){let e=zm[r]||"idle";return Jn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Gm[n]||n}))}function Qr(r){let e=Jn.getStateInfo(r);console.log(Xr.dim(`\u{1F4CD} State: ${Xr.white(r.toUpperCase())} - ${e.description}`))}var Gm,zm,Bs=y(()=>{"use strict";jc();Gm={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"},zm={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(Mi,"getNextSteps");l(Qr,"showStateInfo")});import*as ie from"@clack/prompts";import ns from"chalk";var Oi,Wm,Vs,Bm=y(()=>{"use strict";zt();Oi=[{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."}],Wm=[{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"}],Vs=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(ns.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(ns.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=Oi.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:Oi.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Oi[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:Wm.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=[`${ns.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${ns.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${ns.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${ns.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${ns.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 s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,ie.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Oi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Wm.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import Cl from"node:path";var xC,PC,Fi,TC,ht,ss=y(()=>{"use strict";ke();Ht();Te();xC="outcomes",PC="outcomes.jsonl",Fi=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=E.getGlobalProjectPath(e);return Cl.join(t,xC)}getOutcomesPath(e){return Cl.join(this.getOutcomesDir(e),PC)}async record(e,t){let n={...t,id:he()},s=this.getOutcomesPath(e);return await Lt(Cl.dirname(s)),await Ua(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let n=await xs(t);return n.trim()?n.trim().split(`
413
+ `).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},TC=new Fi,ht=TC});var _i,EC,vl,Vm=y(()=>{"use strict";ss();_i=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await ht.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await ht.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await ht.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,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);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await ht.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await ht.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},EC=new _i,vl=EC});var Zr,Ni,xl,Pl=y(()=>{"use strict";$s();ae();Zr=3,Ni=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Zr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Zr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Zr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Zr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Zr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[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
+ `)}},xl=new Ni});var Li,Jm,Tl=y(()=>{"use strict";hc();nn();ae();Li=class extends Be{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...pp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Bo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Bo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Bo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=mp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=gp(5,s);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:fp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},Jm=new Li});var El=y(()=>{"use strict";Bm();Vm();Pl();ss();Tl()});import rn from"chalk";function IC(r){return qm[r.toLowerCase()]||qm.default}var qm,Il,Hi,Km=y(()=>{"use strict";qm={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(IC,"getIcon");Il=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(rn.cyan(`
415
415
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
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:
420
- `;return s.warnings.forEach(t=>{e+=` - ${t}
421
- `}),s.recommendations.length>0&&(e+=`
416
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=IC(t);console.log(rn.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(rn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(rn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(rn.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?rn.green("\u2713"):rn.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${rn.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?` ${rn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(rn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Hi=new Il});import st from"chalk";function AC(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Ym.length;return Ym[t]}function jC(r,e,t="\u25B6"){let n=st.dim(String(r+1).padStart(2)),o=AC(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=st.green("\u2713 Complete");break;case"in_progress":a=st.yellow(`${t} Working...`);break;case"pending":a=st.gray("\u25CB Pending");break;case"failed":a=st.red("\u2717 Failed");break;case"blocked":a=st.gray("\u2298 Blocked");break;default:a=st.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function DC(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${st.bold.white("SUBTASK PROGRESS")}`),e.push(` ${st.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(jC(t,r[t]));return e.push(""),e.join(`
418
+ `)}function Xm(r){console.log(DC(r))}var Ym,Qm=y(()=>{"use strict";Ym=[st.cyan,st.magenta,st.yellow,st.blue,st.green,st.redBright,st.magentaBright,st.cyanBright];l(AC,"getDomainColor");l(jC,"formatSubtaskLine");l(DC,"renderSubtaskProgress");l(Xm,"printSubtaskProgress")});function RC(r){return Zm.includes(r)}async function $C(r,e,t){let n=[],s=[],o=[];switch(r){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),s.push("Read current task from now.md"),s.push("Calculate duration"),s.push("Append to shipped.md"),s.push("Clear now.md"),s.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),s.push("Parse feature description"),s.push("Generate tasks breakdown"),s.push("Add to roadmap.md"),s.push("Add tasks to next.md"),s.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),s.push("Generate spec template"),s.push("Analyze requirements"),s.push("Create spec file"),s.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),s.push("Scan for unused code"),s.push("Identify dead imports"),s.push("List files to clean"),s.push("Show preview"),s.push("Wait for approval"),s.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),s.push("Analyze current state"),s.push("Generate migration plan"),s.push("Show affected files"),s.push("Request approval"),s.push("Execute migration"),s.push("Verify results");break;default:s.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:r,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:s,confidence:c}}function MC(r){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${r.commandName}`),e.push(""),r.reasoning&&(e.push("Steps:"),r.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),r.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),r.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),r.plan.length>0&&(e.push("Plan:"),r.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(r.confidence*100)}%`),e.join(`
419
+ `)}var Zm,OC,Ui,eg=y(()=>{"use strict";Zm=["ship","feature","spec","cleanup","migrate"];l(RC,"requiresReasoning");l($C,"reason");l(MC,"formatPlan");OC={requiresReasoning:RC,reason:$C,formatPlan:MC,REASONING_REQUIRED_COMMANDS:Zm},Ui=OC});import eo from"node:fs/promises";var Al,FC,yt,jl=y(()=>{"use strict";qe();ke();N();ni();Al=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 $.getProjectId(e),s=E.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:E.getFilePath(n,"core","now.md"),next:E.getFilePath(n,"core","next.md"),context:E.getFilePath(n,"core","context.md"),shipped:E.getFilePath(n,"progress","shipped.md"),metrics:E.getFilePath(n,"progress","metrics.md"),ideas:E.getFilePath(n,"planning","ideas.md"),roadmap:E.getFilePath(n,"planning","roadmap.md"),specs:E.getFilePath(n,"planning","specs"),memory:E.getFilePath(n,"memory","context.jsonl"),patterns:E.getFilePath(n,"memory","patterns.json"),analysis:E.getFilePath(n,"analysis","repo-summary.md"),codePatterns:E.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await eo.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(v(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([eo.readFile(d,"utf-8"),eo.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(v(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await eo.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(v(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await eo.access(e),!0}catch(t){if(v(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},FC=new Al,yt=FC});import{exec as _C}from"node:child_process";import je from"node:fs/promises";import tg from"node:os";import $n from"node:path";import{promisify as NC}from"node:util";function ng(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function Dl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function HC(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
420
+ `;return r.warnings.forEach(t=>{e+=` - ${t}
421
+ `}),r.recommendations.length>0&&(e+=`
422
422
  Recommendations:
423
- `,s.recommendations.forEach(t=>{e+=` -> ${t}
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 '
423
+ `,r.recommendations.forEach(t=>{e+=` -> ${t}
424
+ `})),e}async function sg(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await je.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=ng(n.durationMs))}}catch(a){if(v(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await je.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(v(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await je.access($n.dirname(i),je.constants.W_OK),n.metricsWritable=!0}catch(a){if(v(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function rg(r){let e=[],t=[],n={};try{let{stdout:i}=await LC("git status --porcelain",{cwd:r.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 s=$n.join(r.projectPath,"package.json");try{let i=await je.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await je.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${Dl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await je.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function og(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await je.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await je.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Dl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await 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(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ig(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await je.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await je.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ag(r){let e=[],t=[],n={},s=$n.join(r.projectPath,".prjct/prjct.config.json");try{let i=await je.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=$n.join(tg.homedir(),".prjct-cli");try{await je.access(o,je.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(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 cg(r){let e=[],t=[],n={},s=$n.join(r.projectPath,".prjct/prjct.config.json");try{let a=await je.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=$n.join(tg.homedir(),".prjct-cli/projects",o||"");try{await je.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function lg(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await je.access($n.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await je.stat($n.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function ug(r){let e=[],t=[],n={},s=r.paths.specs;try{await je.access(s),n.specsExists=!0;let i=await je.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function pg(r,e,t){let n=dg[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function UC(r,e,t){let n=await pg(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function GC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var LC,dg,zC,Gi,mg=y(()=>{"use strict";N();LC=NC(_C);l(ng,"formatDuration");l(Dl,"escapeRegex");l(HC,"formatWarnings");l(sg,"verifyDone");l(rg,"verifyShip");l(og,"verifyFeature");l(ig,"verifyNow");l(ag,"verifyInit");l(cg,"verifySync");l(lg,"verifyAnalyze");l(ug,"verifySpec");dg={done:sg,ship:rg,feature:og,now:ig,init:ag,sync:cg,analyze:lg,spec:ug};l(pg,"verify");l(UC,"prepareCommand");l(GC,"requiresVerification");zC={verify:pg,prepareCommand:UC,requiresVerification:GC,verifiers:dg,formatWarnings:HC,formatDuration:ng,escapeRegex:Dl,verifyDone:sg,verifyShip:rg,verifyFeature:og,verifyNow:ig,verifyInit:ag,verifySync:cg,verifyAnalyze:lg,verifySpec:ug},Gi=zC});function BC(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function VC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of WC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:BC(t)};return{detected:!1}}function JC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function qC(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function KC(r,e,t){let n={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return n[e.type]||n.unknown}function YC(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var WC,Rl,XC,Js,gg=y(()=>{"use strict";WC=[{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(BC,"getHallucinationSuggestion");l(VC,"detectHallucination");l(JC,"isSimilarError");l(qC,"analyzeErrorPattern");l(KC,"generateEscalationMessage");l(YC,"generateSuggestion");Rl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>JC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=qC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:KC(e,o,this.maxAttempts),suggestion:YC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return VC(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}}},XC=new Rl,Js=XC});function $l(r,e){let t=to(e),n=QC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function ZC(r,e){let t=to(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function ev(r,e,t){let n=to(t),s=$l(r,t),o=$l(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function zi(r,e=Pn){let t=to(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=tv(r,e),s=nv(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=ov(o),a=sv(o),c=rv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=iv(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function hg(r,e,t=Pn){let n=to(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function tv(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=ev(i,s,e);if(!t.has(a)){let c=$l(i,e),u=ZC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function nv(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+av(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Ol(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function sv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function rv(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=Ol(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function ov(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function iv(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=Ol(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function Ol(r){if(!r.variance)return 0;let e=Ml(r.estimatedDuration),t=Ml(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Ml(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function yg(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
426
+ `)}function av(r){if(!r.estimatedDuration)return 0;let e=Ml(r.estimatedDuration);if(e<=0)return 0;let t=fg[0],n=Number.POSITIVE_INFINITY;for(let s of fg){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function to(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var QC,fg,Fl=y(()=>{"use strict";Ds();QC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l($l,"getSprintStart");l(ZC,"getSprintEnd");l(ev,"getSprintNumber");l(zi,"calculateVelocity");l(hg,"projectCompletion");l(tv,"bucketBySprint");l(nv,"buildSprintVelocities");l(sv,"detectTrend");l(rv,"calculateOverallAccuracy");l(ov,"calculateAverageVelocity");l(iv,"detectEstimationPatterns");l(Ol,"parseVariancePercent");l(Ml,"parseDurationMinutes");l(yg,"formatVelocityContext");fg=[{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(av,"derivePoints");l(to,"resolveConfig")});import{exec as cv}from"node:child_process";import lv from"node:fs/promises";import Wi from"node:path";import{promisify as uv}from"node:util";async function rs(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=fv(r),c=await hv(e),u=await yv(e),d=[];for(let p of c){if(!i&&kv(p))continue;let g=wv(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function fv(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(n=>!t.has(n)&&n.length>2)}async function hv(r){let e=[];async function t(n,s=""){try{let o=await lv.readdir(n,{withFileTypes:!0});for(let i of o){let a=Wi.join(n,i.name),c=Wi.join(s,i.name);if(i.isDirectory()){if(gv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Wi.extname(i.name).toLowerCase();mv.has(u)&&e.push(c)}}}catch(o){v(o)}}return l(t,"walk"),await t(r),e}async function yv(r){let e=new Map;try{let{stdout:t}=await dv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
427
427
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
428
428
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
429
429
  END { for (f in files) print files[f], lastmod[f], f }
430
- '`,{cwd:s,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),r=t.trim().split(`
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 '
430
+ '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
431
+ `).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function wv(r,e,t){let n=[],s=0,o=0,i=0,a=0,c=r.toLowerCase(),u=c.split("/").join(" ").split(/[^a-z0-9]+/);for(let g of e){c.includes(g)&&(s+=.3,n.push(`keyword:${g}`));for(let f of u)if(f.includes(g)||g.includes(f)){s+=.15;break}}s=Math.min(1,s);for(let[g,f]of Object.entries(pv))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(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Wi.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function kv(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var dv,pv,mv,gv,Bi=y(()=>{"use strict";N();dv=uv(cv),pv={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"]},mv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),gv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(rs,"findRelevantFiles");l(fv,"extractKeywords");l(hv,"getAllCodeFiles");l(yv,"getGitRecency");l(wv,"scoreFile");l(kv,"isTestFile")});import{exec as Sv}from"node:child_process";import{promisify as bv}from"node:util";async function so(r=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,s=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(s){let c=await xv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await vv(r,t);return o=o.filter(c=>!Pv(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 vv(r,e){let{stdout:t}=await no(`git log -${e} --pretty=format:"%ct" --name-only | awk '
432
432
  /^[0-9]+$/ { timestamp=$1; next }
433
433
  NF {
434
434
  count[$0]++
@@ -437,9 +437,9 @@ Recommendations:
437
437
  END {
438
438
  for (f in count) print count[f], lastmod[f], f
439
439
  }
440
- ' | sort -rn`,{cwd:s,maxBuffer:10485760}),n=[],r=t.trim().split(`
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 '
440
+ ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
441
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),b=u/i,D=k*.6+b*.4,x;f<1?x="just now":f<24?x=`${f}h ago`:g<7?x=`${g}d ago`:g<30?x=`${Math.floor(g/7)}w ago`:x=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:x,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function xv(r){let{stdout:e}=await no("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await no("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await no(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
442
+ `).filter(Boolean),{stdout:i}=await no(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
443
443
  /^[0-9]+$/ { timestamp=$1; next }
444
444
  NF {
445
445
  count[$0]++
@@ -448,40 +448,40 @@ Recommendations:
448
448
  END {
449
449
  for (f in count) print count[f], lastmod[f], f
450
450
  }
451
- '`,{cwd:s,maxBuffer:10*1024*1024}),a=[],c=i.trim().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(`
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(`
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.
451
+ '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().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),x=Math.floor(b/3600),M=Math.max(0,1-D/14),F=g/d,G=M*.5+F*.5,ee;x<1?ee="just now":x<24?ee=`${x}h ago`:ee=`${D}d ago`,a.push({path:k,changes:g,heatScore:Math.round(G*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 Pv(r){let e=r.split("/").pop()||"";for(let t of Cv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var no,Cv,_l=y(()=>{"use strict";no=bv(Sv),Cv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(so,"getRecentFiles");l(vv,"getHotFilesFromCommits");l(xv,"getBranchOnlyFiles");l(Pv,"shouldIgnore")});function Vi(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function wg(r,e){let t=Tv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Ll(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ro(r,e){let t=Vi(r),n=Vi(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=wg(s,Ev),a=Nl.map(c=>({model:c,...wg(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Ll(i.total),byModel:a}}}function os(r){let e=Vi(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Nl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Ji(r){if(r.length===0)return os("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),n=r.reduce((a,c)=>a+c.tokens.saved,0),s=e>0?(e-t)/e:0,o=Nl.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:n},compression:s,cost:{saved:i,formatted:Ll(i),byModel:o}}}function Iv(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Av(r){return`${Math.round(r*100)}%`}var Tv,Ev,Nl,oo=y(()=>{"use strict";Tv={"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}},Ev="claude-sonnet-4.5";l(Vi,"countTokens");Nl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(wg,"calculateModelCost");l(Ll,"formatCostSaved");l(ro,"measureCompression");l(os,"noCompression");l(Ji,"combineMetrics");l(Iv,"formatTokenCount");l(Av,"formatCompressionRate")});import bg from"node:fs/promises";import Mn from"node:path";async function On(r,e=process.cwd()){let t=Mn.isAbsolute(r)?r:Mn.join(e,r),n;try{n=await bg.readFile(t,"utf-8")}catch(u){if(v(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:os("")};throw u}let s=Mn.extname(r).toLowerCase(),o=Cg[s]||"unknown",i=$v[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:os(n)};let a=Mv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
453
+ `);return{file:r,language:o,signatures:a,fallback:!1,metrics:ro(n,c)}}async function Hl(r,e=process.cwd(),t={}){let n=Mn.isAbsolute(r)?r:Mn.join(e,r),s=[];async function o(i){let a=await bg.readdir(i,{withFileTypes:!0});for(let c of a){let u=Mn.join(i,c.name),d=Mn.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=Mn.extname(c.name).toLowerCase();if(Cg[m]){let p=await On(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function Mv(r,e){let t=[],n=r.split(`
454
+ `),s=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(s.has(c))continue;s.add(c);let u=i.index,d=r.substring(0,u).split(`
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:Ov(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Ov(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Cg,kg,jv,Dv,Rv,Sg,$v,qi=y(()=>{"use strict";N();oo();Cg={".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"},kg=[{type:"function",pattern:/^export\s+(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1},{type:"function",pattern:/^const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1},{type:"interface",pattern:/^export\s+interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^export\s+type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1,exported:!0},{type:"type",pattern:/^type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1},{type:"class",pattern:/^export\s+(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"enum",pattern:/^export\s+enum\s+(\w+)\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)\s*\{/gm,nameIndex:1},{type:"const",pattern:/^export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/gm,nameIndex:1,exported:!0}],jv=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],Dv=[{type:"function",pattern:/^func\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"method",pattern:/^func\s+\([^)]+\)\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/gm,nameIndex:1}],Rv=[{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}],Sg=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],$v={typescript:kg,javascript:kg,python:jv,go:Dv,rust:Rv,java:Sg,csharp:Sg,php:[],ruby:[],unknown:[]};l(On,"extractSignatures");l(Hl,"extractDirectorySignatures");l(Mv,"extractFromContent");l(Ov,"cleanSignature")});import{createHash as Fv}from"node:crypto";import Pg from"node:fs/promises";import Tg from"node:path";function vg(r){return Fv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function xg(r){try{let e=Tg.join(r,"storage","classification-cache.json"),t=await Pg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e)?pc:(console.warn("[classifier] Failed to load cache:",w(e)),pc)}}async function Ul(r,e){try{let t=Tg.join(r,"storage","classification-cache.json");await Pg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function Nv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>_v?null:n.classification}function Lv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function Hv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Eg(e),s=fc("classification")||"",o=`Classify this software engineering task into a domain.
456
456
 
457
- Task: "${s}"
457
+ Task: "${r}"
458
458
 
459
459
  Available domains in this project: ${n.join(", ")}
460
460
  Available agents: ${e.agents.join(", ")||"none"}
461
461
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
462
462
 
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(`
468
- Context: ${s.fileCount} files in project.`),e.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(`
463
+ ${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=xn.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 Gv(r,e){let t=Eg(e),n=new Map;for(let[p,g]of Object.entries(Uv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Zd;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=zv(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 Eg(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function zv(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var _v,Uv,Gl,Wv,Ig,Ag=y(()=>{"use strict";Rr();Wo();N();_v=3600*1e3;l(vg,"hashDescription");l(xg,"loadCache");l(Ul,"saveCache");l(Nv,"lookupCache");l(Lv,"lookupPatterns");l(Hv,"classifyWithLLM");Uv={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(Gv,"classifyWithHeuristic");l(Eg,"buildAvailableDomains");l(zv,"getFilePatterns");Gl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=vg(e),i=await xg(n),a=Nv(i,o,t);if(a)return{classification:a,source:"cache"};let c=Lv(i,o);if(c)return{classification:c,source:"history"};let u=await Hv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Ul(n,i),{classification:u,source:"llm"};let d=Gv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Ul(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=vg(e),o=await xg(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Ul(n,o))}},Wv=new Gl,Ig=Wv});import{exec as Bv}from"node:child_process";import io from"node:fs/promises";import Vv from"node:os";import is from"node:path";import{promisify as Jv}from"node:util";var jg,Dg,zl,qv,Ki,Wl=y(()=>{"use strict";Fl();qe();ke();Ds();Vt();Bi();_l();qi();N();ss();Ag();jn();jg=Jv(Bv),Dg=["database","backend","frontend","testing","devops"],zl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=E.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((G,ee)=>{if(G.status==="fulfilled")return G.value;g.push(p[ee]),console.warn(`Context tool "${p[ee]}" failed: ${w(G.reason)}`)}),[k,b,D]=f,x={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},M=this.shouldFragment(a,t),F=null;return M&&e==="task"&&(F=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:M,subtasks:F,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:b??null,velocityContext:D??null,contextDegradation:x}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),rs(e,t,{maxFiles:10,minScore:.15}),so(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await On(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:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([jg("git branch --show-current",{cwd:e}),jg("git status --porcelain",{cwd:e})]),s=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:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await vt.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 ht.getAll(e);if(t.length===0)return null;let n=zi(t,Pn);return n.sprints.length===0?null:yg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=is.join(e,"analysis","repo-analysis.json"),n=await io.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return v(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=E.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Ig.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=is.join(e,"agents");return(await io.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=E.getGlobalProjectPath(t),s=is.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=is.join(s,u);try{let m=await io.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=pi(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=is.join(Vv.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=is.join(t,`${i}.md`),c=is.join(t,i,"SKILL.md");try{let u=await io.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await io.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=Dg.indexOf(a),d=Dg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},qv=new zl,Ki=qv});function Kv(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var Bl,Yv,Le,Rg=y(()=>{"use strict";Ht();ae();mn();mn();l(Kv,"generateApprovalPrompt");Bl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return vc.includes(e)}isDestructive(e){return xc.includes(e)}isToolAllowedInPlanning(e){return Xo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Xo.includes(n)):t}startPlanning(e,t,n){let s={id:he(),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,s),s}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((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=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(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=oe.ABORTED,n.completedAt=C(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Kv(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[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);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
466
+ `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},Yv=new Bl,Le=Yv});function Xv(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Yi[t]?Yi[t]:Yi[e]?Yi[e]:e}function Xi(r){let e=new Set,t=[];for(let n of r){let s=Xv(n);e.has(s)||(e.add(s),t.push(n))}return t}var Yi,Vl=y(()=>{"use strict";Yi={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(Xv,"normalizeFrameworkName");l(Xi,"deduplicateTechStack")});import{z as He}from"zod";function $g(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
467
+ `);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=Xi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let c=Object.entries(r.domains).filter(([,u])=>!u).map(([u])=>Qv[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=r.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),r.fileCount&&e.push(`
468
+ Context: ${r.fileCount} files in project.`),e.join(`
469
+ `)}var EN,Qv,Mg=y(()=>{"use strict";Vl();EN=He.object({projectPath:He.string(),language:He.string().optional(),framework:He.string().optional(),techStack:He.array(He.string()).default([]),domains:He.object({hasFrontend:He.boolean().default(!1),hasBackend:He.boolean().default(!1),hasDatabase:He.boolean().default(!1),hasTesting:He.boolean().default(!1),hasDocker:He.boolean().default(!1)}).optional(),fileCount:He.number().optional(),availableAgents:He.array(He.string()).default([]),analysisLanguages:He.array(He.string()).default([]),analysisFrameworks:He.array(He.string()).default([]),analysisPackageManager:He.string().optional()}),Qv={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l($g,"buildAntiHallucinationBlock")});import{z as qt}from"zod";var Zv,Og,Fg=y(()=>{"use strict";Zv=qt.object({agents:qt.boolean(),patterns:qt.boolean(),checklist:qt.boolean(),modules:qt.array(qt.string())}),Og=qt.object({version:qt.string(),description:qt.string().optional(),commands:qt.record(qt.string(),Zv).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Jl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function _g(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Jl(o,ex),a=Jl(o,tx),c=Jl(o,nx);return s.some(d=>sx.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 ex,tx,nx,sx,Ng=y(()=>{"use strict";ex=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],tx=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],nx=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],sx=["Write","Edit","Bash"];l(Jl,"countMatches");l(_g,"classifyCommand")});import ql from"node:fs/promises";import rx from"node:path";async function Hg(){if(ao)return ao;let r=await ql.readFile(Kl,"utf-8"),e=JSON.parse(r);return ao=Og.parse(e),ao}function ox(r){return Ug.get(r)}function ix(r,e){Ug.set(r,e)}function cx(r,e){let t=r,n=Lg.get(t);return n&&ux(n.entry,e)?(n.count++,n.count>=ax):(Lg.set(t,{entry:e,count:1}),!1)}async function lx(r,e){let t=await ql.readFile(Kl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await ql.writeFile(Kl,`${JSON.stringify(n,null,2)}
470
+ `,"utf-8"),ao=null}function ux(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,n)=>t===e.modules[n])}function Gg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=ox(e);if(n)return{entry:n,source:"cache"};if(t){let s=_g(e,t);return ix(e,s),cx(e,s)&&lx(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Kl,ao,Ug,Lg,ax,zg=y(()=>{"use strict";Fg();lt();Ng();Kl=rx.join(pe,"core/config/command-context.config.json"),ao=null;l(Hg,"loadCommandContextConfig");Ug=new Map;l(ox,"getCachedClassification");l(ix,"cacheClassification");Lg=new Map,ax=3;l(cx,"trackClassification");l(lx,"persistClassification");l(ux,"isSameEntry");l(Gg,"resolveCommandContextFull")});import dx from"node:os";import{z as on}from"zod";function px(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function mx(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Wg(r){let e=r.platform??dx.platform(),t=r.runtime??px(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
471
+ ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",mx(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
472
472
  `)}
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}
476
- `),r.role&&d.push(`Role: ${r.role}
477
- `),r.skills?.length&&d.push(`Skills: ${r.skills.join(", ")}
473
+ </env>`}var zN,Bg=y(()=>{"use strict";zN=on.object({projectName:on.string(),projectPath:on.string(),isGitRepo:on.boolean().default(!0),gitBranch:on.string().optional(),platform:on.string().optional(),runtime:on.string().optional(),date:on.string().optional(),model:on.string().optional(),provider:on.string().optional()});l(px,"detectRuntime");l(mx,"normalizePlatform");l(Wg,"buildEnvironmentBlock")});function Jg(r){let e=r.getAllocationFor("injection");return{...Zi,totalPrompt:e}}function as(r,e){let t=e*qg;return r.length<=t?r:`${r.substring(0,t)}
474
+ ... (truncated to ~${e} tokens)`}function Vg(r){return Math.ceil(r.length/qg)}function Kg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=gx[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var Zi,qg,gx,Qi,Yg=y(()=>{"use strict";Zi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Jg,"budgetsFromCoordinator");qg=4;l(as,"truncateToTokenBudget");l(Vg,"estimateTokens");gx={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(Kg,"filterSkillsByDomains");Qi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Zi,...e}}addSection(e,t){let n=as(e,t),s=Vg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=as(n,o);return this.used+=Vg(i),i}return this.used+=s,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import Xg from"node:fs/promises";import cs from"node:path";var Yl,fx,Qg,Zg=y(()=>{"use strict";Vt();N();Te();lt();El();Mg();zg();Bg();Yg();Vl();jn();Yl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await P(e)){let s=await Xg.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){v(s)||console.error(`Template loading warning: ${w(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Jg(this._coordinator):Zi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ye(`global/modules/${e}`);if(t)return t;let n=cs.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=An("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ye(s);if(o){let i=cs.basename(s,".md");t[i]=o}}}else{let s=cs.join(pe,"templates","checklists");if(await P(s)){let o=(await Xg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=cs.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){v(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([L.read(e),Ee.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(v(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await vl.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!v(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let s=n.join(`
475
+ `);return as(s,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),s=Date.now()-t,o=Math.floor(s/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=cs.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let S=await Hg();p=Gg(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
476
+ `),s.role&&d.push(`Role: ${s.role}
477
+ `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
478
478
  `),d.push(`
479
479
  Apply specialized expertise. Read agent file for details if needed.
480
480
 
481
481
  `)),d.push(`TASK: ${e.frontmatter.description}
482
482
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
483
483
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
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(`
484
+ `);let k=t.projectPath;if(k){let S=u?.project?.id?cs.basename(k):cs.basename(k),j=Wg({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
485
485
  ${j}
486
486
  `)}if(u){let S=u.sealedAnalysis;if(d.push(`
487
487
  ## PROJECT ANALYSIS (Sealed)
@@ -505,7 +505,7 @@ ${j}
505
505
  `)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let S=this.extractPatternSummary(D);S&&(d.push(`## CODE PATTERNS
506
506
  `),d.push(S),d.push(`
507
507
  Full patterns: Read analysis/patterns.md
508
- `))}let v=n?.analysis||"";if(b&&v&&v.trim()){let S=v.match(/Stack[:\s]+([^\n]+)/i)||v.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
508
+ `))}let x=n?.analysis||"";if(b&&x&&x.trim()){let S=x.match(/Stack[:\s]+([^\n]+)/i)||x.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
509
509
  ## STACK
510
510
  Stack: ${j}
511
511
  `),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
@@ -516,18 +516,18 @@ Stack: ${j}
516
516
  `),j.effort&&d.push(`Effort: ${j.effort}
517
517
  `),j.model&&d.push(`Model: ${j.model}
518
518
  `),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
519
- `);let te=rs(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
519
+ `);let te=as(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
520
520
  ${te}
521
521
  \`\`\`
522
522
 
523
- `)}}let S=Wg(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
523
+ `)}}let S=Kg(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
524
524
 
525
525
  `);for(let j of S){d.push(`#### Skill: ${j.name}
526
- `);let te=rs(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
526
+ `);let te=as(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
527
527
  ${te}
528
528
  \`\`\`
529
529
 
530
- `)}}}let $=this.getModulesForCommand(m,p);if($.length>0)for(let S of $){let j=await this.loadModule(S);j&&(d.push(`
530
+ `)}}}let M=this.getModulesForCommand(m,p);if(M.length>0)for(let S of M){let j=await this.loadModule(S);j&&(d.push(`
531
531
  `),d.push(j))}if(c?.isPlanning&&(d.push(`
532
532
  ## PLAN MODE
533
533
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
@@ -535,8 +535,8 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
535
535
  `)),c?.requiresApproval&&d.push(`
536
536
  ## APPROVAL REQUIRED
537
537
  Show changes, list affected files, ask for confirmation.
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)}
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:Xi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Ze=>Ze.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
539
+ ${$g(te)}
540
540
  `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let S=u.contextDegradation;d.push(`
541
541
  ### CONTEXT DEGRADATION NOTICE
542
542
 
@@ -570,9 +570,9 @@ ${j.content}
570
570
  ## PROJECT: ${k}
571
571
  Read files before modifying.
572
572
 
573
- `);let H=this.filterRelevantState(n);if(H&&(d.push(`
573
+ `);let G=this.filterRelevantState(n);if(G&&(d.push(`
574
574
  ## PRJCT STATE (Project Management Data)
575
- `),d.push(H),d.push(`
575
+ `),d.push(G),d.push(`
576
576
  `)),u?.velocityContext&&(d.push(`
577
577
  ### VELOCITY (Historical Estimation Data)
578
578
 
@@ -618,7 +618,7 @@ Read files before modifying.
618
618
  **Context for this subtask:**
619
619
  ${j.outputForNextAgent}
620
620
  `)}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(`
621
+ `)}let ee=this.getSchemaTypeForCommand(m);if(ee){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(Wo(),cp)),j=S(ee);j&&d.push(`
622
622
  ${j}
623
623
  `)}if(p.checklist){let S=await this.loadChecklistRouting(),j=await this.loadChecklists();S&&Object.keys(j).length>0&&(d.push(`
624
624
  ## QUALITY CHECKLISTS
@@ -626,7 +626,7 @@ ${j}
626
626
  `),d.push(`Available: ${Object.keys(j).join(", ")}
627
627
  `),d.push(`Path: templates/checklists/{name}.md
628
628
  `),d.push(`Use Read tool to load checklists you determine are relevant.
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}
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 Qi({totalPrompt:t.stateData}),s=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=s.includes(i)?500:250,u=n.addSection(`### ${i}
630
630
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
631
631
 
632
632
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -640,10 +640,10 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
640
640
 
641
641
  `),n.join("")}extractPatternSummary(e){if(!e)return null;let t=[],n=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(n){let a=n[0].split(`
642
642
  `).filter(c=>c.includes(":")||c.startsWith("-")).slice(0,6).join(`
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(`
643
+ `);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
644
644
  Avoid:
645
645
  ${a}`)}let o=t.join(`
646
- `);return rs(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
646
+ `);return as(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
647
647
  ## RULES (CRITICAL)
648
648
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
649
649
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -660,7 +660,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
660
660
  - Prefer structured output (JSON) over free text when applicable.
661
661
 
662
662
  EXECUTE: Follow flow. Use tools. Decide.
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:`
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}}}},fx=new Yl,Qg=fx});import ef from"node:fs/promises";import $t from"node:path";var hx,yx,Xl,Ql,ea,Zl=y(()=>{"use strict";qe();ke();N();hx=["task","done","ship","resume","bug","enrich"],yx=["init","sync","pause","next","dash","history","undo","redo"],Xl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return $t.dirname(vr.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=E.getGlobalProjectPath(s),a=await(Je(),It(mt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=$t.join(u,"templates")}catch{c=$t.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await E.getAgentSettingsPath(),paths:{orchestrator:$t.join(c,"agentic","orchestrator.md"),agentRouting:$t.join(c,"agentic","agent-routing.md"),taskFragmentation:$t.join(c,"agentic","task-fragmentation.md"),commandTemplate:$t.join(c,"commands",`${e}.md`),repoAnalysis:$t.join(o,"analysis","repo-analysis.json"),agentsDir:$t.join(o,"agents"),skillsDir:a.skillsDir,stateJson:$t.join(o,"storage","state.json")}}}requiresOrchestration(e){return hx.includes(e)?!0:!yx.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=$t.join(E.getGlobalProjectPath(t),"agents");return(await ef.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return v(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=$t.join(E.getGlobalProjectPath(t),"agents");return(await ef.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
664
664
  ## Agentic Execution Mode
665
665
 
666
666
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -743,13 +743,13 @@ When fragmenting tasks:
743
743
  2. Track progress: currentSubtaskIndex, subtaskProgress
744
744
  3. Each completed subtask generates a summary
745
745
  4. Pass summary to next agent for context handoff
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:`
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")+`
748
- `+Jt.yellow("\u2502")+" "+Jt.bold("Update available!")+" "+Jt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Jt.yellow("\u2502")+`
749
- `+Jt.yellow("\u2502")+" "+Jt.yellow("\u2502")+`
750
- `+Jt.yellow("\u2502")+" Run: "+Jt.cyan("npm update -g prjct-cli")+" "+Jt.yellow("\u2502")+`
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")+`
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
746
+ `,context:e,requiresOrchestration:t}}},Ql=new Xl,ea=Ql});import{exec as wx}from"node:child_process";import tf from"node:fs/promises";import{promisify as kx}from"node:util";var Sx,ls,Qe,eu=y(()=>{"use strict";yi();Sx=kx(wx),ls={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};ls.register("Read",async r=>{try{return await Vr.execute(async()=>await tf.readFile(r,"utf-8"),`read-${r}`)}catch(e){return hi(e)||Br(e),null}});ls.register("Write",async(r,e)=>{try{return await Vr.execute(async()=>await tf.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return hi(t)||Br(t),!1}});ls.register("Bash",async r=>{try{return await Vr.execute(async()=>await Sx(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});ls.register("GetTimestamp",async()=>new Date().toISOString());ls.register("GetDate",async()=>new Date().toISOString().split("T")[0]);ls.register("GetDateTime",async()=>new Date().toISOString());Qe=ls});import tu from"node:fs/promises";import bx from"node:os";import nf from"node:path";async function Cx(r){try{let e=nf.dirname(ta);await P(e)||await tu.mkdir(e,{recursive:!0}),await tu.writeFile(ta,`/p:${r}`)}catch{}}async function vx(){try{await P(ta)&&await tu.unlink(ta)}catch{}}var ta,nu,xx,na,su=y(()=>{"use strict";N();Km();Te();Qm();eg();jl();mg();gg();Hs();Wl();Rg();Zg();Zl();jn();eu();ta=nf.join(bx.homedir(),".prjct-cli",".running");l(Cx,"signalStart");l(vx,"signalEnd");nu=class{static{l(this,"CommandExecutor")}async signalStart(e){await Cx(e)}async signalEnd(){await vx()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Js.shouldEscalate(e,s)){let o=Js.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Jc.load(e),i=await yt.build(n,t),a=Le.requiresPlanning(e),c=Le.isDestructive(e),u=Le.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Le.startPlanning(i.projectId,e,t):u&&(d=Le.getActivePlan(i.projectId));let m=null;if(Gi.requiresVerification(e)){let S=await yt.loadStateForCommand(i,e);m=await Gi.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Gi.formatWarnings(m))}let p=null;if(Ui.requiresReasoning(e)){let S=await yt.loadStateForCommand(i,e);p=await Ui.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ui.formatPlan(p)))}let g=t.task||t.description||"",f=await ea.buildContext(e,g,n),k=ea.buildAgenticPrompt(f),b=null;if(ea.requiresOrchestration(e)&&g)try{b=await Ki.execute(e,g,n),b.detectedDomains.length>0&&Hi.orchestrate(b.detectedDomains);for(let S of b.agents){let j=S.domain||S.name.replace(".md","");Hi.startAgent(S.name,j,`Loading ${j} specialist...`),Hi.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}));Xm(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},x=await yt.loadState(i),M=null,F=null;i.projectId&&(M={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 G={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Le.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ee=await Qg.build(o,D,x,null,M,null,F,G,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Js.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:x,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:M,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=>Le.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>Le.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>Le.proposePlan(i.projectId,S),"propose"),approve:l(S=>Le.approvePlan(i.projectId,S),"approve"),reject:l(S=>Le.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>Le.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Le.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Le.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>Le.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>Le.failStep(i.projectId,S),"failStep"),abort:l(S=>Le.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>Le.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Le.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Js.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Js.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Qe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Qe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Jc.load(e)).frontmatter["allowed-tools"]||[],i=await yt.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:w(s)}}}},xx=new nu,na=xx});import sa from"node:fs/promises";import Px from"node:https";import Tx from"node:os";import ru from"node:path";import Kt from"chalk";var ou,sf,rf=y(()=>{"use strict";N();Te();ou=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=ru.join(Tx.homedir(),".prjct-cli","config"),this.cacheFile=ru.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=ru.join(__dirname,"..","..","package.json");return JSON.parse(await sa.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=Px.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await P(this.cacheFile))return JSON.parse(await sa.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await P(this.cacheDir)||await sa.mkdir(this.cacheDir,{recursive:!0}),await sa.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
747
+ `+Kt.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")+`
748
+ `+Kt.yellow("\u2502")+" "+Kt.bold("Update available!")+" "+Kt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Kt.yellow("\u2502")+`
749
+ `+Kt.yellow("\u2502")+" "+Kt.yellow("\u2502")+`
750
+ `+Kt.yellow("\u2502")+" Run: "+Kt.cyan("npm update -g prjct-cli")+" "+Kt.yellow("\u2502")+`
751
+ `+Kt.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")+`
752
+ `}},sf=ou});var ve,at=y(()=>{"use strict";su();jl();eu();qe();ke();rf();_n();ae();Te();zt();ve=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new sf,this.updateNotificationShown=!1,this.commandExecutor=na}get agent(){return Gs.getAgent()}get agentInfo(){return Gs.getInfo()}get currentAuthor(){return Fn.getCurrentAuthor()}async initializeAgent(){return Gs.initialize()}async ensureProjectInit(e){return Fn.ensureInit(e)}async ensureAuthor(){return Fn.ensureAuthor()}async getGlobalProjectPath(e){return Fn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return ft.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Fn.isEmptyDirectory(e)}async _detectExistingCode(e){return Fn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ci.breakdownFeature(e)}_detectBugSeverity(e){return Ci.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Gs.assignForTask(e,t,n)}}});var of={};we(of,{PlanningCommands:()=>ds});import us from"node:path";async function Ex(){if(!iu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(oa(),af));iu=new r}return iu}var iu,ds,ra=y(()=>{"use strict";Ho();Dn();Ht();Vt();N();Ws();Bs();El();at();iu=null;l(Ex,"getAnalysisCommands");ds=class extends ve{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await $.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Vs(t).runNonInteractive());else if(a=await new Vs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await As(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await E.ensureProjectStructure(m);let p=E.getGlobalProjectPath(m),g={"core/now.md":`# NOW
753
753
 
754
754
  No current task. Use \`/p:now\` to set focus.
755
755
  `,"core/next.md":`# NEXT
@@ -769,7 +769,7 @@ No current task. Use \`/p:now\` to set focus.
769
769
  `,"planning/roadmap.md":`# ROADMAP
770
770
 
771
771
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
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
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,x]of Object.entries(g))await Qe.get("Write")(us.join(p,D),x);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let D=await Ex();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=us.join(p,"planning","architect-session.md"),x=`# Architect Session
773
773
 
774
774
  ## Idea
775
775
  ${b}
@@ -778,8 +778,8 @@ ${b}
778
778
  Initialized - awaiting stack recommendation
779
779
 
780
780
  Generated: ${new Date().toLocaleString()}
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.
781
+ `;return await Qe.get("Write")(D,x),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 s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await yt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=he(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Ee.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:z.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.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 yt.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:z.getTimestamp()}),n.md?console.log(Se(nt("Bug Reported",e),Rt({Severity:a,Priority:m,Agent:u}),Xe([{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(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
782
+ `);let s=await this.getGlobalProjectPath(t),o=us.join(s,"planning","architect-session.md"),i;try{i=await ue.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
783
783
 
784
784
  Create a plan first:
785
785
  1. Run /p:init in an empty directory
@@ -800,7 +800,7 @@ The architect plan is ready. Claude will now:
800
800
  4. Create starter files with boilerplate
801
801
  `),console.log(`
802
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.
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
803
+ `),await this.logToMemory(t,"architect_executed",{timestamp:z.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.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=E.getGlobalProjectPath(o),u=us.join(c,"planning","architect-session.md"),d=`# Architect Session
804
804
 
805
805
  ## Idea
806
806
  ${e}
@@ -815,14 +815,14 @@ Initialized - awaiting architecture design
815
815
  4. Generate roadmap
816
816
 
817
817
  Generated: ${new Date().toLocaleString()}
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(`
818
+ `;return await Qe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(Se(nt("Idea Captured",e),Rt({Mode:"architecture"}),Xe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
819
819
  \u{1F4A1} Use /p:architect execute to continue planning
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(`
820
+ `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await et.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(Se(nt("Idea Captured",e),Rt({Mode:"capture"}),Xe([{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(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=E.getGlobalProjectPath(s),m=us.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(`
821
821
  \u{1F4A1} Create one with /p:spec "feature name"
822
822
  `),{success:!0,specs:[]}):(console.log(`
823
823
  \u{1F4CB} SPECIFICATIONS
824
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)}
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}
825
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=E.getGlobalProjectPath(s),i=us.join(o,"planning","specs");await ue.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=us.join(i,`${a}.md`),u=`# Specification: ${e}
826
826
 
827
827
  ## Overview
828
828
  [Brief description of the feature]
@@ -852,63 +852,63 @@ Generated: ${new Date().toLocaleString()}
852
852
  ---
853
853
  Created: ${new Date().toLocaleString()}
854
854
  Status: Draft
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(`
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
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(`
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(`
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(`
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(`
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?`
855
+ `;return await Qe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:z.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
856
+ \u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
857
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var ia,Fn,cf=y(()=>{"use strict";dn();Ho();qe();ke();N();Te();zt();ia=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ra(),of)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw $o.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await E.ensureProjectStructure(t),E.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await As();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 Ps(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return v(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Ps(e)).some(s=>t.includes(s))}catch(t){return v(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Fn=new ia});import{exec as Ix}from"node:child_process";import{promisify as Ax}from"node:util";var au,jx,aa,co,lf=y(()=>{"use strict";fe();N();ci();au=Ax(Ix),jx={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},aa=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...jx,...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=R.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await au("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([au(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),au(`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(`
858
+ `).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
859
+ `)}async getSessionInfo(e){return In.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
860
+ `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
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}},co=l((r,e)=>new aa(r,e),"createStalenessChecker")});import uf from"node:fs/promises";import ca from"node:path";function lo(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Mx(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...lo(p));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lo(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lo(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...lo(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...lo(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!Rx.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function df(r,e){let t=[],n=await uf.readdir(r,{withFileTypes:!0});for(let s of n){if($x.has(s.name))continue;let o=ca.join(r,s.name);if(s.isDirectory())t.push(...await df(o,e));else if(s.isFile()){let i=ca.extname(s.name).toLowerCase();Dx.has(i)&&t.push(ca.relative(e,o))}}return t}async function Ox(r){let e=await df(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await uf.readFile(ca.join(r,d),"utf-8"),p=Mx(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function _x(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};q.setDoc(r,Fx,t)}async function pf(r,e){let t=await Ox(r);return _x(e,t),t}var Dx,Rx,$x,Fx,mf=y(()=>{"use strict";fe();Dx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Rx=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"]),$x=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(lo,"splitIdentifier");l(Mx,"tokenizeFile");l(df,"listFiles");l(Ox,"buildIndex");Fx="bm25-index";l(_x,"saveIndex");l(pf,"indexProject")});import cu from"node:fs/promises";import fn from"node:path";function Gx(r){let e=[],t,n=new RegExp(Ux.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function zx(r,e,t){let n;if(r.startsWith("@/"))n=fn.join(t,"src",r.slice(2));else{let s=fn.dirname(fn.join(t,e));n=fn.resolve(s,r)}for(let s of Hx){let o=n+s;try{if((await cu.stat(o)).isFile())return fn.relative(t,o)}catch{}}return null}async function gf(r,e){let t=[],n=await cu.readdir(r,{withFileTypes:!0});for(let s of n){if(Lx.has(s.name))continue;let o=fn.join(r,s.name);if(s.isDirectory())t.push(...await gf(o,e));else if(s.isFile()){let i=fn.extname(s.name).toLowerCase();Nx.has(i)&&t.push(fn.relative(e,o))}}return t}async function Wx(r){let e=await gf(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await cu.readFile(fn.join(r,u),"utf-8"),m=Gx(d),p=[];for(let g of m){let f=await zx(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function Bx(r,e){q.setDoc(r,ff,e)}function hf(r){return q.getDoc(r,ff)}async function yf(r,e){let t=await Wx(r);return Bx(e,t),t}var Nx,Lx,Hx,Ux,ff,lu=y(()=>{"use strict";fe();Nx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Lx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Hx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Ux=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Gx,"extractImportSources");l(zx,"resolveImport");l(gf,"listFiles");l(Wx,"buildGraph");ff="import-graph";l(Bx,"saveGraph");l(hf,"loadGraph");l(yf,"indexImports")});function wf(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=hf(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function kf(r){let e=new Set;for(let t of r){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var Sf=y(()=>{"use strict";lu();l(wf,"propagateChanges");l(kf,"affectedDomains")});import uu from"node:fs/promises";import la from"node:path";async function bf(r,e){let t=[],n=await uu.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Jx.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=la.join(r,o);if(s.isDirectory())t.push(...await bf(i,e));else if(s.isFile()){let a=la.extname(o).toLowerCase();Vx.has(a)&&t.push(la.relative(e,i))}}return t}function qx(r){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(r).toString(36)}`;let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function Kx(r){let e=await bf(r,r),t=new Map,n=100;for(let s=0;s<e.length;s+=n){let o=e.slice(s,s+n),i=await Promise.all(o.map(async a=>{try{let c=la.join(r,a),[u,d]=await Promise.all([uu.readFile(c,"utf-8"),uu.stat(c)]);return{path:a,hash:qx(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 Yx(r,e){let t=[],n=[],s=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?n.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:s}}function du(r,e){let t=q.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),q.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Xx(r){let e=new Map;try{let t=q.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function pu(r,e){let[t,n]=await Promise.all([Kx(r),Promise.resolve(Xx(e))]);return{diff:Yx(t,n),currentHashes:t}}function Cf(r){return q.hasDoc(r,"file-hashes-meta")}var Vx,Jx,vf=y(()=>{"use strict";fe();Vx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Jx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(bf,"listProjectFiles");l(qx,"hashContent");l(Kx,"computeHashes");l(Yx,"diffHashes");l(du,"saveHashes");l(Xx,"loadHashes");l(pu,"detectChanges");l(Cf,"hasHashRegistry")});import{exec as Qx}from"node:child_process";import{promisify as Zx}from"node:util";async function nP(r,e=100){try{let{stdout:t}=await eP(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
862
+ `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Pf&&n.push(s),s=new Set):i&&s&&sP(i)&&s.add(i)}return s&&s.size>0&&s.size<=Pf&&n.push(s),n}catch{return[]}}function sP(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function rP(r,e=100){let t=await nP(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=oP(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<xf||m<xf)continue;let p=d+m-a,g=p>0?a/p:0;g<tP||(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 oP(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function aP(r,e){q.setDoc(r,iP,e)}async function Tf(r,e,t=100){let n=await rP(r,t);return aP(e,n),n}var eP,tP,xf,Pf,iP,Ef=y(()=>{"use strict";fe();eP=Zx(Qx),tP=.1,xf=2,Pf=30;l(nP,"parseGitLog");l(sP,"isSourceFile");l(rP,"buildMatrix");l(oP,"pairKey");iP="cochange-index";l(aP,"saveMatrix");l(Tf,"indexCoChanges")});function Mt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function ps(){let r={file:"unknown",type:"detected"};return{name:{...r},version:{...r},ecosystem:{...r},languages:{...r},frameworks:{...r},commands:{...r},projectType:{...r},git:{file:"git",type:"detected"}}}var mu=y(()=>{"use strict";l(Mt,"cite");l(ps,"defaultSources")});function uo(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
863
+ `)}function po(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
864
+ `)}function If(r){let e=[];return r.packageManager&&e.push(`- Package Manager: \`${r.packageManager}\``),r.sourceDir&&e.push(`- Source: \`${r.sourceDir}/\``),r.testDir&&e.push(`- Tests: \`${r.testDir}/\``),e.length>0?`
865
865
  ### Project Structure
866
866
 
867
867
  ${e.join(`
868
868
  `)}
869
- `:""}function tx(s){let e=[];return s.patterns?.length>0&&e.push(`
869
+ `:""}function cP(r){let e=[];return r.patterns?.length>0&&e.push(`
870
870
  ### Code Patterns (Follow These)
871
871
 
872
- ${ao(s.patterns)}`),s.antiPatterns?.length>0&&e.push(`
872
+ ${uo(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
873
873
  ### Anti-Patterns (Avoid These)
874
874
 
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
877
- <!-- projectId: ${s.projectId} -->
875
+ ${po(r.antiPatterns)}`),e.push(If(r)),e.join(`
876
+ `)}function lP(r,e){let t=r.sources||ps();return`# ${r.name} - Project Rules
877
+ <!-- projectId: ${r.projectId} -->
878
878
  <!-- Generated: ${new Date().toISOString()} -->
879
- <!-- Ecosystem: ${s.ecosystem} | Type: ${s.projectType} -->
879
+ <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
880
880
 
881
- ## THIS PROJECT (${s.ecosystem})
881
+ ## THIS PROJECT (${r.ecosystem})
882
882
 
883
- ${$t(t.ecosystem)}
884
- **Type:** ${s.projectType}
885
- **Path:** ${s.repoPath}
883
+ ${Mt(t.ecosystem)}
884
+ **Type:** ${r.projectType}
885
+ **Path:** ${r.repoPath}
886
886
 
887
887
  ### Commands (USE THESE, NOT OTHERS)
888
888
 
889
- ${$t(t.commands)}
889
+ ${Mt(t.commands)}
890
890
  | Action | Command |
891
891
  |--------|---------|
892
- | Install dependencies | \`${s.commands.install}\` |
893
- | Run dev server | \`${s.commands.dev}\` |
894
- | Run tests | \`${s.commands.test}\` |
895
- | Build | \`${s.commands.build}\` |
896
- | Lint | \`${s.commands.lint}\` |
897
- | Format | \`${s.commands.format}\` |
892
+ | Install dependencies | \`${r.commands.install}\` |
893
+ | Run dev server | \`${r.commands.dev}\` |
894
+ | Run tests | \`${r.commands.test}\` |
895
+ | Build | \`${r.commands.build}\` |
896
+ | Lint | \`${r.commands.lint}\` |
897
+ | Format | \`${r.commands.format}\` |
898
898
 
899
899
  ### Code Conventions
900
900
 
901
- ${$t(t.languages)}
902
- - **Languages**: ${s.languages.join(", ")||"Not detected"}
903
- ${$t(t.frameworks)}
904
- - **Frameworks**: ${s.frameworks.join(", ")||"Not detected"}
905
- ${s.analysis?tx(s.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
901
+ ${Mt(t.languages)}
902
+ - **Languages**: ${r.languages.join(", ")||"Not detected"}
903
+ ${Mt(t.frameworks)}
904
+ - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
905
+ ${r.analysis?cP(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
906
906
  ---
907
907
 
908
908
  ## PRJCT RULES
909
909
 
910
910
  ### Path Resolution
911
- **ALL prjct writes go to**: \`~/.prjct-cli/projects/${s.projectId}/\`
911
+ **ALL prjct writes go to**: \`~/.prjct-cli/projects/${r.projectId}/\`
912
912
  - NEVER write to \`.prjct/\`
913
913
  - NEVER write to \`./\` for prjct data
914
914
 
@@ -928,49 +928,49 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
928
928
 
929
929
  ## PROJECT STATE
930
930
 
931
- ${$t(t.name)}
931
+ ${Mt(t.name)}
932
932
  | Field | Value |
933
933
  |-------|-------|
934
- | Name | ${s.name} |
935
- | Version | ${s.version} |
936
- | Ecosystem | ${s.ecosystem} |
937
- | Branch | ${s.branch} |
938
- | Files | ~${s.fileCount} |
939
- | Commits | ${s.commits} |
934
+ | Name | ${r.name} |
935
+ | Version | ${r.version} |
936
+ | Ecosystem | ${r.ecosystem} |
937
+ | Branch | ${r.branch} |
938
+ | Files | ~${r.fileCount} |
939
+ | Commits | ${r.commits} |
940
940
 
941
941
  ---
942
942
 
943
943
  ## AGENTS
944
944
 
945
- Load from \`~/.prjct-cli/projects/${s.projectId}/agents/\`:
946
-
947
- **Workflow**: ${s.agents.workflow.join(", ")}
948
- **Domain**: ${s.agents.domain.join(", ")||"none"}
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()}
956
- ${r.join(`
957
- `)}`;return s.replace(o,`---
945
+ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
946
+
947
+ **Workflow**: ${r.agents.workflow.join(", ")}
948
+ **Domain**: ${r.agents.domain.join(", ")||"none"}
949
+ `}function uP(r,e){let t=r.sources||ps(),n=[];if(n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(Mt(t.languages)),n.push("## Tech Stack"),r.languages.length>0&&n.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- Frameworks: ${r.frameworks.join(", ")}`),n.push(""),n.push(Mt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),r.analysis){r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(uo(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(po(r.analysis.antiPatterns)),n.push(""));let s=If(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
950
+ `)}function dP(r,e){let t=r.sources||ps(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(Mt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(uo(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(po(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(Mt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
951
+ `)}function pP(r,e){let t=r.sources||ps(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push(Mt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(Mt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(uo(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(po(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
952
+ `)}function mP(r,e){let t=[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`];if(r.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of r.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(r.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of r.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}r.analysis||t.push("","Run `p. sync` to populate project intelligence.");let s={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: ${r.commands.test}`}]};return JSON.stringify(s,null,2)}function gP(r,e){let t=[];return t.push(`# ${r.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(uo(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(po(r.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 Af(r){return{claude:lP,cursor:uP,copilot:dP,windsurf:pP,continue:mP,codex:gP}[r]||null}var gu=y(()=>{"use strict";mu();l(uo,"formatPatterns");l(po,"formatAntiPatterns");l(If,"formatStructure");l(cP,"formatAnalysisForClaude");l(lP,"formatForClaude");l(uP,"formatForCursor");l(dP,"formatForCopilot");l(pP,"formatForWindsurf");l(mP,"formatForContinue");l(gP,"formatForCodex");l(Af,"getFormatter")});import{exec as fP}from"node:child_process";import hP from"node:os";import qs from"node:path";import{promisify as yP}from"node:util";function jf(r){return da[r]||null}async function ua(r){try{return await wP(`which ${r}`),!0}catch{return!1}}async function pa(r=process.cwd()){let e=[];return await ua("claude")&&e.push("claude"),(await ua("cursor")||await P(qs.join(r,".cursor")))&&e.push("cursor"),await P(qs.join(r,".github"))&&e.push("copilot"),(await ua("windsurf")||await P(qs.join(r,".windsurf")))&&e.push("windsurf"),(await P(qs.join(r,".continue"))||await P(qs.join(hP.homedir(),".continue")))&&e.push("continue"),(await ua("codex")||await P(qs.join(r,".agents")))&&e.push("codex"),e}async function Df(r,e=process.cwd()){if(r==="auto"){let t=await pa(e);return t.length>0?t:["claude"]}return r==="all"?kP:r.filter(t=>da[t])}var wP,da,mo,kP,fu=y(()=>{"use strict";Te();wP=yP(fP),da={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"}},mo=["claude"],kP=Object.keys(da);l(jf,"getAIToolConfig");l(ua,"commandExists");l(pa,"detectInstalledTools");l(Df,"resolveToolIds")});import hu from"node:fs/promises";import yu from"node:path";async function Rf(r,e,t,n=mo){let s=[];for(let o of n){let i=jf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await SP(r,i,e,t);s.push(a)}return s}async function SP(r,e,t,n){let s=Af(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=yu.join(n,e.outputFile):i=yu.join(t,"context",e.outputFile),await hu.mkdir(yu.dirname(i),{recursive:!0});try{let a=await hu.readFile(i,"utf-8"),c=Qc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Xc(o,a)}catch{}return await hu.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 $f=y(()=>{"use strict";N();Zc();gu();fu();l(Rf,"generateAIToolContexts");l(SP,"generateForTool")});var Mf=y(()=>{"use strict";gu();$f();fu()});import go from"node:fs/promises";import fo from"node:path";var wu,Of,ku,Ff,_f=y(()=>{"use strict";N();wu=".prjct/.prjct-state.md",Of=".prjct-state.md",ku=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=fo.join(e,wu);await go.mkdir(fo.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await go.writeFile(n,s,"utf-8");try{let o=fo.join(e,Of);await go.unlink(o)}catch(o){if(!v(o))throw o}}async remove(e){for(let t of[wu,Of])try{await go.unlink(fo.join(e,t))}catch(n){if(!v(n))throw n}}async exists(e){let t=fo.join(e,wu);try{return await go.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
955
+ `)}},Ff=new ku});import Su from"node:fs/promises";import bP from"node:os";import Nf from"node:path";function bu(){return Nf.join(bP.homedir(),".prjct-cli","skills",CP)}function vP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ho(){try{let r=await Su.readFile(bu(),"utf-8");return JSON.parse(r)}catch{return vP()}}async function Cu(r){let e=bu();await Su.mkdir(Nf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Su.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function xP(r){let e=await ho();e.skills[r.name]=r,await Cu(e)}async function PP(r){let e=await ho();return r in e.skills?(delete e.skills[r],await Cu(e),!0):!1}async function TP(r){return(await ho()).skills[r]||null}async function EP(){return(await ho()).skills}function IP(){return bu()}var CP,yo,Lf=y(()=>{"use strict";CP=".skill-lock.json";l(bu,"getLockFilePath");l(vP,"createEmptyLockFile");l(ho,"read");l(Cu,"write");l(xP,"addEntry");l(PP,"removeEntry");l(TP,"getEntry");l(EP,"getAll");l(IP,"getPath");yo={read:ho,write:Cu,addEntry:xP,removeEntry:PP,getEntry:TP,getAll:EP,getPath:IP}});import{exec as AP}from"node:child_process";import hn from"node:fs/promises";import xu from"node:os";import ct from"node:path";import{promisify as jP}from"node:util";import{glob as Hf}from"glob";function Gf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ct.join(xu.homedir(),r.slice(1)):ct.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function zf(r){let e=[];try{let s=ct.join(r,"SKILL.md");await hn.access(s);let o=ct.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Hf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ct.basename(ct.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Hf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ct.basename(ct.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function DP(r,e,t){let n=new Date().toISOString(),s=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&s.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=r.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
956
+ ${s.join(`
957
+ `)}`;return r.replace(o,`---
958
958
  ${c}
959
959
  ---`)}return`---
960
- ${r.join(`
960
+ ${s.join(`
961
961
  `)}
962
962
  ---
963
963
 
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=[`
964
+ ${r}`}function Pu(){return ct.join(xu.homedir(),".claude","skills")}async function vu(r,e,t,n){let s=Pu(),o=ct.join(s,e),i=ct.join(o,"SKILL.md"),a=await hn.readFile(r,"utf-8"),c=DP(a,t,n);return await hn.mkdir(o,{recursive:!0}),await hn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function RP(r){let e={installed:[],skipped:[],errors:[]};if(!zs.isAvailable("git")){let n=zs.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=ct.join(xu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Uf(`git clone --depth 1 ${n} ${t}`,{timeout:Ms("GIT_CLONE")});let s;try{let{stdout:a}=await Uf("git rev-parse HEAD",{cwd:t,timeout:Ms("TOOL_CHECK")});s=a.trim()}catch{}let o=await zf(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${r.owner}/${r.repo}`),e;let i=r.skillName?o.filter(a=>a.name===r.skillName):o;if(r.skillName&&i.length===0)return e.errors.push(`Skill "${r.skillName}" not found in ${r.owner}/${r.repo}`),e;for(let a of i)try{let c=await vu(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await yo.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await hn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function $P(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await hn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await hn.stat(t)).isFile()){let s=ct.basename(ct.dirname(t));try{let o=await vu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await yo.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await zf(t);if(s.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of s)try{let i=await vu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await yo.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function MP(r){let e=Pu(),t=ct.join(e,r);try{await hn.rm(t,{recursive:!0,force:!0})}catch{}let n=ct.join(e,`${r}.md`);try{await hn.rm(n,{force:!0})}catch{}return yo.removeEntry(r)}async function OP(r){let e=Gf(r);switch(e.type){case"github":return RP(e);case"local":return $P(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Uf,Wf,Bf=y(()=>{"use strict";N();mn();Ai();Lf();Uf=jP(AP);l(Gf,"parseSource");l(zf,"discoverSkills");l(DP,"injectSourceMetadata");l(Pu,"getInstallDir");l(vu,"installSkillFile");l(RP,"installFromGitHub");l($P,"installFromLocal");l(MP,"remove");l(OP,"install");Wf={install:OP,remove:MP,parseSource:Gf,getInstallDir:Pu}});import Ot from"node:fs/promises";import FP from"node:os";import Tt from"node:path";async function Vf(r,e,t,n){let s=[],o=Tt.join(r,"agents");try{let c=await Ot.readdir(o);for(let u of c)u.endsWith(".md")&&await Ot.unlink(Tt.join(o,u))}catch(c){H.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=>_P(c,o)));for(let c of i)s.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>NP(c.name,o,t,e,n)));for(let c of a)s.push({name:c.name,type:"domain",skill:c.skill});return s}async function Jf(r){let e=Tt.join(r,"agents"),t=[];try{let n=await Ot.readdir(e),s=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=s.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function qf(r){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...r.matchAll(e)];if(t.length===0)return r;let n=r;for(let s of t){let o=s[1],i=ye(`subagents/${o}.md`);if(!i){let a=Tt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Ot.readFile(a,"utf-8")}catch{n=n.replace(s[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(s[0],i.trim())}return n}async function _P(r,e){let t="";try{let n=Tt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Ot.readFile(n,"utf-8"),t=await qf(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:re(n)}),t=HP(r)}await Ot.writeFile(Tt.join(e,`${r}.md`),t,"utf-8")}async function NP(r,e,t,n,s){let o="";try{let i=Tt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Ot.readFile(i,"utf-8"),o=await qf(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:r,error:re(i)}),o=UP(r,t,n)}o=LP(o,r,s),await Ot.writeFile(Tt.join(e,`${r}.md`),o,"utf-8")}function LP(r,e,t){if(!t)return r;let{patternsDiscovered:n,knownGotchas:s,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||s.length>0||i.length>0))return r;let c=[`
965
965
  ## Recent Learnings (from completed tasks)
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(`
967
- `)}function $x(s){return`---
968
- name: ${s}
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"}
966
+ `];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(s.length>0){c.push("### Known Gotchas");for(let u of s)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return r+c.join(`
967
+ `)}function HP(r){return`---
968
+ name: ${r}
969
+ description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[r]||"Workflow agent"}
970
970
  tools: Read, Write, Glob
971
971
  ---
972
972
 
973
- # ${s.toUpperCase()}
973
+ # ${r.toUpperCase()}
974
974
 
975
975
  Workflow agent for prjct operations.
976
976
 
@@ -980,16 +980,16 @@ When invoked:
980
980
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
981
981
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
982
982
  3. Execute requested operation
983
- `}function Mx(s,e,t){return`---
984
- name: ${s}
985
- description: ${s.charAt(0).toUpperCase()+s.slice(1)} specialist for ${e.name}
983
+ `}function UP(r,e,t){return`---
984
+ name: ${r}
985
+ description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
986
986
  tools: Read, Write, Glob, Grep
987
987
  skills: []
988
988
  ---
989
989
 
990
- # ${s.toUpperCase()} AGENT
990
+ # ${r.toUpperCase()} AGENT
991
991
 
992
- Domain specialist for ${s} tasks.
992
+ Domain specialist for ${r} tasks.
993
993
 
994
994
  ## Project Context
995
995
 
@@ -999,86 +999,86 @@ Domain specialist for ${s} tasks.
999
999
 
1000
1000
  ## Your Role
1001
1001
 
1002
- You are the ${s} expert for this project. Apply best practices for the detected stack.
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(`
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+=`
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(`
1009
- `).length}),r.hasChanges=!0)):(r.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
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(`
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(`
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(`
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(`
1002
+ You are the ${r} expert for this project. Apply best practices for the detected stack.
1003
+ `}function Kf(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Ot.writeFile(Tt.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:re(o)})}),n}async function Yf(r){let e=[];try{let t=Tt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Ot.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Tt.join(FP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Tt.join(a,d,"SKILL.md"),p=Tt.join(a,`${d}.md`),g=!1;try{await Ot.access(m),g=!0}catch{try{await Ot.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 Wf.install(k);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:re(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:re(t)})}return e}var Xf=y(()=>{"use strict";jn();dn();ae();Vn();Bf();l(Vf,"generateAgents");l(Jf,"loadExistingAgents");l(qf,"resolveTemplateIncludes");l(_P,"generateWorkflowAgent");l(NP,"generateDomainAgent");l(LP,"injectFeedbackSection");l(HP,"generateMinimalWorkflowAgent");l(UP,"generateMinimalDomainAgent");l(Kf,"configureSkills");l(Yf,"autoInstallSkills")});import Qf from"node:fs/promises";import Zf from"node:path";var ma,eh=y(()=>{"use strict";ma=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Zf.join(this.projectPath,"package.json"),t=await Qf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Qf.access(Zf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as GP}from"node:child_process";import th from"node:fs/promises";import Tu from"node:path";import{promisify as zP}from"node:util";async function nh(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ms("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await ms("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await ms("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await ms("git status --porcelain",{cwd:r}),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 ms('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});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 ms('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:re(t)})}return e}async function an(r,e){try{return await th.access(Tu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:re(t)}),!1}}async function sh(r){let e={fileCount:0,version:"0.0.0",name:Tu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ms('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:r,error:re(t)}),e.fileCount=0}try{let t=Tu.join(r,"package.json"),n=JSON.parse(await th.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await an(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:re(t)})}return await an(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await an(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await an(r,"requirements.txt")||await an(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function rh(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await an(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await an(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await an(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await an(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await an(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function oh(r,e){let t=ps(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function ih(r){return new ma(r).detect()}var ms,ah=y(()=>{"use strict";dn();mu();Vn();eh();ms=zP(GP);l(nh,"analyzeGit");l(an,"fileExists");l(sh,"gatherStats");l(rh,"detectCommands");l(oh,"buildSources");l(ih,"detectStack")});import{exec as WP}from"node:child_process";import Eu from"node:fs/promises";import ga from"node:path";import{promisify as BP}from"node:util";var VP,Iu,Au,ch,lh=y(()=>{"use strict";Vt();N();VP=BP(WP),Iu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ga.join(r,s);try{await Eu.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=ga.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=ga.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await Eu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Eu.readFile(ga.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Au=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Iu.contextFilesExist(t),Iu.jsonFilesValid(t),Iu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await VP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},ch=new Au});import fa from"node:fs/promises";import ha from"node:path";var ya,gs,ju=y(()=>{"use strict";Hs();mf();Sf();vf();Ef();lu();dn();Dn();qe();ke();Di();Tn();fe();Mr();Kr();$i();Or();Fr();Nr();Mf();ae();Vn();Pl();Tl();_f();dl();Xf();ah();lh();ya=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await pa(e)).filter(i=>!mo.includes(i));s=[...mo,...o]}else t.aiTools[0]==="auto"?(s=await pa(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Df("all",e):s=t.aiTools;try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=E.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Yr(this.projectId);try{let _=await Ri(this.projectId);_>0&&H.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){H.debug("Legacy JSON sweep failed (non-critical)",{error:re(_)})}let[i,a,c,u]=await Promise.all([nh(this.projectPath),sh(this.projectPath),rh(this.projectPath),ih(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&Cf(this.projectId))try{let{diff:_,currentHashes:ks}=await pu(this.projectPath,this.projectId),xo=_.added.length+_.modified.length+_.deleted.length;if(xo===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let La=wf(_,this.projectId);f=kf(La.allAffected);let Gy=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=La.allAffected.some(Gn=>{let zy=Gn.substring(Gn.lastIndexOf("."));return Gy.has(zy)}),g=La.directlyChanged.some(Gn=>Gn==="package.json"||Gn==="tsconfig.json"||Gn.includes("Dockerfile")||Gn.includes("docker-compose")),m={isIncremental:!0,filesChanged:xo,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}du(this.projectId,ks)}catch(_){H.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await pu(this.projectPath,this.projectId);du(this.projectId,_)}catch(_){H.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([pf(this.projectPath,this.projectId),yf(this.projectPath,this.projectId),Tf(this.projectPath,this.projectId)])}catch(_){H.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 Vf(this.globalPath,u,a,k):await Jf(this.globalPath),D=Kf(b,this.projectId,this.globalPath),x=g?await Yf(b):[],M=oh(a,c),F=[],G;try{let _=await vt.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(G={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:M,analysis:G},S=await Rf(ee,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let 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 Ze;try{let _=await $.readConfig(this.projectPath);Ze=await ch.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){H.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:x,contextFiles:F,aiTools:S.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:te,verification:Ze,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=>fa.mkdir(ha.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=R.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};R.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await Ff.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:re(o)})}}async logToMemory(e,t){R.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=ha.join(this.globalPath,m),g=await fa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:re(p)})}for(let m of n)try{let p=ha.join(this.globalPath,"agents",`${m.name}.md`),g=await fa.readFile(p,"utf-8");i+=g.length}catch(p){H.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 gn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:re(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await vt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:re(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([gt.archiveOldShipped(this.projectId).catch(()=>0),et.markDormantIdeas(this.projectId).catch(()=>0),Ee.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),ft.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=bt.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.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 xl.learnFromTaskHistory(this.projectId,e,t);try{let s=await Jm.getFeatureOutcomes(this.projectId);s.length>0&&await xl.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:re(e)})}}async getCliVersion(){try{let e=ha.join(__dirname,"..","..","package.json");return JSON.parse(await fa.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.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:[]}}},gs=new ya});var _n=y(()=>{"use strict";fm();vm();xm();Im();jm();cl();Rm();dl();$m();Mm();cf();lf();ju()});import yn from"chalk";function uh(r){return Math.ceil(r.length/JP)}function dh(r){let e=r.split(`
1006
+ `),t=[],n=null;for(let s=0;s<e.length;s++){let o=e[s],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=s-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:s,endLine:s}):n&&(n.content+=`
1007
+ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Du(r){return r.includes("<!-- prjct:preserve")}function ph(r,e){let t=dh(r),n=dh(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:uh(r),tokensAfter:uh(e),tokenDelta:0};s.tokenDelta=s.tokensAfter-s.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)Du(a.content)&&s.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()&&(Du(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
1009
+ `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
1010
+ `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Du(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1011
+ `).length}),s.hasChanges=!0)}return s}function mh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?yn.green:p=>p,o=t?yn.red:p=>p,i=t?yn.yellow:p=>p,a=t?yn.dim:p=>p,c=t?yn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1012
+ `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),r.added.length>0)for(let p of r.added)n.push(s(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of r.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(s(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?s:o;return n.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
1013
+ `)}function gh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?yn.green:c=>c,o=t?yn.red:c=>c,i=t?yn.cyan:c=>c,a=t?yn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1014
+ `))n.push(s(`+ ${u}`));n.push("")}for(let c of r.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
1015
1015
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1016
1016
  `).length>5&&n.push(a(` ... ${c.before.split(`
1017
1017
  `).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
1018
- `).slice(0,5))n.push(r(`+ ${u}`));c.after.split(`
1018
+ `).slice(0,5))n.push(s(`+ ${u}`));c.after.split(`
1019
1019
  `).length>5&&n.push(a(` ... ${c.after.split(`
1020
- `).length-5} more lines`))}n.push("")}for(let c of s.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
1020
+ `).length-5} more lines`))}n.push("")}for(let c of r.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
1021
1021
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1022
1022
  `).length>5&&n.push(a(` ... ${c.before.split(`
1023
1023
  `).length-5} more lines`))}n.push("")}return n.join(`
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
1024
+ `)}var JP,fh=y(()=>{"use strict";JP=4;l(uh,"estimateTokens");l(dh,"parseMarkdownSections");l(Du,"isPreservedSection");l(ph,"generateSyncDiff");l(mh,"formatDiffPreview");l(gh,"formatFullDiff")});import qP from"node:path";async function Ru(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await Ae.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
1025
+ `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Pt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function hh(r){try{let e=await ft.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=z.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function wo(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function $u(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function yh(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(s=>s.tokensSaved),n=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/n*(e.length-1)),e.length-1);return e[o]}).join("")}function wh(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${wo(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${mi(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${$u(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${wo(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
1026
+ `)}function kh(r,e){let t=[];t.push(`# Repository Analysis
1027
1027
  `),t.push(`Generated: ${new Date().toLocaleString()}
1028
- `);let n=Hx.basename(e);if(t.push(`## Project: ${n}
1028
+ `);let n=qP.basename(e);if(t.push(`## Project: ${n}
1029
1029
  `),t.push(`## Stack Detected
1030
- `),s.packageJson){let i=s.packageJson;if(t.push(`### JavaScript/TypeScript
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
1030
+ `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
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)`:""}`)}r.hasNextConfig&&t.push("- **Framework**: Next.js detected"),r.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),r.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}r.cargoToml&&(t.push(`### Rust
1032
1032
  `),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
1033
- `)),s.goMod&&(t.push(`### Go
1033
+ `)),r.goMod&&(t.push(`### Go
1034
1034
  `),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
1035
- `)),s.requirements&&(t.push(`### Python
1035
+ `)),r.requirements&&(t.push(`### Python
1036
1036
  `),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
1037
- `));let r=s.directories;t.push(`## Structure
1038
- `),t.push(`- **Total Files**: ${s.fileCount}`),t.push(`- **Directories**: ${r?.slice(0,15).join(", ")||"none"}${(r?.length||0)>15?` (+${(r?.length||0)-15} more)`:""}`),s.hasDockerfile&&t.push("- **Docker**: Detected"),s.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),s.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=s.gitStats;return t.push(`## Git Statistics
1039
- `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),s.gitLog&&(t.push(`## Recent Activity
1040
- `),s.gitLog.split(`
1037
+ `));let s=r.directories;t.push(`## Structure
1038
+ `),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${s?.slice(0,15).join(", ")||"none"}${(s?.length||0)>15?` (+${(s?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
1039
+ `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
1040
+ `),r.gitLog.split(`
1041
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
1042
1042
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1043
1043
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
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!
1044
+ `)}var Sh=y(()=>{"use strict";Dn();gi();_n();Bs();zt();at();l(Ru,"showSyncResult");l(hh,"getSessionActivity");l(wo,"formatTokens");l($u,"formatDuration");l(yh,"generateSparkline");l(wh,"generateStatsMarkdown");l(kh,"generateAnalysisSummary")});var af={};we(af,{AnalysisCommands:()=>hs});import Mu from"node:fs/promises";import bh from"node:path";import*as fs from"@clack/prompts";var hs,oa=y(()=>{"use strict";Hs();rm();Dn();gi();_n();fh();Di();fe();Kr();N();Ws();Bs();zt();Sh();at();hs=class extends ve{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1045
+ `),Ye.init(t);let n=await yt.build(t,e),s={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=kh(s,t),i=await $.getProjectId(t),a=n.paths.analysis||E.getFilePath(i,"analysis","repo-summary.md");await Qe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:z.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Je(),It(mt)).getActiveProvider(),d=await Ae.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${E.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1046
1046
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
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(`
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:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=E.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await E.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 gs.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(Se(Jt(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=bh.join(o,"context","CLAUDE.md"),c=null;try{c=await Mu.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 gs.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Se("## \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 Mu.readFile(a,"utf-8")}catch{p=""}let g=ph(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(Se(Jt("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 Mu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let x of g.added)b.push(`Added: ${x.name} (${x.lineCount} lines)`);for(let x of g.modified)b.push(`Modified: ${x.name} (${x.lineCount} lines)`);for(let x of g.removed)b.push(`Removed: ${x.name} (${x.lineCount} lines)`);let D=Se("## \u26A1 Sync Preview",b.length>0?nt("Changes",xt(b)):"No section changes.",Rt({"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(mh(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await fs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(fs.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
+ ${gh(g)}`);let b=await fs.confirm({message:"Apply these changes?",initialValue:!0});if(fs.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"),Ru(m,i)}t.md||h.spin("Syncing project...");let d=await gs.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Se("## \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=Mi("sync"),k=Se(Jt("Sync Complete"),Rt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),d.git.hasChanges?Um("Uncommitted changes detected"):null,Xe(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 Ru(d,i)}catch(n){return t.md?console.log(Se("## \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 s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await gn.getSummary(s),i=await gn.getDailyStats(s,30),a=await hh(s),c=await Ie.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=R.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await gn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${wo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${mi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${$u(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=yh(i);if(console.log(` ${p} ${wo(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=wh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=co(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await vt.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=bh.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=Se(`## \u26A1 Status: ${u}`,Rt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?nt("Analysis",xt(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 s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await vt.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await vt.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=R.getDoc(s,"project")?.repoPath||e}catch{}let i=await vt.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var wa,U,Ks=y(()=>{"use strict";qe();ke();N();ae();wa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:E.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},U=new wa});import KP from"node:path";var Ys,Ou=y(()=>{"use strict";_n();Vt();N();Ws();at();Ks();Ys=class extends ve{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=KP.basename(t),a=await L.getCurrentTask(o),c=await Ee.getActiveTasks(o),u=await gt.getRecent(o,5),d=await et.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=z.getDaysAgo(m),g=[];try{let b=p.toISOString();g=R.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(x=>({...JSON.parse(x.data),timestamp:x.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
1049
1049
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1050
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(`
1051
1051
  Activity: ${k}
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(`
1052
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await yt.build(t),p=await Qe.get("Read")(m.paths.roadmap);if(console.log(`
1053
1053
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1054
1054
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1055
1055
  `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let b=f.split(`
1056
1056
  `)[0].trim();console.log(` ${k+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
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(`
1057
+ `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${z.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let 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=Se(`## \u26A1 Dashboard: ${i}`,nt("Current Focus",m),nt(`Queue (${c.length})`,xt(p,!0)),nt("Recent Ships",xt(g)),nt("Ideas",`${d.length} pending`),Xe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1058
1058
  \u{1F4CA} DASHBOARD - ${i}
1059
- `),console.log("\u2550".repeat(50));let m=oo(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1059
+ `),console.log("\u2550".repeat(50));let m=co(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1060
1060
  ${g}`),console.log(`
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(`
1061
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=z.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1062
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(`
1063
1063
  \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
1064
1064
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1065
1065
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1066
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:B.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1066
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:z.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1067
1067
  PRJCT COMMANDS
1068
- `),console.log("=".repeat(50));let i=z.getAllCategories(),a=z.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1068
+ `),console.log("=".repeat(50));let i=U.getAllCategories(),a=U.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1069
1069
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1070
1070
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1071
- `),{success:!0,topic:"overview"}}let n=z.getByName(e);if(n){if(console.log(`
1071
+ `),{success:!0,topic:"overview"}}let n=U.getByName(e);if(n){if(console.log(`
1072
1072
  \u{1F4DA} HELP: /p:${n.name}
1073
1073
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1074
1074
  Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
1075
1075
  Features:`);for(let i of n.features)console.log(` \u2022 ${i}`)}return console.log(`
1076
1076
  ${"\u2550".repeat(50)}
1077
- `),{success:!0,topic:e,command:n}}let r={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(r))if(o.includes(i))return console.log(`
1077
+ `),{success:!0,topic:e,command:n}}let s={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(s))if(o.includes(i))return console.log(`
1078
1078
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1079
1079
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1080
1080
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
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}
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"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import YP from"node:fs/promises";import XP from"node:path";var ys,Sz,Fu=y(()=>{"use strict";Wl();qe();ke();Vt();N();ys=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=E.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 Ki.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=XP.join(e,"analysis","repo-analysis.json"),n=await YP.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return v(t),null}}},Sz=new ys});async function ka(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-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 Sa(r){let e=await $.getProjectId(r);if(!e)return;let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;q.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}async function _u(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ka(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=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),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await et.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${w(a)}`)}try{let c=(await Ee.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${w(a)}`)}return await Sa(e),await ft.log(e,"cleanup_performed",{items:s.length,timestamp:z.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Nu=y(()=>{"use strict";_n();Vt();fe();N();at();l(ka,"cleanupMemory");l(Sa,"cleanupMemoryInternal");l(_u,"cleanup")});import Ch from"node:path";async function Lu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=Ch.join(E.getGlobalProjectPath(i),"planning","designs");await ue.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1082
1082
 
1083
1083
  *Use templates/design/architecture.md for full design*
1084
1084
  `;break;case"api":c=`# API Design: ${o}
@@ -1093,45 +1093,45 @@ ${"\u2550".repeat(50)}
1093
1093
  `;break;case"flow":c=`# Flow Design: ${o}
1094
1094
 
1095
1095
  *Use templates/design/flow.md for full design*
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(`
1096
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Ch.join(a,u);return await ue.writeFile(d,c),await ft.log(t,"design_created",{type:n,target:o,timestamp:z.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}var Hu=y(()=>{"use strict";_n();N();at();l(Lu,"design")});import Xs from"node:path";async function Uu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=E.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ue.readFile(t);n=JSON.parse(s)}catch(s){if(v(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1097
1097
  Found abandoned session:
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(`
1098
+ `),console.log(` Task: ${n.task}`),n.startedAt){let s=z.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1099
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
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(`
1100
+ `),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Gu(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Xs.join(E.getGlobalProjectPath(e),"snapshots");await ue.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=Xs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ue.readFile(a);c=JSON.parse(u)}catch(u){if(!v(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ue.writeFile(a,JSON.stringify(c,null,2)),await ft.log(r,"undo_performed",{snapshotId:i,timestamp:z.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(s)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function zu(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Xs.join(E.getGlobalProjectPath(e),"snapshots"),n=Xs.join(t,"history.json"),s;try{let i=await ue.readFile(n);s=JSON.parse(i)}catch(i){if(v(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1101
+ `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ue.writeFile(n,JSON.stringify(s,null,2)),await ft.log(r,"redo_performed",{timestamp:z.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Wu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Xs.join(E.getGlobalProjectPath(e),"snapshots"),n=Xs.join(t,"history.json"),s;try{let o=await ue.readFile(n);s=JSON.parse(o)}catch(o){if(v(o)||o instanceof SyntaxError)return console.log(`
1102
1102
  SNAPSHOT HISTORY
1103
1103
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1104
1104
  `),{success:!0,snapshots:[]};throw o}return console.log(`
1105
1105
  SNAPSHOT HISTORY
1106
- `),console.log("=".repeat(50)),r.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
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
1106
+ `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1107
+ `)):(s.snapshots.forEach((o,i)=>{let a=i===s.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${s.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1108
1108
  `)),console.log(`${"=".repeat(50)}
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(`
1109
+ `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Bu=y(()=>{"use strict";_n();N();at();l(Uu,"recover");l(Gu,"undo");l(zu,"redo");l(Wu,"history")});var Qs,Vu=y(()=>{"use strict";at();Nu();Hu();Bu();Nu();Hu();Bu();Qs=class extends ve{static{l(this,"MaintenanceCommands")}_cleanupMemory=ka;_cleanupMemoryInternal=Sa;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?_u(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Lu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Uu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Gu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?zu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Wu(e):t}}});import De from"chalk";function ba(r,e,t){return t==="below"?r<=e?De.green("\u2713"):De.yellow("\u26A0"):r>=e?De.green("\u2713"):De.yellow("\u26A0")}var Nn,Zs,Ju=y(()=>{"use strict";li();N();at();Nn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(ba,"statusIcon");Zs=class extends ve{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Yn.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1110
1110
  ${De.dim("No performance data yet.")}`),console.log(`${De.dim("Metrics are collected automatically as you use the CLI.")}
1111
1111
  `),{success:!0,message:"No data"};if(console.log(`
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}...
1112
+ ${De.cyan("Performance Report")} ${De.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ba(i.startup.avg,Nn.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: <${Nn.startup.max}ms`)}`)}if(i.memory){let c=ba(i.memory.peakHeapMB,Nn.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: <${Nn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ba(i.contextCorrectness.rate,Nn.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: ${Nn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ba(i.subtaskHandoff.rate,Nn.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: ${Nn.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 qu from"node:fs/promises";import QP from"node:path";import le from"chalk";var er,Ku=y(()=>{"use strict";Dn();ke();N();Te();lt();at();er=class extends ve{static{l(this,"SetupCommands")}async start(){let t=await(Je(),It(mt)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1114
1114
  `),!(await Ae.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1115
1115
 
1116
1116
  Please install it first:
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(`
1118
- \u2705 Installed ${r.installed?.length??0} commands to:
1119
- ${I.getDisplayPath(r.path||"")}`),(r.errors?.length??0)>0){console.log(`
1120
- \u26A0\uFE0F ${r.errors?.length??0} errors:`);for(let o of r.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1117
+ - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ae.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
1118
+ \u2705 Installed ${s.installed?.length??0} commands to:
1119
+ ${E.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
1120
+ \u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1121
1121
  \u{1F389} Setup complete!`),console.log(`
1122
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...
1123
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(`
1124
1124
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1125
1125
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}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(`
1126
+ \u{1F4DD} Installing global configuration...`);let n=await Ae.installGlobalConfig(),s=n.path?E.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Je(),It(mt)).getActiveProvider()).name==="claude"){console.log(`
1127
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(`
1128
1128
  \u{1F389} Setup complete!
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
1129
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=E.getClaudeDir(),t=E.getClaudeSettingsPath(),n=QP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1130
1130
  # prjct Status Line for Claude Code
1131
1131
  # Shows version update notifications and current task
1132
1132
 
1133
1133
  # Current CLI version (embedded at install time)
1134
- CLI_VERSION="${xe}"
1134
+ CLI_VERSION="${Pe}"
1135
1135
 
1136
1136
  # Read JSON context from stdin (provided by Claude Code)
1137
1137
  read -r json
@@ -1182,18 +1182,18 @@ fi
1182
1182
 
1183
1183
  # Default: show prjct branding
1184
1184
  echo "\u26A1 prjct"
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)}
1185
+ `;await qu.writeFile(n,s,{mode:493});let o={};if(await P(t))try{o=JSON.parse(await qu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await qu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(le.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(le.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(le.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(le.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(le.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(le.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(le.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(` ${le.bold.cyan("prjct")}${le.magenta("/")}${le.green("cli")} ${le.dim.white(`v${Pe} installed`)}`),console.log(""),console.log(` ${le.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${le.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${le.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(le.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(le.bold.cyan("\u{1F680} Quick Start")),console.log(le.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(` ${le.bold("1.")} Initialize your project:`),console.log(` ${le.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${le.bold("2.")} Start your first task:`),console.log(` ${le.green('prjct task "build auth"')}`),console.log(""),console.log(` ${le.bold("3.")} Ship & celebrate:`),console.log(` ${le.green('prjct ship "user login"')}`),console.log(""),console.log(le.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(` ${le.dim("Documentation:")} ${le.cyan("https://prjct.app")}`),console.log(` ${le.dim("Report issues:")} ${le.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(le.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import wt from"node:path";async function ZP(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await P(wt.join(r,"pnpm-lock.yaml"))?"pnpm":await P(wt.join(r,"yarn.lock"))?"yarn":await P(wt.join(r,"bun.lockb"))||await P(wt.join(r,"bun.lock"))?"bun":(await P(wt.join(r,"package-lock.json")),"npm")}function vh(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function eT(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Yu(r){let e=wt.join(r,"package.json"),t=await zn(e,null);if(t){let o=await ZP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:vh(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:vh(o,"typecheck")}),i.test&&(a.test={tool:o,command:eT(o)}),a}if(await P(wt.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await xs(wt.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await P(wt.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await P(wt.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Ps(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await P(wt.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await P(wt.join(r,"gradlew"))&&(await P(wt.join(r,"build.gradle"))||await P(wt.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var xh=y(()=>{"use strict";Te();l(ZP,"detectPackageManager");l(vh,"pmRun");l(eT,"pmTest");l(Yu,"detectProjectCommands")});import{exec as tT}from"node:child_process";import{promisify as nT}from"node:util";import Yt from"chalk";function ko(r,e){return`workflow:${r}_${e}`}async function Ph(r,e){let t=ko(e.hook,e.command);switch(e.scope){case"permanent":await Ie.recordDecision(r,t,e.action,"workflow");break;case"session":Ca.set(t,e);break;case"once":tr.set(t,e);break}}async function rT(r,e){let t={};for(let n of["before","after","skip"]){let s=ko(n,e),o=tr.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Ca.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Ie.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function wn(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await rT(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=ko(e,t);tr.has(i)&&tr.delete(i),console.log(`
1186
+ ${Yt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await sT(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(`${Yt.green("\u2713")} ${Yt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Yt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(Yt.dim(c.split(`
1187
+ `)[0])),{success:!1,failed:o,output:c}}}async function Xu(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=ko(o,s),a=tr.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Ca.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Ie.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}async function Th(r,e,t){let n=ko(e,t);return tr.delete(n),Ca.delete(n),await Ie.recordDecision(r,n,"","workflow:remove"),!0}function Eh(r){if(r.length===0)return`${Yt.dim($r.NO_PREFERENCES)}
1188
1188
 
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}
1189
+ Set one: "${$r.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];for(let t of r){let n=t.scope==="permanent"?Yt.green("permanent"):t.scope==="session"?Yt.yellow("session"):Yt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Yt.dim(`Modify: "${$r.MODIFY_EXAMPLE}"`)),e.push(Yt.dim(`Remove: "${$r.REMOVE_EXAMPLE}"`)),e.join(`
1190
+ `)}var sT,Ca,tr,Qu=y(()=>{"use strict";Hs();N();mn();sT=nT(tT),Ca=new Map,tr=new Map;l(ko,"prefKey");l(Ph,"setWorkflowPreference");l(rT,"getWorkflowPreferences");l(wn,"runWorkflowHooks");l(Xu,"listWorkflowPreferences");l(Th,"removeWorkflowPreference");l(Eh,"formatWorkflowPreferences")});import Ih from"node:path";var nr,Zu=y(()=>{"use strict";Hs();Vt();N();Ws();Bs();xh();Qu();at();nr=class extends ve{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Qe.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1191
1191
  ${o.stderr}`.trim(),a=i.split(`
1192
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(`
1193
1193
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
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
1194
+ `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.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 wn(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 gt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:z.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 wn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Mi("ship"),k=Se(Jt(`Shipped: ${i}`,`Version: ${d}`),nt("Results",xt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`])),Xe(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(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async _runLint(e){try{let t=await Yu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Yu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Ih.join(e,"package.json"),n=await ue.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ue.writeJson(t,n)),c}catch(t){if(v(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=Ih.join(n,"CHANGELOG.md"),o=await ue.readFile(s,`# Changelog
1195
1195
 
1196
- `),i=`## [${t}] - ${B.formatDate(new Date)}
1196
+ `),i=`## [${t}] - ${z.formatDate(new Date)}
1197
1197
 
1198
1198
  ### Added
1199
1199
  - ${e}
@@ -1202,46 +1202,48 @@ ${o.stderr}`.trim(),a=i.split(`
1202
1202
 
1203
1203
  `,`# Changelog
1204
1204
 
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}
1205
+ ${i}`);await ue.writeFile(s,a)}catch(s){v(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Qe.get("Bash")("git add .");let n=`feat: ${e}
1206
1206
 
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(`
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 v(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 v(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import oT from"node:fs/promises";import iT from"node:path";import sr from"chalk";var rr,ed=y(()=>{"use strict";qe();ke();$i();N();zt();at();rr=class extends ve{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(sr.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(` ${sr.dim("would update")} ${m}`);continue}try{let p=await Yr(d),g=await Ri(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${sr.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${sr.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${sr.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${sr.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 $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=iT.join(E.getGlobalBasePath(),"projects");try{return(await oT.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import Re from"chalk";var or,td=y(()=>{"use strict";Fl();Ds();kl();N();ss();at();or=class extends ve{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await ht.getAll(s);if(i.length===0)return console.log(`
1209
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(`
1210
+ `),{success:!0,message:"No data"};let a=zi(i,o);await wl.saveMetrics(s,a),console.log(`
1211
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
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=hg(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 $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Pn,...n.velocity}}catch{}return Pn}}});var aT,cT,jh,va,Ah,Dh,Rh=y(()=>{"use strict";ss();aT=[1,2,3,5,8,13,21],cT={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}},jh=l(r=>aT.includes(r),"isValidPoint"),va=l(r=>cT[r],"pointsToMinutes"),Ah=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Dh=l(r=>{let e=va(r);return`${Ah(e.min)}\u2013${Ah(e.max)}`},"pointsToTimeRange")});function nd(){rt.clear(),Xt.clear(),ir.clear(),ar.clear()}function sd(){return{issues:rt.stats(),assignedIssues:Xt.stats(),teams:ir.stats(),projects:ar.stats()}}var xa,rt,Xt,ir,ar,rd=y(()=>{"use strict";ni();xa=300*1e3,rt=new Ut({ttl:xa,maxSize:100}),Xt=new Ut({ttl:xa,maxSize:10}),ir=new Ut({ttl:xa,maxSize:5}),ar=new Ut({ttl:xa,maxSize:5});l(nd,"clearLinearCache");l(sd,"getLinearCacheStats")});import{exec as lT}from"node:child_process";import{promisify as uT}from"node:util";async function Pa(r){if(process.platform!=="darwin")return $h(r);try{let{stdout:e}=await dT(`security find-generic-password -s "${pT}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return $h(r)}}function $h(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var dT,pT,od=y(()=>{"use strict";N();dT=uT(lT),pT="prjct-cli";l(Pa,"getCredential");l($h,"getEnvFallback")});var mT,gT,Mh,Ta,kt,id=y(()=>{"use strict";N();od();mT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},gT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Mh={none:0,urgent:1,high:2,medium:3,low:4},Ta=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 Pa("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Mh[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=Mh[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:mT[t?.type||"backlog"]||"backlog",priority:gT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},kt=new Ta});var Ea,Ft,ad=y(()=>{"use strict";rd();id();Ea=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&kt.isConfigured()}async initialize(e){this.initialized||(await kt.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=Xt.get(t);if(n)return n;let s=await kt.fetchAssignedIssues(e);Xt.set(t,s);for(let o of s)rt.set(`issue:${o.id}`,o),rt.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Xt.get(n);if(s)return s;let o=await kt.fetchTeamIssues(e,t);Xt.set(n,o);for(let i of o)rt.set(`issue:${i.id}`,i),rt.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=rt.get(t);if(n)return n;let s=await kt.fetchIssue(e);return s&&(rt.set(`issue:${s.id}`,s),rt.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await kt.createIssue(e);return rt.set(`issue:${t.id}`,t),rt.set(`issue:${t.externalId}`,t),Xt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await kt.updateIssue(e,t);return rt.set(`issue:${n.id}`,n),rt.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await kt.markInProgress(e),rt.delete(`issue:${e}`),Xt.clear()}async markDone(e){this.ensureInitialized(),await kt.markDone(e),rt.delete(`issue:${e}`),Xt.clear()}async addComment(e,t){this.ensureInitialized(),await kt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ir.get("teams");if(e)return e;let t=await kt.getTeams();return ir.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=ar.get("projects");if(e)return e;let t=await kt.getProjects();return ar.set("projects",t),t}clearCache(){nd()}getCacheStats(){return sd()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ft=new Ea});var Oh,Ia,fT,Fh=y(()=>{"use strict";gc();fe();N();ad();Oh=1800*1e3,Ia=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Ft.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:Oh,issues:o};return R.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Ft.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Ft.markInProgress(t):n==="done"&&await Ft.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Oh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return R.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){R.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=sp("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},fT=new Ia});var _h=y(()=>{"use strict";rd();id();ad();Fh()});import{exec as hT}from"node:child_process";import{promisify as yT}from"node:util";var Nh,cr,wT,cd,Ln,Lh=y(()=>{"use strict";ke();fe();ae();Nh=yT(hT),cr="session-snapshot",wT=30,cd=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:C(),resumeHint:c};return R.setDoc(e,cr,u),u}getSnapshot(e){try{return R.getDoc(e,cr)}catch{return null}}clearSnapshot(e){try{R.deleteDoc(e,cr)}catch{}}async listAllSnapshots(){let e=await E.listProjects(),t=[];for(let n of e)try{if(!R.exists(n))continue;let s=R.getDoc(n,cr);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=wT){let t=await E.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!R.exists(o))continue;let i=R.getDoc(o,cr);i&&new Date(i.timestamp).getTime()<n&&(R.deleteDoc(o,cr),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${pn(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${pn(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1214
+ `)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${pn(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await Nh("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await Nh("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1215
+ `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},Ln=new cd});import kT from"node:fs/promises";import ST from"node:os";import bT from"node:path";function CT(r){return bT.join(ST.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function Aa(r){let e=CT(r);if(!await P(e))return{};try{return JSON.parse(await kT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function ld(r){let e=await Aa(r);return e.linear?.apiKey?e.linear.apiKey:Pa("linear-api-key")}var Hh=y(()=>{"use strict";N();Te();od();l(CT,"getCredentialsPath");l(Aa,"getProjectCredentials");l(ld,"getLinearApiKey")});import vT from"node:fs/promises";import xT from"node:path";function Uh(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}async function PT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}async function TT(r){try{let e=xT.join(r,"analysis","repo-analysis.json"),t=await vT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e),null}}function ET(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=Rt(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
1216
+ ${xt(g)}`}return[u?`### Project
1215
1217
  ${u}`:null,m].filter(Boolean).join(`
1216
1218
 
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)
1218
- ${r.join(`
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)
1220
- ${r.join(`
1219
+ `)||null}function IT(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Hm(e)}function AT(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"";return`- **${o.name}**: ${o.description}${i}`});e.push(`### Patterns (follow these)
1220
+ ${s.join(`
1221
+ `)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s=n.map(o=>`- **${o.issue}** \u2014 \`${o.file}\` \u2192 ${o.suggestion}`);e.push(`### Anti-patterns (avoid these)
1222
+ ${s.join(`
1221
1223
  `)}`)}return e.length>0?e.join(`
1222
1224
 
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,`
1225
+ `):null}function jT(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var lr,ud=y(()=>{"use strict";su();Zl();Rh();ke();_h();Ht();Lh();Vt();Bi();N();Ws();Bs();Hh();Qu();ss();at();lr=class extends ve{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await wn(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 Aa(o),k=await ld(o);if(k&&f.linear?.teamId){await Ft.initializeFromApiKey(k,f.linear.teamId);let b=await Ft.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await Ft.markInProgress(e))}}catch{}if(n.md){let f=await L.getCurrentTask(o);if(f)return sn("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:he(),description:c,sessionId:he(),linearId:a});let k=E.getGlobalProjectPath(o),[b,D,x,M]=await Promise.all([PT(),vt.getActive(o).catch(()=>null),TT(k),rs(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=null;try{let _=Ln.getSnapshot(o);_&&(F=Ln.formatContinuityContext(_),Ln.clearSnapshot(o))}catch{}let G=bl({description:c,branch:b,linearId:a}),ee=ET(D,x),S=Lm(M.files.map(_=>({path:_.path,description:_.reasons.join(", ")}))),j=IT(x),te=AT(D),Ze=Xe([{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(Se(F,G,ee,S,j,te,Ze)),await this.logToMemory(t,"task_started",{task:e,timestamp:z.getTimestamp()}),await wn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await na.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:he(),description:c,sessionId:he(),linearId:a});let m=await Ql.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}),Qr("working"),Pt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:z.getTimestamp()}),await wn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:jh,pointsToMinutes:va,pointsToTimeRange:Dh,storeEstimate:l(async f=>{let k=va(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?sn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?z.calculateDuration(new Date(i.startedAt)):void 0,c=bl({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?Nm(u,d):"",p=Xe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Se(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=w(s);return n.md?o.includes("Cannot run")||o.includes("working state")?sn("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return t.md?sn("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 wn(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=z.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await ht.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:z.getTimestamp(),estimatedDuration:d?Uh(d):"0m",actualDuration:c||"0m",variance:d?jT(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 (${Uh(d)}) \u2192 ${b}${k}%`}await L.completeTask(s,t.feedback);try{Ln.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Aa(s),k=await ld(s);k&&f.linear?.teamId&&(await Ft.initializeFromApiKey(k,f.linear.teamId),await Ft.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Se(Jt("Completed",`${a}${f}`),Rt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Xe([{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}`),Qr("completed"),Pt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:z.getTimestamp()}),await wn(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Ee.getActiveTasks(s);if(o.length===0)return t.md?sn("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(Se(nt("Queue",`${o.length} task${o.length!==1?"s":""}`),xt(i,!0),Xe([{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 s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?sn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=z.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e);try{await Ln.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(Se(Jt("Task Paused",`**Paused:** ${i.description}`),Rt({Reason:e||void 0,"Duration worked":a||void 0}),Xe([{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})`:""}`),Qr("paused"),Pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:z.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.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?sn("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(Se(Jt("Task Resumed",`**Resumed:** ${a.description}`),Xe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Qr("working"),Pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?sn("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Xu(s);return console.log(Eh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await Ph(s,{...o,createdAt:z.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await Th(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Xu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await Ln.cleanup();return t.md?console.log(Jt("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await Ln.listAllSnapshots();if(n.length===0)return t.md?sn("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=z.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(Se(nt("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),xt(s),Xe([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=z.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Uh,"formatMinutesToDuration");l(PT,"getGitBranch");l(TT,"loadRepoAnalysis");l(ET,"buildProjectContext");l(IT,"buildRules");l(AT,"buildPatterns");l(jT,"formatVariance")});var kn,xV,Gh=y(()=>{"use strict";oa();Ou();Fu();Vu();Ju();ra();Ku();Zu();ed();td();ud();kn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new lr,this.planning=new ds,this.shipping=new nr,this.analytics=new Ys,this.performanceCmds=new Zs,this.maintenance=new Qs,this.analysis=new hs,this.setupCmds=new er,this.updateCmds=new rr,this.velocityCmds=new or,this.contextCmds=new ys,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 sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async 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)}},xV=new kn});var So,ur,dd=y(()=>{"use strict";So={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}},ur=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"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 Vh={};we(Vh,{UninstallCommands:()=>Co,uninstall:()=>Bh});import{execSync as ja}from"node:child_process";import St from"node:fs/promises";import DT from"node:os";import Sn from"node:path";import RT from"node:readline";import xe from"chalk";async function pd(r){let e=0;try{let t=await St.readdir(r,{withFileTypes:!0});for(let n of t){let s=Sn.join(r,n.name);if(n.isDirectory())e+=await pd(s);else try{let o=await St.stat(s);e+=o.size}catch{}}}catch{}return e}function zh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function $T(r){try{return(await St.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function MT(){let r={homebrew:!1,npm:!1};try{ja("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ja("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function OT(){let r=[],e=am(),t=E.getGlobalBasePath(),n=await P(t),s=n?await $T(Sn.join(t,"projects")):0,o=n?await pd(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=Sn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let G=await St.readFile(i,"utf-8");c=G.includes(Da)&&G.includes(bo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await P(u),m=d?await pd(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await P(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=Sn.join(e.claude.config,"prjct-statusline.sh"),k=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=Sn.join(e.gemini.config,"GEMINI.md"),M=await P(x),F=!1;if(M)try{let G=await St.readFile(x,"utf-8");F=G.includes(Da)&&G.includes(bo)}catch{}return M&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function FT(r){try{let e=await St.readFile(r,"utf-8");if(!e.includes(Da)||!e.includes(bo))return!1;let t=e.indexOf(Da),n=e.indexOf(bo)+bo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1224
1226
 
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(`
1227
+ `).trim(),!s||s.trim().length===0?await St.unlink(r):await St.writeFile(r,`${s}
1228
+ `,"utf-8"),!0}catch{return!1}}async function _T(){let r=DT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Sn.join(r,`.prjct-backup-${e}`);try{await St.mkdir(t,{recursive:!0});let n=E.getGlobalBasePath();return await P(n)&&await Wh(n,Sn.join(t,".prjct-cli")),t}catch{return null}}async function Wh(r,e){await St.mkdir(e,{recursive:!0});let t=await St.readdir(r,{withFileTypes:!0});for(let n of t){let s=Sn.join(r,n.name),o=Sn.join(e,n.name);n.isDirectory()?await Wh(s,o):await St.copyFile(s,o)}}async function NT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await FT(o.path)&&n.push(o.path):o.type==="directory"?(await St.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await St.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ja(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||ja("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}async function LT(r){let e=RT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Bh(r={},e=process.cwd()){let t=await OT(),n=MT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(xe.yellow(`
1229
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(xe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(xe.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=E.getDisplayPath(c.path),d="";c.type==="section"?d=xe.dim("(section only)"):c.size&&(d=xe.dim(`(${zh(c.size)})`)),console.log(` ${xe.cyan(u.padEnd(35))} ${d}`),console.log(` ${xe.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${xe.cyan("Homebrew".padEnd(35))} ${xe.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${xe.cyan("npm global".padEnd(35))} ${xe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(xe.dim(` Total size: ${zh(o)}`)),console.log("")),r.dryRun)return console.log(xe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(xe.blue("Creating backup..."));let c=await _T();c?(console.log(xe.green(`Backup created: ${E.getDisplayPath(c)}`)),console.log("")):console.log(xe.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(xe.yellow('Type "uninstall" to confirm:')),!await LT("> ")))return console.log(xe.yellow(`
1230
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(xe.blue("Removing prjct..."));let{deleted:i,errors:a}=await NT(t,n,r);if(console.log(""),i.length>0&&console.log(xe.green(`Removed ${i.length} items`)),a.length>0){console.log(xe.yellow(`
1231
+ ${a.length} errors:`));for(let c of a)console.log(xe.red(` - ${c}`))}return console.log(""),console.log(xe.green("prjct has been uninstalled.")),console.log(xe.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 Da,bo,Co,md=y(()=>{"use strict";Dn();ke();N();Te();at();Da="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",bo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(pd,"getDirectorySize");l(zh,"formatSize");l($T,"countDirectoryItems");l(MT,"detectInstallation");l(OT,"gatherUninstallItems");l(FT,"removePrjctSection");l(_T,"createBackup");l(Wh,"copyDirectory");l(NT,"performUninstall");l(LT,"promptConfirmation");l(Bh,"uninstall");Co=class extends ve{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Bh(e,t)}}});function VT(){for(let[r,e]of Object.entries(So))U.registerCategory(r,e)}function Kh(){if(U.has("work"))return;VT();let r=l(e=>ur.find(t=>t.name===e),"getMeta");U.registerMethod("task",ws,"now",r("task")),U.registerMethod("done",ws,"done",r("done")),U.registerMethod("next",ws,"next",r("next")),U.registerMethod("pause",ws,"pause",r("pause")),U.registerMethod("resume",ws,"resume",r("resume")),U.registerMethod("workflow",ws,"workflow",r("workflow")),U.registerMethod("sessions",ws,"sessions",r("sessions")),U.registerMethod("init",Ra,"init",r("init")),U.registerMethod("bug",Ra,"bug",r("bug")),U.registerMethod("idea",Ra,"idea",r("idea")),U.registerMethod("spec",Ra,"spec",r("spec")),U.registerMethod("ship",HT,"ship",r("ship")),U.registerMethod("dash",Jh,"dash",r("dash")),U.registerMethod("help",Jh,"help",r("help")),U.registerMethod("perf",UT,"perf",r("perf")),U.registerMethod("velocity",zT,"velocity",r("velocity")),U.registerMethod("cleanup",dr,"cleanup",r("cleanup")),U.registerMethod("design",dr,"design",r("design")),U.registerMethod("recover",dr,"recover",r("recover")),U.registerMethod("undo",dr,"undo",r("undo")),U.registerMethod("redo",dr,"redo",r("redo")),U.registerMethod("history",dr,"history",r("history")),U.registerMethod("analyze",pr,"analyze",r("analyze")),U.registerMethod("sync",pr,"sync",r("sync")),U.registerMethod("stats",pr,"stats",r("stats")),U.registerMethod("status",pr,"status",r("status")),U.registerMethod("seal",pr,"seal",r("seal")),U.registerMethod("verify",pr,"verify",r("verify")),U.registerMethod("start",qh,"start",r("start")),U.registerMethod("setup",qh,"setup",r("setup")),U.registerMethod("uninstall",WT,"uninstall",r("uninstall")),U.registerMethod("update",BT,"update",r("update")),U.registerMethod("context",GT,"context",r("context"))}var ws,Ra,HT,Jh,UT,dr,pr,qh,GT,zT,WT,BT,$a=y(()=>{"use strict";oa();Ou();dd();Fu();Vu();Ju();ra();Ks();Ku();Zu();md();ed();td();ud();ws=new lr,Ra=new ds,HT=new nr,Jh=new Ys,UT=new Zs,dr=new Qs,pr=new hs,qh=new er,GT=new ys,zT=new or,WT=new Co,BT=new rr;l(VT,"registerCategories");l(Kh,"registerAllCommands");Kh()});var gd=y(()=>{"use strict";Cc();Gh();$a();Ks()});var Xh={};we(Xh,{shutdown:()=>gr,startDaemon:()=>qT});import _t from"node:fs";import{createServer as JT}from"node:net";async function qT(r){let e=Ge.socket(),t=Ge.pid(),n=Ge.runDir();if(_t.mkdirSync(n,{recursive:!0}),_t.existsSync(t)){let s=parseInt(_t.readFileSync(t,"utf-8").trim(),10);ZT(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),_t.unlinkSync(t)}if(_t.existsSync(e)&&_t.unlinkSync(e),Ve={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ha,idleTimer:null},Ne=new kn,mr=JT(s=>KT(s)),mr.listen(e,()=>{_t.chmodSync(e,384),_t.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Yh()}),mr.on("error",s=>{console.error("Daemon socket error:",s.message),gr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||oi;vo=ri({port:i,projectId:o,projectPath:s,enableLogging:!1}),await vo.start()}}catch{}if(process.on("SIGTERM",()=>gr(0)),process.on("SIGINT",()=>gr(0)),process.on("SIGHUP",()=>{Ne=new kn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function KT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1232
+ `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await YT(o);r.write(Ss(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Ss(i))}}}),r.on("error",()=>{})}async function YT(r){if(!Ve||!Ne)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Yh(),Ve.commandsServed++,Ve.lastActivity=Date.now(),r.command==="daemon")return QT(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await XT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1231
1233
  `)||o.message||void 0,stderr:t.join(`
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(`
1234
+ `)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function XT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Ne.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Ne.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Ne.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Ne.seal(r.cwd,{json:t.json===!0});case"verify":return Ne.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Ne.task(e,r.cwd,{md:n});case"done":return Ne.done(r.cwd,{md:n});case"next":return Ne.next(r.cwd,{md:n});case"pause":return Ne.pause(e||"",r.cwd,{md:n});case"resume":return Ne.resume(e,r.cwd,{md:n});case"bug":return Ne.bug(e||"",r.cwd,{md:n});case"idea":return Ne.idea(e||"",r.cwd,{md:n});case"ship":return Ne.ship(e,r.cwd,{md:n});case"dash":return Ne.dash(e||"default",r.cwd,{md:n});case"sessions":return Ne.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return Ne.design(e||"",t);case"analyze":return Ne.analyze(t);case"cleanup":return Ne.cleanup(t);default:return U.execute(r.command,e,r.cwd)}}function QT(r){let e=r.args[0];if(e==="status")return{id:r.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:U.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>gr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Yh(){Ve&&(Ve.idleTimer&&clearTimeout(Ve.idleTimer),Ve.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ve.idleTimeoutMs/1e3/60} minutes, shutting down`),gr(0)},Ve.idleTimeoutMs),Ve.idleTimer.unref&&Ve.idleTimer.unref())}function gr(r){console.log("Daemon shutting down..."),Ve?.idleTimer&&clearTimeout(Ve.idleTimer),vo&&(vo.stop(),vo=null),mr&&(mr.close(),mr=null);let e=Ge.socket(),t=Ge.pid();try{_t.existsSync(e)&&_t.unlinkSync(e)}catch{}try{_t.existsSync(t)&&_t.unlinkSync(t)}catch{}process.exit(r)}function ZT(r){try{return process.kill(r,0),!0}catch{return!1}}var mr,vo,Ne,Ve,Qh=y(()=>{"use strict";gd();Ks();$a();qe();$c();Po();mr=null,vo=null,Ne=null,Ve=null;l(qT,"startDaemon");l(KT,"handleConnection");l(YT,"handleRequest");l(XT,"executeCommand");l(QT,"handleDaemonCommand");l(Yh,"resetIdleTimer");l(gr,"shutdown");l(ZT,"isProcessRunning")});var ty={};we(ty,{runStart:()=>lE});import Nt from"node:fs/promises";import Zh from"node:os";import Qt from"node:path";import V from"chalk";function nE(){console.clear(),console.log(eE),console.log(tE)}function ey(r,e){console.log(`
1233
1235
  ${V.bold(" Select AI providers to configure:")}
1234
1236
  `),console.log(` ${V.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
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(`
1237
+ `),r.forEach((t,n)=>{let s=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(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function sE(){let r=await un(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,s=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),ey(e,n)},"render");ey(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(`
1236
1238
  Cancelled.
1237
1239
  `),process.exit(0)),a==="\r"||a===`
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(`
1240
+ `){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),s()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),s()),a===" "&&(e[n].selected=!e[n].selected,s())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1239
1241
  ${V.bold(" Detected providers:")}
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}
1242
+ `),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 rE(r){let e=Oe[r];if(!e.configDir)return!1;try{let t=Qt.join(e.configDir,"commands");await Nt.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(lt(),No)),s=n(),o=r==="claude"?"p.md":"p.toml",i=Qt.join(s,"templates","commands",o),a=Qt.join(t,o);return await P(i)?(await Nt.copyFile(i,a),!0):!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${r} router: ${w(t)}`),!1}}async function oE(r){let e=Oe[r];if(!e.configDir)return!1;try{let t=r==="gemini"?Qt.join(e.configDir,"commands"):Qt.join(e.configDir,"commands","p");await Nt.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=An("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=ye(`commands/${i}`);a&&await Nt.writeFile(Qt.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${r} subcommands: ${w(t)}`),!1}}async function iE(r){let e=Oe[r];if(!e.configDir)return!1;try{await Nt.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(lt(),No)),n=t(),s=r==="claude"?"CLAUDE.md":"GEMINI.md",o=Qt.join(n,"templates","global",s),i=Qt.join(e.configDir,s);if(await P(o)){let a=await Nt.readFile(o,"utf-8");if(await P(i)){let c=await Nt.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 Nt.writeFile(i,m+g+p)}else await Nt.writeFile(i,`${c}
1241
1243
 
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(`
1244
+ ${a}`)}else await Nt.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${r} config: ${w(t)}`),!1}}async function aE(r){let e=Qt.join(Zh.homedir(),".prjct-cli","config");await Nt.mkdir(e,{recursive:!0});let t=Qt.join(e,"installed-editors.json"),n={version:Pe,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:Qt.join(Zh.homedir(),`.${r[0]}`,"commands")};await Nt.writeFile(t,JSON.stringify(n,null,2))}function cE(r){console.log(`
1243
1245
  ${V.green.bold(" \u2713 Setup complete!")}
1244
- `),console.log(` ${V.dim("Configured providers:")}`),s.forEach(e=>{let t=Oe[e];console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(`
1246
+ `),console.log(` ${V.dim("Configured providers:")}`),r.forEach(e=>{let t=Oe[e];console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(`
1245
1247
  ${V.bold("Next steps:")}
1246
1248
 
1247
1249
  ${V.cyan("1.")} Navigate to your project directory
@@ -1254,30 +1256,30 @@ ${V.green.bold(" \u2713 Setup complete!")}
1254
1256
  ${V.dim("\u2022")} Use ${V.bold("p. ship")} to create PRs
1255
1257
 
1256
1258
  ${V.dim("Learn more: https://prjct.app/docs")}
1257
- `)}async function ZT(){VT();let s=await JT();console.log(`
1259
+ `)}async function lE(){nE();let r=await sE();console.log(`
1258
1260
  ${V.cyan("Setting up...")}
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=`
1261
+ `);for(let e of r){let t=Oe[e];process.stdout.write(` ${V.dim("\u2022")} ${t.displayName}... `);let n=await rE(e),s=await oE(e),o=await iE(e);console.log(n&&s&&o?V.green("\u2713"):n||o?V.yellow("partial"):V.yellow("skipped"))}await aE(r),cE(r)}var fr,hr,yr,wr,kr,eE,tE,ny=y(()=>{"use strict";jn();Je();N();Te();lt();fr=V.rgb(0,255,255),hr=V.rgb(80,180,255),yr=V.rgb(140,120,255),wr=V.rgb(200,80,220),kr=V.rgb(255,80,180),eE=`
1260
1262
 
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 ")}
1263
+ ${fr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${hr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${yr(" \u2588\u2588\u2557")}${wr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${kr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1264
+ ${fr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${hr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${yr(" \u2588\u2588\u2551")}${wr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${kr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1265
+ ${fr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${hr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${yr(" \u2588\u2588\u2551")}${wr("\u2588\u2588\u2551 ")}${kr(" \u2588\u2588\u2551 ")}
1266
+ ${fr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${hr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${yr("\u2588\u2588 \u2588\u2588\u2551")}${wr("\u2588\u2588\u2551 ")}${kr(" \u2588\u2588\u2551 ")}
1267
+ ${fr(" \u2588\u2588\u2551 ")}${hr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${yr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${wr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${kr(" \u2588\u2588\u2551 ")}
1268
+ ${fr(" \u255A\u2550\u255D ")}${hr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${yr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${wr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${kr(" \u255A\u2550\u255D ")}
1267
1269
 
1268
- `,BT=` ${V.white("Context Layer for AI Agents")} ${V.dim(`v${xe}`)}
1270
+ `,tE=` ${V.white("Context Layer for AI Agents")} ${V.dim(`v${Pe}`)}
1269
1271
 
1270
1272
  ${V.dim(`Project context layer for AI coding agents.
1271
1273
  Works with Claude Code, Gemini CLI, and more.`)}
1272
1274
  ${V.cyan("https://prjct.app")}
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(`
1275
+ `;l(nE,"showBanner");l(ey,"showProviderSelection");l(sE,"selectProviders");l(rE,"installRouter");l(oE,"installSubcommands");l(iE,"installGlobalConfig");l(aE,"saveSetupConfig");l(cE,"showCompletion");l(lE,"runStart")});import{exec as uE}from"node:child_process";import oy from"node:fs/promises";import cn from"node:path";import{promisify as dE}from"node:util";async function Sr(r,e=process.cwd(),t={}){let n=cn.isAbsolute(r)?r:cn.join(e,r),s;try{s=await oy.readFile(n,"utf-8")}catch(g){if(v(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=cn.extname(r).toLowerCase(),i=hE[o]||"unknown",a=fE[i]||[],c=await yE(s,a,n,e),u=[];t.reverse&&(u=await kE(r,e));let d;t.depth&&t.depth>0&&(d=await iy(r,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function yE(r,e,t,n){let s=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await wE(c,t,n)),s.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return s}async function wE(r,e,t){let n=cn.dirname(e);if(r.startsWith("@/")){let o=cn.join(t,"src",r.slice(2));return ry(o,t)}let s=cn.resolve(n,r);return ry(s,t)}async function ry(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let s=r+n;try{if((await oy.stat(s)).isFile())return cn.relative(e,s)}catch{}}return null}async function kE(r,e){let t=[],n=cn.basename(r,cn.extname(r)),s=cn.dirname(r);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await pE(`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(`
1276
+ `).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function iy(r,e,t,n=0,s=new Set){let o={file:r,imports:[],depth:n};if(n>=t||s.has(r))return o;s.add(r);let i=await Sr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await iy(a.resolved,e,t,n+1,s);o.imports.push(c)}return o}var pE,sy,mE,gE,fE,hE,fd=y(()=>{"use strict";N();pE=dE(uE),sy=[{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}],mE=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],gE=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],fE={typescript:sy,javascript:sy,python:mE,go:gE},hE={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Sr,"analyzeImports");l(yE,"extractImports");l(wE,"resolveImport");l(ry,"tryResolve");l(kE,"findImportedBy");l(iy,"buildDependencyTree")});import ay from"node:fs/promises";import ln from"node:path";async function Ma(r,e=process.cwd()){let t=ln.isAbsolute(r)?r:ln.join(e,r),n;try{n=await ay.readFile(t,"utf-8")}catch(p){if(v(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:os("")};throw p}let s=ln.extname(r).toLowerCase(),o=cy[s]||"unknown",i=await On(r,e),a=await Sr(r,e),c=bE(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?CE(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=vE(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:ro(n,m)}}async function hd(r,e=process.cwd(),t={}){let n=ln.isAbsolute(r)?r:ln.join(e,r),s=[];async function o(i){let a=await ay.readdir(i,{withFileTypes:!0});for(let c of a){let u=ln.join(i,c.name),d=ln.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=ln.extname(c.name).toLowerCase();if(cy[m]){let p=await Ma(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function bE(r,e){let t=SE[e]||[],n=r.split(`
1275
1277
  `);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]}
1276
1278
  `,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
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(`
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`
1279
+ `).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let s=r.split(`
1280
+ `)[0]||"";return`Module: ${ln.basename(s,ln.extname(s))}`}function CE(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1281
+ `)[0].trim()}function vE(r,e,t){let n=[];if(n.push(`Purpose: ${r}`),n.push(""),e.length>0){n.push("Public API:");for(let s of e){let o=s.description?` - ${s.description}`:"";n.push(` ${s.type} ${s.name}: ${s.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
1282
+ `)}var SE,cy,ly=y(()=>{"use strict";N();fd();qi();oo();SE={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}]},cy={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ma,"summarizeFile");l(hd,"summarizeDirectory");l(bE,"extractFilePurpose");l(CE,"extractDescriptionFromDocstring");l(vE,"buildSummaryText")});var uy=y(()=>{"use strict"});var dy={};we(dy,{analyzeImports:()=>Sr,combineMetrics:()=>Ji,countTokens:()=>Vi,extractDirectorySignatures:()=>Hl,extractSignatures:()=>On,findRelevantFiles:()=>rs,formatCompressionRate:()=>Av,formatCostSaved:()=>Ll,formatTokenCount:()=>Iv,getRecentFiles:()=>so,measureCompression:()=>ro,noCompression:()=>os,runContextTool:()=>xE,summarizeDirectory:()=>hd,summarizeFile:()=>Ma});async function xE(r,e,t){let n=Date.now(),[s,...o]=r;try{let i;switch(s){case"files":i=await PE(o,t);break;case"signatures":i=await TE(o,t);break;case"imports":i=await EE(o,t);break;case"recent":i=await IE(o,t);break;case"summary":i=await AE(o,t);break;case"help":return{tool:"error",result:{error:$E(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${s}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=jE(i),u=DE(i);return await RE(e,{tool:s,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function PE(r,e){let t={},n=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:n.push(r[i]);let s=n.join(" ");return s?{tool:"files",result:await rs(s,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function TE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await Hl(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Ji(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 On(t,e)}}async function EE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let n={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?n.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(n.depth=parseInt(r[++o],10));return{tool:"imports",result:await Sr(t,e,n)}}async function IE(r,e){let t={};for(let s=0;s<r.length;s++)r[s]==="--branch"||r[s]==="-b"?t.branch=!0:r[s]==="--max"&&r[s+1]?t.maxFiles=parseInt(r[++s],10):/^\d+$/.test(r[s])&&(t.commits=parseInt(r[s],10));return{tool:"recent",result:await so(e,t)}}async function AE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await hd(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Ji(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ma(t,e)}}function jE(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.tokens.saved;case"files":return r.result.metrics.filesScanned*50-r.result.metrics.filesReturned*50;case"imports":return r.result.metrics.totalImports*20;case"recent":return r.result.metrics.totalFilesChanged*30;default:return 0}}function DE(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.compression;case"files":{let e=r.result.metrics.filesScanned,t=r.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function RE(r,e){try{await gn.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function $E(){return`
1281
1283
  Context Tools - Smart context filtering for AI agents
1282
1284
 
1283
1285
  USAGE:
@@ -1338,7 +1340,7 @@ TOOLS:
1338
1340
  OUTPUT:
1339
1341
  All tools output JSON for easy parsing by AI agents.
1340
1342
  Each output includes metrics showing token savings.
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
1343
+ `.trim()}var py=y(()=>{"use strict";Kr();N();ae();Bi();fd();_l();qi();ly();oo();oo();uy();l(xE,"runContextTool");l(PE,"runFilesTool");l(TE,"runSignaturesTool");l(EE,"runImportsTool");l(IE,"runRecentTool");l(AE,"runSummaryTool");l(jE,"getTokensSaved");l(DE,"getCompressionRate");l(RE,"recordToolUsage");l($E,"getHelpText")});var hy={};we(hy,{hooksService:()=>HE});import Ue from"node:fs/promises";import $e from"node:path";import Et from"chalk";function gy(){return`#!/bin/sh
1342
1344
  # prjct auto-sync hook (post-commit)
1343
1345
  # Syncs project context after each commit
1344
1346
  # Installed by: prjct hooks install
@@ -1359,7 +1361,7 @@ if command -v prjct >/dev/null 2>&1; then
1359
1361
  fi
1360
1362
 
1361
1363
  exit 0
1362
- `}function cy(){return`#!/bin/sh
1364
+ `}function fy(){return`#!/bin/sh
1363
1365
  # prjct auto-sync hook (post-checkout)
1364
1366
  # Syncs project context after branch switch
1365
1367
  # Installed by: prjct hooks install
@@ -1391,45 +1393,45 @@ if command -v prjct >/dev/null 2>&1; then
1391
1393
  fi
1392
1394
 
1393
1395
  exit 0
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=`
1396
+ `}async function yd(r){let e=[];return(await P($e.join(r,"lefthook.yml"))||await P($e.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await P($e.join(r,".husky"))||await P($e.join(r,".husky","_")))&&e.push("husky"),await P($e.join(r,".git"))&&e.push("direct"),e}function my(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function ME(r,e){let t=await P($e.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=$e.join(r,t),s=await Ue.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(s.includes(a))continue;let c=`
1395
1397
  ${i}:
1396
1398
  commands:
1397
1399
  ${a}:
1398
1400
  run: prjct sync --quiet --yes
1399
1401
  fail_text: "prjct sync failed (non-blocking)"
1400
- `,u=new RegExp(`^${i}:\\s*$`,"m");u.test(r)?r=r.replace(u,`${i}:
1402
+ `,u=new RegExp(`^${i}:\\s*$`,"m");u.test(s)?s=s.replace(u,`${i}:
1401
1403
  commands:
1402
1404
  ${a}:
1403
1405
  run: prjct sync --quiet --yes
1404
- fail_text: "prjct sync failed (non-blocking)"`):r=`${r.trimEnd()}
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,`
1406
+ fail_text: "prjct sync failed (non-blocking)"`):s=`${s.trimEnd()}
1407
+ ${c}`}return await Ue.writeFile(n,s,"utf-8"),!0}async function OE(r,e){let t=$e.join(r,".husky");for(let n of e){let s=$e.join(t,n),o=n==="post-commit"?gy():fy();if(await P(s)){if((await Ue.readFile(s,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(s,`
1406
1408
  # prjct auto-sync
1407
1409
  prjct sync --quiet --yes &
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,`
1410
+ `)}else await Ue.writeFile(s,o,{mode:493})}return!0}async function FE(r,e){let t=$e.join(r,".git","hooks");await P(t)||await Ue.mkdir(t,{recursive:!0});for(let n of e){let s=$e.join(t,n),o=n==="post-commit"?gy():fy();if(await P(s)){if((await Ue.readFile(s,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(s,`
1409
1411
  # prjct auto-sync
1410
1412
  ${o.split(`
1411
1413
  `).slice(1).join(`
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(`
1414
+ `)}`)}else await Ue.writeFile(s,o,{mode:493})}return!0}async function _E(r){let e=await P($e.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=$e.join(r,e);if(!await P(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()}
1415
+ `,"utf-8"),!0}async function NE(r){let e=$e.join(r,".husky");for(let t of["post-commit","post-checkout"]){let n=$e.join(e,t);if(!await P(n))continue;let s=await Ue.readFile(n,"utf-8");if(!s.includes("prjct sync"))continue;let o=s.split(`
1414
1416
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
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(`
1417
+ `);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 LE(r){let e=$e.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=$e.join(e,t);if(!await P(n))continue;let s=await Ue.readFile(n,"utf-8");if(s.includes("prjct sync"))if(s.includes("Installed by: prjct hooks install"))await Ue.unlink(n);else{let o=s.split(`
1416
1418
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
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||`
1424
- ${K.yellow(`Command '${s}' not found.`)}
1419
+ `);await Ue.writeFile(n,o,{mode:493})}}return!0}var wd,HE,yy=y(()=>{"use strict";qe();fe();N();Te();zt();l(gy,"getPostCommitScript");l(fy,"getPostCheckoutScript");l(yd,"detectHookManagers");l(my,"selectStrategy");l(ME,"installLefthook");l(OE,"installHusky");l(FE,"installDirect");l(_E,"uninstallLefthook");l(NE,"uninstallHusky");l(LE,"uninstallDirect");wd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],s=await yd(e);if(s.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||my(s);try{let i=!1;switch(o){case"lefthook":i=await ME(e,n);break;case"husky":i=await OE(e,n);break;case"direct":i=await FE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",s=!1;switch(n){case"lefthook":s=await _E(e);break;case"husky":s=await NE(e);break;case"direct":s=await LE(e);break}return s&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:s}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await yd(e),n=await this.getHookConfig(e),s=["post-commit","post-checkout"],o=await Promise.all(s.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await $.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 yd(e),n=my(t);console.log(` Strategy: ${Et.cyan(n)}`),console.log(` Hooks: ${Et.dim("post-commit, post-checkout")}`),console.log("");let s=await this.install(e,{strategy:n});if(s.success){h.done(`Hooks installed via ${s.strategy}`),console.log("");for(let o of s.hooksInstalled)console.log(` ${Et.green("\u2713")} ${o}`);console.log(""),console.log(Et.dim(" Context will auto-sync on commit and branch switch.")),console.log(Et.dim(" Remove with: prjct hooks uninstall"))}else h.fail(s.error||"Failed to install hooks");return console.log(""),h.end(),s.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${Et.green("Active")}`),console.log(` Strategy: ${Et.cyan(t.strategy)}`)):console.log(` Status: ${Et.dim("Not installed")}`),console.log("");for(let n of t.hooks){let s=n.installed?Et.green("\u2713"):Et.dim("\u25CB"),o=n.installed?n.name:Et.dim(n.name);console.log(` ${s} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Et.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Et.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await P($e.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=$e.join(e,o);return await P(i)?(await Ue.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=$e.join(e,".husky",t);return await P(o)?(await Ue.readFile(o,"utf-8")).includes("prjct sync"):!1}let s=$e.join(e,".git","hooks",t);return await P(s)?(await Ue.readFile(s,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await P($e.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await $.getProjectId(e);if(!t)return null;try{let n=R.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await $.getProjectId(e);if(n)try{let s=R.getDoc(n,"project")||{};s.hooks=t,R.setDoc(n,"project",s)}catch{}}},HE=new wd});var Sy={};we(Sy,{DoctorService:()=>Oa,doctorService:()=>UE});import{execSync as kd}from"node:child_process";import wy from"node:fs/promises";import ky from"node:path";import Hn from"chalk";var Oa,UE,by=y(()=>{"use strict";qe();ke();Vt();zt();lt();Oa=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await $.getProjectId(e),this.projectId&&(this.globalPath=E.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),s=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:s,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,n,s,o){try{let a=kd(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:s}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:s}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e}async checkPrjctConfig(){let e=ky.join(this.projectPath,".prjct","prjct.config.json");try{return await wy.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=ky.join(this.globalPath,"context","CLAUDE.md");try{let t=await wy.stat(e),n=Date.now()-t.mtimeMs,s=Math.floor(n/(1e3*60*60)),o=Math.floor(s/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:s>0?i=`${s} hour${s>1?"s":""} ago`:i="recently",s>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{kd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=kd("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1420
+ `).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(s=>{let o=this.getStatusIcon(s.status,s.optional),i=s.name.padEnd(14),a=s.version||s.message||"",c=s.optional&&s.status==="error"?Hn.dim(" (optional)"):"";return`${o} ${i} ${Hn.dim(a)}${c}`});for(let s of n)console.log(` ${s}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:Hn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Hn.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 Hn.green("\u2713");case"warn":return Hn.yellow("\u26A0");case"error":return t?Hn.dim("\u25CB"):Hn.red("\u2717")}}},UE=new Oa});var Cy={};we(Cy,{WatchService:()=>Fa,watchService:()=>VE});import GE from"node:path";import ot from"chalk";import zE from"chokidar";var WE,BE,Fa,VE,vy=y(()=>{"use strict";qe();N();ae();ju();WE=["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"],BE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Fa=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await $.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=zE.watch(WE,{cwd:this.projectPath,ignored:BE,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(ot.dim(`
1421
+ \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(ot.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(ot.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(`
1422
+ ${ot.dim(`[${t}]`)} ${ot.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await gs.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let s=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=s.length>0?` [${s.join(", ")}]`:"";console.log(`${ot.dim(`[${t}]`)} ${ot.green("\u2713")} Synced${o}`)}}else console.error(`${ot.dim(`[${t}]`)} ${ot.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${ot.dim(`[${t}]`)} ${ot.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(ot.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(ot.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(ot.dim(` Project: ${GE.basename(this.projectPath)}`)),console.log(ot.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(ot.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(ot.dim(" Press Ctrl+C to stop")),console.log("")}},VE=new Fa});var jy={};we(jy,{formatAgentCommandHelp:()=>Ey,formatCommandHelp:()=>Iy,formatCommandList:()=>Ay,formatMainHelp:()=>Py,formatTerminalCommandHelp:()=>Ty,getHelp:()=>qE});import K from"chalk";function Py(){let r=[];r.push(""),r.push(`${K.cyan.bold("prjct")} v${Pe} - Context layer for AI coding agents`),r.push(K.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(K.bold("QUICK START")),r.push(K.dim("\u2500".repeat(60))),r.push(` ${K.green("1.")} prjct start ${K.dim("# Configure AI providers")}`),r.push(` ${K.green("2.")} cd my-project && prjct init`),r.push(` ${K.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${K.green("4.")} p. sync ${K.dim("# Analyze project")}`),r.push(""),r.push(K.bold("TERMINAL COMMANDS")),r.push(K.dim("\u2500".repeat(60)));for(let t of xy){let n=`prjct ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(""),r.push(`${K.bold("AI AGENT COMMANDS")} ${K.dim("(inside Claude/Gemini/Cursor)")}`),r.push(K.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${K.dim("\u2500".repeat(56))}`);let e=ur.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(` ${K.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(K.bold("FLAGS")),r.push(K.dim("\u2500".repeat(60)));for(let t of JE)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(K.bold("MORE INFO")),r.push(K.dim("\u2500".repeat(60))),r.push(` Documentation: ${K.cyan("https://prjct.app")}`),r.push(` GitHub: ${K.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
1423
+ `)}function Ty(r){let e=xy.find(n=>n.name===r);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(`
1424
+ `)}function Ey(r){let e=ur.find(s=>s.name===r);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 s of e.features)t.push(` \u2022 ${s}`);t.push("")}e.blockingRules&&(t.push(K.bold("REQUIREMENTS")),t.push(` ${K.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=So[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(`
1425
+ `)}function Iy(r){let e=Ty(r);if(e)return e;let t=Ey(r);return t||`
1426
+ ${K.yellow(`Command '${r}' not found.`)}
1425
1427
 
1426
1428
  Run 'prjct help' to see all available commands.
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}
1429
+ `}function Ay(){let r=[];r.push(""),r.push(K.cyan.bold("All Commands")),r.push("");let e=Object.entries(So).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=ur.filter(o=>o.group===t);if(s.length!==0){r.push(`${K.bold(n.title)} ${K.dim(`(${s.length} commands)`)}`),r.push(K.dim(n.description)),r.push("");for(let o of s){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(K.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1430
+ `)}function qE(r){return r?r==="commands"||r==="all"?Ay():Iy(r):Py()}var xy,JE,Dy=y(()=>{"use strict";dd();lt();xy=[{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"]}],JE=[{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(Py,"formatMainHelp");l(Ty,"formatTerminalCommandHelp");l(Ey,"formatAgentCommandHelp");l(Iy,"formatCommandHelp");l(Ay,"formatCommandList");l(qE,"getHelp")});var _y={};we(_y,{installAntigravitySkill:()=>Oy,installCodexSkill:()=>Fy,needsAntigravityInstallation:()=>ZE,run:()=>My});import{execSync as KE}from"node:child_process";import J from"node:fs/promises";import Un from"node:os";import Z from"node:path";import ge from"chalk";async function YE(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!zs.isAvailable("npm"))return console.log(`${ge.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ge.dim(`Install ${r.displayName} using one of:`)}`),console.log(ge.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ge.dim(` \u2022 Use Homebrew: brew install ${r.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} ${r.displayName} not found. Installing...`)),console.log(""),KE(`npm install -g ${e}`,{stdio:"inherit",timeout:Ms("NPM_INSTALL")}),console.log(""),console.log(`${ge.green("\u2713")} ${r.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 ${r.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 ${r.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 ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function My(){let r=await un(),e=await Ya(),t=Oe[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let a of s){let c=Oe[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await YE(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 tI(),await nI()}}else if(a==="gemini"){await XE()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await QE();p.success&&(d.configAction=p.action)}n.providers.push(d)}(await Ts()).installed&&(await Oy()).success&&console.log(` ${ge.green("\u2713")} Antigravity skill installed`),(await Ka()).installed&&(await Fy()).success&&console.log(` ${ge.green("\u2713")} Codex skill installed`),await ic.saveConfig(Pe,await Ae.getInstallPath(),e.provider),await eI();for(let a of n.providers)sI(a,Oe[a.provider]);return n}async function XE(){try{let r=Z.join(Un.homedir(),".gemini","commands"),e=Z.join(r,"p.toml");await J.mkdir(r,{recursive:!0});let t=ye("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 P(n)?(await J.copyFile(n,e),!0):!1}catch(r){return H.warn(`Gemini router warning: ${w(r)}`),!1}}async function QE(){try{let r=Z.join(Un.homedir(),".gemini"),e=Z.join(r,"GEMINI.md");await J.mkdir(r,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=Z.join(pe,"templates","global","GEMINI.md");t=await J.readFile(p,"utf-8")}let n="",s=!1;try{n=await J.readFile(e,"utf-8"),s=!0}catch(p){if(v(p))s=!1;else throw p}if(!s)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}
1429
1431
 
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
1432
+ ${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(r){return H.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function Oy(){try{let r=Z.join(Un.homedir(),".gemini","antigravity","skills"),e=Z.join(r,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await P(t),s=ye("antigravity/SKILL.md");if(!s){let o=Z.join(pe,"templates","antigravity","SKILL.md");if(!await P(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await J.readFile(o,"utf-8")}return await J.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function ZE(){let r=await Ts();return r.installed&&!r.skillInstalled}async function Fy(){try{let r=Z.join(Un.homedir(),".codex","skills"),e=Z.join(r,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await P(t),s=ye("codex/SKILL.md");if(!s){let o=Z.join(pe,"templates","codex","SKILL.md");if(!await P(o))return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};s=await J.readFile(o,"utf-8")}return await J.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Codex skill warning: ${w(r)}`),{success:!1,action:null}}}async function eI(){try{let r=Z.join(Un.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await J.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=R.getDoc(n,"project");if(!s)continue;s.cliVersion!==Pe&&(s.cliVersion=Pe,R.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${ge.green("\u2713")} Updated ${t} project(s) to v${Pe}`)}catch(r){v(r)||H.warn(`Migration warning: ${w(r)}`)}}async function Ry(r,e){let t={};if(await P(r))try{t=JSON.parse(await J.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await J.writeFile(r,JSON.stringify(t,null,2))}async function tI(){try{let r=Z.join(Un.homedir(),".claude"),e=Z.join(r,"settings.json"),t=Z.join(r,"prjct-statusline.sh"),n=Z.join(Un.homedir(),".prjct-cli","statusline"),s=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 P(r)||await J.mkdir(r,{recursive:!0}),await P(n)||await J.mkdir(n,{recursive:!0}),await P(o)||await J.mkdir(o,{recursive:!0}),await P(i)||await J.mkdir(i,{recursive:!0}),await P(a)||await J.mkdir(a,{recursive:!0}),await P(s)){let k=await J.readFile(s,"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(s,D,{mode:493})}await _a(p,i),await _a(g,a),await $y(t,s),await Ry(e,t);return}}if(await P(d)){let k=await J.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Pe}"`),await J.writeFile(s,k,{mode:493}),await _a(p,i),await _a(g,a),await P(m)){let b=await J.readdir(m);for(let D of b){let x=Z.join(m,D),M=Z.join(o,D);await J.copyFile(x,M)}}!await P(c)&&await P(f)&&await J.copyFile(f,c)}else{let k=`#!/bin/bash
1431
1433
  # prjct Status Line for Claude Code
1432
- CLI_VERSION="${xe}"
1434
+ CLI_VERSION="${Pe}"
1433
1435
  input=$(cat)
1434
1436
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
1435
1437
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -1458,14 +1460,14 @@ if [ -f "$CONFIG" ]; then
1458
1460
  fi
1459
1461
  fi
1460
1462
  echo "prjct"
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
+ `;await J.writeFile(s,k,{mode:493})}await $y(t,s),await Ry(e,t)}catch(r){v(r)||H.warn(`Status line warning: ${w(r)}`)}}async function nI(){try{let r=Z.join(Un.homedir(),".claude"),e=Z.join(r,"mcp.json");await P(r)||await J.mkdir(r,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await P(e)){let n=await J.readFile(e,"utf-8"),s=JSON.parse(n);if(s.mcpServers?.context7)return;s.mcpServers=s.mcpServers||{},s.mcpServers.context7=t.mcpServers.context7,await J.writeFile(e,JSON.stringify(s,null,2),"utf-8")}else await J.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(r){H.warn(`Context7 MCP setup warning: ${w(r)}`)}}async function _a(r,e){if(!await P(r))return;let t=await J.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=Z.join(r,n),o=Z.join(e,n);await J.copyFile(s,o),await J.chmod(o,493)}}async function $y(r,e){try{if(await P(r)){if((await J.lstat(r)).isSymbolicLink()&&await J.readlink(r)===e)return;await J.unlink(r)}await J.symlink(e,r)}catch{try{await P(e)&&(await J.copyFile(e,r),await J.chmod(r,493))}catch(n){v(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function sI(r,e){if(console.log(""),r.cliInstalled?console.log(` ${ge.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ge.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${ge.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${ge.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${ge.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${ge.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${ge.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var rI,Ny=y(()=>{"use strict";jn();Ai();fe();N();mn();Te();Vn();lt();Je();Dn();ac();l(YE,"installAICLI");l(My,"run");l(XE,"installGeminiRouter");l(QE,"installGeminiGlobalConfig");l(Oy,"installAntigravitySkill");l(ZE,"needsAntigravityInstallation");l(Fy,"installCodexSkill");l(eI,"migrateProjectsCliVersion");l(Ry,"ensureStatusLineSettings");l(tI,"installStatusLine");l(nI,"installContext7MCP");l(_a,"installStatusLineModules");l($y,"ensureStatusLineSymlink");l(sI,"showResults");rI=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");rI&&My().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var Ly=Ky((Jq,oI)=>{oI.exports={name:"prjct-cli",version:"1.32.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 mI={};import Hy from"node:os";import Na from"node:path";import Me from"chalk";async function iI(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let t=await Promise.resolve().then(()=>Yy(Ly()));await dI(t.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(pI(),process.exit(0)),h.start();try{let t=U.getByName(r);if(!t){let d=cI(r),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Kn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${r}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:s}=uI(t,e),o=aI(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await $.getProjectId(process.cwd()),i&&(await In.expireIfStale(i),await In.touch(i))}catch{}let c=new kn,u;if(r==="design"){let d=n.join(" ");u=await c.design(d,s)}else if(r==="analyze")u=await c.analyze(s);else if(r==="cleanup")u=await c.cleanup(s);else if(r==="setup")u=await c.setup(s);else if(r==="update")u=await c.update(s);else{let d=n.join(" ")||null,m=s.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),sessions:l(()=>c.sessions(process.cwd(),{md:m,cleanup:s.cleanup===!0}),"sessions"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:s.json===!0,export:s.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:s.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:s.agents?String(s.agents).split(","):void 0,preview:s.preview===!0||s["dry-run"]===!0,yes:s.yes===!0,json:s.json===!0,md:m,package:s.package?String(s.package):void 0,full:s.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:s.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:s.json===!0,semantic:s.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[r];if(g)u=await g(d);else throw new Error(`Command '${r}' has no handler`)}if(i){let d=Date.now()-a;try{await In.trackCommand(i,r,d)}catch{}try{await Yn.recordTiming(i,"command_duration",d,{command:r});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Yn.recordTiming(i,"startup_time",p)}await Yn.recordMemory(i,{command:r})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(Eo(t)),h.end(),process.exit(1)}}function aI(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return Kn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function cI(r){let e=U.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=lI(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function lI(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}function uI(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function dI(r){let e=await un(),t=Na.join(Hy.homedir(),".claude","commands","p.md"),n=Na.join(Hy.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(n),P(Na.join(process.cwd(),".cursor","commands","sync.md")),P(Na.join(process.cwd(),".cursor"))]),c=await Ts();if(console.log(`
1464
+ ${Me.cyan("p/")} prjct v${r}
1463
1465
  ${Me.dim("Context layer for AI coding agents")}
1464
1466
 
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(`
1467
+ ${Me.dim("Providers:")}`),e.claude.installed){let u=s?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
1468
  ${Me.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1467
1469
  ${Me.cyan("https://prjct.app")}
1468
- `)}function nI(){console.log(`
1470
+ `)}function pI(){console.log(`
1469
1471
  prjct - Context layer for AI coding agents
1470
1472
  Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
1471
1473
 
@@ -1524,15 +1526,15 @@ MORE INFO
1524
1526
  ---------
1525
1527
  Documentation: https://prjct.app
1526
1528
  GitHub: https://github.com/jlopezlira/prjct-cli
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(`
1529
+ `)}var Uy=y(()=>{"use strict";gd();Ks();$a();Je();qe();li();ci();N();Hr();Te();zt();l(iI,"main");l(aI,"validateCommandParams");l(cI,"findClosestCommand");l(lI,"editDistance");l(uI,"parseCommandArgs");l(dI,"displayVersion");l(pI,"displayHelp");iI().catch(r=>{console.error("Fatal error:",w(r)),process.env.DEBUG&&console.error(Eo(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var br=process.argv.slice(2),Sd=br.find(r=>!r.startsWith("--")&&!r.startsWith("-")),gI=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(Sd&&!gI.has(Sd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Po(),Cd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(Cs(),bs)),s=await import("node:crypto"),o=[],i={};for(let a=0;a<br.length;a++){let c=br[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<br.length&&!br[a+1].startsWith("--")?i[u]=br[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:s.randomUUID(),command:Sd,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 fI(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Je(),mt)),s=(await Promise.resolve().then(()=>(qe(),Jd))).default,o=(await Promise.resolve().then(()=>(ac(),Kd))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>($c(),qp)),{fileExists:c}=await Promise.resolve().then(()=>(Te(),ue)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ba(),Od)),{VERSION:d}=await Promise.resolve().then(()=>(lt(),No));async function m(){let x=r.homedir(),M=await n();if(M.claude.installed){let F=e.join(x,".claude","commands","p.md");if(!await c(F))return!1}if(M.gemini.installed){let F=e.join(x,".gemini","commands","p.toml");if(!await c(F))return!1}return!M.claude.installed&&!M.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(x=>x==="--quiet"||x==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:x}=await Promise.resolve().then(()=>(zt(),Qp));x(!0)}let k=p.indexOf("--refresh"),b=k!==-1;b&&(p.splice(k,1),await u());async function D(x){let M=Date.now();try{let F=await s.getProjectId(process.cwd());if(F){let{sessionTracker:G}=await Promise.resolve().then(()=>(ci(),tm));return await G.expireIfStale(F),await G.touch(F),()=>{let ee=Date.now()-M;G.trackCommand(F,x,ee).catch(()=>{}),Promise.resolve().then(()=>(li(),sm)).then(({performanceTracker:S})=>{S.recordTiming(F,"command_duration",ee,{command:x}).catch(()=>{}),S.recordMemory(F,{command:x}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let x=p[1]||"status";if(x==="start"){let{isDaemonRunning:M,spawnDaemon:F}=await Promise.resolve().then(()=>(Cs(),bs));if(await M())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:ee}=await Promise.resolve().then(()=>(Qh(),Xh)),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(x==="stop"){let{isDaemonRunning:M,stopDaemon:F}=await Promise.resolve().then(()=>(Cs(),bs));if(await M()){let G=await F();console.log(G?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=G?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(x==="status"){let{getDaemonStatus:M}=await Promise.resolve().then(()=>(Cs(),bs)),F=await M();if(F.running){let G=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${G}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${x}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:x}=await Promise.resolve().then(()=>(ny(),ty));await x()}else if(p[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(p[0]==="web"||p[0]==="serve")try{let x=process.cwd(),M=await s.getProjectId(x);if(!M)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a(M,x,F)}}catch(x){console.error("Server error:",x.message),process.exitCode=1}else if(p[0]==="context"){let x=process.cwd(),M=await s.getProjectId(x);if(!M)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:G}=await Promise.resolve().then(()=>(py(),dy)),ee=await G(p.slice(1),M,x);console.log(JSON.stringify(ee,null,2)),process.exitCode=ee.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let x=await D("hooks"),{hooksService:M}=await Promise.resolve().then(()=>(yy(),hy)),F=p[1]||"status",G=await M.run(process.cwd(),F);process.exitCode=G,x()}else if(p[0]==="doctor"){let x=await D("doctor"),{doctorService:M}=await Promise.resolve().then(()=>(by(),Sy)),F=await M.run(process.cwd());process.exitCode=F,x()}else if(p[0]==="uninstall"){let{uninstall:x}=await Promise.resolve().then(()=>(md(),Vh)),M=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),G=p.includes("--dry-run")||p.includes("-n"),ee=p.includes("--keep-package"),S=await x({force:M,backup:F,dryRun:G,keepPackage:ee});process.exitCode=S.success?0:1}else if(p[0]==="watch"){let x=process.cwd();if(!await s.getProjectId(x))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(vy(),Cy)),G=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,Ze=await F.start(x,{verbose:G,quiet:f,debounceMs:S,minIntervalMs:te});Ze.success||(console.error(Ze.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:x}=await import("node:child_process"),M=await import("node:fs"),F=process.cwd(),G=await s.getProjectId(F);if(!G)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,Ze;if(M.existsSync(ee)?(te=ee,Ze="bun"):M.existsSync(j)?(te=j,Ze="node"):M.existsSync(S)?(te=S,Ze="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,te="",Ze=""),te){let _=["--project",G,...p.slice(1)];x(Ze,[te,..._],{stdio:"inherit",cwd:F}).on("close",xo=>{process.exitCode=xo||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:x}=await Promise.resolve().then(()=>(Dy(),jy)),M=p[1];console.log(x(M)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let x=await n(b),M=r.homedir(),F=process.cwd(),[G,ee,S,j,te,Ze]=await Promise.all([c(e.join(M,".claude","commands","p.md")),c(e.join(M,".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(`
1528
1530
  ${t.cyan("p/")} prjct v${d}
1529
1531
  ${t.dim("Context layer for AI coding agents")}
1530
1532
 
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(`
1533
+ ${t.dim("Providers:")}`),x.claude.installed){let _=G?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ks=x.claude.version?` (v${x.claude.version})`:"";console.log(` Claude Code ${_}${t.dim(ks)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(x.gemini.installed){let _=ee?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ks=x.gemini.version?` (v${x.gemini.version})`:"";console.log(` Gemini CLI ${_}${t.dim(ks)}`)}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 _=Ze?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(`
1532
1534
  ${t.dim("Run 'prjct start' to configure (CLI providers)")}
1533
1535
  ${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1534
1536
  ${t.cyan("https://prjct.app")}
1535
- `)}else{let v=e.join(s.homedir(),".prjct-cli","config","installed-editors.json"),$=await m();if(!await c(v)||!$)console.log(`
1537
+ `)}else{let x=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),M=await m();if(!await c(x)||!M)console.log(`
1536
1538
  ${t.cyan.bold(" Welcome to prjct!")}
1537
1539
 
1538
1540
  Run ${t.bold("prjct start")} to configure your AI providers.
@@ -1541,4 +1543,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
1541
1543
  Claude Code, Gemini CLI, or both.`)}
1542
1544
  `),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
1543
1545
  ${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
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)});
1546
+ `);let{default:G}=await Promise.resolve().then(()=>(Ny(),_y));await G.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Cs(),bs)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(Uy(),mI))}}}l(fI,"main");fI().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});