prjct-cli 1.56.6 → 1.56.10

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,17 +4,17 @@ import { dirname as __pathDirname } from 'path';
4
4
  var require = __createRequire(import.meta.url);
5
5
  var __filename = __fileURLToPath(import.meta.url);
6
6
  var __dirname = __pathDirname(__filename);
7
- var iw=Object.create;var no=Object.defineProperty;var aw=Object.getOwnPropertyDescriptor;var cw=Object.getOwnPropertyNames;var lw=Object.getPrototypeOf,uw=Object.prototype.hasOwnProperty;var l=(r,e)=>no(r,"name",{value:e,configurable:!0}),Bt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var dw=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ye=(r,e)=>{for(var t in e)no(r,t,{get:e[t],enumerable:!0})},ep=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of cw(e))!uw.call(r,n)&&n!==t&&no(r,n,{get:()=>e[n],enumerable:!(s=aw(e,n))||s.enumerable});return r};var pw=(r,e,t)=>(t=r!=null?iw(lw(r)):{},ep(e||!r||!r.__esModule?no(t,"default",{value:r,enumerable:!0}):t,r)),bt=r=>ep(no({},"__esModule",{value:!0}),r);var tp={};ye(tp,{DAEMON_PATHS:()=>Le,IDLE_TIMEOUT_MS:()=>tc,MAX_BUFFER_SIZE:()=>sc,decodeMessage:()=>mw,encodeMessage:()=>gn});function gn(r){return Buffer.from(`${JSON.stringify(r)}
8
- `)}function mw(r){return JSON.parse(r.trim())}var Le,tc,sc,Jo=S(()=>{"use strict";Le={runDir:l(()=>`${process.env.HOME||Bt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Le.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Le.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Le.runDir()}/daemon.log`,"log")},tc=30*60*1e3,sc=1024*1024;l(gn,"encodeMessage");l(mw,"decodeMessage")});function sp(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function nc(){if(sp()==="bun")return!0;try{let{execSync:r}=Bt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function fn(){return sp()==="bun"}var ro=S(()=>{"use strict";l(sp,"detectRuntime");l(nc,"isBunAvailable");l(fn,"isBun")});var vs={};ye(vs,{executeViaDaemon:()=>hw,forceKillDaemon:()=>ww,getDaemonStatus:()=>fw,isDaemonRunning:()=>np,sendRequest:()=>oo,spawnDaemon:()=>rp,stopDaemon:()=>yw});import zo from"node:crypto";import ct from"node:fs";import{connect as gw}from"node:net";async function np(){let r=Le.socket();if(!ct.existsSync(r))return!1;try{return(await oo({id:zo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{ct.unlinkSync(r)}catch{}return!1}}async function fw(){let r=Le.socket(),e=Le.pid();if(!ct.existsSync(r))return{running:!1};try{let t=await oo({id:zo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return ct.existsSync(e)?{running:!1,pid:parseInt(ct.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function oo(r){return new Promise((e,t)=>{let s=Le.socket(),n=gw(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(gn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(m)}catch(m){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function hw(r,e,t,s,n,o=!0){let i=Le.socket();if(!ct.existsSync(i))return o&&rp().catch(()=>{}),null;try{return await oo({id:zo.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function yw(){try{return(await oo({id:zo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function ww(){let r=Le.pid(),e=Le.socket(),t=!1;if(ct.existsSync(r)){let s=parseInt(ct.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{ct.existsSync(r)&&ct.unlinkSync(r)}catch{}try{ct.existsSync(e)&&ct.unlinkSync(e)}catch{}return t}async function rp(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(ct.existsSync(t))o=t,i="bun";else if(ct.existsSync(s))o=s,i=nc()?"bun":"node";else if(ct.existsSync(n))o=n,i=nc()?"bun":"node";else return!1;let a=Le.runDir();ct.mkdirSync(a,{recursive:!0});let c=Le.log(),u=ct.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),ct.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await np())return!0;return!1}var Ts=S(()=>{"use strict";ro();Jo();l(np,"isDaemonRunning");l(fw,"getDaemonStatus");l(oo,"sendRequest");l(hw,"executeViaDaemon");l(yw,"stopDaemon");l(ww,"forceKillDaemon");l(rp,"spawnDaemon")});var io=S(()=>{"use strict"});import{z as ds}from"zod";function op(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var HP,WP,GP,qn,qP,Ko=S(()=>{"use strict";HP=ds.enum(["opus","sonnet","haiku"]),WP=ds.enum(["2.5-pro","2.5-flash","2.0-flash"]),GP=ds.string().min(1),qn=ds.object({provider:ds.string(),model:ds.string(),cliVersion:ds.string().optional(),recordedAt:ds.string()}),qP=ds.object({preferredModel:ds.string().optional(),lastAnalysisModel:qn.optional()});l(op,"compareSemver")});var ap={};ye(ap,{execAsync:()=>F,execFileAsync:()=>hn});import{exec as kw,execFile as Sw}from"node:child_process";import{promisify as ip}from"node:util";var F,hn,Je=S(()=>{"use strict";F=ip(kw),hn=ip(Sw)});var cp,lp,up,rc=S(()=>{"use strict";cp=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),lp=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],up=/(?:import|from)\s+['"]([^'"]+)['"]/g});function bw(r){return r instanceof Error&&"code"in r}function O(r){return bw(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function oc(r){if(r instanceof Error)return r.stack}var W=S(()=>{"use strict";l(bw,"isNodeError");l(O,"isNotFoundError");l(k,"getErrorMessage");l(oc,"getErrorStack")});import mp from"node:fs/promises";async function gp(r,e){let t;try{t=await mp.readFile(r,"utf-8")}catch(o){if(O(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await dp(r,t),pp(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await dp(r,t),pp(r,vw(n.error)),null)}async function dp(r,e){let t=`${r}.backup`;try{await mp.writeFile(t,e,"utf-8")}catch{}}function pp(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 vw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var fp=S(()=>{"use strict";W();l(gp,"safeRead");l(dp,"createBackup");l(pp,"logCorruption");l(vw,"formatZodError")});var _t={};ye(_t,{appendLine:()=>ic,appendToFile:()=>Ew,atomicWrite:()=>Tw,batchProcess:()=>wn,copyFile:()=>Aw,deleteDir:()=>xw,deleteFile:()=>Pw,dirExists:()=>Xt,ensureDir:()=>rt,fileExists:()=>C,getFileExtension:()=>Mw,getFileModifiedTime:()=>Rw,getFileNameWithoutExtension:()=>Ow,getFileSize:()=>jw,listFiles:()=>Cs,moveFile:()=>Iw,prependToFile:()=>Cw,readFile:()=>_e,readJson:()=>Ae,readLines:()=>Dw,walkDir:()=>yn,writeFile:()=>Pt,writeJson:()=>de,writeLines:()=>$w});import Re from"node:fs/promises";import Es from"node:path";async function yn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Re.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(cp.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=Es.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(Es.relative(r,d))}}return l(o,"walk"),await o(r),t}async function wn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function Ae(r,e=null,t){if(t)return await gp(r,t)??e;try{let s=await Re.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(O(s))return e;throw s}}async function de(r,e,t=2){let s=Es.dirname(r);await Re.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Re.writeFile(r,n,"utf-8")}async function _e(r,e=""){try{return await Re.readFile(r,"utf-8")}catch(t){if(O(t))return e;throw t}}async function Pt(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.writeFile(r,e,"utf-8")}async function Tw(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await Re.writeFile(s,e,"utf-8"),await Re.rename(s,r)}async function Ew(r,e){await Re.appendFile(r,e,"utf-8")}async function ic(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.appendFile(r,`${e}
10
- `,"utf-8")}async function Cw(r,e){try{let t=await Re.readFile(r,"utf-8");await Re.writeFile(r,e+t,"utf-8")}catch(t){if(O(t))await Re.writeFile(r,e,"utf-8");else throw t}}async function C(r){try{return await Re.access(r),!0}catch(e){if(O(e))return!1;throw e}}async function Xt(r){try{return(await Re.stat(r)).isDirectory()}catch(e){if(O(e))return!1;throw e}}async function rt(r){await Re.mkdir(r,{recursive:!0})}async function Pw(r){try{return await Re.unlink(r),!0}catch(e){if(O(e))return!1;throw e}}async function xw(r){try{return await Re.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(O(e))return!1;throw e}}async function Cs(r,e={}){try{let s=await Re.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(O(t))return[];throw t}}async function jw(r){return(await Re.stat(r)).size}async function Rw(r){return(await Re.stat(r)).mtime}async function Aw(r,e){await Re.copyFile(r,e)}async function Iw(r,e){await Re.rename(r,e)}async function Dw(r){return(await _e(r,"")).split(`
11
- `)}async function $w(r,e){let t=e.join(`
12
- `);await Pt(r,t)}function Mw(r){return Es.extname(r)}function Ow(r){return Es.basename(r,Es.extname(r))}var B=S(()=>{"use strict";rc();fp();W();l(yn,"walkDir");l(wn,"batchProcess");l(Ae,"readJson");l(de,"writeJson");l(_e,"readFile");l(Pt,"writeFile");l(Tw,"atomicWrite");l(Ew,"appendToFile");l(ic,"appendLine");l(Cw,"prependToFile");l(C,"fileExists");l(Xt,"dirExists");l(rt,"ensureDir");l(Pw,"deleteFile");l(xw,"deleteDir");l(Cs,"listFiles");l(jw,"getFileSize");l(Rw,"getFileModifiedTime");l(Aw,"copyFile");l(Iw,"moveFile");l(Dw,"readLines");l($w,"writeLines");l(Mw,"getFileExtension");l(Ow,"getFileNameWithoutExtension")});function Gs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var Bn,kn=S(()=>{"use strict";l(Gs,"isExpired");Bn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var wp={};ye(wp,{invalidateProviderCache:()=>Fw,readProviderCache:()=>cc,writeProviderCache:()=>lc});import hp from"node:fs/promises";import _w from"node:os";import yp from"node:path";async function cc(){try{let r=await hp.readFile(ac,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Gs(e.timestamp,Lw)?null:e.detection}catch{return null}}async function lc(r){let e={timestamp:new Date().toISOString(),detection:r};await de(ac,e)}async function Fw(){try{await hp.unlink(ac)}catch{}}var Nw,ac,Lw,uc=S(()=>{"use strict";kn();B();Nw=yp.join(_w.homedir(),".prjct-cli","cache"),ac=yp.join(Nw,"providers.json"),Lw=10*60*1e3;l(cc,"readProviderCache");l(lc,"writeProviderCache");l(Fw,"invalidateProviderCache")});var Nt={};ye(Nt,{AntigravityProvider:()=>pc,ClaudeProvider:()=>Xo,CodexProvider:()=>mc,CursorProvider:()=>Sp,GeminiProvider:()=>dc,Providers:()=>ze,WindsurfProvider:()=>bp,detectAllProviders:()=>Ps,detectAntigravity:()=>Vn,detectCodex:()=>Sn,detectCursorProject:()=>Ep,detectProvider:()=>Yo,detectWindsurfProject:()=>Cp,getActiveProvider:()=>Gw,getCapabilities:()=>Hw,getCommandsDir:()=>Xw,getGlobalContextPath:()=>Jw,getGlobalSettingsPath:()=>zw,getProjectCommandsPath:()=>Yw,getProviderBranding:()=>Qo,getSkillsPath:()=>Kw,hasProviderConfig:()=>qw,needsCursorRouterRegeneration:()=>Bw,needsWindsurfRouterRegeneration:()=>Vw,selectProvider:()=>gc,validateCliVersion:()=>Tp});import qs from"node:os";import ot from"node:path";function Hw(r,e){return{...Uw[r],...e}}async function vp(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Ww(r){try{let{stdout:e}=await F(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Yo(r){let e=ze[r];if(!e.cliCommand)return{installed:!1};let t=await vp(e.cliCommand);if(!t)return{installed:!1};let s=await Ww(e.cliCommand),n=Tp(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Tp(r,e){let t=ze[r];return!t.minCliVersion||!e?null:op(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 Ps(r=!1){if(!r){let i=await cc();if(i)return i}let[e,t,s]=await Promise.all([Yo("claude"),Yo("gemini"),Sn()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await lc(o).catch(()=>{}),o}async function Gw(r){if(r&&ze[r])return ze[r];let e=await Ps();return e.claude.installed&&!e.gemini.installed?Xo:e.gemini.installed&&!e.claude.installed?dc:Xo}async function qw(r){let e=ze[r];return e.configDir?C(e.configDir):!1}function Qo(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 Ep(r){let e=ot.join(r,".cursor"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Bw(r){let e=await Ep(r);return e.detected&&!e.routerInstalled}async function Cp(r){let e=ot.join(r,".windsurf"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Vw(r){let e=await Cp(r);return e.detected&&!e.routerInstalled}async function Vn(){let r=pc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=ot.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Sn(){let r=mc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await vp("codex"),t=ot.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Jw(r){let e=ze[r];return e.configDir?ot.join(e.configDir,e.contextFile):null}function zw(r){let e=ze[r];return!e.configDir||!e.settingsFile?null:ot.join(e.configDir,e.settingsFile)}function Kw(r){return ze[r].skillsDir}function Xw(r){return ze[r].commandsDir}function Yw(r,e){let t=ze[r];return ot.join(e,t.commandsDir)}async function gc(){let r=await Ps(),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 Uw,Xo,dc,pc,Sp,bp,mc,ze,lt=S(()=>{"use strict";io();Ko();Je();B();uc();Uw={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(Hw,"getCapabilities");Xo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ot.join(qs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ot.join(qs.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},dc={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ot.join(qs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ot.join(qs.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},pc={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ot.join(qs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ot.join(qs.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Sp={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},bp={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},mc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ot.join(qs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ot.join(qs.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},ze={claude:Xo,gemini:dc,cursor:Sp,antigravity:pc,windsurf:bp,codex:mc};l(vp,"whichCommand");l(Ww,"getCliVersion");l(Yo,"detectProvider");l(Tp,"validateCliVersion");l(Ps,"detectAllProviders");l(Gw,"getActiveProvider");l(qw,"hasProviderConfig");l(Qo,"getProviderBranding");l(Ep,"detectCursorProject");l(Bw,"needsCursorRouterRegeneration");l(Cp,"detectWindsurfProject");l(Vw,"needsWindsurfRouterRegeneration");l(Vn,"detectAntigravity");l(Sn,"detectCodex");l(Jw,"getGlobalContextPath");l(zw,"getGlobalSettingsPath");l(Kw,"getSkillsPath");l(Xw,"getCommandsDir");l(Yw,"getProjectCommandsPath");l(gc,"selectProvider")});import{z as De}from"zod";function Qw(r){return r instanceof Jn}function we(r){return Qw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var zn,Cx,Px,xx,jx,Rx,Ax,Jn,Zo,ei,ao,xs=S(()=>{"use strict";zn={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},Cx=zn.create("FileError",De.object({path:De.string(),operation:De.enum(["read","write","delete","create","copy"]),reason:De.string().optional()})),Px=zn.create("ValidationError",De.object({field:De.string(),expected:De.string(),received:De.string().optional(),message:De.string().optional()})),xx=zn.create("PermissionError",De.object({action:De.string(),resource:De.string(),reason:De.string().optional()})),jx=zn.create("TaskError",De.object({taskId:De.string().optional(),operation:De.enum(["create","update","complete","pause","resume","delete"]),reason:De.string()})),Rx=zn.create("SessionError",De.object({sessionId:De.string().optional(),reason:De.string()})),Ax=zn.create("SyncError",De.object({projectId:De.string().optional(),operation:De.enum(["push","pull","auth","connect"]),reason:De.string()})),Jn=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)}},Zo=class r extends Jn{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")}},ei=class r extends Jn{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")}},ao=class r extends Jn{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(Qw,"isPrjctError");l(we,"getErrorMessage")});import{formatDistanceToNowStrict as Mx}from"date-fns";function Pp(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function xp(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function v(){return new Date().toISOString()}function Bs(r){let e=new Date;return e.setDate(e.getDate()-r),e}function xt(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function js(r,e=new Date){let t=e.getTime()-r.getTime();return xt(t)}function Kn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function Lt(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var X=S(()=>{"use strict";l(Pp,"formatDate");l(xp,"getYearMonthDay");l(v,"getTimestamp");l(Bs,"getDaysAgo");l(xt,"formatDuration");l(js,"calculateDuration");l(Kn,"parseVarianceMinutes");l(Lt,"parseDurationMinutes")});var Yn={};ye(Yn,{PACKAGE_ROOT:()=>jt,VERSION:()=>ke,compareVersions:()=>jp,getPackageInfo:()=>Zw,getPackageRoot:()=>hc,getVersion:()=>bn,isCompatible:()=>ek,needsMigration:()=>tk,resetPackageRoot:()=>yc});import fc from"node:fs";import ti from"node:path";function hc(){if(Xn)return Xn;let r=__dirname;for(let e=0;e<5;e++){let t=ti.join(r,"package.json");if(fc.existsSync(t))try{if(JSON.parse(fc.readFileSync(t,"utf-8")).name==="prjct-cli")return Xn=r,r}catch{}r=ti.dirname(r)}return Xn=ti.join(__dirname,"..","..",".."),Xn}function bn(){if(co)return co;try{let r=ti.join(hc(),"package.json"),e=JSON.parse(fc.readFileSync(r,"utf-8"));return co=e.version,si=e,co}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Zw(){return si||bn(),si}function jp(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function ek(r){let e=bn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function tk(r,e=null){let t=e||bn();return jp(r,t)<0}function yc(r){Xn=r,co=null,si=null}var co,si,Xn,ke,jt,ut=S(()=>{"use strict";W();co=null,si=null,Xn=null;l(hc,"getPackageRoot");l(bn,"getVersion");l(Zw,"getPackageInfo");l(jp,"compareVersions");l(ek,"isCompatible");l(tk,"needsMigration");l(yc,"resetPackageRoot");ke=bn(),jt=hc()});async function ni(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function sk(){let r=await ni("gh api user --jq .login");return r.success&&r.output||(r=await ni("git config --global github.user"),r.success&&r.output)?r.output:null}async function nk(){let r=await ni("git config user.name");return r.success&&r.output?r.output:null}async function rk(){let r=await ni("git config user.email");return r.success&&r.output?r.output:null}async function Qn(){let[r,e,t]=await Promise.all([sk(),nk(),rk()]);return{github:r,email:t,name:e||r||"Unknown"}}var ri=S(()=>{"use strict";Je();l(ni,"execCommand");l(sk,"detectGitHubUsername");l(nk,"detectGitName");l(rk,"detectGitEmail");l(Qn,"detect")});import ok from"node:crypto";import ps from"node:fs/promises";import kc from"node:os";import z from"node:path";import{globSync as ik}from"glob";var Sc,ak,A,ve=S(()=>{"use strict";X();B();Sc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(kc.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return ok.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Xt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await rt(this.globalBaseDir),await rt(this.globalProjectsDir),await rt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await rt(z.join(t,n));return await rt(z.join(t,"planning","tasks")),await rt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=xp(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await rt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await ps.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await ps.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let m=z.join(c,d.name),p=await ps.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:z.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await ps.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 Xt(t)}getDisplayPath(e){let t=kc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),bt(Nt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),bt(Nt)).getActiveProvider();return(lt(),bt(Nt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(kc.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=z.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await C(n))try{let o=await ps.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await ps.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
13
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=z.join(e,"package.json"),i=await ps.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=z.join(e,"lerna.json");if(await C(c)){let u=await ps.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=z.join(e,"package.json"),i=await ps.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=ik(o,{cwd:e,absolute:!1});for(let a of i){let c=z.join(e,a),u=z.join(c,"package.json");if(await C(u))try{let d=await ps.readFile(u,"utf-8"),m=JSON.parse(d),p=z.join(c,"PRJCT.md");s.push({name:m.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await C(p)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=z.resolve(e);for(let n of t.packages){let o=z.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=z.resolve(e),s=z.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=z.dirname(t)}return null}},ak=new Sc,A=ak});var oi={};ye(oi,{default:()=>Yt,worktreeService:()=>Ap});import bc from"node:fs/promises";import ms from"node:path";var Rp,vc,Ap,Yt,lo=S(()=>{"use strict";Je();B();Rp=".worktrees",vc=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=ms.join(n,Rp,t),i=s.branch||`feat/${t}`;await bc.mkdir(ms.join(n,Rp),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await F(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await F("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await F("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await F(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await F(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await F("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await F("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await F("git rev-parse --git-dir",{cwd:e}),n=ms.resolve(e,t.trim()),o=ms.resolve(e,s.trim());if(n!==o){let{stdout:i}=await F("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await F("git rev-parse HEAD",{cwd:e}),{stdout:c}=await F("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=ms.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await F("git worktree list --porcelain",{cwd:e}),n=s.split(`
14
- `)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await F("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=ms.join(t,".env");await C(s)&&await bc.copyFile(s,ms.join(e,".env"));let n=ms.join(t,".prjct"),o=ms.join(e,".prjct");await C(n)&&!await C(o)&&await bc.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await F("git worktree prune",{cwd:n});for(let o of t)o.isMain||await C(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
7
+ var Zy=Object.create;var Zr=Object.defineProperty;var ew=Object.getOwnPropertyDescriptor;var tw=Object.getOwnPropertyNames;var sw=Object.getPrototypeOf,nw=Object.prototype.hasOwnProperty;var l=(r,e)=>Zr(r,"name",{value:e,configurable:!0}),Bt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var rw=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ye=(r,e)=>{for(var t in e)Zr(r,t,{get:e[t],enumerable:!0})},Ld=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of tw(e))!nw.call(r,n)&&n!==t&&Zr(r,n,{get:()=>e[n],enumerable:!(s=ew(e,n))||s.enumerable});return r};var ow=(r,e,t)=>(t=r!=null?Zy(sw(r)):{},Ld(e||!r||!r.__esModule?Zr(t,"default",{value:r,enumerable:!0}):t,r)),bt=r=>Ld(Zr({},"__esModule",{value:!0}),r);var Fd={};ye(Fd,{DAEMON_PATHS:()=>Le,IDLE_TIMEOUT_MS:()=>Ka,MAX_BUFFER_SIZE:()=>Ya,decodeMessage:()=>iw,encodeMessage:()=>pn});function pn(r){return Buffer.from(`${JSON.stringify(r)}
8
+ `)}function iw(r){return JSON.parse(r.trim())}var Le,Ka,Ya,Wo=S(()=>{"use strict";Le={runDir:l(()=>`${process.env.HOME||Bt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Le.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Le.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Le.runDir()}/daemon.log`,"log")},Ka=30*60*1e3,Ya=1024*1024;l(pn,"encodeMessage");l(iw,"decodeMessage")});function Ud(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function gn(){return Ud()==="bun"}function Qa(){if(Ud()==="bun")return!0;try{let{execSync:r}=Bt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var eo=S(()=>{"use strict";l(Ud,"detectRuntime");l(gn,"isBun");l(Qa,"isBunAvailable")});var vs={};ye(vs,{executeViaDaemon:()=>lw,forceKillDaemon:()=>dw,getDaemonStatus:()=>cw,isDaemonRunning:()=>Hd,sendRequest:()=>to,spawnDaemon:()=>Wd,stopDaemon:()=>uw});import Go from"node:crypto";import ct from"node:fs";import{connect as aw}from"node:net";async function Hd(){let r=Le.socket();if(!ct.existsSync(r))return!1;try{return(await to({id:Go.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{ct.unlinkSync(r)}catch{}return!1}}async function cw(){let r=Le.socket(),e=Le.pid();if(!ct.existsSync(r))return{running:!1};try{let t=await to({id:Go.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return ct.existsSync(e)?{running:!1,pid:parseInt(ct.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function to(r){return new Promise((e,t)=>{let s=Le.socket(),n=aw(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(pn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function lw(r,e,t,s,n,o=!0){let i=Le.socket();if(!ct.existsSync(i))return o&&Wd().catch(()=>{}),null;try{return await to({id:Go.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function uw(){try{return(await to({id:Go.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function dw(){let r=Le.pid(),e=Le.socket(),t=!1;if(ct.existsSync(r)){let s=parseInt(ct.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{ct.existsSync(r)&&ct.unlinkSync(r)}catch{}try{ct.existsSync(e)&&ct.unlinkSync(e)}catch{}return t}async function Wd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(ct.existsSync(t))o=t,i="bun";else if(ct.existsSync(s))o=s,i=Qa()?"bun":"node";else if(ct.existsSync(n))o=n,i=Qa()?"bun":"node";else return!1;let a=Le.runDir();ct.mkdirSync(a,{recursive:!0});let c=Le.log(),u=ct.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),ct.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Hd())return!0;return!1}var Ts=S(()=>{"use strict";eo();Wo();l(Hd,"isDaemonRunning");l(cw,"getDaemonStatus");l(to,"sendRequest");l(lw,"executeViaDaemon");l(uw,"stopDaemon");l(dw,"forceKillDaemon");l(Wd,"spawnDaemon")});var so=S(()=>{"use strict"});import{z as ds}from"zod";function Gd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var UP,HP,WP,Gn,GP,qo=S(()=>{"use strict";UP=ds.enum(["opus","sonnet","haiku"]),HP=ds.enum(["2.5-pro","2.5-flash","2.0-flash"]),WP=ds.string().min(1),Gn=ds.object({provider:ds.string(),model:ds.string(),cliVersion:ds.string().optional(),recordedAt:ds.string()}),GP=ds.object({preferredModel:ds.string().optional(),lastAnalysisModel:Gn.optional()});l(Gd,"compareSemver")});var Bd={};ye(Bd,{execAsync:()=>F,execFileAsync:()=>fn});import{exec as mw,execFile as pw}from"node:child_process";import{promisify as qd}from"node:util";var F,fn,Je=S(()=>{"use strict";F=qd(mw),fn=qd(pw)});var Vd,Jd,zd,Za=S(()=>{"use strict";Vd=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),Jd=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],zd=/(?:import|from)\s+['"]([^'"]+)['"]/g});function gw(r){return r instanceof Error&&"code"in r}function O(r){return gw(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function ec(r){if(r instanceof Error)return r.stack}var W=S(()=>{"use strict";l(gw,"isNodeError");l(O,"isNotFoundError");l(k,"getErrorMessage");l(ec,"getErrorStack")});import Yd from"node:fs/promises";async function Qd(r,e){let t;try{t=await Yd.readFile(r,"utf-8")}catch(o){if(O(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Xd(r,t),Kd(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Xd(r,t),Kd(r,fw(n.error)),null)}async function Xd(r,e){let t=`${r}.backup`;try{await Yd.writeFile(t,e,"utf-8")}catch{}}function Kd(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 fw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Zd=S(()=>{"use strict";W();l(Qd,"safeRead");l(Xd,"createBackup");l(Kd,"logCorruption");l(fw,"formatZodError")});var _t={};ye(_t,{appendLine:()=>tc,appendToFile:()=>yw,atomicWrite:()=>hw,batchProcess:()=>yn,copyFile:()=>Tw,deleteDir:()=>Sw,deleteFile:()=>kw,dirExists:()=>Kt,ensureDir:()=>rt,fileExists:()=>C,getFileExtension:()=>xw,getFileModifiedTime:()=>vw,getFileNameWithoutExtension:()=>jw,getFileSize:()=>bw,listFiles:()=>Cs,moveFile:()=>Ew,prependToFile:()=>ww,readFile:()=>_e,readJson:()=>Ae,readLines:()=>Cw,walkDir:()=>hn,writeFile:()=>Pt,writeJson:()=>de,writeLines:()=>Pw});import Re from"node:fs/promises";import Es from"node:path";async function hn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Re.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Vd.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=Es.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(Es.relative(r,d))}}return l(o,"walk"),await o(r),t}async function yn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function Ae(r,e=null,t){if(t)return await Qd(r,t)??e;try{let s=await Re.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(O(s))return e;throw s}}async function de(r,e,t=2){let s=Es.dirname(r);await Re.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Re.writeFile(r,n,"utf-8")}async function _e(r,e=""){try{return await Re.readFile(r,"utf-8")}catch(t){if(O(t))return e;throw t}}async function Pt(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.writeFile(r,e,"utf-8")}async function hw(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await Re.writeFile(s,e,"utf-8"),await Re.rename(s,r)}async function yw(r,e){await Re.appendFile(r,e,"utf-8")}async function tc(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.appendFile(r,`${e}
10
+ `,"utf-8")}async function ww(r,e){try{let t=await Re.readFile(r,"utf-8");await Re.writeFile(r,e+t,"utf-8")}catch(t){if(O(t))await Re.writeFile(r,e,"utf-8");else throw t}}async function C(r){try{return await Re.access(r),!0}catch(e){if(O(e))return!1;throw e}}async function Kt(r){try{return(await Re.stat(r)).isDirectory()}catch(e){if(O(e))return!1;throw e}}async function rt(r){await Re.mkdir(r,{recursive:!0})}async function kw(r){try{return await Re.unlink(r),!0}catch(e){if(O(e))return!1;throw e}}async function Sw(r){try{return await Re.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(O(e))return!1;throw e}}async function Cs(r,e={}){try{let s=await Re.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(O(t))return[];throw t}}async function bw(r){return(await Re.stat(r)).size}async function vw(r){return(await Re.stat(r)).mtime}async function Tw(r,e){await Re.copyFile(r,e)}async function Ew(r,e){await Re.rename(r,e)}async function Cw(r){return(await _e(r,"")).split(`
11
+ `)}async function Pw(r,e){let t=e.join(`
12
+ `);await Pt(r,t)}function xw(r){return Es.extname(r)}function jw(r){return Es.basename(r,Es.extname(r))}var B=S(()=>{"use strict";Za();Zd();W();l(hn,"walkDir");l(yn,"batchProcess");l(Ae,"readJson");l(de,"writeJson");l(_e,"readFile");l(Pt,"writeFile");l(hw,"atomicWrite");l(yw,"appendToFile");l(tc,"appendLine");l(ww,"prependToFile");l(C,"fileExists");l(Kt,"dirExists");l(rt,"ensureDir");l(kw,"deleteFile");l(Sw,"deleteDir");l(Cs,"listFiles");l(bw,"getFileSize");l(vw,"getFileModifiedTime");l(Tw,"copyFile");l(Ew,"moveFile");l(Cw,"readLines");l(Pw,"writeLines");l(xw,"getFileExtension");l(jw,"getFileNameWithoutExtension")});function Ws(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var qn,wn=S(()=>{"use strict";l(Ws,"isExpired");qn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var sm={};ye(sm,{invalidateProviderCache:()=>Dw,readProviderCache:()=>nc,writeProviderCache:()=>rc});import em from"node:fs/promises";import Rw from"node:os";import tm from"node:path";async function nc(){try{let r=await em.readFile(sc,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ws(e.timestamp,Iw)?null:e.detection}catch{return null}}async function rc(r){let e={timestamp:new Date().toISOString(),detection:r};await de(sc,e)}async function Dw(){try{await em.unlink(sc)}catch{}}var Aw,sc,Iw,oc=S(()=>{"use strict";wn();B();Aw=tm.join(Rw.homedir(),".prjct-cli","cache"),sc=tm.join(Aw,"providers.json"),Iw=10*60*1e3;l(nc,"readProviderCache");l(rc,"writeProviderCache");l(Dw,"invalidateProviderCache")});var Nt={};ye(Nt,{AntigravityProvider:()=>ac,ClaudeProvider:()=>Bo,CodexProvider:()=>cc,CursorProvider:()=>rm,GeminiProvider:()=>ic,Providers:()=>ze,WindsurfProvider:()=>om,detectAllProviders:()=>Ps,detectAntigravity:()=>Bn,detectCodex:()=>kn,detectCursorProject:()=>cm,detectProvider:()=>Vo,detectWindsurfProject:()=>lm,getActiveProvider:()=>_w,getCapabilities:()=>Mw,getCommandsDir:()=>Gw,getGlobalContextPath:()=>Uw,getGlobalSettingsPath:()=>Hw,getProjectCommandsPath:()=>qw,getProviderBranding:()=>Jo,getSkillsPath:()=>Ww,hasProviderConfig:()=>Nw,needsCursorRouterRegeneration:()=>Lw,needsWindsurfRouterRegeneration:()=>Fw,selectProvider:()=>lc,validateCliVersion:()=>am});import Gs from"node:os";import ot from"node:path";function Mw(r,e){return{...$w[r],...e}}async function im(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Ow(r){try{let{stdout:e}=await F(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Vo(r){let e=ze[r];if(!e.cliCommand)return{installed:!1};let t=await im(e.cliCommand);if(!t)return{installed:!1};let s=await Ow(e.cliCommand),n=am(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function am(r,e){let t=ze[r];return!t.minCliVersion||!e?null:Gd(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 Ps(r=!1){if(!r){let i=await nc();if(i)return i}let[e,t,s]=await Promise.all([Vo("claude"),Vo("gemini"),kn()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await rc(o).catch(()=>{}),o}async function _w(r){if(r&&ze[r])return ze[r];let e=await Ps();return e.claude.installed&&!e.gemini.installed?Bo:e.gemini.installed&&!e.claude.installed?ic:Bo}async function Nw(r){let e=ze[r];return e.configDir?C(e.configDir):!1}function Jo(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 cm(r){let e=ot.join(r,".cursor"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Lw(r){let e=await cm(r);return e.detected&&!e.routerInstalled}async function lm(r){let e=ot.join(r,".windsurf"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Fw(r){let e=await lm(r);return e.detected&&!e.routerInstalled}async function Bn(){let r=ac.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=ot.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function kn(){let r=cc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await im("codex"),t=ot.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Uw(r){let e=ze[r];return e.configDir?ot.join(e.configDir,e.contextFile):null}function Hw(r){let e=ze[r];return!e.configDir||!e.settingsFile?null:ot.join(e.configDir,e.settingsFile)}function Ww(r){return ze[r].skillsDir}function Gw(r){return ze[r].commandsDir}function qw(r,e){let t=ze[r];return ot.join(e,t.commandsDir)}async function lc(){let r=await Ps(),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 $w,Bo,ic,ac,rm,om,cc,ze,lt=S(()=>{"use strict";so();qo();Je();B();oc();$w={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(Mw,"getCapabilities");Bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ot.join(Gs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ot.join(Gs.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},ic={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ot.join(Gs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ot.join(Gs.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},ac={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ot.join(Gs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ot.join(Gs.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},rm={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},om={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},cc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ot.join(Gs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ot.join(Gs.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},ze={claude:Bo,gemini:ic,cursor:rm,antigravity:ac,windsurf:om,codex:cc};l(im,"whichCommand");l(Ow,"getCliVersion");l(Vo,"detectProvider");l(am,"validateCliVersion");l(Ps,"detectAllProviders");l(_w,"getActiveProvider");l(Nw,"hasProviderConfig");l(Jo,"getProviderBranding");l(cm,"detectCursorProject");l(Lw,"needsCursorRouterRegeneration");l(lm,"detectWindsurfProject");l(Fw,"needsWindsurfRouterRegeneration");l(Bn,"detectAntigravity");l(kn,"detectCodex");l(Uw,"getGlobalContextPath");l(Hw,"getGlobalSettingsPath");l(Ww,"getSkillsPath");l(Gw,"getCommandsDir");l(qw,"getProjectCommandsPath");l(lc,"selectProvider")});import{z as De}from"zod";function Bw(r){return r instanceof Vn}function we(r){return Bw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Jn,Ex,Cx,Px,xx,jx,Rx,Vn,zo,Xo,no,xs=S(()=>{"use strict";Jn={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},Ex=Jn.create("FileError",De.object({path:De.string(),operation:De.enum(["read","write","delete","create","copy"]),reason:De.string().optional()})),Cx=Jn.create("ValidationError",De.object({field:De.string(),expected:De.string(),received:De.string().optional(),message:De.string().optional()})),Px=Jn.create("PermissionError",De.object({action:De.string(),resource:De.string(),reason:De.string().optional()})),xx=Jn.create("TaskError",De.object({taskId:De.string().optional(),operation:De.enum(["create","update","complete","pause","resume","delete"]),reason:De.string()})),jx=Jn.create("SessionError",De.object({sessionId:De.string().optional(),reason:De.string()})),Rx=Jn.create("SyncError",De.object({projectId:De.string().optional(),operation:De.enum(["push","pull","auth","connect"]),reason:De.string()})),Vn=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)}},zo=class r extends Vn{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")}},Xo=class r extends Vn{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")}},no=class r extends Vn{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(Bw,"isPrjctError");l(we,"getErrorMessage")});import{formatDistanceToNowStrict as $x}from"date-fns";function um(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function dm(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function v(){return new Date().toISOString()}function qs(r){let e=new Date;return e.setDate(e.getDate()-r),e}function xt(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function js(r,e=new Date){let t=e.getTime()-r.getTime();return xt(t)}function zn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function Lt(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=S(()=>{"use strict";l(um,"formatDate");l(dm,"getYearMonthDay");l(v,"getTimestamp");l(qs,"getDaysAgo");l(xt,"formatDuration");l(js,"calculateDuration");l(zn,"parseVarianceMinutes");l(Lt,"parseDurationMinutes")});var Kn={};ye(Kn,{PACKAGE_ROOT:()=>jt,VERSION:()=>ke,compareVersions:()=>mm,getPackageInfo:()=>Vw,getPackageRoot:()=>dc,getVersion:()=>Sn,isCompatible:()=>Jw,needsMigration:()=>zw,resetPackageRoot:()=>mc});import uc from"node:fs";import Ko from"node:path";function dc(){if(Xn)return Xn;let r=__dirname;for(let e=0;e<5;e++){let t=Ko.join(r,"package.json");if(uc.existsSync(t))try{if(JSON.parse(uc.readFileSync(t,"utf-8")).name==="prjct-cli")return Xn=r,r}catch{}r=Ko.dirname(r)}return Xn=Ko.join(__dirname,"..","..",".."),Xn}function Sn(){if(ro)return ro;try{let r=Ko.join(dc(),"package.json"),e=JSON.parse(uc.readFileSync(r,"utf-8"));return ro=e.version,Yo=e,ro}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Vw(){return Yo||Sn(),Yo}function mm(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Jw(r){let e=Sn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function zw(r,e=null){let t=e||Sn();return mm(r,t)<0}function mc(r){Xn=r,ro=null,Yo=null}var ro,Yo,Xn,ke,jt,ut=S(()=>{"use strict";W();ro=null,Yo=null,Xn=null;l(dc,"getPackageRoot");l(Sn,"getVersion");l(Vw,"getPackageInfo");l(mm,"compareVersions");l(Jw,"isCompatible");l(zw,"needsMigration");l(mc,"resetPackageRoot");ke=Sn(),jt=dc()});async function Qo(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Xw(){let r=await Qo("gh api user --jq .login");return r.success&&r.output||(r=await Qo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Kw(){let r=await Qo("git config user.name");return r.success&&r.output?r.output:null}async function Yw(){let r=await Qo("git config user.email");return r.success&&r.output?r.output:null}async function Yn(){let[r,e,t]=await Promise.all([Xw(),Kw(),Yw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Zo=S(()=>{"use strict";Je();l(Qo,"execCommand");l(Xw,"detectGitHubUsername");l(Kw,"detectGitName");l(Yw,"detectGitEmail");l(Yn,"detect")});import Qw from"node:crypto";import ms from"node:fs/promises";import gc from"node:os";import z from"node:path";import{globSync as Zw}from"glob";var fc,ek,A,ve=S(()=>{"use strict";K();B();fc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(gc.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return Qw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Kt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await rt(this.globalBaseDir),await rt(this.globalProjectsDir),await rt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await rt(z.join(t,n));return await rt(z.join(t,"planning","tasks")),await rt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=dm(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await rt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await ms.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await ms.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=z.join(c,d.name),m=await ms.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:z.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await ms.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 Kt(t)}getDisplayPath(e){let t=gc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),bt(Nt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),bt(Nt)).getActiveProvider();return(lt(),bt(Nt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(gc.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=z.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await C(n))try{let o=await ms.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await ms.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
13
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=z.join(e,"package.json"),i=await ms.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=z.join(e,"lerna.json");if(await C(c)){let u=await ms.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=z.join(e,"package.json"),i=await ms.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=Zw(o,{cwd:e,absolute:!1});for(let a of i){let c=z.join(e,a),u=z.join(c,"package.json");if(await C(u))try{let d=await ms.readFile(u,"utf-8"),p=JSON.parse(d),m=z.join(c,"PRJCT.md");s.push({name:p.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await C(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=z.resolve(e);for(let n of t.packages){let o=z.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=z.resolve(e),s=z.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=z.dirname(t)}return null}},ek=new fc,A=ek});var ei={};ye(ei,{default:()=>Yt,worktreeService:()=>gm});import hc from"node:fs/promises";import ps from"node:path";var pm,yc,gm,Yt,oo=S(()=>{"use strict";Je();B();pm=".worktrees",yc=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=ps.join(n,pm,t),i=s.branch||`feat/${t}`;await hc.mkdir(ps.join(n,pm),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await F(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await F("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await F("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await F(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await F(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await F("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await F("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await F("git rev-parse --git-dir",{cwd:e}),n=ps.resolve(e,t.trim()),o=ps.resolve(e,s.trim());if(n!==o){let{stdout:i}=await F("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await F("git rev-parse HEAD",{cwd:e}),{stdout:c}=await F("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=ps.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await F("git worktree list --porcelain",{cwd:e}),n=s.split(`
14
+ `)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await F("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=ps.join(t,".env");await C(s)&&await hc.copyFile(s,ps.join(e,".env"));let n=ps.join(t,".prjct"),o=ps.join(e,".prjct");await C(n)&&!await C(o)&&await hc.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await F("git worktree prune",{cwd:n});for(let o of t)o.isMain||await C(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
15
15
 
16
16
  `);for(let o of n){if(!o.trim())continue;let i=o.trim().split(`
17
- `),a="",c="",u="",d=!1;for(let m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?c=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:c,isMain:m,slug:m?"main":ms.basename(a)})}}return s}},Ap=new vc,Yt=Ap});var Dp={};ye(Dp,{default:()=>$});import Tc from"node:fs/promises";import ck from"node:path";import*as ii from"jsonc-parser";function Ip(r){let e=[],t=ii.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${ii.printParseErrorCode(s.error)}`)}return t}var Ec,lk,$,Te=S(()=>{"use strict";xs();W();X();B();ut();ri();ve();l(Ip,"parseJsonc");Ec=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await Tc.readFile(t,"utf-8");return Ip(s)}catch(t){return O(t)||console.warn(`Warning: Could not read config at ${e}: ${we(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e);await de(s,t)}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await Tc.readFile(t,"utf-8");return Ip(s)}catch(t){return O(t)||console.warn(`Warning: Could not read global config for ${e}: ${we(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e);await de(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=v();t={projectId:e,authors:[],version:ke,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=A.generateProjectId(e),n=A.getGlobalProjectPath(s),o=A.getDisplayPath(n),i=v(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:ke,created:i,lastSync:i};return await this.writeGlobalConfig(s,c),a}async updateLastSync(e){let t=await this.getProjectId(e),s=await this.readGlobalConfig(t);s&&(s.lastSync=v(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=A.getGlobalProjectPath(n.projectId);try{return(await Tc.readdir(ck.join(o,"core"))).length===0}catch(i){return O(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(lo(),oi));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return A.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=v();s.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),s.lastSync=o,await this.writeGlobalConfig(e,s)}async updateAuthorActivity(e,t){let s=await this.readGlobalConfig(e);if(!s||!s.authors)return;let n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=v(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Qn(),s=await this.getProjectId(e);return await this.addAuthor(s,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let s=await this.readConfig(e);s&&(s.showMetrics=t,await this.writeConfig(e,s))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let s=A.generateProjectId(e);return{projectId:s,dataPath:A.getDisplayPath(A.getGlobalProjectPath(s))}}},lk=new Ec,$=lk});var Mp={};ye(Mp,{default:()=>uo});import Cc from"node:fs/promises";import uk from"node:os";import $p from"node:path";var Pc,dk,uo,ai=S(()=>{"use strict";W();B();Pc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=uk.homedir(),this.configDir=$p.join(this.homeDir,".prjct-cli","config"),this.configFile=$p.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Cc.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await Cc.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",k(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await de(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",k(n)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await de(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",k(t)),!1}}async configExists(){return C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Cc.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},dk=new Pc,uo=dk});var li={};ye(li,{PrjctDatabase:()=>ci,default:()=>N,prjctDb:()=>E});import xc from"node:fs";import Op from"node:path";function pk(r){if(fn()){let{Database:n}=Bt("bun:sqlite");return new n(r,{create:!0})}let e=Bt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var mk,gk,ci,E,N,ee=S(()=>{"use strict";ve();ro();l(pk,"openDatabase");mk=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
17
+ `),a="",c="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?c=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;s.push({path:a,branch:u,commit:c,isMain:p,slug:p?"main":ps.basename(a)})}}return s}},gm=new yc,Yt=gm});var hm={};ye(hm,{default:()=>$});import wc from"node:fs/promises";import tk from"node:path";import*as ti from"jsonc-parser";function fm(r){let e=[],t=ti.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${ti.printParseErrorCode(s.error)}`)}return t}var kc,sk,$,Te=S(()=>{"use strict";xs();W();K();B();ut();Zo();ve();l(fm,"parseJsonc");kc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await wc.readFile(t,"utf-8");return fm(s)}catch(t){return O(t)||console.warn(`Warning: Could not read config at ${e}: ${we(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e);await de(s,t)}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await wc.readFile(t,"utf-8");return fm(s)}catch(t){return O(t)||console.warn(`Warning: Could not read global config for ${e}: ${we(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e);await de(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=v();t={projectId:e,authors:[],version:ke,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=A.generateProjectId(e),n=A.getGlobalProjectPath(s),o=A.getDisplayPath(n),i=v(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:ke,created:i,lastSync:i};return await this.writeGlobalConfig(s,c),a}async updateLastSync(e){let t=await this.getProjectId(e),s=await this.readGlobalConfig(t);s&&(s.lastSync=v(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=A.getGlobalProjectPath(n.projectId);try{return(await wc.readdir(tk.join(o,"core"))).length===0}catch(i){return O(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(oo(),ei));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return A.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=v();s.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),s.lastSync=o,await this.writeGlobalConfig(e,s)}async updateAuthorActivity(e,t){let s=await this.readGlobalConfig(e);if(!s||!s.authors)return;let n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=v(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Yn(),s=await this.getProjectId(e);return await this.addAuthor(s,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let s=await this.readConfig(e);s&&(s.showMetrics=t,await this.writeConfig(e,s))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let s=A.generateProjectId(e);return{projectId:s,dataPath:A.getDisplayPath(A.getGlobalProjectPath(s))}}},sk=new kc,$=sk});var wm={};ye(wm,{default:()=>io});import Sc from"node:fs/promises";import nk from"node:os";import ym from"node:path";var bc,rk,io,si=S(()=>{"use strict";W();B();bc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=nk.homedir(),this.configDir=ym.join(this.homeDir,".prjct-cli","config"),this.configFile=ym.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Sc.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await Sc.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",k(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await de(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",k(n)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await de(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",k(t)),!1}}async configExists(){return C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Sc.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},rk=new bc,io=rk});var ri={};ye(ri,{PrjctDatabase:()=>ni,default:()=>N,prjctDb:()=>E});import vc from"node:fs";import km from"node:path";function ok(r){if(gn()){let{Database:n}=Bt("bun:sqlite");return new n(r,{create:!0})}let e=Bt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var ik,ak,ni,E,N,ee=S(()=>{"use strict";ve();eo();l(ok,"openDatabase");ik=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
18
18
  -- =======================================================================
19
19
  -- Document storage (backward-compatible with JSON file pattern)
20
20
  -- =======================================================================
@@ -475,37 +475,37 @@ var iw=Object.create;var no=Object.defineProperty;var aw=Object.getOwnPropertyDe
475
475
  );
476
476
 
477
477
  CREATE INDEX IF NOT EXISTS idx_qtc_task_id ON queue_task_comments(task_id);
478
- `)},"up")}],gk=3,ci=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Op.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=gk&&this.evictLru();let s=this.getDbPath(e),n=Op.dirname(s);xc.existsSync(n)||xc.mkdirSync(n,{recursive:!0});let o=pk(s);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(s=>s!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return xc.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,s,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
478
+ `)},"up")}],ak=3,ni=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return km.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=ak&&this.evictLru();let s=this.getDbPath(e),n=km.dirname(s);vc.existsSync(n)||vc.mkdirSync(n,{recursive:!0});let o=ok(s);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(s=>s!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return vc.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,s,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
479
479
  CREATE TABLE IF NOT EXISTS _migrations (
480
480
  version INTEGER PRIMARY KEY,
481
481
  name TEXT NOT NULL,
482
482
  applied_at TEXT NOT NULL
483
483
  )
484
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of mk)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new ci,N=E});import{z as J}from"zod";var fk,hk,_p,yk,wk,kk,Sk,bk,Np,bj,Lp=S(()=>{"use strict";fk=J.enum(["low","medium","high"]),hk=J.enum(["pending","converted","completed","archived","dormant"]),_p=J.enum(["high","medium","low"]),yk=J.object({impact:_p,effort:_p}),wk=J.object({frontend:J.string().optional(),backend:J.string().optional(),payments:J.string().optional(),ai:J.string().optional(),deploy:J.string().optional(),other:J.array(J.string()).optional()}),kk=J.object({name:J.string(),description:J.string()}),Sk=J.object({name:J.string(),description:J.string().optional()}),bk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:fk,status:hk,tags:J.array(J.string()),addedAt:J.string(),completedAt:J.string().optional(),convertedTo:J.string().optional(),source:J.string().optional(),sourceFiles:J.array(J.string()).optional(),painPoints:J.array(J.string()).optional(),solutions:J.array(J.string()).optional(),filesAffected:J.array(J.string()).optional(),impactEffort:yk.optional(),implementationNotes:J.string().optional(),stack:wk.optional(),modules:J.array(kk).optional(),roles:J.array(Sk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),Np=J.object({ideas:J.array(bk),lastUpdated:J.string()}),bj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import vk from"node:crypto";import{homedir as Tk}from"node:os";import{join as Ek}from"node:path";function Z(){return vk.randomUUID()}var xj,Ut=S(()=>{"use strict";l(Z,"generateUUID");xj=Ek(Tk(),".prjct-cli","projects")});var Rs,jc,Rt,Vs=S(()=>{"use strict";Ut();X();ee();Rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},jc=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Z(),n=v();return E.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return E.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?E.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):E.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=E.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=E.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(E.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);E.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return E.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Rt=new jc});var Rc,Js,Ac=S(()=>{"use strict";ve();X();B();Rc=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ae(t,[])??[];s.push(e),await de(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ae(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await de(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await de(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ae(t,null)}},Js=new Rc});var dt,As=S(()=>{"use strict";Ac();kn();X();ee();dt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Bn({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=E.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){E.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Js.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Ic,$e,zs=S(()=>{"use strict";Lp();Ut();X();Vs();As();Ic=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Np)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:v()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=Bs(Rs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},$e=new Ic});import{z as P}from"zod";var Ck,ui,Pk,xk,jk,Dc,Up,Hp,Wp,$c,Fp,Rk,Ak,Ik,Gp,qp,Bp,Dk,$k,eR,Mc=S(()=>{"use strict";Ko();Ck=P.enum(["low","medium","high","critical"]),ui=P.enum(["feature","bug","improvement","chore"]),Pk=P.enum(["active","backlog","previously_active"]),xk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),jk=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Dc=P.object({title:P.string(),description:P.string(),filesChanged:P.array(P.object({path:P.string(),action:P.enum(["created","modified","deleted"])})),whatWasDone:P.array(P.string()).min(1),outputForNextAgent:P.string().min(1),notes:P.string().optional()}),Up=P.object({output:P.string().min(1,"Subtask output is required"),summary:Dc}),Hp=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:xk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:Dc.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Wp=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),$c=P.object({id:P.string(),description:P.string(),type:ui.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Hp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Wp.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:qn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),Fp=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:ui.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Hp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Wp.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:qn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Rk=P.object({stackConfirmed:P.array(P.string()).optional(),patternsDiscovered:P.array(P.string()).optional(),agentAccuracy:P.array(P.object({agent:P.string(),rating:P.enum(["helpful","neutral","inaccurate"]),note:P.string().optional()})).optional(),issuesEncountered:P.array(P.string()).optional()}),Ak=P.object({taskId:P.string(),title:P.string(),classification:ui,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(Dc),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:Rk.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Ik=$c.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),Gp=P.object({currentTask:$c.nullable(),previousTask:Fp.nullable().optional(),pausedTasks:P.array(Fp).optional(),taskHistory:P.array(Ak).optional(),activeTasks:P.array(Ik).optional(),lastUpdated:P.string()}),qp=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:Ck,type:ui,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:Pk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Bp=P.object({tasks:P.array(qp),lastUpdated:P.string()}),Dk=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),$k=P.object({type:jk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),eR=P.object({projectId:P.string(),currentTask:$c.nullable(),queue:P.array(qp),stats:Dk,recentActivity:P.array($k),lastSync:P.string()})});function di(r){return[...r].sort((e,t)=>{let s=Jp[e.section]-Jp[t.section];return s!==0?s:Vp[e.priority]-Vp[t.priority]})}function Oc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Vp,Jp,pi=S(()=>{"use strict";Vp={critical:0,high:1,medium:2,low:3},Jp={active:0,previously_active:1,backlog:2};l(di,"sortBySectionAndPriority");l(Oc,"uniqueBy")});var _c,ce,Vt=S(()=>{"use strict";Ut();Mc();pi();X();Vs();As();_c=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Bp)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return di(t)[0]||null}async addTask(e,t){let s={...t,id:Z(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:v()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=v(),n=t.map(o=>({...o,id:Z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async getTask(e,t){return(await this.read(e)).tasks.find(n=>n.id===t)||null}async updateTask(e,t,s){let n=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(n={...i,...s},n):i),lastUpdated:v()})),n&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),n}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=Bs(Rs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ce=new _c});import{z as re}from"zod";var Mk,zp,Ok,_k,Nk,Lk,Fk,Uk,Hk,Kp,Xp=S(()=>{"use strict";Mk=re.enum(["feature","fix","improvement","refactor"]),zp=re.enum(["pass","warning","fail","skipped"]),Ok=re.enum(["added","changed","fixed","removed"]),_k=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),Nk=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Lk=re.object({description:re.string(),type:Ok.optional()}),Fk=re.object({lintStatus:zp.nullable().optional(),lintDetails:re.string().optional(),testStatus:zp.nullable().optional(),testDetails:re.string().optional()}),Uk=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Hk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:Mk,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Lk).optional(),codeSnippets:re.array(re.string()).optional(),commit:Uk.optional(),codeMetrics:Nk.optional(),qualityMetrics:Fk.optional(),quantitativeImpact:re.string().optional(),duration:_k.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),Kp=re.object({shipped:re.array(Hk),lastUpdated:re.string()})});var Nc,it,Ks=S(()=>{"use strict";Ut();Xp();X();Vs();As();Nc=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Kp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Z(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:v()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-7*24*60*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=Bs(Rs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},it=new Nc});var po,Lc,vn,Fc=S(()=>{"use strict";po={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"}},Lc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=po[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return po[e]}getPrompt(e){return po[e].prompt}getValidCommands(e){return po[e].transitions}formatNextSteps(e){return po[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},vn=new Lc});var Uc,L,vt=S(()=>{"use strict";Ut();Mc();X();Fc();Vs();As();Uc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",Gp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=vn.getCurrentState(e),n=vn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:v(),sessionId:i.sessionId??Z()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Rt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:v()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:v()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(p=>p.feedback),n=[],o=[],i=[],a=[];for(let p of s){let g=p.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let 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 startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:v()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(m=>m.workspaceId===t);if(!i)return null;let a=v(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,m=>({...m,activeTasks:(m.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:v()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=Up.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
484
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of ik)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new ni,N=E});import{z as J}from"zod";var ck,lk,Sm,uk,dk,mk,pk,gk,bm,Sj,vm=S(()=>{"use strict";ck=J.enum(["low","medium","high"]),lk=J.enum(["pending","converted","completed","archived","dormant"]),Sm=J.enum(["high","medium","low"]),uk=J.object({impact:Sm,effort:Sm}),dk=J.object({frontend:J.string().optional(),backend:J.string().optional(),payments:J.string().optional(),ai:J.string().optional(),deploy:J.string().optional(),other:J.array(J.string()).optional()}),mk=J.object({name:J.string(),description:J.string()}),pk=J.object({name:J.string(),description:J.string().optional()}),gk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:ck,status:lk,tags:J.array(J.string()),addedAt:J.string(),completedAt:J.string().optional(),convertedTo:J.string().optional(),source:J.string().optional(),sourceFiles:J.array(J.string()).optional(),painPoints:J.array(J.string()).optional(),solutions:J.array(J.string()).optional(),filesAffected:J.array(J.string()).optional(),impactEffort:uk.optional(),implementationNotes:J.string().optional(),stack:dk.optional(),modules:J.array(mk).optional(),roles:J.array(pk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),bm=J.object({ideas:J.array(gk),lastUpdated:J.string()}),Sj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import fk from"node:crypto";import{homedir as hk}from"node:os";import{join as yk}from"node:path";function Z(){return fk.randomUUID()}var Pj,Ut=S(()=>{"use strict";l(Z,"generateUUID");Pj=yk(hk(),".prjct-cli","projects")});var Rs,Tc,Rt,Bs=S(()=>{"use strict";Ut();K();ee();Rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Tc=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Z(),n=v();return E.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return E.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?E.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):E.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=E.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=E.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(E.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);E.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return E.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Rt=new Tc});var Ec,Vs,Cc=S(()=>{"use strict";ve();K();B();Ec=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ae(t,[])??[];s.push(e),await de(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ae(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await de(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await de(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ae(t,null)}},Vs=new Ec});var dt,As=S(()=>{"use strict";Cc();wn();K();ee();dt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new qn({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=E.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){E.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Vs.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Pc,$e,Js=S(()=>{"use strict";vm();Ut();K();Bs();As();Pc=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",bm)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:v()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=qs(Rs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},$e=new Pc});import{z as P}from"zod";var wk,oi,kk,Sk,bk,xc,Em,Cm,Pm,jc,Tm,vk,Tk,Ek,xm,jm,Rm,Ck,Pk,Zj,Rc=S(()=>{"use strict";qo();wk=P.enum(["low","medium","high","critical"]),oi=P.enum(["feature","bug","improvement","chore"]),kk=P.enum(["active","backlog","previously_active"]),Sk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),bk=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),xc=P.object({title:P.string(),description:P.string(),filesChanged:P.array(P.object({path:P.string(),action:P.enum(["created","modified","deleted"])})),whatWasDone:P.array(P.string()).min(1),outputForNextAgent:P.string().min(1),notes:P.string().optional()}),Em=P.object({output:P.string().min(1,"Subtask output is required"),summary:xc}),Cm=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:Sk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:xc.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Pm=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),jc=P.object({id:P.string(),description:P.string(),type:oi.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),Tm=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:oi.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),vk=P.object({stackConfirmed:P.array(P.string()).optional(),patternsDiscovered:P.array(P.string()).optional(),agentAccuracy:P.array(P.object({agent:P.string(),rating:P.enum(["helpful","neutral","inaccurate"]),note:P.string().optional()})).optional(),issuesEncountered:P.array(P.string()).optional()}),Tk=P.object({taskId:P.string(),title:P.string(),classification:oi,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(xc),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:vk.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Ek=jc.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),xm=P.object({currentTask:jc.nullable(),previousTask:Tm.nullable().optional(),pausedTasks:P.array(Tm).optional(),taskHistory:P.array(Tk).optional(),activeTasks:P.array(Ek).optional(),lastUpdated:P.string()}),jm=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:wk,type:oi,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:kk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Rm=P.object({tasks:P.array(jm),lastUpdated:P.string()}),Ck=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Pk=P.object({type:bk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),Zj=P.object({projectId:P.string(),currentTask:jc.nullable(),queue:P.array(jm),stats:Ck,recentActivity:P.array(Pk),lastSync:P.string()})});function ii(r){return[...r].sort((e,t)=>{let s=Im[e.section]-Im[t.section];return s!==0?s:Am[e.priority]-Am[t.priority]})}function Ac(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Am,Im,ai=S(()=>{"use strict";Am={critical:0,high:1,medium:2,low:3},Im={active:0,previously_active:1,backlog:2};l(ii,"sortBySectionAndPriority");l(Ac,"uniqueBy")});var Ic,ce,Vt=S(()=>{"use strict";Ut();Rc();ai();K();Bs();As();Ic=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Rm)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return ii(t)[0]||null}async addTask(e,t){let s={...t,id:Z(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:v()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=v(),n=t.map(o=>({...o,id:Z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async getTask(e,t){return(await this.read(e)).tasks.find(n=>n.id===t)||null}async updateTask(e,t,s){let n=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(n={...i,...s},n):i),lastUpdated:v()})),n&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),n}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=qs(Rs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ce=new Ic});import{z as re}from"zod";var xk,Dm,jk,Rk,Ak,Ik,Dk,$k,Mk,$m,Mm=S(()=>{"use strict";xk=re.enum(["feature","fix","improvement","refactor"]),Dm=re.enum(["pass","warning","fail","skipped"]),jk=re.enum(["added","changed","fixed","removed"]),Rk=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),Ak=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Ik=re.object({description:re.string(),type:jk.optional()}),Dk=re.object({lintStatus:Dm.nullable().optional(),lintDetails:re.string().optional(),testStatus:Dm.nullable().optional(),testDetails:re.string().optional()}),$k=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Mk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:xk,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Ik).optional(),codeSnippets:re.array(re.string()).optional(),commit:$k.optional(),codeMetrics:Ak.optional(),qualityMetrics:Dk.optional(),quantitativeImpact:re.string().optional(),duration:Rk.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),$m=re.object({shipped:re.array(Mk),lastUpdated:re.string()})});var Dc,it,zs=S(()=>{"use strict";Ut();Mm();K();Bs();As();Dc=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",$m)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Z(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:v()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-7*24*60*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=qs(Rs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},it=new Dc});var ao,$c,bn,Mc=S(()=>{"use strict";ao={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"}},$c=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=ao[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return ao[e]}getPrompt(e){return ao[e].prompt}getValidCommands(e){return ao[e].transitions}formatNextSteps(e){return ao[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},bn=new $c});var Oc,L,vt=S(()=>{"use strict";Ut();Rc();K();Mc();Bs();As();Oc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",xm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=bn.getCurrentState(e),n=bn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:v(),sessionId:i.sessionId??Z()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Rt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:v()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:v()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:v()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=v(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:v()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=Em.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
485
485
  ${w.join(`
486
- `)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:v(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(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:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(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:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:v()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new Uc});function Gk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Wk.has(r)||r.includes("prjct"))return{level:Zn.debug,name:"debug"};let e=Zn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function mi(r,e,t){return Yp>=r?(...s)=>console[t](e,...s):Bk}var Zn,Wk,Yp,qk,Bk,Vk,V,Is=S(()=>{"use strict";Zn={error:0,warn:1,info:2,debug:3},Wk=new Set(["1","true","*"]);l(Gk,"getLogLevel");({level:Yp,name:qk}=Gk()),Bk=l(()=>{},"noop");l(mi,"createLogMethod");Vk={error:mi(Zn.error,"[prjct:error]","error"),warn:mi(Zn.warn,"[prjct:warn]","warn"),info:mi(Zn.info,"[prjct:info]","log"),debug:mi(Zn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Yp>=0,"isEnabled"),level:l(()=>qk,"level")},V=Vk});import Jk from"node:fs/promises";import zk from"node:path";import{Hono as Kk}from"hono";function Xk(r){return A.getGlobalProjectPath(r)}function Qp(r,e){let t=new Kk,s=Xk(r);return t.get("/state",async n=>{let o=await L.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await ce.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await $e.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=E.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await it.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([L.read(r),ce.read(r),$e.read(r),it.read(r)]),u=E.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await L.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=zk.join(s,"context",`${o}.md`),c=await Jk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return O(a)||V.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var Zp=S(()=>{"use strict";ve();ee();zs();Vt();Ks();vt();W();Is();l(Xk,"getProjectDataPath");l(Qp,"createRoutes")});function Yk(r){return{id:r.id,taskId:r.task_id,author:r.author,content:r.content,createdAt:r.created_at,updatedAt:r.updated_at}}function Qk(){return`cmt_${Math.random().toString(36).slice(2,10)}${Date.now().toString(36)}`}var Hc,mo,em=S(()=>{"use strict";ee();l(Yk,"rowToComment");l(Qk,"generateId");Hc=class{static{l(this,"CommentStorage")}addComment(e,t,s,n="user"){let o=Qk(),i=new Date().toISOString();return E.run(e,`INSERT INTO queue_task_comments (id, task_id, author, content, created_at, updated_at)
487
- VALUES (?, ?, ?, ?, ?, ?)`,o,t,n,s,i,i),{id:o,taskId:t,author:n,content:s,createdAt:i,updatedAt:i}}getComments(e,t){return E.query(e,"SELECT * FROM queue_task_comments WHERE task_id = ? ORDER BY created_at ASC",t).map(Yk)}updateComment(e,t,s){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"UPDATE queue_task_comments SET content = ?, updated_at = ? WHERE id = ?",s,new Date().toISOString(),t),!0):!1}deleteComment(e,t){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"DELETE FROM queue_task_comments WHERE id = ?",t),!0):!1}},mo=new Hc});var Wc,go,Gc=S(()=>{"use strict";ee();Wc=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){E.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
486
+ `)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:v(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:v()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new Oc});function _k(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Ok.has(r)||r.includes("prjct"))return{level:Qn.debug,name:"debug"};let e=Qn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function ci(r,e,t){return Om>=r?(...s)=>console[t](e,...s):Lk}var Qn,Ok,Om,Nk,Lk,Fk,V,Is=S(()=>{"use strict";Qn={error:0,warn:1,info:2,debug:3},Ok=new Set(["1","true","*"]);l(_k,"getLogLevel");({level:Om,name:Nk}=_k()),Lk=l(()=>{},"noop");l(ci,"createLogMethod");Fk={error:ci(Qn.error,"[prjct:error]","error"),warn:ci(Qn.warn,"[prjct:warn]","warn"),info:ci(Qn.info,"[prjct:info]","log"),debug:ci(Qn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Om>=0,"isEnabled"),level:l(()=>Nk,"level")},V=Fk});import Uk from"node:fs/promises";import Hk from"node:path";import{Hono as Wk}from"hono";function Gk(r){return A.getGlobalProjectPath(r)}function _m(r,e){let t=new Wk,s=Gk(r);return t.get("/state",async n=>{let o=await L.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await ce.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await $e.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=E.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await it.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([L.read(r),ce.read(r),$e.read(r),it.read(r)]),u=E.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await L.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=Hk.join(s,"context",`${o}.md`),c=await Uk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return O(a)||V.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var Nm=S(()=>{"use strict";ve();ee();Js();Vt();zs();vt();W();Is();l(Gk,"getProjectDataPath");l(_m,"createRoutes")});function qk(r){return{id:r.id,taskId:r.task_id,author:r.author,content:r.content,createdAt:r.created_at,updatedAt:r.updated_at}}function Bk(){return`cmt_${Math.random().toString(36).slice(2,10)}${Date.now().toString(36)}`}var _c,co,Lm=S(()=>{"use strict";ee();l(qk,"rowToComment");l(Bk,"generateId");_c=class{static{l(this,"CommentStorage")}addComment(e,t,s,n="user"){let o=Bk(),i=new Date().toISOString();return E.run(e,`INSERT INTO queue_task_comments (id, task_id, author, content, created_at, updated_at)
487
+ VALUES (?, ?, ?, ?, ?, ?)`,o,t,n,s,i,i),{id:o,taskId:t,author:n,content:s,createdAt:i,updatedAt:i}}getComments(e,t){return E.query(e,"SELECT * FROM queue_task_comments WHERE task_id = ? ORDER BY created_at ASC",t).map(qk)}updateComment(e,t,s){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"UPDATE queue_task_comments SET content = ?, updated_at = ? WHERE id = ?",s,new Date().toISOString(),t),!0):!1}deleteComment(e,t){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"DELETE FROM queue_task_comments WHERE id = ?",t),!0):!1}},co=new _c});var Nc,lo,Lc=S(()=>{"use strict";ee();Nc=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){E.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
488
488
  VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){E.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
489
489
  VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return E.query(e,"SELECT * FROM context_zone_events WHERE project_id = ? ORDER BY id DESC LIMIT ?",e,t).map(n=>({from:n.zone_from,to:n.zone_to,usagePercent:n.usage_percent,timestamp:n.timestamp,action:n.action}))}getSummary(e,t=7){let s=new Date(Date.now()-t*864e5).toISOString(),n=E.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
490
490
  WHERE project_id = ? AND timestamp >= ?
491
491
  GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let u of n)o[u.zone_to]=u.cnt,i+=u.cnt;let c=E.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
492
- WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},go=new Wc});var qc,Ke,gi=S(()=>{"use strict";ee();qc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();N.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
493
- VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=N.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return s?this.rowToWorkflow(s):null}getAllWorkflows(e,t=!1){let s=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return N.query(e,s).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,s){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return s.description!==void 0&&(i.push("description = ?"),a.push(s.description)),s.enabled!==void 0&&(i.push("enabled = ?"),a.push(s.enabled?1:0)),s.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(s.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),N.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let s=this.getWorkflow(e,t);if(!s)return!1;if(s.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return N.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],s=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||s.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Ke=new qc});import{createHash as tm}from"node:crypto";function fo(r){return tm("sha256").update(r).digest("hex")}function Tn(r){return fo(r).slice(0,16)}function sm(r){return tm("md5").update(r).digest("hex")}var En=S(()=>{"use strict";l(fo,"sha256");l(Tn,"sha256Short");l(sm,"md5")});import fi from"node:fs/promises";import nm from"node:path";function Zk(){return{version:er,lastUpdated:"",checksums:{}}}var er,Bc,Cn,Vc=S(()=>{"use strict";ve();W();X();En();ee();er="1.0.0";l(Zk,"getDefaultChecksums");Bc=class{static{l(this,"IndexStorage")}getIndexPath(e){return nm.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await fi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==er?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return Zk()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await fi.readFile(e);return sm(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let s={version:er,lastUpdated:v(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{E.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await fi.readdir(t);await Promise.all(s.map(n=>fi.unlink(nm.join(t,n))))}catch(s){if(!O(s))throw s}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let s=new Date(t.lastFullScan);return(new Date().getTime()-s.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==er?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===er)return t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==er?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let s=await this.readCategories(e),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=E.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=E.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Cn=new Bc});var Jc,hi,Qt,tr=S(()=>{"use strict";X();ee();Jc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=E.getDb(e),n=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=E.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?E.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return E.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},hi=new Jc,Qt=hi});import{z as Xe}from"zod";function am(r,e="default"){let t=rm[e]||rm.default;return r/1e3*t}function yi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var eS,tS,om,im,rm,wi=S(()=>{"use strict";eS=Xe.object({date:Xe.string(),tokensSaved:Xe.number(),syncs:Xe.number(),avgCompressionRate:Xe.number(),totalDuration:Xe.number()}),tS=Xe.object({agentName:Xe.string(),usageCount:Xe.number(),tokensSaved:Xe.number()}),om=Xe.object({totalTokensSaved:Xe.number(),avgCompressionRate:Xe.number(),syncCount:Xe.number(),watchTriggers:Xe.number(),avgSyncDuration:Xe.number(),totalSyncDuration:Xe.number(),agentUsage:Xe.array(tS),dailyStats:Xe.array(eS),firstSync:Xe.string(),lastUpdated:Xe.string()}),im={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},rm={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};l(am,"estimateCostSaved");l(yi,"formatCost")});var zc,Zt,ho=S(()=>{"use strict";wi();X();As();zc=class extends dt{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",om)}getDefault(){return{...im}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],p=m.findIndex(x=>x.date===o);if(p>=0){let x=m[p];m[p]={...x,tokensSaved:x.tokensSaved+s,syncs:x.syncs+1,avgCompressionRate:(x.avgCompressionRate*x.syncs+n)/(x.syncs+1),totalDuration:x.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],b=m.filter(x=>x.date>=w),h=[...i.agentUsage];if(t.agents)for(let x of t.agents){let T=h.findIndex(I=>I.agentName===x);T>=0?h[T]={...h[T],usageCount:h[T].usageCount+1,tokensSaved:h[T].tokensSaved+Math.floor(s/t.agents.length)}:h.push({agentName:x,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:h,dailyStats:b,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:am(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Zt=new zc});import{z as be}from"zod";var sS,nS,cm,jA,RA,AA,Xs,lm,yo=S(()=>{"use strict";sS=be.enum(["improving","stable","declining"]),nS=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),cm=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),jA=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),RA=be.object({sprints:be.array(nS),averageVelocity:be.number(),velocityTrend:sS,estimationAccuracy:be.number(),overEstimated:be.array(cm),underEstimated:be.array(cm),lastUpdated:be.string()}),AA=be.object({sprintLengthDays:be.number().min(1).max(90).default(7),startDay:be.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:be.number().min(1).max(52).default(6),accuracyTolerance:be.number().min(0).max(100).default(20)}),Xs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},lm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Kc,sr,ki=S(()=>{"use strict";yo();As();Kc=class extends dt{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:lm,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}},sr=new Kc});function Xc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Yc,je,wo=S(()=>{"use strict";gi();ee();l(Xc,"rowToRule");Yc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=E.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return E.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
494
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),E.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return E.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(E.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!E.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let m=u;a.push(d.transform?d.transform(m):m)}return i.length===0||(a.push(t),E.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=E.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Xc(s):null}getRulesForCommand(e,t){let s=Ke.getWorkflow(e,t);return!s||!s.enabled?[]:E.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Xc)}getAllRules(e){return E.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Xc)}resetRules(e){let t=E.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return E.run(e,"DELETE FROM workflow_rules"),t?.c??0}},je=new Yc});import gs from"node:fs/promises";import Zc from"node:path";import{Hono as rS}from"hono";function ko(r){return E.getDoc(r,"project")}async function Qc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function um(){let r=new rS;return r.get("/projects",async e=>{try{await gs.mkdir(nr,{recursive:!0});let s=(await gs.readdir(nr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ko(o),a=await L.read(o),c=await ce.read(o),u=await $e.read(o),d=await it.read(o),m=a?.currentTask,p=await Qc(m?.startedAt),g=i;return{id:o,name:g?.name||o.slice(0,8),path:g?.repoPath||g?.path||null,stack:g?.stack||null,branch:g?.currentBranch||null,fileCount:g?.fileCount||null,lastSync:g?.lastSync||null,version:g?.version||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:u?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0,tasksToday:0,tasksThisWeek:0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:String(o.name||"").localeCompare(String(i.name||""))),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(ko(t)),L.read(t),ce.read(t),$e.read(t),it.read(t)]),c=E.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Qc(n.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(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=d)?.length||0,g=o?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=m)?.length||0,w=null;try{let b=E.get(t,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");if(b){let h=JSON.parse(b.analysis);w={architecture:h.architecture,patterns:(h.patterns||[]).slice(0,6),antiPatterns:(h.antiPatterns||[]).slice(0,4),techDebt:(h.techDebt||[]).slice(0,4),conventions:h.conventions,stack:h.stack,analyzedAt:h.analyzedAt,commitHash:h.commitHash}}}catch{}return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},analysis:w,stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(b=>!b.completed)?.length||0,ideasCount:i?.ideas?.filter(b=>b.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([L.read(t),ce.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(m=>typeof m=="string").slice(0,20):[],d=await $e.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await gs.mkdir(nr,{recursive:!0});let s=(await gs.readdir(nr,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await L.read(c),d=await ce.read(c),m=await $e.read(c),p=await it.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await gs.mkdir(nr,{recursive:!0});let n=(await gs.readdir(nr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let m=ko(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let m=await L.read(d),p=ko(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Qc(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:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/queue",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{description:n,priority:o,type:i,section:a}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"description required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"description too long (max 5000 chars)"},400);let c=await ce.addTask(t,{description:n,priority:o||"medium",type:i||"feature",section:a||"active"});return e.json({success:!0,task:c})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await ce.getTask(t,s);if(!n)return e.json({error:"Task not found"},404);let o=mo.getComments(t,s);return e.json({task:n,comments:o})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json().catch(()=>({})),o={};if(n.priority&&typeof n.priority=="string"){if(!["low","medium","high","critical","normal","urgent"].includes(n.priority))return e.json({success:!1,error:"Invalid priority"},400);o.priority=n.priority}if(n.section&&typeof n.section=="string"){if(!["active","backlog","previously_active"].includes(n.section))return e.json({success:!1,error:"Invalid section"},400);o.section=n.section}return typeof n.description=="string"&&(o.description=n.description),typeof n.body=="string"&&(o.body=n.body),typeof n.type=="string"&&(o.type=n.type),Object.keys(o).length>0&&!await ce.updateTask(t,s,o)?e.json({success:!1,error:"Task not found"},404):e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{return await ce.removeTask(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/:taskId/comments",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json(),{content:o,author:i}=n;if(!o?.trim())return e.json({error:"Content required"},400);let a=mo.addComment(t,s,o.trim(),i);return e.json({comment:a})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId/comments/:commentId",async e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{let n=await e.req.json(),{content:o}=n;return o?.trim()?mo.updateComment(t,s,o.trim())?e.json({success:!0}):e.json({error:"Not found"},404):e.json({error:"Content required"},400)}catch(n){return e.json({error:String(n)},500)}}),r.delete("/projects/:id/queue/:taskId/comments/:commentId",e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{return mo.deleteComment(t,s),e.json({success:!0})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{let n=await e.req.json().catch(()=>({})),{priority:o,tags:i}=n;if(o){if(!["low","medium","high"].includes(o))return e.json({success:!1,error:"Invalid priority"},400);await $e.setPriority(t,s,o)}if(i&&Array.isArray(i)){let a=i.filter(c=>typeof c=="string").slice(0,20);a.length>0&&await $e.addTags(t,s,a)}return e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.removeIdea(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas/:ideaId/archive",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.archive(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id/task",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{description:n,type:o,branch:i}=s,a={};return n&&typeof n=="string"&&(a.description=n),o&&typeof o=="string"&&(a.type=o),i&&typeof i=="string"&&(a.branch=i),Object.keys(a).length===0?e.json({success:!1,error:"No valid fields to update"},400):await L.updateCurrentTask(t,a)?e.json({success:!0}):e.json({success:!1,error:"No active task"},400)}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{name:n,description:o,stack:i,techStack:a,repoPath:c}=s,u=A.getGlobalProjectPath(t),d=Zc.join(u,"project.json"),m={};try{let p=await gs.readFile(d,"utf-8");m=JSON.parse(p)}catch{m={projectId:t}}return n!==void 0&&(m.name=n),o!==void 0&&(m.description=o),i!==void 0&&(m.stack=i),a!==void 0&&(m.techStack=a),c!==void 0&&(m.repoPath=c),await gs.mkdir(Zc.dirname(d),{recursive:!0}),await gs.writeFile(d,JSON.stringify(m,null,2)),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id",async e=>{let t=e.req.param("id");try{E.close(t);let s=A.getGlobalProjectPath(t);return await gs.rm(s,{recursive:!0,force:!0}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflow-graph",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"workflow-graph");return e.json({edges:s?.edges||[]})}catch{return e.json({edges:[]})}}),r.put("/projects/:id/workflow-graph",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{edges:n}=s;return E.setDoc(t,"workflow-graph",{edges:n||[]}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflows",e=>{let t=e.req.param("id");try{let s=Ke.getAllWorkflows(t),n=je.getAllRules(t);return e.json({workflows:s,rules:n})}catch{return e.json({workflows:[],rules:[]})}}),r.patch("/projects/:id/workflows/:name",async e=>{let{id:t,name:s}=e.req.param();try{let n=await e.req.json().catch(()=>({})),{enabled:o}=n,i=Ke.getWorkflow(t,s);return i?(Ke.updateWorkflow(t,s,{enabled:o??!i.enabled}),e.json({success:!0})):e.json({success:!1,error:"Workflow not found"},404)}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/workflow-rules",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{type:n,command:o,position:i,action:a,description:c,enabled:u,timeoutMs:d}=s,m=je.addRule(t,{type:n,command:o,position:i,action:a,description:c||null,enabled:u??!0,timeoutMs:d??3e4,createdAt:new Date().toISOString(),sortOrder:0});return e.json({success:!0,id:m})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.patch("/projects/:id/workflow-rules/:ruleId",async e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{let n=await e.req.json();return je.updateRule(t,s,n),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.delete("/projects/:id/workflow-rules/:ruleId",e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{return je.removeRule(t,s),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/projects/:id/metrics",async e=>{let t=e.req.param("id");try{let s=await Zt.getSummary(t),n=await Zt.getDailyStats(t,90);return e.json({...s,dailyStats:n})}catch{return e.json({totalTokensSaved:0,avgCompressionRate:0,syncCount:0,dailyStats:[]})}}),r.get("/projects/:id/velocity",async e=>{let t=e.req.param("id");try{let s=await sr.getMetrics(t);return e.json(s)}catch{return e.json({averageVelocity:0,velocityTrend:"stable",sprints:[]})}}),r.get("/projects/:id/analysis/full",e=>{let t=e.req.param("id");try{let s=hi.getActive(t),n=hi.getHistory(t,10);return e.json({analysis:s,history:n})}catch{return e.json({analysis:null,history:[]})}}),r.get("/projects/:id/index",async e=>{let t=e.req.param("id");try{let s=await Cn.readIndex(t),n=await Cn.readDomains(t),o=await Cn.readScores(t),i=await Cn.readCategories(t);return e.json({index:s,domains:n,scores:o?.slice(0,100),categories:i})}catch{return e.json({index:null,domains:null,scores:[],categories:null})}}),r.get("/projects/:id/archives",e=>{let t=e.req.param("id"),s=e.req.query("type")||void 0,n=Number(e.req.query("limit"))||50;try{let o=Rt.getArchived(t,s,n),i=Rt.getStats(t);return e.json({items:o,stats:i})}catch{return e.json({items:[],stats:{total:0,byType:{}}})}}),r.get("/projects/:id/context-health",e=>{let t=e.req.param("id");try{let s=go.getSummary(t,30),n=go.getTransitions(t,50);return e.json({summary:s,transitions:n})}catch{return e.json({summary:null,transitions:[]})}}),r.get("/projects/:id/context-feedback",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM context_feedback ORDER BY created_at DESC LIMIT 50");return e.json({feedback:s})}catch{return e.json({feedback:[]})}}),r.get("/projects/:id/state/full",async e=>{let t=e.req.param("id");try{let s=await L.read(t);return e.json(s)}catch{return e.json({currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""})}}),r.get("/projects/:id/events",e=>{let t=e.req.param("id"),s=Number(e.req.query("limit"))||100,n=Number(e.req.query("offset"))||0,o=e.req.query("type")||void 0;try{let i=o?E.query(t,"SELECT * FROM events WHERE type = ? ORDER BY timestamp DESC LIMIT ? OFFSET ?",o,s,n):E.query(t,"SELECT * FROM events ORDER BY timestamp DESC LIMIT ? OFFSET ?",s,n),a=E.get(t,"SELECT COUNT(*) as c FROM events");return e.json({events:i,total:a?.c||0,limit:s,offset:n})}catch{return e.json({events:[],total:0})}}),r.get("/projects/:id/memory",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM memory ORDER BY updated_at DESC LIMIT 200");return e.json({items:s})}catch{return e.json({items:[]})}}),r.get("/projects/:id/sessions",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM sessions ORDER BY started_at DESC LIMIT 50"),n=E.query(t,"SELECT * FROM agent_sessions ORDER BY started_at DESC LIMIT 50");return e.json({sessions:s,agentSessions:n})}catch{return e.json({sessions:[],agentSessions:[]})}}),r.get("/projects/:id/tasks",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM tasks ORDER BY started_at DESC LIMIT 100"),n=E.query(t,"SELECT * FROM subtasks ORDER BY sort_order ASC");return e.json({tasks:s,subtasks:n})}catch{return e.json({tasks:[],subtasks:[]})}}),r.get("/projects/:id/kv",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT key, value FROM kv_store ORDER BY key"),n={};for(let o of s)try{n[o.key]=JSON.parse(o.value)}catch{n[o.key]=o.value}return e.json(n)}catch{return e.json({})}}),r.get("/projects/:id/issues",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"issues");return e.json({issues:s?.issues||[]})}catch{return e.json({issues:[]})}}),r.get("/projects/:id/roadmap",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"roadmap");return e.json(s||{features:[],backlog:[]})}catch{return e.json({features:[],backlog:[]})}}),r.get("/projects/:id/config",async e=>{let t=e.req.param("id");try{let s=ko(t);return e.json(s||{projectId:t})}catch{return e.json({projectId:t})}}),r}var oS,nr,dm=S(()=>{"use strict";ve();Vs();em();Gc();gi();ee();zs();Vc();tr();ho();Vt();Ks();vt();ki();wo();oS=A.getGlobalBasePath(),nr=Zc.join(oS,"projects");l(ko,"getProjectConfig");l(Qc,"calculateDuration");l(um,"createExtendedRoutes")});var pm=S(()=>{"use strict"});import{streamSSE as iS}from"hono/streaming";function gm(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>mm&&t(i)},aS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return iS(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},cS),p=setTimeout(()=>{t(a)},mm);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(){n();for(let o of[...r.keys()])t(o)}}}var mm,aS,cS,fm=S(()=>{"use strict";pm();mm=60*60*1e3,aS=5*60*1e3,cS=3e4;l(gm,"createSSEManager")});var hm={};ye(hm,{DEFAULT_PORT:()=>bi,createServer:()=>Si,startServer:()=>mS});import el from"node:fs";import Ys from"node:path";import{Hono as lS}from"hono";import{cors as uS}from"hono/cors";import{logger as dS}from"hono/logger";import{secureHeaders as pS}from"hono/secure-headers";function Si(r){let e=new lS,t=gm();e.use("*",pS()),r.enableCors!==!1&&e.use("*",uS({origin:l(c=>{if(!c)return c;try{let u=new URL(c);return u.hostname==="localhost"||u.hostname==="127.0.0.1"?c:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",dS()),e.get("/health",c=>c.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/api",c=>c.json({name:"prjct-cli",version:ke,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=Qp(r.projectId,r.projectPath);e.route("/api",s);let n=um();e.route("/api",n),e.get("/api/events",c=>t.handleConnection(c));let i=[Ys.resolve(__dirname,"..","dist","web"),Ys.resolve(__dirname,"..","..","dist","web"),Ys.resolve(process.cwd(),"dist","web"),Ys.resolve(__dirname,"..","web")].find(c=>el.existsSync(Ys.join(c,"index.html")))||null;if(i){let c={".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2"};e.get("/assets/*",async u=>{let d=Ys.join(i,u.req.path);try{let m=el.readFileSync(d),p=Ys.extname(d);return new Response(m,{headers:{"Content-Type":c[p]||"application/octet-stream","Cache-Control":"public, max-age=31536000, immutable"}})}catch{return u.notFound()}}),e.get("*",u=>{if(u.req.path.startsWith("/api"))return u.notFound();try{let d=el.readFileSync(Ys.join(i,"index.html"),"utf-8");return u.html(d)}catch{return u.json({error:"Dashboard not built. Run: cd web && bun run build"},404)}})}let a=null;return{app:e,async start(){let c=r.port,u=r.host||"0.0.0.0";if(fn())a=Bun.serve({port:c,hostname:u,fetch:e.fetch});else{let{serve:d}=await import("@hono/node-server"),m=d({fetch:e.fetch,port:c,hostname:u});a={stop:l(()=>m.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${u}:${c}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${fn()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${c}`)},stop(){t.shutdown(),a&&(a.stop(),a=null,console.log("Server stopped"))},broadcast(c,u){t.broadcast(c,u)}}}async function mS(r,e,t=bi){let s=Si({port:t,projectId:r,projectPath:e});return await s.start(),s}var bi,tl=S(()=>{"use strict";ro();ut();Zp();dm();fm();l(Si,"createServer");bi=3478;l(mS,"startServer")});import Pn from"chalk";var ym,gS,fS,es,wm=S(()=>{"use strict";lt();ym=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],gS=80,fS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:ym,speed:gS},cli:{header:l(()=>`${Pn.cyan.bold("\u26A1")} ${Pn.cyan("prjct")}`,"header"),footer:l(()=>Pn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Pn.cyan("\u26A1")} ${Pn.cyan("prjct")} ${Pn.cyan(ym[r%10])} ${Pn.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")=>Qo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Qo(r).signature,"getSignature")},es=fS});function rr(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return hS[r]}var me,sl,nl,vi,hS,Jt,km,xn=S(()=>{"use strict";me={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},sl=["feature","spec","design","refactor","migrate"],nl=["ship","cleanup","git","migrate"],vi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],hS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(rr,"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},km={HISTORY_MAX:100}});var So,rl=S(()=>{"use strict";So={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function jn(r,e){return{...So[r],...e}}function or(r,e,t){return{message:r,hint:e,...t}}var bo=S(()=>{"use strict";rl();rl();l(jn,"getError");l(or,"createError")});var bm={};ye(bm,{ERRORS:()=>So,ICONS:()=>Qs,OUTPUT_TIERS:()=>Sm,createError:()=>or,default:()=>f,formatForHuman:()=>bS,getError:()=>jn,getOutputTier:()=>wS,getTierConfig:()=>Ei,isQuietMode:()=>SS,limitLines:()=>Ti,setOutputTier:()=>yS,setQuietMode:()=>kS});import pe from"chalk";function yS(r){ar=r}function wS(){return ar}function Ei(){return Sm[ar]}function kS(r){At=r}function SS(){return At}function Ti(r,e){let t=e??Ei().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
492
+ WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},lo=new Nc});var Fc,Xe,li=S(()=>{"use strict";ee();Fc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();N.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
493
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=N.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return s?this.rowToWorkflow(s):null}getAllWorkflows(e,t=!1){let s=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return N.query(e,s).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,s){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return s.description!==void 0&&(i.push("description = ?"),a.push(s.description)),s.enabled!==void 0&&(i.push("enabled = ?"),a.push(s.enabled?1:0)),s.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(s.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),N.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let s=this.getWorkflow(e,t);if(!s)return!1;if(s.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return N.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],s=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||s.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Xe=new Fc});import{createHash as Fm}from"node:crypto";function uo(r){return Fm("sha256").update(r).digest("hex")}function vn(r){return uo(r).slice(0,16)}function Um(r){return Fm("md5").update(r).digest("hex")}var Tn=S(()=>{"use strict";l(uo,"sha256");l(vn,"sha256Short");l(Um,"md5")});import ui from"node:fs/promises";import Hm from"node:path";function Vk(){return{version:Zn,lastUpdated:"",checksums:{}}}var Zn,Uc,En,Hc=S(()=>{"use strict";ve();W();K();Tn();ee();Zn="1.0.0";l(Vk,"getDefaultChecksums");Uc=class{static{l(this,"IndexStorage")}getIndexPath(e){return Hm.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await ui.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Zn?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return Vk()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await ui.readFile(e);return Um(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let s={version:Zn,lastUpdated:v(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{E.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await ui.readdir(t);await Promise.all(s.map(n=>ui.unlink(Hm.join(t,n))))}catch(s){if(!O(s))throw s}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let s=new Date(t.lastFullScan);return(new Date().getTime()-s.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Zn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Zn)return t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Zn?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let s=await this.readCategories(e),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=E.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=E.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},En=new Uc});var Wc,di,Qt,er=S(()=>{"use strict";K();ee();Wc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=E.getDb(e),n=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=E.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?E.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return E.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},di=new Wc,Qt=di});import{z as Ke}from"zod";function Bm(r,e="default"){let t=Wm[e]||Wm.default;return r/1e3*t}function mi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Jk,zk,Gm,qm,Wm,pi=S(()=>{"use strict";Jk=Ke.object({date:Ke.string(),tokensSaved:Ke.number(),syncs:Ke.number(),avgCompressionRate:Ke.number(),totalDuration:Ke.number()}),zk=Ke.object({agentName:Ke.string(),usageCount:Ke.number(),tokensSaved:Ke.number()}),Gm=Ke.object({totalTokensSaved:Ke.number(),avgCompressionRate:Ke.number(),syncCount:Ke.number(),watchTriggers:Ke.number(),avgSyncDuration:Ke.number(),totalSyncDuration:Ke.number(),agentUsage:Ke.array(zk),dailyStats:Ke.array(Jk),firstSync:Ke.string(),lastUpdated:Ke.string()}),qm={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Wm={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};l(Bm,"estimateCostSaved");l(mi,"formatCost")});var Gc,Zt,mo=S(()=>{"use strict";pi();K();As();Gc=class extends dt{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Gm)}getDefault(){return{...qm}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,p=[...i.dailyStats],m=p.findIndex(x=>x.date===o);if(m>=0){let x=p[m];p[m]={...x,tokensSaved:x.tokensSaved+s,syncs:x.syncs+1,avgCompressionRate:(x.avgCompressionRate*x.syncs+n)/(x.syncs+1),totalDuration:x.totalDuration+t.duration}}else p.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],b=p.filter(x=>x.date>=w),h=[...i.agentUsage];if(t.agents)for(let x of t.agents){let T=h.findIndex(I=>I.agentName===x);T>=0?h[T]={...h[T],usageCount:h[T].usageCount+1,tokensSaved:h[T].tokensSaved+Math.floor(s/t.agents.length)}:h.push({agentName:x,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:h,dailyStats:b,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Bm(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Zt=new Gc});import{z as be}from"zod";var Xk,Kk,Vm,xA,jA,RA,Xs,Jm,po=S(()=>{"use strict";Xk=be.enum(["improving","stable","declining"]),Kk=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),Vm=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),xA=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),jA=be.object({sprints:be.array(Kk),averageVelocity:be.number(),velocityTrend:Xk,estimationAccuracy:be.number(),overEstimated:be.array(Vm),underEstimated:be.array(Vm),lastUpdated:be.string()}),RA=be.object({sprintLengthDays:be.number().min(1).max(90).default(7),startDay:be.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:be.number().min(1).max(52).default(6),accuracyTolerance:be.number().min(0).max(100).default(20)}),Xs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Jm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var qc,tr,gi=S(()=>{"use strict";po();As();qc=class extends dt{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Jm,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}},tr=new qc});function Bc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Vc,je,go=S(()=>{"use strict";li();ee();l(Bc,"rowToRule");Vc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=E.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return E.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
494
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),E.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return E.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(E.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!E.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),E.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=E.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Bc(s):null}getRulesForCommand(e,t){let s=Xe.getWorkflow(e,t);return!s||!s.enabled?[]:E.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Bc)}getAllRules(e){return E.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Bc)}resetRules(e){let t=E.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return E.run(e,"DELETE FROM workflow_rules"),t?.c??0}},je=new Vc});import gs from"node:fs/promises";import zc from"node:path";import{Hono as Yk}from"hono";function fo(r){return E.getDoc(r,"project")}async function Jc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function zm(){let r=new Yk;return r.get("/projects",async e=>{try{await gs.mkdir(sr,{recursive:!0});let s=(await gs.readdir(sr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=fo(o),a=await L.read(o),c=await ce.read(o),u=await $e.read(o),d=await it.read(o),p=a?.currentTask,m=await Jc(p?.startedAt),g=i;return{id:o,name:g?.name||o.slice(0,8),path:g?.repoPath||g?.path||null,stack:g?.stack||null,branch:g?.currentBranch||null,fileCount:g?.fileCount||null,lastSync:g?.lastSync||null,version:g?.version||null,currentTask:p?{...p,duration:m}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:u?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0,tasksToday:0,tasksThisWeek:0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:String(o.name||"").localeCompare(String(i.name||""))),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(fo(t)),L.read(t),ce.read(t),$e.read(t),it.read(t)]),c=E.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Jc(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=d)?.length||0,g=o?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=p)?.length||0,w=null;try{let b=E.get(t,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");if(b){let h=JSON.parse(b.analysis);w={architecture:h.architecture,patterns:(h.patterns||[]).slice(0,6),antiPatterns:(h.antiPatterns||[]).slice(0,4),techDebt:(h.techDebt||[]).slice(0,4),conventions:h.conventions,stack:h.stack,analyzedAt:h.analyzedAt,commitHash:h.commitHash}}}catch{}return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},analysis:w,stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(b=>!b.completed)?.length||0,ideasCount:i?.ideas?.filter(b=>b.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([L.read(t),ce.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await $e.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await gs.mkdir(sr,{recursive:!0});let s=(await gs.readdir(sr,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await L.read(c),d=await ce.read(c),p=await $e.read(c),m=await it.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await gs.mkdir(sr,{recursive:!0});let n=(await gs.readdir(sr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=fo(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await L.read(d),m=fo(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await Jc(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/queue",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{description:n,priority:o,type:i,section:a}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"description required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"description too long (max 5000 chars)"},400);let c=await ce.addTask(t,{description:n,priority:o||"medium",type:i||"feature",section:a||"active"});return e.json({success:!0,task:c})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await ce.getTask(t,s);if(!n)return e.json({error:"Task not found"},404);let o=co.getComments(t,s);return e.json({task:n,comments:o})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json().catch(()=>({})),o={};if(n.priority&&typeof n.priority=="string"){if(!["low","medium","high","critical","normal","urgent"].includes(n.priority))return e.json({success:!1,error:"Invalid priority"},400);o.priority=n.priority}if(n.section&&typeof n.section=="string"){if(!["active","backlog","previously_active"].includes(n.section))return e.json({success:!1,error:"Invalid section"},400);o.section=n.section}return typeof n.description=="string"&&(o.description=n.description),typeof n.body=="string"&&(o.body=n.body),typeof n.type=="string"&&(o.type=n.type),Object.keys(o).length>0&&!await ce.updateTask(t,s,o)?e.json({success:!1,error:"Task not found"},404):e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{return await ce.removeTask(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/:taskId/comments",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json(),{content:o,author:i}=n;if(!o?.trim())return e.json({error:"Content required"},400);let a=co.addComment(t,s,o.trim(),i);return e.json({comment:a})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId/comments/:commentId",async e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{let n=await e.req.json(),{content:o}=n;return o?.trim()?co.updateComment(t,s,o.trim())?e.json({success:!0}):e.json({error:"Not found"},404):e.json({error:"Content required"},400)}catch(n){return e.json({error:String(n)},500)}}),r.delete("/projects/:id/queue/:taskId/comments/:commentId",e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{return co.deleteComment(t,s),e.json({success:!0})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{let n=await e.req.json().catch(()=>({})),{priority:o,tags:i}=n;if(o){if(!["low","medium","high"].includes(o))return e.json({success:!1,error:"Invalid priority"},400);await $e.setPriority(t,s,o)}if(i&&Array.isArray(i)){let a=i.filter(c=>typeof c=="string").slice(0,20);a.length>0&&await $e.addTags(t,s,a)}return e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.removeIdea(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas/:ideaId/archive",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.archive(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id/task",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{description:n,type:o,branch:i}=s,a={};return n&&typeof n=="string"&&(a.description=n),o&&typeof o=="string"&&(a.type=o),i&&typeof i=="string"&&(a.branch=i),Object.keys(a).length===0?e.json({success:!1,error:"No valid fields to update"},400):await L.updateCurrentTask(t,a)?e.json({success:!0}):e.json({success:!1,error:"No active task"},400)}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{name:n,description:o,stack:i,techStack:a,repoPath:c}=s,u=A.getGlobalProjectPath(t),d=zc.join(u,"project.json"),p={};try{let m=await gs.readFile(d,"utf-8");p=JSON.parse(m)}catch{p={projectId:t}}return n!==void 0&&(p.name=n),o!==void 0&&(p.description=o),i!==void 0&&(p.stack=i),a!==void 0&&(p.techStack=a),c!==void 0&&(p.repoPath=c),await gs.mkdir(zc.dirname(d),{recursive:!0}),await gs.writeFile(d,JSON.stringify(p,null,2)),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id",async e=>{let t=e.req.param("id");try{E.close(t);let s=A.getGlobalProjectPath(t);return await gs.rm(s,{recursive:!0,force:!0}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflow-graph",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"workflow-graph");return e.json({edges:s?.edges||[]})}catch{return e.json({edges:[]})}}),r.put("/projects/:id/workflow-graph",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{edges:n}=s;return E.setDoc(t,"workflow-graph",{edges:n||[]}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflows",e=>{let t=e.req.param("id");try{let s=Xe.getAllWorkflows(t),n=je.getAllRules(t);return e.json({workflows:s,rules:n})}catch{return e.json({workflows:[],rules:[]})}}),r.patch("/projects/:id/workflows/:name",async e=>{let{id:t,name:s}=e.req.param();try{let n=await e.req.json().catch(()=>({})),{enabled:o}=n,i=Xe.getWorkflow(t,s);return i?(Xe.updateWorkflow(t,s,{enabled:o??!i.enabled}),e.json({success:!0})):e.json({success:!1,error:"Workflow not found"},404)}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/workflow-rules",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{type:n,command:o,position:i,action:a,description:c,enabled:u,timeoutMs:d}=s,p=je.addRule(t,{type:n,command:o,position:i,action:a,description:c||null,enabled:u??!0,timeoutMs:d??3e4,createdAt:new Date().toISOString(),sortOrder:0});return e.json({success:!0,id:p})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.patch("/projects/:id/workflow-rules/:ruleId",async e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{let n=await e.req.json();return je.updateRule(t,s,n),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.delete("/projects/:id/workflow-rules/:ruleId",e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{return je.removeRule(t,s),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/projects/:id/metrics",async e=>{let t=e.req.param("id");try{let s=await Zt.getSummary(t),n=await Zt.getDailyStats(t,90);return e.json({...s,dailyStats:n})}catch{return e.json({totalTokensSaved:0,avgCompressionRate:0,syncCount:0,dailyStats:[]})}}),r.get("/projects/:id/velocity",async e=>{let t=e.req.param("id");try{let s=await tr.getMetrics(t);return e.json(s)}catch{return e.json({averageVelocity:0,velocityTrend:"stable",sprints:[]})}}),r.get("/projects/:id/analysis/full",e=>{let t=e.req.param("id");try{let s=di.getActive(t),n=di.getHistory(t,10);return e.json({analysis:s,history:n})}catch{return e.json({analysis:null,history:[]})}}),r.get("/projects/:id/index",async e=>{let t=e.req.param("id");try{let s=await En.readIndex(t),n=await En.readDomains(t),o=await En.readScores(t),i=await En.readCategories(t);return e.json({index:s,domains:n,scores:o?.slice(0,100),categories:i})}catch{return e.json({index:null,domains:null,scores:[],categories:null})}}),r.get("/projects/:id/archives",e=>{let t=e.req.param("id"),s=e.req.query("type")||void 0,n=Number(e.req.query("limit"))||50;try{let o=Rt.getArchived(t,s,n),i=Rt.getStats(t);return e.json({items:o,stats:i})}catch{return e.json({items:[],stats:{total:0,byType:{}}})}}),r.get("/projects/:id/context-health",e=>{let t=e.req.param("id");try{let s=lo.getSummary(t,30),n=lo.getTransitions(t,50);return e.json({summary:s,transitions:n})}catch{return e.json({summary:null,transitions:[]})}}),r.get("/projects/:id/context-feedback",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM context_feedback ORDER BY created_at DESC LIMIT 50");return e.json({feedback:s})}catch{return e.json({feedback:[]})}}),r.get("/projects/:id/state/full",async e=>{let t=e.req.param("id");try{let s=await L.read(t);return e.json(s)}catch{return e.json({currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""})}}),r.get("/projects/:id/events",e=>{let t=e.req.param("id"),s=Number(e.req.query("limit"))||100,n=Number(e.req.query("offset"))||0,o=e.req.query("type")||void 0;try{let i=o?E.query(t,"SELECT * FROM events WHERE type = ? ORDER BY timestamp DESC LIMIT ? OFFSET ?",o,s,n):E.query(t,"SELECT * FROM events ORDER BY timestamp DESC LIMIT ? OFFSET ?",s,n),a=E.get(t,"SELECT COUNT(*) as c FROM events");return e.json({events:i,total:a?.c||0,limit:s,offset:n})}catch{return e.json({events:[],total:0})}}),r.get("/projects/:id/memory",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM memory ORDER BY updated_at DESC LIMIT 200");return e.json({items:s})}catch{return e.json({items:[]})}}),r.get("/projects/:id/sessions",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM sessions ORDER BY started_at DESC LIMIT 50"),n=E.query(t,"SELECT * FROM agent_sessions ORDER BY started_at DESC LIMIT 50");return e.json({sessions:s,agentSessions:n})}catch{return e.json({sessions:[],agentSessions:[]})}}),r.get("/projects/:id/tasks",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM tasks ORDER BY started_at DESC LIMIT 100"),n=E.query(t,"SELECT * FROM subtasks ORDER BY sort_order ASC");return e.json({tasks:s,subtasks:n})}catch{return e.json({tasks:[],subtasks:[]})}}),r.get("/projects/:id/kv",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT key, value FROM kv_store ORDER BY key"),n={};for(let o of s)try{n[o.key]=JSON.parse(o.value)}catch{n[o.key]=o.value}return e.json(n)}catch{return e.json({})}}),r.get("/projects/:id/issues",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"issues");return e.json({issues:s?.issues||[]})}catch{return e.json({issues:[]})}}),r.get("/projects/:id/roadmap",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"roadmap");return e.json(s||{features:[],backlog:[]})}catch{return e.json({features:[],backlog:[]})}}),r.get("/projects/:id/config",async e=>{let t=e.req.param("id");try{let s=fo(t);return e.json(s||{projectId:t})}catch{return e.json({projectId:t})}}),r}var Qk,sr,Xm=S(()=>{"use strict";ve();Bs();Lm();Lc();li();ee();Js();Hc();er();mo();Vt();zs();vt();gi();go();Qk=A.getGlobalBasePath(),sr=zc.join(Qk,"projects");l(fo,"getProjectConfig");l(Jc,"calculateDuration");l(zm,"createExtendedRoutes")});import{streamSSE as Zk}from"hono/streaming";function Ym(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Km&&t(i)},eS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return Zk(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},tS),m=setTimeout(()=>{t(a)},Km);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}var Km,eS,tS,Qm=S(()=>{"use strict";Km=60*60*1e3,eS=5*60*1e3,tS=3e4;l(Ym,"createSSEManager")});var Zm={};ye(Zm,{DEFAULT_PORT:()=>hi,createServer:()=>fi,startServer:()=>iS});import Xc from"node:fs";import Ks from"node:path";import{Hono as sS}from"hono";import{cors as nS}from"hono/cors";import{logger as rS}from"hono/logger";import{secureHeaders as oS}from"hono/secure-headers";function fi(r){let e=new sS,t=Ym();e.use("*",oS()),r.enableCors!==!1&&e.use("*",nS({origin:l(c=>{if(!c)return c;try{let u=new URL(c);return u.hostname==="localhost"||u.hostname==="127.0.0.1"?c:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",rS()),e.get("/health",c=>c.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/api",c=>c.json({name:"prjct-cli",version:ke,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=_m(r.projectId,r.projectPath);e.route("/api",s);let n=zm();e.route("/api",n),e.get("/api/events",c=>t.handleConnection(c));let i=[Ks.resolve(__dirname,"..","dist","web"),Ks.resolve(__dirname,"..","..","dist","web"),Ks.resolve(process.cwd(),"dist","web"),Ks.resolve(__dirname,"..","web")].find(c=>Xc.existsSync(Ks.join(c,"index.html")))||null;if(i){let c={".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2"};e.get("/assets/*",async u=>{let d=Ks.join(i,u.req.path);try{let p=Xc.readFileSync(d),m=Ks.extname(d);return new Response(p,{headers:{"Content-Type":c[m]||"application/octet-stream","Cache-Control":"public, max-age=31536000, immutable"}})}catch{return u.notFound()}}),e.get("*",u=>{if(u.req.path.startsWith("/api"))return u.notFound();try{let d=Xc.readFileSync(Ks.join(i,"index.html"),"utf-8");return u.html(d)}catch{return u.json({error:"Dashboard not built. Run: cd web && bun run build"},404)}})}let a=null;return{app:e,async start(){let c=r.port,u=r.host||"0.0.0.0";if(gn())a=Bun.serve({port:c,hostname:u,fetch:e.fetch});else{let{serve:d}=await import("@hono/node-server"),p=d({fetch:e.fetch,port:c,hostname:u});a={stop:l(()=>p.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${u}:${c}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${gn()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${c}`)},stop(){t.shutdown(),a&&(a.stop(),a=null,console.log("Server stopped"))},broadcast(c,u){t.broadcast(c,u)}}}async function iS(r,e,t=hi){let s=fi({port:t,projectId:r,projectPath:e});return await s.start(),s}var hi,Kc=S(()=>{"use strict";eo();ut();Nm();Xm();Qm();l(fi,"createServer");hi=3478;l(iS,"startServer")});import Cn from"chalk";var ep,aS,cS,es,tp=S(()=>{"use strict";lt();ep=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],aS=80,cS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:ep,speed:aS},cli:{header:l(()=>`${Cn.cyan.bold("\u26A1")} ${Cn.cyan("prjct")}`,"header"),footer:l(()=>Cn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Cn.cyan("\u26A1")} ${Cn.cyan("prjct")} ${Cn.cyan(ep[r%10])} ${Cn.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")=>Jo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Jo(r).signature,"getSignature")},es=cS});function nr(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return lS[r]}var pe,Yc,Qc,yi,lS,Jt,sp,Pn=S(()=>{"use strict";pe={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Yc=["feature","spec","design","refactor","migrate"],Qc=["ship","cleanup","git","migrate"],yi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],lS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(nr,"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},sp={HISTORY_MAX:100}});var np,rp=S(()=>{"use strict";np={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function ho(r,e){return{...np[r],...e}}function wi(r,e,t){return{message:r,hint:e,...t}}var ki=S(()=>{"use strict";rp();l(ho,"getError");l(wi,"createError")});var ip={};ye(ip,{ICONS:()=>Ys,OUTPUT_TIERS:()=>op,default:()=>f,formatForHuman:()=>gS,getOutputTier:()=>dS,getTierConfig:()=>bi,isQuietMode:()=>pS,limitLines:()=>Si,setOutputTier:()=>uS,setQuietMode:()=>mS});import me from"chalk";function uS(r){or=r}function dS(){return or}function bi(){return op[or]}function mS(r){At=r}function pS(){return At}function Si(r,e){let t=e??bi().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
495
495
  `);if(s.length<=t)return r;let n=s.slice(0,t),o=s.length-t;return`${n.join(`
496
496
  `)}
497
- ${pe.dim(`...${o} more lines`)}`}function bS(r){let e=Ei();if(ar==="silent")return"";if(ar==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return zt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${zt(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&&ar==="compact"&&o.push(pe.dim(String(t.url))),Ti(o.join(`
498
- `),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} ${zt(String(a.title),Jt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(pe.dim(`...${o.length-e.maxLines} more`)),i.join(`
499
- `)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?Ti(n.map(o=>`${o}: ${zt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
500
- `),e.maxLines):Ti(JSON.stringify(r,null,2),e.maxLines)}var U0,ol,Sm,ar,Qs,ir,il,At,zt,vS,TS,f,Fe=S(()=>{"use strict";wm();xn();bo();bo();U0=es.spinner.frames,ol=es.spinner.speed,Sm={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}},ar="compact";l(yS,"setOutputTier");l(wS,"getOutputTier");l(Ei,"getTierConfig");Qs={success:pe.green("\u2713"),fail:pe.red("\u2717"),warn:pe.yellow("\u26A0"),info:pe.blue("\u2139"),debug:pe.dim("\u{1F527}"),bullet:pe.dim("\u2022"),arrow:pe.dim("\u2192"),check:pe.green("\u2713"),cross:pe.red("\u2717"),spinner:pe.cyan("\u25D0")},ir=null,il=0,At=!1;l(kS,"setQuietMode");l(SS,"isQuietMode");zt=l((r,e)=>{let t=e??(Ei().maxCharsPerLine||Jt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Ti,"limitLines");l(bS,"formatForHuman");vS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Jt.CLEAR_WIDTH)}\r`):!0,"clear"),TS={start(){return At||console.log(es.cli.header()),this},end(){return At||console.log(es.cli.footer()),this},spin(r){return At?this:(this.stop(),process.stdout.isTTY?(ir=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(il++,zt(r,Jt.SPINNER_MSG))}`)},ol),this):(process.stdout.write(`${es.cli.spin(0,zt(r,Jt.SPINNER_MSG))}
501
- `),this))},done(r,e){if(this.stop(),!At){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=pe.dim(` [${s.join(" | ")}]`))}console.log(`${Qs.success} ${zt(r,Jt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Qs.fail} ${zt(r,Jt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?jn(r):r;return console.error(),console.error(`${Qs.fail} ${e.message}`),e.file&&console.error(pe.dim(` File: ${e.file}`)),e.hint&&console.error(pe.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(pe.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),At||console.log(`${Qs.warn} ${zt(r,Jt.WARN_MSG)}`),this},info(r){return this.stop(),At||console.log(`${Qs.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!At&&e&&console.log(`${Qs.debug} ${pe.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),At)return this;let t=e.bullet||Qs.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),At||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(pe.dim(n)),console.log(pe.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),At)return this;let t=e.split(`
502
- `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(pe.dim(`\u250C${n}\u2510`)),console.log(`${pe.dim("\u2502")} ${pe.bold(r.padEnd(s))} ${pe.dim("\u2502")}`),console.log(pe.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${pe.dim("\u2502")} ${o.padEnd(s)} ${pe.dim("\u2502")}`);return console.log(pe.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),At?this:(console.log(`
503
- ${pe.bold(r)}`),console.log(pe.dim("\u2500".repeat(r.length))),this)},stop(){return ir&&(clearInterval(ir),ir=null,vS()),this},step(r,e,t){if(At)return this;this.stop();let s=pe.dim(`[${r}/${e}]`);return process.stdout.isTTY?(ir=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(il++,`${s} ${zt(t,Jt.STEP_MSG)}`)}`)},ol),this):(process.stdout.write(`${es.cli.spin(0,`${s} ${zt(t,Jt.STEP_MSG)}`)}
504
- `),this)},progress(r,e,t){if(At)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=pe.cyan("\u2588".repeat(n))+pe.dim("\u2591".repeat(o)),a=t?` ${zt(t,Jt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ir=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(il++,`[${i}] ${s}%${a}`)}`)},ol),this):(process.stdout.write(`${es.cli.spin(0,`[${i}] ${s}%${a}`)}
505
- `),this)}},f=TS});var Em={};ye(Em,{default:()=>CS,sessionTracker:()=>Zs});var vm,Tm,al,Zs,CS,Ci=S(()=>{"use strict";io();ee();kn();X();vm=50,Tm=200,al=class{static{l(this,"SessionTracker")}async read(e){try{return E.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){E.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Gs(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=v();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>vm&&(n.current.commands=n.current.commands.slice(-vm)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>Tm&&(n.current.files=n.current.files.slice(-Tm)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),m=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:xt(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:xt(u),commandCount:s.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Zs=new al,CS=Zs});var Pm={};ye(Pm,{default:()=>Rn,performanceTracker:()=>Cm});var PS,cl,Cm,Rn,Pi=S(()=>{"use strict";ee();PS=BigInt(5*60*1e9),cl=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let s=process.hrtime.bigint();return this.marks.delete(e),Number(s-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,s]of this.marks)e-s>PS&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(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,w)=>g+w,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=n.filter(p=>"metric"in p&&p.metric==="heap_used"),c=n.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),w=c.map(b=>b.value);o.memory={avgHeapMB:p(g.reduce((b,h)=>b+h,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:w.length>0?p(w.reduce((b,h)=>b+h,0)/w.length):0}}let u=n.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=n.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=n.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let w=g.context?.command||"unknown";p[w]||(p[w]=[]),p[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(p))o.commandDurations[g]={avg:Math.round(w.reduce((b,h)=>b+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},Cm=new cl,Rn=Cm});import xi from"node:fs/promises";var ll,xS,An,ji=S(()=>{"use strict";Te();ve();W();kn();B();ll=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Bn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await $.getProjectId(e),n=A.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:A.getFilePath(s,"core","now.md"),next:A.getFilePath(s,"core","next.md"),context:A.getFilePath(s,"core","context.md"),shipped:A.getFilePath(s,"progress","shipped.md"),metrics:A.getFilePath(s,"progress","metrics.md"),ideas:A.getFilePath(s,"planning","ideas.md"),roadmap:A.getFilePath(s,"planning","roadmap.md"),specs:A.getFilePath(s,"planning","specs"),memory:A.getFilePath(s,"memory","context.jsonl"),patterns:A.getFilePath(s,"memory","patterns.json"),analysis:A.getFilePath(s,"analysis","repo-summary.md"),codePatterns:A.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await xi.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(O(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([xi.readFile(d,"utf-8"),xi.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(O(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)s[u]=m,this._cache.set(d,{content:m,mtime:p})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await xi.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(O(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return C(e)}getCacheStats(){return this._cache.stats()}},xS=new ll,An=xS});function Ri(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var et,vo=S(()=>{"use strict";et={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(Ri,"calculateConfidence")});var Ai,Ii,Di,ul=S(()=>{"use strict";ee();vo();X();Ai=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=N.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Ii=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},Di=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:v(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var $i,xm=S(()=>{"use strict";ee();vo();X();ul();$i=class r extends Ai{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Ri(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=v();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=Ri(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:Ri(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=v(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});function Ds(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var cr,dl=S(()=>{"use strict";Ut();ee();vo();X();En();l(Ds,"rowToMemory");cr=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(et));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=v(),d=Tn(s),m=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(m)return m.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
506
- revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let p=Z();return N.run(e,`INSERT INTO memories
497
+ ${me.dim(`...${o} more lines`)}`}function gS(r){let e=bi();if(or==="silent")return"";if(or==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return zt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${zt(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&&or==="compact"&&o.push(me.dim(String(t.url))),Si(o.join(`
498
+ `),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} ${zt(String(a.title),Jt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(me.dim(`...${o.length-e.maxLines} more`)),i.join(`
499
+ `)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?Si(n.map(o=>`${o}: ${zt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
500
+ `),e.maxLines):Si(JSON.stringify(r,null,2),e.maxLines)}var O0,Zc,op,or,Ys,rr,el,At,zt,fS,hS,f,Fe=S(()=>{"use strict";tp();Pn();ki();O0=es.spinner.frames,Zc=es.spinner.speed,op={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}},or="compact";l(uS,"setOutputTier");l(dS,"getOutputTier");l(bi,"getTierConfig");Ys={success:me.green("\u2713"),fail:me.red("\u2717"),warn:me.yellow("\u26A0"),info:me.blue("\u2139"),debug:me.dim("\u{1F527}"),bullet:me.dim("\u2022"),arrow:me.dim("\u2192"),check:me.green("\u2713"),cross:me.red("\u2717"),spinner:me.cyan("\u25D0")},rr=null,el=0,At=!1;l(mS,"setQuietMode");l(pS,"isQuietMode");zt=l((r,e)=>{let t=e??(bi().maxCharsPerLine||Jt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Si,"limitLines");l(gS,"formatForHuman");fS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Jt.CLEAR_WIDTH)}\r`):!0,"clear"),hS={start(){return At||console.log(es.cli.header()),this},end(){return At||console.log(es.cli.footer()),this},spin(r){return At?this:(this.stop(),process.stdout.isTTY?(rr=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(el++,zt(r,Jt.SPINNER_MSG))}`)},Zc),this):(process.stdout.write(`${es.cli.spin(0,zt(r,Jt.SPINNER_MSG))}
501
+ `),this))},done(r,e){if(this.stop(),!At){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=me.dim(` [${s.join(" | ")}]`))}console.log(`${Ys.success} ${zt(r,Jt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Ys.fail} ${zt(r,Jt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?ho(r):r;return console.error(),console.error(`${Ys.fail} ${e.message}`),e.file&&console.error(me.dim(` File: ${e.file}`)),e.hint&&console.error(me.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(me.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),At||console.log(`${Ys.warn} ${zt(r,Jt.WARN_MSG)}`),this},info(r){return this.stop(),At||console.log(`${Ys.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!At&&e&&console.log(`${Ys.debug} ${me.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),At)return this;let t=e.bullet||Ys.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),At||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(me.dim(n)),console.log(me.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),At)return this;let t=e.split(`
502
+ `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(me.dim(`\u250C${n}\u2510`)),console.log(`${me.dim("\u2502")} ${me.bold(r.padEnd(s))} ${me.dim("\u2502")}`),console.log(me.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${me.dim("\u2502")} ${o.padEnd(s)} ${me.dim("\u2502")}`);return console.log(me.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),At?this:(console.log(`
503
+ ${me.bold(r)}`),console.log(me.dim("\u2500".repeat(r.length))),this)},stop(){return rr&&(clearInterval(rr),rr=null,fS()),this},step(r,e,t){if(At)return this;this.stop();let s=me.dim(`[${r}/${e}]`);return process.stdout.isTTY?(rr=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(el++,`${s} ${zt(t,Jt.STEP_MSG)}`)}`)},Zc),this):(process.stdout.write(`${es.cli.spin(0,`${s} ${zt(t,Jt.STEP_MSG)}`)}
504
+ `),this)},progress(r,e,t){if(At)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=me.cyan("\u2588".repeat(n))+me.dim("\u2591".repeat(o)),a=t?` ${zt(t,Jt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(rr=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(el++,`[${i}] ${s}%${a}`)}`)},Zc),this):(process.stdout.write(`${es.cli.spin(0,`[${i}] ${s}%${a}`)}
505
+ `),this)}},f=hS});var lp={};ye(lp,{default:()=>wS,sessionTracker:()=>Qs});var ap,cp,tl,Qs,wS,vi=S(()=>{"use strict";so();ee();wn();K();ap=50,cp=200,tl=class{static{l(this,"SessionTracker")}async read(e){try{return E.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){E.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ws(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=v();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>ap&&(n.current.commands=n.current.commands.slice(-ap)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>cp&&(n.current.files=n.current.files.slice(-cp)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:xt(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:xt(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Qs=new tl,wS=Qs});var dp={};ye(dp,{default:()=>xn,performanceTracker:()=>up});var kS,sl,up,xn,Ti=S(()=>{"use strict";ee();kS=BigInt(5*60*1e9),sl=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let s=process.hrtime.bigint();return this.marks.delete(e),Number(s-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,s]of this.marks)e-s>kS&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,w)=>g+w,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),w=c.map(b=>b.value);o.memory={avgHeapMB:m(g.reduce((b,h)=>b+h,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:w.length>0?m(w.reduce((b,h)=>b+h,0)/w.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let w=g.context?.command||"unknown";m[w]||(m[w]=[]),m[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(m))o.commandDurations[g]={avg:Math.round(w.reduce((b,h)=>b+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},up=new sl,xn=up});import Ei from"node:fs/promises";var nl,SS,jn,Ci=S(()=>{"use strict";Te();ve();W();wn();B();nl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new qn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await $.getProjectId(e),n=A.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:A.getFilePath(s,"core","now.md"),next:A.getFilePath(s,"core","next.md"),context:A.getFilePath(s,"core","context.md"),shipped:A.getFilePath(s,"progress","shipped.md"),metrics:A.getFilePath(s,"progress","metrics.md"),ideas:A.getFilePath(s,"planning","ideas.md"),roadmap:A.getFilePath(s,"planning","roadmap.md"),specs:A.getFilePath(s,"planning","specs"),memory:A.getFilePath(s,"memory","context.jsonl"),patterns:A.getFilePath(s,"memory","patterns.json"),analysis:A.getFilePath(s,"analysis","repo-summary.md"),codePatterns:A.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Ei.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(O(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[p,m]=await Promise.all([Ei.readFile(d,"utf-8"),Ei.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(O(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Ei.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(O(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return C(e)}getCacheStats(){return this._cache.stats()}},SS=new nl,jn=SS});function Pi(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var et,yo=S(()=>{"use strict";et={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(Pi,"calculateConfidence")});var xi,ji,Ri,rl=S(()=>{"use strict";ee();yo();K();xi=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=N.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},ji=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()}},Ri=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:v(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var Ai,mp=S(()=>{"use strict";ee();yo();K();rl();Ai=class r extends xi{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Pi(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=v();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=Pi(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:Pi(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=v(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});function Ds(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var ir,ol=S(()=>{"use strict";Ut();ee();yo();K();Tn();l(Ds,"rowToMemory");ir=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(et));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=v(),d=vn(s),p=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
506
+ revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=Z();return N.run(e,`INSERT INTO memories
507
507
  (id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
508
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,p,e,t,s,c,i??null,d,o?1:0,u,u),p}async updateMemory(e,t,s){let n=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?Tn(i):n.content_hash;return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
508
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?vn(i):n.content_hash;return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
509
509
  revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,v(),t),!0}async deleteMemory(e,t){return N.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",v(),t),!0):!1}async findByTags(e,t,s=!1){let n=this._coerceTags(t);if(n.length===0)return[];let o=n.map(()=>"(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)"),i=s?" AND ":" OR ",a=o.join(i),c=[e];for(let d of n)c.push(d,`${d},%`,`%,${d},%`,`%,${d}`);return N.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
510
510
  AND (${a}) ORDER BY updated_at DESC`,...c).map(Ds)}async searchMemories(e,t,s=20,n=0){try{return N.query(e,`SELECT m.* FROM memories m
511
511
  JOIN memories_fts fts ON m.rowid = fts.rowid
@@ -516,7 +516,7 @@ ${pe.bold(r)}`),console.log(pe.dim("\u2500".repeat(r.length))),this)},stop(){ret
516
516
  ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(Ds)}}async getRelevantMemories(e,t,s=5){let n=[];if(t.commandName&&n.push(t.commandName),t.params?.description&&n.push(String(t.params.description)),t.params?.task&&n.push(String(t.params.task)),t.params?.feature&&n.push(String(t.params.feature)),n.length===0)return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Ds);let o=n.join(" ");try{return N.query(e,`SELECT m.* FROM memories m
517
517
  JOIN memories_fts fts ON m.rowid = fts.rowid
518
518
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
519
- ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(Ds)}catch{return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Ds)}}async getRelevantMemoriesWithMetrics(e,t){let n=N.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,m)=>({...d,relevanceScore:Math.max(10,100-m*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-m*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,m)=>d+m.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[et.COMMIT_STYLE],branch_naming:[et.BRANCH_NAMING],test_before_ship:[et.TEST_BEHAVIOR,et.SHIP_WORKFLOW],preferred_agent:[et.AGENT_PREFERENCE],code_style:[et.CODE_STYLE],verbosity:[et.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
519
+ ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(Ds)}catch{return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Ds)}}async getRelevantMemoriesWithMetrics(e,t){let n=N.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,p)=>d+p.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[et.COMMIT_STYLE],branch_naming:[et.BRANCH_NAMING],test_before_ship:[et.TEST_BEHAVIOR,et.SHIP_WORKFLOW],preferred_agent:[et.AGENT_PREFERENCE],code_style:[et.CODE_STYLE],verbosity:[et.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
520
520
  Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async findSimilar(e,t,s=5){let n=await this.getMemoryById(e,t);if(!n)return[];let o=n.title.split(/\s+/).filter(a=>a.length>2).slice(0,8);if(o.length===0)return[];let i=o.join(" OR ");try{return N.query(e,`SELECT m.* FROM memories m
521
521
  JOIN memories_fts fts ON m.rowid = fts.rowid
522
522
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
@@ -524,19 +524,19 @@ Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async f
524
524
  WHERE project_id = ? AND deleted_at IS NULL
525
525
  GROUP BY title HAVING cnt > 1`,e),n=v();for(let o of s){let i=N.query(e,`SELECT * FROM memories
526
526
  WHERE project_id = ? AND title = ? AND deleted_at IS NULL
527
- ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(p=>p.content!==a.content).map(p=>p.content)].filter((p,g,w)=>w.indexOf(p)===g).join(`
527
+ ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(m=>m.content!==a.content).map(m=>m.content)].filter((m,g,w)=>w.indexOf(m)===g).join(`
528
528
 
529
529
  ---
530
530
 
531
- `),d=new Set;for(let p of i)if(p.tags)for(let g of p.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&N.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let m=[];for(let p of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,p.id),m.push(p.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:m})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?Ds(s):null}async getAllMemories(e){return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(Ds)}async getMemoryStats(e){let t=N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var pl,jS,Tt,Mi=S(()=>{"use strict";ul();xm();dl();pl=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new cr,this._patternStore=new $i,this._historyStore=new Di,this._sessionStore=new Ii}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,s){return this._semanticMemories.updateMemory(e,t,s)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,s){return this._semanticMemories.findByTags(e,t,s)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,s){return this._semanticMemories.getRelevantMemories(e,t,s)}autoRemember(e,t,s,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,s,n){return this._patternStore.recordDecision(e,t,s,n)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,s){return this._patternStore.recordWorkflow(e,t,s)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,s,n){return this._patternStore.setPreference(e,t,s,n)}getPreference(e,t,s){return this._patternStore.getPreference(e,t,s)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let s=this.getSession(`decision:${t}`);if(s!==void 0)return s;let n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},jS=new pl,Tt=jS});import Kt from"node:fs/promises";import ts from"node:path";var ml,RS,pt,jm=S(()=>{"use strict";W();Je();B();ml=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=ts.join(this.projectPath,"package.json"),t=await Kt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=ts.join(this.projectPath,"Cargo.toml");return await Kt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readRequirements(){try{let e=ts.join(this.projectPath,"requirements.txt");return await Kt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readGoMod(){try{let e=ts.join(this.projectPath,"go.mod");return await Kt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readGemfile(){try{let e=ts.join(this.projectPath,"Gemfile");return await Kt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readMixExs(){try{let e=ts.join(this.projectPath,"mix.exs");return await Kt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readPomXml(){try{let e=ts.join(this.projectPath,"pom.xml");return await Kt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readComposerJson(){try{let e=ts.join(this.projectPath,"composer.json"),t=await Kt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=ts.join(this.projectPath,"pyproject.toml");return await Kt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await F('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
532
- `).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Kt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(s=>t.some(n=>n.test(s)))}catch(e){if(O(e))return[];throw e}}async listDirectories(){try{return(await Kt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(O(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await F(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await F("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await F('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await F('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:s.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await F('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return C(ts.join(this.projectPath,e))}async readFile(e){try{let t=ts.join(this.projectPath,e);return await Kt.readFile(t,"utf-8")}catch(t){if(O(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await F(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
533
- `).filter(Boolean)}catch{return[]}}},RS=new ml,pt=RS});var bl={};ye(bl,{clearCache:()=>kl,default:()=>Sl,getAllowedTools:()=>Rm,getTemplateContent:()=>ht,listTemplates:()=>$s,load:()=>wl,parseFrontmatter:()=>yl,resetBundle:()=>MS});import fl from"node:fs";import AS from"node:fs/promises";import _i from"node:path";function hl(){if(gl)return Oi;gl=!0;let r=_i.join(jt,"dist","templates.json");try{let e=fl.readFileSync(r,"utf-8");return Oi=JSON.parse(e),Oi}catch{return null}}function DS(r){let e=In.indexOf(r);e>-1&&In.splice(e,1),In.push(r)}function $S(){for(;lr.size>=IS&&In.length>0;){let r=In.shift();r&&lr.delete(r)}}function yl(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
534
- `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function wl(r){if(lr.has(r))return DS(r),lr.get(r);let e,t=hl();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=_i.join(jt,"templates","commands",`${r}.md`);try{e=await AS.readFile(n,"utf-8")}catch{throw ei.notFound(r)}}let s=yl(e);return $S(),lr.set(r,s),In.push(r),s}async function Rm(r){return(await wl(r)).frontmatter["allowed-tools"]||[]}function kl(){lr.clear(),In.length=0}function MS(){Oi=null,gl=!1,kl()}function ht(r){let e=hl();if(e?.[r])return e[r];let t=_i.join(jt,"templates",r);try{return fl.readFileSync(t,"utf-8")}catch{return null}}function $s(r){let e=hl();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=_i.join(jt,"templates",r);try{return fl.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var IS,lr,In,Oi,gl,OS,Sl,fs=S(()=>{"use strict";xs();ut();IS=50,lr=new Map,In=[],Oi=null,gl=!1;l(hl,"loadBundle");l(DS,"updateLruOrder");l($S,"evictLru");l(yl,"parseFrontmatter");l(wl,"load");l(Rm,"getAllowedTools");l(kl,"clearCache");l(MS,"resetBundle");l(ht,"getTemplateContent");l($s,"listTemplates");OS={load:wl,parseFrontmatter:yl,getAllowedTools:Rm,clearCache:kl,getTemplateContent:ht,listTemplates:$s},Sl=OS});function Ni(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
531
+ `),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&N.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?Ds(s):null}async getAllMemories(e){return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(Ds)}async getMemoryStats(e){let t=N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var il,bS,Tt,Ii=S(()=>{"use strict";rl();mp();ol();il=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new ir,this._patternStore=new Ai,this._historyStore=new Ri,this._sessionStore=new ji}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,s){return this._semanticMemories.updateMemory(e,t,s)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,s){return this._semanticMemories.findByTags(e,t,s)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,s){return this._semanticMemories.getRelevantMemories(e,t,s)}autoRemember(e,t,s,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,s,n){return this._patternStore.recordDecision(e,t,s,n)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,s){return this._patternStore.recordWorkflow(e,t,s)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,s,n){return this._patternStore.setPreference(e,t,s,n)}getPreference(e,t,s){return this._patternStore.getPreference(e,t,s)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let s=this.getSession(`decision:${t}`);if(s!==void 0)return s;let n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},bS=new il,Tt=bS});import Xt from"node:fs/promises";import ts from"node:path";var al,vS,mt,pp=S(()=>{"use strict";W();Je();B();al=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=ts.join(this.projectPath,"package.json"),t=await Xt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=ts.join(this.projectPath,"Cargo.toml");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readRequirements(){try{let e=ts.join(this.projectPath,"requirements.txt");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readGoMod(){try{let e=ts.join(this.projectPath,"go.mod");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readGemfile(){try{let e=ts.join(this.projectPath,"Gemfile");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readMixExs(){try{let e=ts.join(this.projectPath,"mix.exs");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readPomXml(){try{let e=ts.join(this.projectPath,"pom.xml");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readComposerJson(){try{let e=ts.join(this.projectPath,"composer.json"),t=await Xt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=ts.join(this.projectPath,"pyproject.toml");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await F('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
532
+ `).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Xt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(s=>t.some(n=>n.test(s)))}catch(e){if(O(e))return[];throw e}}async listDirectories(){try{return(await Xt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(O(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await F(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await F("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await F('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await F('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:s.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await F('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return C(ts.join(this.projectPath,e))}async readFile(e){try{let t=ts.join(this.projectPath,e);return await Xt.readFile(t,"utf-8")}catch(t){if(O(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await F(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
533
+ `).filter(Boolean)}catch{return[]}}},vS=new al,mt=vS});var ml={};ye(ml,{default:()=>dl,getTemplateContent:()=>ht,listTemplates:()=>$s,resetBundle:()=>jS});import ll from"node:fs";import TS from"node:fs/promises";import $i from"node:path";function ul(){if(cl)return Di;cl=!0;let r=$i.join(jt,"dist","templates.json");try{let e=ll.readFileSync(r,"utf-8");return Di=JSON.parse(e),Di}catch{return null}}function CS(r){let e=Rn.indexOf(r);e>-1&&Rn.splice(e,1),Rn.push(r)}function PS(){for(;ar.size>=ES&&Rn.length>0;){let r=Rn.shift();r&&ar.delete(r)}}function gp(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
534
+ `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function fp(r){if(ar.has(r))return CS(r),ar.get(r);let e,t=ul();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=$i.join(jt,"templates","commands",`${r}.md`);try{e=await TS.readFile(n,"utf-8")}catch{throw Xo.notFound(r)}}let s=gp(e);return PS(),ar.set(r,s),Rn.push(r),s}async function xS(r){return(await fp(r)).frontmatter["allowed-tools"]||[]}function hp(){ar.clear(),Rn.length=0}function jS(){Di=null,cl=!1,hp()}function ht(r){let e=ul();if(e?.[r])return e[r];let t=$i.join(jt,"templates",r);try{return ll.readFileSync(t,"utf-8")}catch{return null}}function $s(r){let e=ul();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=$i.join(jt,"templates",r);try{return ll.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var ES,ar,Rn,Di,cl,RS,dl,fs=S(()=>{"use strict";xs();ut();ES=50,ar=new Map,Rn=[],Di=null,cl=!1;l(ul,"loadBundle");l(CS,"updateLruOrder");l(PS,"evictLru");l(gp,"parseFrontmatter");l(fp,"load");l(xS,"getAllowedTools");l(hp,"clearCache");l(jS,"resetBundle");l(ht,"getTemplateContent");l($s,"listTemplates");RS={load:fp,parseFrontmatter:gp,getAllowedTools:xS,clearCache:hp,getTemplateContent:ht,listTemplates:$s},dl=RS});function Mi(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
535
535
 
536
- ${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var vl=S(()=>{"use strict";fs();W();B();Is();ut();l(Ni,"mergeWithMarkers")});import yt from"node:fs/promises";import Li from"node:os";import Ie from"node:path";async function _S(){try{let r=Ie.join(Li.homedir(),".prjct-cli","docs");await yt.mkdir(r,{recursive:!0});let e=$s("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=ht(n);if(o){let i=Ie.basename(n);await yt.writeFile(Ie.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(ut(),bt(Yn)),s=Ie.join(t,"templates/global/docs");try{let n=await yt.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Ie.join(s,o),a=Ie.join(r,o),c=await yt.readFile(i,"utf-8");await yt.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:k(r)}}}async function NS(){let r=(lt(),bt(Nt)),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 yt.mkdir(e.configDir,{recursive:!0});let n=Ie.join(e.configDir,e.contextFile),o=Am;if(t!=="claude"){let g=ht(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(ut(),bt(Yn)),b=Ie.join(w,"templates","global",e.contextFile);try{o=await yt.readFile(b,"utf-8")}catch{t==="gemini"&&(o=Am.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await yt.readFile(n,"utf-8"),a=!0}catch(g){if(O(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),w=i.substring(i.indexOf(u)+u.length);i=`${(g+w).replace(/\n{3,}/g,`
536
+ ${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var pl=S(()=>{"use strict";fs();W();B();Is();ut();l(Mi,"mergeWithMarkers")});import yt from"node:fs/promises";import Oi from"node:os";import Ie from"node:path";async function AS(){try{let r=Ie.join(Oi.homedir(),".prjct-cli","docs");await yt.mkdir(r,{recursive:!0});let e=$s("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=ht(n);if(o){let i=Ie.basename(n);await yt.writeFile(Ie.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(ut(),bt(Kn)),s=Ie.join(t,"templates/global/docs");try{let n=await yt.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Ie.join(s,o),a=Ie.join(r,o),c=await yt.readFile(i,"utf-8");await yt.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:k(r)}}}async function IS(){let r=(lt(),bt(Nt)),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 yt.mkdir(e.configDir,{recursive:!0});let n=Ie.join(e.configDir,e.contextFile),o=yp;if(t!=="claude"){let g=ht(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(ut(),bt(Kn)),b=Ie.join(w,"templates","global",e.contextFile);try{o=await yt.readFile(b,"utf-8")}catch{t==="gemini"&&(o=yp.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await yt.readFile(n,"utf-8"),a=!0}catch(g){if(O(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),w=i.substring(i.indexOf(u)+u.length);i=`${(g+w).replace(/\n{3,}/g,`
537
537
 
538
538
  `).trim()}
539
- `}let p=Ni(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await yt.writeFile(n,p.content,"utf-8"),{success:!0,action:p.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function Im(){let r=Li.homedir();return{claude:{commands:Ie.join(r,".claude","commands"),config:Ie.join(r,".claude"),router:Ie.join(r,".claude","commands","p.md")},gemini:{commands:Ie.join(r,".gemini","commands"),config:Ie.join(r,".gemini"),router:Ie.join(r,".gemini","commands","p.toml")}}}var Am,Ms,LS,Ue,Os=S(()=>{"use strict";fs();W();B();vl();Am=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
539
+ `}let m=Mi(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await yt.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function wp(){let r=Oi.homedir();return{claude:{commands:Ie.join(r,".claude","commands"),config:Ie.join(r,".claude"),router:Ie.join(r,".claude","commands","p.md")},gemini:{commands:Ie.join(r,".gemini","commands"),config:Ie.join(r,".gemini"),router:Ie.join(r,".gemini","commands","p.toml")}}}var yp,Ms,DS,Ue,Os=S(()=>{"use strict";fs();W();B();pl();yp=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
540
540
  # p/ \u2014 Context layer for AI agents
541
541
 
542
542
  Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
@@ -552,20 +552,20 @@ Data:
552
552
 
553
553
  **Auto-managed by prjct-cli** | https://prjct.app
554
554
  <!-- prjct:end - DO NOT REMOVE THIS MARKER -->
555
- `;l(_S,"installDocs");l(NS,"installGlobalConfig");Ms=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=Li.homedir()}async ensureInit(){if(this._initialized)return;let t=await(lt(),bt(Nt)).getActiveProvider();this.commandsPath=Ie.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(lt(),bt(Nt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=Ie.join(this.commandsPath,t);try{await yt.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:k(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:k(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:k(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=Ie.join(this.commandsPath,t);try{await yt.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Ie.join(this.commandsPath,"p");try{if((await yt.stat(e).catch(()=>null))?.isDirectory())return await yt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return NS()}async cleanupAllLegacy(){let e=Li.homedir(),t=[],s=[Ie.join(e,".claude","commands","p.md"),Ie.join(e,".claude","commands","p.toml"),Ie.join(e,".gemini","commands","p.md"),Ie.join(e,".gemini","commands","p.toml")];for(let i of s)try{await yt.unlink(i),t.push(i)}catch{}let n=[Ie.join(e,".claude","commands","p"),Ie.join(e,".gemini","commands","p")];for(let i of n)try{(await yt.stat(i).catch(()=>null))?.isDirectory()&&(await yt.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Ie.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await yt.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return _S()}};l(Im,"getProviderPaths");LS=new Ms,Ue=LS});function Dm(r,e){let t=[];To("Languages",r.languages,e.languages,t),To("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),To("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);To("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);To("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Tl(r){if(!r.hasChanges)return`## Analysis Diff
555
+ `;l(AS,"installDocs");l(IS,"installGlobalConfig");Ms=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=Oi.homedir()}async ensureInit(){if(this._initialized)return;let t=await(lt(),bt(Nt)).getActiveProvider();this.commandsPath=Ie.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(lt(),bt(Nt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=Ie.join(this.commandsPath,t);try{await yt.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:k(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:k(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:k(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=Ie.join(this.commandsPath,t);try{await yt.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Ie.join(this.commandsPath,"p");try{if((await yt.stat(e).catch(()=>null))?.isDirectory())return await yt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return IS()}async cleanupAllLegacy(){let e=Oi.homedir(),t=[],s=[Ie.join(e,".claude","commands","p.md"),Ie.join(e,".claude","commands","p.toml"),Ie.join(e,".gemini","commands","p.md"),Ie.join(e,".gemini","commands","p.toml")];for(let i of s)try{await yt.unlink(i),t.push(i)}catch{}let n=[Ie.join(e,".claude","commands","p"),Ie.join(e,".gemini","commands","p")];for(let i of n)try{(await yt.stat(i).catch(()=>null))?.isDirectory()&&(await yt.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Ie.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await yt.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return AS()}};l(wp,"getProviderPaths");DS=new Ms,Ue=DS});function kp(r,e){let t=[];wo("Languages",r.languages,e.languages,t),wo("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),wo("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);wo("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);wo("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function gl(r){if(!r.hasChanges)return`## Analysis Diff
556
556
 
557
557
  No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let n=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${n} | ${s.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
558
- `)}function $m(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
559
- `)}function To(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var El=S(()=>{"use strict";l(Dm,"generateAnalysisDiff");l(Tl,"formatAnalysisDiffMd");l($m,"formatAnalysisDiffText");l(To,"diffStringArray")});var Cl,Pl,Mm,Eo=S(()=>{"use strict";Cl=[1,2,3,5,8,13,21],Pl={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}},Mm={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import FS from"node:fs/promises";import US from"node:path";function ur(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 HS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...ur(p));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of n){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ur(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(...ur(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(...ur(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ur(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&&!Nm.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function WS(r){return r.split(/\s+/).flatMap(e=>ur(e)).filter(e=>e.length>1&&!Nm.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function GS(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async a=>{try{let c=await FS.readFile(US.join(r,a),"utf-8"),u=HS(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,m]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function qS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function BS(r,e){let t=WS(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=qS(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function VS(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,Lm,t)}function Fi(r){let e=N.getDoc(r,Lm);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Fm(r,e){let t=await GS(r);return VS(e,t),t}function Um(r,e,t=15){let s=Fi(r);return s?BS(e,s).slice(0,t):[]}var Nm,Lm,xl=S(()=>{"use strict";Eo();ee();B();Nm=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(ur,"splitIdentifier");l(HS,"tokenizeFile");l(WS,"tokenizeQuery");l(GS,"buildIndex");l(qS,"idf");l(BS,"score");Lm="bm25-index";l(VS,"saveIndex");l(Fi,"loadIndex");l(Fm,"indexProject");l(Um,"queryFiles")});import jl from"node:fs/promises";import en from"node:path";import{z as se}from"zod";async function YS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=en.join(e,"package.json"),n=await jl.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return O(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function QS(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await sb(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=XS[a];if(!c)continue;c.some(d=>n.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ZS(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=en.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function eb(r,e){let t=Date.now();try{let s=await nb(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function tb(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=en.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Hm(r,e){let t=Date.now(),s=await Promise.all([YS(r,e),QS(r,e),ZS(r,e),eb(r,e),tb(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function sb(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await jl.readdir(n,{withFileTypes:!0});for(let i of o){let a=en.join(n,i.name),c=en.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=en.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function nb(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await jl.readdir(n,{withFileTypes:!0});for(let i of o){let a=en.join(n,i.name),c=en.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var JS,zS,KS,Rl,bD,XS,Wm=S(()=>{"use strict";W();B();Ko();JS=se.enum(["draft","verified","sealed"]),zS=se.object({name:se.string(),description:se.string(),location:se.string().optional(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),KS=se.object({issue:se.string(),file:se.string(),suggestion:se.string(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),Rl=se.object({projectId:se.string(),languages:se.array(se.string()),frameworks:se.array(se.string()),packageManager:se.string().optional(),sourceDir:se.string().optional(),testDir:se.string().optional(),configFiles:se.array(se.string()),fileCount:se.number(),patterns:se.array(zS),antiPatterns:se.array(KS),analyzedAt:se.string(),modelMetadata:qn.optional(),status:JS.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),bD={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},XS={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(YS,"verifyFrameworks");l(QS,"verifyLanguages");l(ZS,"verifyPatternLocations");l(eb,"verifyFileCount");l(tb,"verifyAntiPatternFiles");l(Hm,"semanticVerify");l(sb,"getProjectExtensions");l(nb,"countProjectFiles")});var Al,mt,dr=S(()=>{"use strict";Wm();El();X();En();As();Al=class extends dt{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};Rl.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:v()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),n=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Rl.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=v();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Dm(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await Hm(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return fo(JSON.stringify(t))}},mt=new Al});import Gm from"node:fs/promises";import qm from"node:path";async function Dl(r,e,t,s){let[n,o,i,a]=await Promise.all([ib(r,e,s),ab(r),cb(r),lb(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,rb).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function ib(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Um(r,n,Il*2);for(let a of o){if(s.length>=Il)break;try{let c=qm.join(e,a.path),u=await Gm.readFile(c,"utf-8");u.length>Ui*3?s.push({path:a.path,content:`${u.slice(0,Ui)}
560
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Ui),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(s.length>=Il)break;if(!s.some(c=>c.path===a))try{let c=qm.join(e,a),u=await Gm.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Ui),reason:"entry point"})}catch{}}return s}async function ab(r){try{let e=await mt.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function cb(r){try{return(await L.getTaskHistory(r)).slice(0,ob).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function lb(r){try{let e=Qt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return V.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Ui,Il,rb,ob,Bm=S(()=>{"use strict";xl();dr();tr();vt();Is();Ui=800,Il=6,rb=8,ob=5;l(Dl,"buildAnalysisPayload");l(ib,"selectCodeSamples");l(ab,"getExistingPatterns");l(cb,"getTaskHistory");l(lb,"getPreviousAnalysisSummary")});var Hi=S(()=>{"use strict"});import _s from"chalk";function Vm(r){return Math.ceil(r.length/4)}function Jm(r){let e=r.split(`
558
+ `)}function Sp(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
559
+ `)}function wo(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var fl=S(()=>{"use strict";l(kp,"generateAnalysisDiff");l(gl,"formatAnalysisDiffMd");l(Sp,"formatAnalysisDiffText");l(wo,"diffStringArray")});var hl,yl,bp,ko=S(()=>{"use strict";hl=[1,2,3,5,8,13,21],yl={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}},bp={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import $S from"node:fs/promises";import MS from"node:path";function cr(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 OS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...cr(m));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...cr(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...cr(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...cr(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...cr(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Ep.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function _S(r){return r.split(/\s+/).flatMap(e=>cr(e)).filter(e=>e.length>1&&!Ep.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function NS(r){let e=await hn(r),t={},s={},n=0,o=await yn(e,50,async a=>{try{let c=await $S.readFile(MS.join(r,a),"utf-8"),u=OS(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function LS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function FS(r,e){let t=_S(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=LS(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function US(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,Cp,t)}function _i(r){let e=N.getDoc(r,Cp);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Pp(r,e){let t=await NS(r);return US(e,t),t}function xp(r,e,t=15){let s=_i(r);return s?FS(e,s).slice(0,t):[]}var Ep,Cp,wl=S(()=>{"use strict";ko();ee();B();Ep=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(cr,"splitIdentifier");l(OS,"tokenizeFile");l(_S,"tokenizeQuery");l(NS,"buildIndex");l(LS,"idf");l(FS,"score");Cp="bm25-index";l(US,"saveIndex");l(_i,"loadIndex");l(Pp,"indexProject");l(xp,"queryFiles")});import kl from"node:fs/promises";import Zs from"node:path";import{z as se}from"zod";async function BS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Zs.join(e,"package.json"),n=await kl.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return O(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function VS(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await KS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=qS[a];if(!c)continue;c.some(d=>n.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function JS(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=Zs.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function zS(r,e){let t=Date.now();try{let s=await YS(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function XS(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=Zs.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function jp(r,e){let t=Date.now(),s=await Promise.all([BS(r,e),VS(r,e),JS(r,e),zS(r,e),XS(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function KS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await kl.readdir(n,{withFileTypes:!0});for(let i of o){let a=Zs.join(n,i.name),c=Zs.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=Zs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function YS(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await kl.readdir(n,{withFileTypes:!0});for(let i of o){let a=Zs.join(n,i.name),c=Zs.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var HS,WS,GS,Sl,fD,qS,Rp=S(()=>{"use strict";W();B();qo();HS=se.enum(["draft","verified","sealed"]),WS=se.object({name:se.string(),description:se.string(),location:se.string().optional(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),GS=se.object({issue:se.string(),file:se.string(),suggestion:se.string(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),Sl=se.object({projectId:se.string(),languages:se.array(se.string()),frameworks:se.array(se.string()),packageManager:se.string().optional(),sourceDir:se.string().optional(),testDir:se.string().optional(),configFiles:se.array(se.string()),fileCount:se.number(),patterns:se.array(WS),antiPatterns:se.array(GS),analyzedAt:se.string(),modelMetadata:Gn.optional(),status:HS.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),fD={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},qS={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(BS,"verifyFrameworks");l(VS,"verifyLanguages");l(JS,"verifyPatternLocations");l(zS,"verifyFileCount");l(XS,"verifyAntiPatternFiles");l(jp,"semanticVerify");l(KS,"getProjectExtensions");l(YS,"countProjectFiles")});var bl,pt,lr=S(()=>{"use strict";Rp();fl();K();Tn();As();bl=class extends dt{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};Sl.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:v()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),n=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Sl.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=v();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:kp(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await jp(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return uo(JSON.stringify(t))}},pt=new bl});import Ap from"node:fs/promises";import Ip from"node:path";async function Tl(r,e,t,s){let[n,o,i,a]=await Promise.all([eb(r,e,s),tb(r),sb(r),nb(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,QS).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function eb(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=xp(r,n,vl*2);for(let a of o){if(s.length>=vl)break;try{let c=Ip.join(e,a.path),u=await Ap.readFile(c,"utf-8");u.length>Ni*3?s.push({path:a.path,content:`${u.slice(0,Ni)}
560
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Ni),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(s.length>=vl)break;if(!s.some(c=>c.path===a))try{let c=Ip.join(e,a),u=await Ap.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Ni),reason:"entry point"})}catch{}}return s}async function tb(r){try{let e=await pt.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function sb(r){try{return(await L.getTaskHistory(r)).slice(0,ZS).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function nb(r){try{let e=Qt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return V.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Ni,vl,QS,ZS,Dp=S(()=>{"use strict";wl();lr();er();vt();Is();Ni=800,vl=6,QS=8,ZS=5;l(Tl,"buildAnalysisPayload");l(eb,"selectCodeSamples");l(tb,"getExistingPatterns");l(sb,"getTaskHistory");l(nb,"getPreviousAnalysisSummary")});var Li=S(()=>{"use strict"});import _s from"chalk";function $p(r){return Math.ceil(r.length/4)}function Mp(r){let e=r.split(`
561
561
  `),t=[],s=null;for(let n=0;n<e.length;n++){let o=e[n],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=n-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:n,endLine:n}):s&&(s.content+=`
562
- ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function $l(r){return r.includes("<!-- prjct:preserve")}function zm(r,e){let t=Jm(r),s=Jm(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Vm(r),tokensAfter:Vm(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(s.map(a=>[a.name.toLowerCase(),a]));for(let a of t)$l(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
563
- `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&($l(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
562
+ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function El(r){return r.includes("<!-- prjct:preserve")}function Op(r,e){let t=Mp(r),s=Mp(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:$p(r),tokensAfter:$p(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(s.map(a=>[a.name.toLowerCase(),a]));for(let a of t)El(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
563
+ `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(El(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
564
564
  `).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
565
- `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!$l(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
566
- `).length}),n.hasChanges=!0)}return n}function Km(r,e={}){let{colorize:t=!0}=e,s=[],n=t?_s.green:p=>p,o=t?_s.red:p=>p,i=t?_s.yellow:p=>p,a=t?_s.dim:p=>p,c=t?_s.bold:p=>p;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
567
- `);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let p of r.added)s.push(n(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)s.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)s.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let p of r.preserved)s.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
568
- `)}function Xm(r,e={}){let{colorize:t=!0}=e,s=[],n=t?_s.green:c=>c,o=t?_s.red:c=>c,i=t?_s.cyan:c=>c,a=t?_s.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
565
+ `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!El(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
566
+ `).length}),n.hasChanges=!0)}return n}function _p(r,e={}){let{colorize:t=!0}=e,s=[],n=t?_s.green:m=>m,o=t?_s.red:m=>m,i=t?_s.yellow:m=>m,a=t?_s.dim:m=>m,c=t?_s.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
567
+ `);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let m of r.added)s.push(n(`+ \u2502 + ${m.name} (new)`));if(r.modified.length>0)for(let m of r.modified)s.push(i(`~ \u2502 ${m.name} (modified)`));if(r.removed.length>0)for(let m of r.removed)s.push(o(`- \u2502 - ${m.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let m of r.preserved)s.push(a(` \u2502 \u2713 ${m.name} (${m.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",p=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${p(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
568
+ `)}function Np(r,e={}){let{colorize:t=!0}=e,s=[],n=t?_s.green:c=>c,o=t?_s.red:c=>c,i=t?_s.cyan:c=>c,a=t?_s.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
569
569
  `))s.push(n(`+ ${u}`));s.push("")}for(let c of r.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
570
570
  `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
571
571
  `).length>5&&s.push(a(` ... ${c.before.split(`
@@ -576,17 +576,17 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function $l(r){return r.incl
576
576
  `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
577
577
  `).length>5&&s.push(a(` ... ${c.before.split(`
578
578
  `).length-5} more lines`))}s.push("")}return s.join(`
579
- `)}var Ym=S(()=>{"use strict";Hi();l(Vm,"estimateTokens");l(Jm,"parseMarkdownSections");l($l,"isPreservedSection");l(zm,"generateSyncDiff");l(Km,"formatDiffPreview");l(Xm,"formatFullDiff")});var ub,Ml,Wi,Ol=S(()=>{"use strict";ee();W();Je();Ci();ub={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Ml=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...ub,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let s={};try{let c=E.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;s=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let n=s.lastSync;try{let{stdout:c}=await F("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([F(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),F(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
579
+ `)}var Lp=S(()=>{"use strict";Li();l($p,"estimateTokens");l(Mp,"parseMarkdownSections");l(El,"isPreservedSection");l(Op,"generateSyncDiff");l(_p,"formatDiffPreview");l(Np,"formatFullDiff")});var rb,Cl,Fi,Pl=S(()=>{"use strict";ee();W();Je();vi();rb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Cl=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...rb,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let s={};try{let c=E.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;s=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let n=s.lastSync;try{let{stdout:c}=await F("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([F(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),F(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
580
580
  `).filter(Boolean):[],n){let c=new Date(n),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(s){return t.reason=`Error checking staleness: ${k(s)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let s=[];if(e.lastSyncCommit&&s.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&s.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&s.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&s.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&s.push(`Files changed: ${e.changedFiles.length}`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let n of e.significantChanges.slice(0,5))t.push(` \u2022 ${n}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
581
- `)}async getSessionInfo(e){return Zs.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
581
+ `)}async getSessionInfo(e){return Qs.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
582
582
  `);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let n=new Set,o=[];for(let i of e.commands)n.has(i)||(n.add(i),o.push(i));s.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&s.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),s.push(`Idle: ${e.expiresIn} until timeout`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
583
- `)}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}},Wi=l((r,e)=>new Ml(r,e),"createStalenessChecker")});import Qm from"node:fs/promises";import mr from"node:path";function db(r){let e=[],t,s=new RegExp(up.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function pb(r,e,t){let s;if(r.startsWith("@/"))s=mr.join(t,"src",r.slice(2));else{let n=mr.dirname(mr.join(t,e));s=mr.resolve(n,r)}for(let n of lp){let o=s+n;try{if((await Qm.stat(o)).isFile())return mr.relative(t,o)}catch{}}return null}async function mb(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async i=>{try{let a=await Qm.readFile(mr.join(r,i),"utf-8"),c=db(a),u=[];for(let d of c){let m=await pb(d,i,r);m&&m!==i&&u.push(m)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function gb(r,e){N.setDoc(r,Zm,e)}function Gi(r){return N.getDoc(r,Zm)}async function eg(r,e){let t=await mb(r);return gb(e,t),t}var Zm,_l=S(()=>{"use strict";rc();ee();B();l(db,"extractImportSources");l(pb,"resolveImport");l(mb,"buildGraph");Zm="import-graph";l(gb,"saveGraph");l(Gi,"loadGraph");l(eg,"indexImports")});function tg(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Gi(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function sg(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var ng=S(()=>{"use strict";_l();l(tg,"propagateChanges");l(sg,"affectedDomains")});import rg from"node:fs/promises";import fb from"node:path";function hb(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 yb(r){let e=await yn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await wn(e,100,async n=>{try{let o=fb.join(r,n),[i,a]=await Promise.all([rg.readFile(o,"utf-8"),rg.stat(o)]);return{path:n,hash:hb(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function wb(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function Nl(r,e){let t=N.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),N.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function kb(r){let e=new Map;try{let t=N.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function Ll(r,e){let[t,s]=await Promise.all([yb(r),Promise.resolve(kb(e))]);return{diff:wb(t,s),currentHashes:t}}function og(r){return N.hasDoc(r,"file-hashes-meta")}var ig=S(()=>{"use strict";ee();B();l(hb,"hashContent");l(yb,"computeHashes");l(wb,"diffHashes");l(Nl,"saveHashes");l(kb,"loadHashes");l(Ll,"detectChanges");l(og,"hasHashRegistry")});async function bb(r,e=100){try{let{stdout:t}=await F(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
584
- `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&vb(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function vb(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 Tb(r,e=100){let t=await bb(r,e),s=new Map,n=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=Eb(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,m=s.get(u)||0;if(d<2||m<2)continue;let p=d+m-a,g=p>0?a/p:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function Eb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Cb(r,e){N.setDoc(r,lg,e)}function ug(r){return N.getDoc(r,lg)}async function dg(r,e,t=100){let s=await Tb(r,t);return Cb(e,s),s}var lg,pg=S(()=>{"use strict";Eo();ee();Je();l(bb,"parseGitLog");l(vb,"isSourceFile");l(Tb,"buildMatrix");l(Eb,"pairKey");lg="cochange-index";l(Cb,"saveMatrix");l(ug,"loadMatrix");l(dg,"indexCoChanges")});import hg from"node:fs/promises";import mg from"node:os";import Fl from"node:path";function xb(){let r=ht("mcp-config.json");if(!r)return{mcpServers:{context7:Ul}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Ul}}}}function yg(){return xb().mcpServers?.context7||Ul}function gg(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Fl.join(mg.tmpdir(),"prjct-context7-test","mcp.json"):Fl.join(mg.homedir(),".claude","mcp.json")}async function fg(r){try{let e=await hg.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e))return{};throw e}}async function jb(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=yg(),e=[...r.args||[],"--help"];await hn(r.command||"npx",e,{timeout:15e3})}var Ul,gr,Hl,Rb,ss,fr=S(()=>{"use strict";fs();io();W();Je();B();Ul={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},gr=null;l(xb,"parseTemplateConfig");l(yg,"getContext7Config");l(gg,"getConfigPath");l(fg,"readConfig");l(jb,"runSmokeCheck");Hl=class{static{l(this,"Context7Service")}async install(){let e=gg(),t=Fl.dirname(e);await hg.mkdir(t,{recursive:!0});let s=await fg(e),n=s.mcpServers||{};return n.context7=yg(),s.mcpServers=n,await de(e,s),gr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(gr&&Date.now()-gr.at<3e5)return gr.status;let e=gg(),n=((await fg(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await jb();let o={installed:!0,verified:!0,configPath:e};return gr={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${k(o)}`};return gr={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},Rb=new Hl,ss=Rb});import{execFileSync as wg,execSync as Ab}from"node:child_process";var qi,Wl,Bi,kg,Sg=S(()=>{"use strict";kn();bo();qi={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"}},Wl=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=qi[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=qi[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Bi(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=qi[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
585
- `);throw new Bi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
586
- ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(qi),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Ab(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:or(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:or(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return wg(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return wg(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:or(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Gs(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())}},Bi=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}},kg=new Wl});var Ji={};ye(Ji,{installAntigravitySkill:()=>Cg,installCodexSkill:()=>Gl,needsAntigravityInstallation:()=>Ob,run:()=>Eg,verifyCodexPRouterReady:()=>hr});import{execFileSync as Ib}from"node:child_process";import oe from"node:fs/promises";import Dn from"node:os";import ge from"node:path";import Ee from"chalk";async function Db(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!kg.isAvailable("npm"))return console.log(`${Ee.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${Ee.dim(`Install ${r.displayName} using one of:`)}`),console.log(Ee.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(Ee.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(Ee.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(Ee.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Ib("npm",["install","-g",e],{stdio:"inherit",timeout:rr("NPM_INSTALL")}),console.log(""),console.log(`${Ee.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(Ee.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(Ee.dim("The npm install took too long. Try:")),console.log(Ee.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(Ee.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(Ee.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(Ee.dim("Alternative installation methods:")),console.log(Ee.dim(` \u2022 npm: npm install -g ${e}`)),console.log(Ee.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(Ee.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(Ee.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Eg(){let r=await Ps(),e=await gc(),t=ze[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=ze[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await Db(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ue.detectActiveProvider()){let p=await Ue.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let g=await Ue.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Ue.installDocs(),await Fb(),await ss.ensureReady()}}else if(a==="gemini"){await $b()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await Mb();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await Vn()).installed&&(await Cg()).success&&console.log(` ${Ee.green("\u2713")} Antigravity skill installed`),(await Sn()).installed){if(!(await Gl()).success)throw new Error("Codex skill installation failed");let c=await hr({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${Ee.green("\u2713")} Codex skill installed`),console.log(` ${Ee.green("\u2713")} Codex p. router ready`)}await uo.saveConfig(ke,await Ue.getInstallPath(),e.provider),await Lb();for(let a of s.providers)Ub(a,ze[a.provider]);return s}async function $b(){try{let r=ge.join(Dn.homedir(),".gemini","commands"),e=ge.join(r,"p.toml");try{return await oe.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return V.warn(`Gemini router cleanup warning: ${k(r)}`),!1}}async function Mb(){try{let r=ge.join(Dn.homedir(),".gemini"),e=ge.join(r,"GEMINI.md");await oe.mkdir(r,{recursive:!0});let t=ht("global/GEMINI.md");if(!t){let c=ge.join(jt,"templates","global","GEMINI.md");t=await oe.readFile(c,"utf-8")}let s="",n=!1;try{s=await oe.readFile(e,"utf-8"),n=!0}catch(c){if(O(c))n=!1;else throw c}let a=Ni(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await oe.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return V.warn(`Gemini config warning: ${k(r)}`),{success:!1,action:null}}}async function Cg(){try{let r=ge.join(Dn.homedir(),".gemini","antigravity","skills"),e=ge.join(r,"prjct"),t=ge.join(e,"SKILL.md");await oe.mkdir(e,{recursive:!0});let s=await C(t),n=ht("antigravity/SKILL.md");if(!n){let o=ge.join(jt,"templates","antigravity","SKILL.md");if(!await C(o))return V.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await oe.readFile(o,"utf-8")}return await oe.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return V.warn(`Antigravity skill warning: ${k(r)}`),{success:!1,action:null}}}async function Ob(){let r=await Vn();return r.installed&&!r.skillInstalled}function xg(){return ge.join(Dn.homedir(),".codex","skills","prjct","SKILL.md")}function _b(r){return`<!-- ${Pg}: ${JSON.stringify({version:ke,templateHash:r})} -->`}function bg(r){let e=r.match(new RegExp(`<!--\\s*${Pg}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Nb(r){return fo(r)}async function jg(){let r=ht("codex/SKILL.md");if(r)return r;let e=ge.join(jt,"templates","codex","SKILL.md");return await C(e)?oe.readFile(e,"utf-8"):null}function Rg(r){let e=r.trimEnd(),t=Nb(e),s=_b(t);return{content:`${e}
583
+ `)}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}},Fi=l((r,e)=>new Cl(r,e),"createStalenessChecker")});import Fp from"node:fs/promises";import dr from"node:path";function ob(r){let e=[],t,s=new RegExp(zd.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function ib(r,e,t){let s;if(r.startsWith("@/"))s=dr.join(t,"src",r.slice(2));else{let n=dr.dirname(dr.join(t,e));s=dr.resolve(n,r)}for(let n of Jd){let o=s+n;try{if((await Fp.stat(o)).isFile())return dr.relative(t,o)}catch{}}return null}async function ab(r){let e=await hn(r),t={},s={},n=0,o=await yn(e,50,async i=>{try{let a=await Fp.readFile(dr.join(r,i),"utf-8"),c=ob(a),u=[];for(let d of c){let p=await ib(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function cb(r,e){N.setDoc(r,Up,e)}function Ui(r){return N.getDoc(r,Up)}async function Hp(r,e){let t=await ab(r);return cb(e,t),t}var Up,xl=S(()=>{"use strict";Za();ee();B();l(ob,"extractImportSources");l(ib,"resolveImport");l(ab,"buildGraph");Up="import-graph";l(cb,"saveGraph");l(Ui,"loadGraph");l(Hp,"indexImports")});function Wp(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Ui(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Gp(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var qp=S(()=>{"use strict";xl();l(Wp,"propagateChanges");l(Gp,"affectedDomains")});import Bp from"node:fs/promises";import lb from"node:path";function ub(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 db(r){let e=await hn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await yn(e,100,async n=>{try{let o=lb.join(r,n),[i,a]=await Promise.all([Bp.readFile(o,"utf-8"),Bp.stat(o)]);return{path:n,hash:ub(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function mb(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function jl(r,e){let t=N.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),N.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function pb(r){let e=new Map;try{let t=N.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function Rl(r,e){let[t,s]=await Promise.all([db(r),Promise.resolve(pb(e))]);return{diff:mb(t,s),currentHashes:t}}function Vp(r){return N.hasDoc(r,"file-hashes-meta")}var Jp=S(()=>{"use strict";ee();B();l(ub,"hashContent");l(db,"computeHashes");l(mb,"diffHashes");l(jl,"saveHashes");l(pb,"loadHashes");l(Rl,"detectChanges");l(Vp,"hasHashRegistry")});async function fb(r,e=100){try{let{stdout:t}=await F(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
584
+ `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&hb(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function hb(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 yb(r,e=100){let t=await fb(r,e),s=new Map,n=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=wb(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,p=s.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function wb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function kb(r,e){N.setDoc(r,Kp,e)}function Yp(r){return N.getDoc(r,Kp)}async function Qp(r,e,t=100){let s=await yb(r,t);return kb(e,s),s}var Kp,Zp=S(()=>{"use strict";ko();ee();Je();l(fb,"parseGitLog");l(hb,"isSourceFile");l(yb,"buildMatrix");l(wb,"pairKey");Kp="cochange-index";l(kb,"saveMatrix");l(Yp,"loadMatrix");l(Qp,"indexCoChanges")});import ng from"node:fs/promises";import eg from"node:os";import Al from"node:path";function bb(){let r=ht("mcp-config.json");if(!r)return{mcpServers:{context7:Il}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Il}}}}function rg(){return bb().mcpServers?.context7||Il}function tg(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Al.join(eg.tmpdir(),"prjct-context7-test","mcp.json"):Al.join(eg.homedir(),".claude","mcp.json")}async function sg(r){try{let e=await ng.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e))return{};throw e}}async function vb(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=rg(),e=[...r.args||[],"--help"];await fn(r.command||"npx",e,{timeout:15e3})}var Il,mr,Dl,Tb,ss,pr=S(()=>{"use strict";fs();so();W();Je();B();Il={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},mr=null;l(bb,"parseTemplateConfig");l(rg,"getContext7Config");l(tg,"getConfigPath");l(sg,"readConfig");l(vb,"runSmokeCheck");Dl=class{static{l(this,"Context7Service")}async install(){let e=tg(),t=Al.dirname(e);await ng.mkdir(t,{recursive:!0});let s=await sg(e),n=s.mcpServers||{};return n.context7=rg(),s.mcpServers=n,await de(e,s),mr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(mr&&Date.now()-mr.at<3e5)return mr.status;let e=tg(),n=((await sg(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await vb();let o={installed:!0,verified:!0,configPath:e};return mr={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${k(o)}`};return mr={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},Tb=new Dl,ss=Tb});import{execFileSync as og,execSync as Eb}from"node:child_process";var Hi,$l,Wi,ig,ag=S(()=>{"use strict";wn();ki();Hi={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},$l=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=Hi[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Hi[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Wi(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=Hi[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
585
+ `);throw new Wi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
586
+ ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Hi),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Eb(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:wi(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:wi(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return og(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return og(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:wi(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ws(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())}},Wi=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}},ig=new $l});var qi={};ye(qi,{installAntigravitySkill:()=>mg,installCodexSkill:()=>Ml,needsAntigravityInstallation:()=>Rb,run:()=>dg,verifyCodexPRouterReady:()=>gr});import{execFileSync as Cb}from"node:child_process";import oe from"node:fs/promises";import An from"node:os";import ge from"node:path";import Ee from"chalk";async function Pb(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!ig.isAvailable("npm"))return console.log(`${Ee.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${Ee.dim(`Install ${r.displayName} using one of:`)}`),console.log(Ee.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(Ee.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(Ee.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(Ee.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Cb("npm",["install","-g",e],{stdio:"inherit",timeout:nr("NPM_INSTALL")}),console.log(""),console.log(`${Ee.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(Ee.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(Ee.dim("The npm install took too long. Try:")),console.log(Ee.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(Ee.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(Ee.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(Ee.dim("Alternative installation methods:")),console.log(Ee.dim(` \u2022 npm: npm install -g ${e}`)),console.log(Ee.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(Ee.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(Ee.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function dg(){let r=await Ps(),e=await lc(),t=ze[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=ze[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await Pb(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ue.detectActiveProvider()){let m=await Ue.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await Ue.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Ue.installDocs(),await $b(),await ss.ensureReady()}}else if(a==="gemini"){await xb()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await jb();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await Bn()).installed&&(await mg()).success&&console.log(` ${Ee.green("\u2713")} Antigravity skill installed`),(await kn()).installed){if(!(await Ml()).success)throw new Error("Codex skill installation failed");let c=await gr({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${Ee.green("\u2713")} Codex skill installed`),console.log(` ${Ee.green("\u2713")} Codex p. router ready`)}await io.saveConfig(ke,await Ue.getInstallPath(),e.provider),await Db();for(let a of s.providers)Mb(a,ze[a.provider]);return s}async function xb(){try{let r=ge.join(An.homedir(),".gemini","commands"),e=ge.join(r,"p.toml");try{return await oe.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return V.warn(`Gemini router cleanup warning: ${k(r)}`),!1}}async function jb(){try{let r=ge.join(An.homedir(),".gemini"),e=ge.join(r,"GEMINI.md");await oe.mkdir(r,{recursive:!0});let t=ht("global/GEMINI.md");if(!t){let c=ge.join(jt,"templates","global","GEMINI.md");t=await oe.readFile(c,"utf-8")}let s="",n=!1;try{s=await oe.readFile(e,"utf-8"),n=!0}catch(c){if(O(c))n=!1;else throw c}let a=Mi(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await oe.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return V.warn(`Gemini config warning: ${k(r)}`),{success:!1,action:null}}}async function mg(){try{let r=ge.join(An.homedir(),".gemini","antigravity","skills"),e=ge.join(r,"prjct"),t=ge.join(e,"SKILL.md");await oe.mkdir(e,{recursive:!0});let s=await C(t),n=ht("antigravity/SKILL.md");if(!n){let o=ge.join(jt,"templates","antigravity","SKILL.md");if(!await C(o))return V.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await oe.readFile(o,"utf-8")}return await oe.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return V.warn(`Antigravity skill warning: ${k(r)}`),{success:!1,action:null}}}async function Rb(){let r=await Bn();return r.installed&&!r.skillInstalled}function gg(){return ge.join(An.homedir(),".codex","skills","prjct","SKILL.md")}function Ab(r){return`<!-- ${pg}: ${JSON.stringify({version:ke,templateHash:r})} -->`}function cg(r){let e=r.match(new RegExp(`<!--\\s*${pg}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Ib(r){return uo(r)}async function fg(){let r=ht("codex/SKILL.md");if(r)return r;let e=ge.join(jt,"templates","codex","SKILL.md");return await C(e)?oe.readFile(e,"utf-8"):null}function hg(r){let e=r.trimEnd(),t=Ib(e),s=Ab(t);return{content:`${e}
587
587
 
588
588
  ${s}
589
- `,templateHash:t}}async function Gl(){try{let r=xg(),e=ge.dirname(r);await oe.mkdir(e,{recursive:!0});let t=await C(r),s=await jg();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Rg(s);return t&&await oe.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await oe.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return V.warn(`Codex skill warning: ${k(r)}`),{success:!1,action:null}}}async function hr(r={}){let e=xg();if(!(await Sn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await jg();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let n=Rg(s),o=l(async()=>r.autoRepair?(await Gl()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await oe.readFile(e,"utf-8").catch(()=>"");let a=bg(i);if(!(a?.version===ke&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await oe.readFile(e,"utf-8").catch(()=>""),a=bg(i),!(a?.version===ke&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function Lb(){try{let r=ge.join(Dn.homedir(),".prjct-cli","projects");if(!await C(r))return;let e=(await oe.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=E.getDoc(s,"project");if(!n)continue;n.cliVersion!==ke&&(n.cliVersion=ke,E.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${Ee.green("\u2713")} Updated ${t} project(s) to v${ke}`)}catch(r){O(r)||V.warn(`Migration warning: ${k(r)}`)}}async function vg(r,e){let t={};if(await C(r))try{t=await Ae(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await de(r,t)}async function Fb(){try{let r=ge.join(Dn.homedir(),".claude"),e=ge.join(r,"settings.json"),t=ge.join(r,"prjct-statusline.sh"),s=ge.join(Dn.homedir(),".prjct-cli","statusline"),n=ge.join(s,"statusline.sh"),o=ge.join(s,"themes"),i=ge.join(s,"lib"),a=ge.join(s,"components"),c=ge.join(s,"config.json"),u=ge.join(jt,"assets","statusline"),d=ge.join(u,"statusline.sh"),m=ge.join(u,"themes"),p=ge.join(u,"lib"),g=ge.join(u,"components"),w=ge.join(u,"default-config.json");if(await C(r)||await oe.mkdir(r,{recursive:!0}),await C(s)||await oe.mkdir(s,{recursive:!0}),await C(o)||await oe.mkdir(o,{recursive:!0}),await C(i)||await oe.mkdir(i,{recursive:!0}),await C(a)||await oe.mkdir(a,{recursive:!0}),await C(n)){let b=await oe.readFile(n,"utf8");if(b.includes("CLI_VERSION=")){let h=b.match(/CLI_VERSION="([^"]*)"/);if(h&&h[1]!==ke){let x=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ke}"`);await oe.writeFile(n,x,{mode:493})}await Vi(p,i),await Vi(g,a),await Tg(t,n),await vg(e,t);return}}if(await C(d)){let b=await oe.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ke}"`),await oe.writeFile(n,b,{mode:493}),await Vi(p,i),await Vi(g,a),await C(m)){let h=await oe.readdir(m);for(let x of h){let T=ge.join(m,x),I=ge.join(o,x);await oe.copyFile(T,I)}}!await C(c)&&await C(w)&&await oe.copyFile(w,c)}else{let b=`#!/bin/bash
589
+ `,templateHash:t}}async function Ml(){try{let r=gg(),e=ge.dirname(r);await oe.mkdir(e,{recursive:!0});let t=await C(r),s=await fg();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=hg(s);return t&&await oe.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await oe.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return V.warn(`Codex skill warning: ${k(r)}`),{success:!1,action:null}}}async function gr(r={}){let e=gg();if(!(await kn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await fg();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let n=hg(s),o=l(async()=>r.autoRepair?(await Ml()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await oe.readFile(e,"utf-8").catch(()=>"");let a=cg(i);if(!(a?.version===ke&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await oe.readFile(e,"utf-8").catch(()=>""),a=cg(i),!(a?.version===ke&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function Db(){try{let r=ge.join(An.homedir(),".prjct-cli","projects");if(!await C(r))return;let e=(await oe.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=E.getDoc(s,"project");if(!n)continue;n.cliVersion!==ke&&(n.cliVersion=ke,E.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${Ee.green("\u2713")} Updated ${t} project(s) to v${ke}`)}catch(r){O(r)||V.warn(`Migration warning: ${k(r)}`)}}async function lg(r,e){let t={};if(await C(r))try{t=await Ae(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await de(r,t)}async function $b(){try{let r=ge.join(An.homedir(),".claude"),e=ge.join(r,"settings.json"),t=ge.join(r,"prjct-statusline.sh"),s=ge.join(An.homedir(),".prjct-cli","statusline"),n=ge.join(s,"statusline.sh"),o=ge.join(s,"themes"),i=ge.join(s,"lib"),a=ge.join(s,"components"),c=ge.join(s,"config.json"),u=ge.join(jt,"assets","statusline"),d=ge.join(u,"statusline.sh"),p=ge.join(u,"themes"),m=ge.join(u,"lib"),g=ge.join(u,"components"),w=ge.join(u,"default-config.json");if(await C(r)||await oe.mkdir(r,{recursive:!0}),await C(s)||await oe.mkdir(s,{recursive:!0}),await C(o)||await oe.mkdir(o,{recursive:!0}),await C(i)||await oe.mkdir(i,{recursive:!0}),await C(a)||await oe.mkdir(a,{recursive:!0}),await C(n)){let b=await oe.readFile(n,"utf8");if(b.includes("CLI_VERSION=")){let h=b.match(/CLI_VERSION="([^"]*)"/);if(h&&h[1]!==ke){let x=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ke}"`);await oe.writeFile(n,x,{mode:493})}await Gi(m,i),await Gi(g,a),await ug(t,n),await lg(e,t);return}}if(await C(d)){let b=await oe.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ke}"`),await oe.writeFile(n,b,{mode:493}),await Gi(m,i),await Gi(g,a),await C(p)){let h=await oe.readdir(p);for(let x of h){let T=ge.join(p,x),I=ge.join(o,x);await oe.copyFile(T,I)}}!await C(c)&&await C(w)&&await oe.copyFile(w,c)}else{let b=`#!/bin/bash
590
590
  # prjct Status Line for Claude Code
591
591
  CLI_VERSION="${ke}"
592
592
  input=$(cat)
@@ -617,7 +617,7 @@ if [ -f "$CONFIG" ]; then
617
617
  fi
618
618
  fi
619
619
  echo "prjct"
620
- `;await oe.writeFile(n,b,{mode:493})}await Tg(t,n),await vg(e,t)}catch(r){O(r)||V.warn(`Status line warning: ${k(r)}`)}}async function Vi(r,e){if(!await C(r))return;let t=await oe.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ge.join(r,s),o=ge.join(e,s);await oe.copyFile(n,o),await oe.chmod(o,493)}}async function Tg(r,e){try{if(await C(r)){if((await oe.lstat(r)).isSymbolicLink()&&await oe.readlink(r)===e)return;await oe.unlink(r)}await oe.symlink(e,r)}catch{try{await C(e)&&(await oe.copyFile(e,r),await oe.chmod(r,493))}catch(s){O(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function Ub(r,e){if(console.log(""),r.cliInstalled?console.log(` ${Ee.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${Ee.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${Ee.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${Ee.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${Ee.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${Ee.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${Ee.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var Pg,Hb,yr=S(()=>{"use strict";fs();fr();Sg();ee();W();xn();B();En();Is();ut();lt();Os();ai();vl();l(Db,"installAICLI");l(Eg,"run");l($b,"installGeminiRouter");l(Mb,"installGeminiGlobalConfig");l(Cg,"installAntigravitySkill");l(Ob,"needsAntigravityInstallation");Pg="prjct-codex-router";l(xg,"getCodexSkillPath");l(_b,"getCodexSkillMetadata");l(bg,"parseCodexSkillMetadata");l(Nb,"hashContent");l(jg,"loadCodexSkillTemplate");l(Rg,"buildCodexSkillContent");l(Gl,"installCodexSkill");l(hr,"verifyCodexPRouterReady");l(Lb,"migrateProjectsCliVersion");l(vg,"ensureStatusLineSettings");l(Fb,"installStatusLine");l(Vi,"installStatusLineModules");l(Tg,"ensureStatusLineSymlink");l(Ub,"showResults");Hb=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Hb&&Eg().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import ie from"node:fs/promises";import ne from"node:path";async function zi(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(E.exists(r)&&E.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(r),n=ne.join(s,"storage"),o=ne.join(s,"index"),i=ne.join(s,"memory");t.backupDir=await Wb(n,o,i),E.getDb(r);for(let{filename:c,key:u}of Vl){let d=ne.join(n,c),m=await ns(d);if(m===null){t.skippedFiles.push(c);continue}try{E.setDoc(r,u,m),Ag(r,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of Bl){let d=ne.join(o,c),m=await ns(d);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{E.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),Ig(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await Xb(r,o,t),await Yb(r,o,t),await Qb(r,i,t),await Zb(r,i,t);let a=ne.join(s,"sessions");return await ev(r,a,t),t.errors.length===0&&await tv(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function Wb(r,e,t){let s=ne.join(r,"backup");return await ie.mkdir(s,{recursive:!0}),await ie.mkdir(ne.join(s,"index"),{recursive:!0}),await ie.mkdir(ne.join(s,"memory"),{recursive:!0}),await ql(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await ql(e,ne.join(s,"index")),await ql(t,ne.join(s,"memory")),s}async function ql(r,e,t){try{let s=await ie.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=ne.join(r,n.name),i=ne.join(e,n.name);await ie.copyFile(o,i)}}catch(s){if(!O(s))throw s}}function Ag(r,e,t){switch(e){case"state":Gb(r,t);break;case"queue":qb(r,t);break;case"ideas":Bb(r,t);break;case"shipped":Vb(r,t);break;case"metrics":Jb(r,t);break;case"analysis":zb(r,t);break}}function Gb(r,e){let t=E.getDb(r),s=t.prepare(`
620
+ `;await oe.writeFile(n,b,{mode:493})}await ug(t,n),await lg(e,t)}catch(r){O(r)||V.warn(`Status line warning: ${k(r)}`)}}async function Gi(r,e){if(!await C(r))return;let t=await oe.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ge.join(r,s),o=ge.join(e,s);await oe.copyFile(n,o),await oe.chmod(o,493)}}async function ug(r,e){try{if(await C(r)){if((await oe.lstat(r)).isSymbolicLink()&&await oe.readlink(r)===e)return;await oe.unlink(r)}await oe.symlink(e,r)}catch{try{await C(e)&&(await oe.copyFile(e,r),await oe.chmod(r,493))}catch(s){O(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function Mb(r,e){if(console.log(""),r.cliInstalled?console.log(` ${Ee.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${Ee.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${Ee.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${Ee.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${Ee.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${Ee.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${Ee.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var pg,Ob,fr=S(()=>{"use strict";fs();pr();ag();ee();W();Pn();B();Tn();Is();ut();lt();Os();si();pl();l(Pb,"installAICLI");l(dg,"run");l(xb,"installGeminiRouter");l(jb,"installGeminiGlobalConfig");l(mg,"installAntigravitySkill");l(Rb,"needsAntigravityInstallation");pg="prjct-codex-router";l(gg,"getCodexSkillPath");l(Ab,"getCodexSkillMetadata");l(cg,"parseCodexSkillMetadata");l(Ib,"hashContent");l(fg,"loadCodexSkillTemplate");l(hg,"buildCodexSkillContent");l(Ml,"installCodexSkill");l(gr,"verifyCodexPRouterReady");l(Db,"migrateProjectsCliVersion");l(lg,"ensureStatusLineSettings");l($b,"installStatusLine");l(Gi,"installStatusLineModules");l(ug,"ensureStatusLineSymlink");l(Mb,"showResults");Ob=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Ob&&dg().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import ie from"node:fs/promises";import ne from"node:path";async function Bi(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(E.exists(r)&&E.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(r),n=ne.join(s,"storage"),o=ne.join(s,"index"),i=ne.join(s,"memory");t.backupDir=await _b(n,o,i),E.getDb(r);for(let{filename:c,key:u}of Nl){let d=ne.join(n,c),p=await ns(d);if(p===null){t.skippedFiles.push(c);continue}try{E.setDoc(r,u,p),yg(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of _l){let d=ne.join(o,c),p=await ns(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{E.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),wg(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await qb(r,o,t),await Bb(r,o,t),await Vb(r,i,t),await Jb(r,i,t);let a=ne.join(s,"sessions");return await zb(r,a,t),t.errors.length===0&&await Xb(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function _b(r,e,t){let s=ne.join(r,"backup");return await ie.mkdir(s,{recursive:!0}),await ie.mkdir(ne.join(s,"index"),{recursive:!0}),await ie.mkdir(ne.join(s,"memory"),{recursive:!0}),await Ol(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Ol(e,ne.join(s,"index")),await Ol(t,ne.join(s,"memory")),s}async function Ol(r,e,t){try{let s=await ie.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=ne.join(r,n.name),i=ne.join(e,n.name);await ie.copyFile(o,i)}}catch(s){if(!O(s))throw s}}function yg(r,e,t){switch(e){case"state":Nb(r,t);break;case"queue":Lb(r,t);break;case"ideas":Fb(r,t);break;case"shipped":Ub(r,t);break;case"metrics":Hb(r,t);break;case"analysis":Wb(r,t);break}}function Nb(r,e){let t=E.getDb(r),s=t.prepare(`
621
621
  INSERT OR REPLACE INTO tasks
622
622
  (id, description, type, status, parent_description, branch, linear_id,
623
623
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -628,92 +628,92 @@ echo "prjct"
628
628
  (id, task_id, description, status, domain, agent, sort_order,
629
629
  depends_on, started_at, completed_at, output, summary)
630
630
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
631
- `),o=l((a,c)=>{if(!a||!a.id)return;s.run(_(a.id)??`task-${Date.now()}`,_(a.description??a.parentDescription)??"",_(a.type),_(c??a.status)??"unknown",_(a.parentDescription),_(a.branch),_(a.linearId),_(a.linearUuid),_(a.sessionId),_(a.featureId),_(a.startedAt)??new Date().toISOString(),_(a.completedAt),_(a.shippedAt),_(a.pausedAt),_(a.pauseReason),_(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];n.run(_(m.id)??`subtask-${d}`,_(a.id),_(m.description)??"",_(m.status)??"pending",_(m.domain),_(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,_(m.startedAt),_(m.completedAt),_(m.output),m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function qb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
631
+ `),o=l((a,c)=>{if(!a||!a.id)return;s.run(_(a.id)??`task-${Date.now()}`,_(a.description??a.parentDescription)??"",_(a.type),_(c??a.status)??"unknown",_(a.parentDescription),_(a.branch),_(a.linearId),_(a.linearUuid),_(a.sessionId),_(a.featureId),_(a.startedAt)??new Date().toISOString(),_(a.completedAt),_(a.shippedAt),_(a.pausedAt),_(a.pauseReason),_(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let p=u[d];n.run(_(p.id)??`subtask-${d}`,_(a.id),_(p.description)??"",_(p.status)??"pending",_(p.domain),_(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,_(p.startedAt),_(p.completedAt),_(p.output),p.summary?JSON.stringify(p.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function Lb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
632
632
  INSERT OR REPLACE INTO queue_tasks
633
633
  (id, description, type, priority, section, created_at, completed, completed_at,
634
634
  feature_id, feature_name)
635
635
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
636
- `);for(let o of t)n.run(_(o.id)??`queue-${Date.now()}`,_(o.description)??"",_(o.type),_(o.priority),_(o.section),_(o.createdAt)??new Date().toISOString(),o.completed?1:0,_(o.completedAt),_(o.featureId),_(o.featureName))}function Bb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
636
+ `);for(let o of t)n.run(_(o.id)??`queue-${Date.now()}`,_(o.description)??"",_(o.type),_(o.priority),_(o.section),_(o.createdAt)??new Date().toISOString(),o.completed?1:0,_(o.completedAt),_(o.featureId),_(o.featureName))}function Fb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
637
637
  INSERT OR REPLACE INTO ideas
638
638
  (id, text, status, priority, tags, added_at, converted_to, details, data)
639
639
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
640
- `);for(let o of t)n.run(_(o.id)??`idea-${Date.now()}`,_(o.text)??"",_(o.status)??"pending",_(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,_(o.addedAt)??new Date().toISOString(),_(o.convertedTo),_(o.details),JSON.stringify(o))}function Vb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
640
+ `);for(let o of t)n.run(_(o.id)??`idea-${Date.now()}`,_(o.text)??"",_(o.status)??"pending",_(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,_(o.addedAt)??new Date().toISOString(),_(o.convertedTo),_(o.details),JSON.stringify(o))}function Ub(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
641
641
  INSERT OR REPLACE INTO shipped_features
642
642
  (id, name, shipped_at, version, description, type, duration, data)
643
643
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
644
- `);for(let o of t)n.run(_(o.id)??`ship-${Date.now()}`,_(o.name)??"",_(o.shippedAt)??new Date().toISOString(),_(o.version)??"0.0.0",_(o.description),_(o.type),_(o.duration),JSON.stringify(o))}function Jb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
644
+ `);for(let o of t)n.run(_(o.id)??`ship-${Date.now()}`,_(o.name)??"",_(o.shippedAt)??new Date().toISOString(),_(o.version)??"0.0.0",_(o.description),_(o.type),_(o.duration),JSON.stringify(o))}function Hb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
645
645
  INSERT OR REPLACE INTO metrics_daily
646
646
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
647
647
  VALUES (?, ?, ?, ?, ?)
648
- `);for(let o of t)n.run(_(o.date)??new Date().toISOString().slice(0,10),tn(o.tokensSaved)??0,tn(o.syncs)??0,tn(o.avgCompressionRate)??0,tn(o.totalDuration)??0)}function zb(r,e){let s=E.getDb(r).prepare(`
648
+ `);for(let o of t)n.run(_(o.date)??new Date().toISOString().slice(0,10),en(o.tokensSaved)??0,en(o.syncs)??0,en(o.avgCompressionRate)??0,en(o.totalDuration)??0)}function Wb(r,e){let s=E.getDb(r).prepare(`
649
649
  INSERT OR REPLACE INTO analysis
650
650
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
651
651
  VALUES (?, ?, ?, ?, ?, ?, ?)
652
- `),n=l((o,i)=>{o&&s.run(i,_(o.status)??"unknown",_(o.commitHash),_(o.signature),_(o.sealedAt),_(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function Ig(r,e,t){e==="categories-cache"&&Kb(r,t)}function Kb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
652
+ `),n=l((o,i)=>{o&&s.run(i,_(o.status)??"unknown",_(o.commitHash),_(o.signature),_(o.sealedAt),_(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function wg(r,e,t){e==="categories-cache"&&Gb(r,t)}function Gb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
653
653
  INSERT OR REPLACE INTO index_files
654
654
  (path, categories, domain, score, size, mtime, language)
655
655
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
656
- `);for(let o of t){let i=_(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,_(o.primaryDomain),i)}}async function Xb(r,e,t){let s=ne.join(e,"checksums.json"),n=await ns(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=E.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 Yb(r,e,t){let s=ne.join(e,"file-scores.json"),n=await ns(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=E.getDb(r),a=i.prepare(`
656
+ `);for(let o of t){let i=_(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,_(o.primaryDomain),i)}}async function qb(r,e,t){let s=ne.join(e,"checksums.json"),n=await ns(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=E.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 Bb(r,e,t){let s=ne.join(e,"file-scores.json"),n=await ns(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=E.getDb(r),a=i.prepare(`
657
657
  INSERT OR REPLACE INTO index_files
658
658
  (path, score, size, mtime, language, categories, domain)
659
659
  VALUES (?, ?, ?, ?, NULL,
660
660
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
661
661
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
662
- `);i.transaction(()=>{for(let c of o){let u=_(c.path);u&&a.run(u,tn(c.score)??0,tn(c.size),_(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Qb(r,e,t){let s=ne.join(e,"events.jsonl");try{let o=(await ie.readFile(s,"utf-8")).split(`
663
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=E.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),p=_(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Zb(r,e,t){let s=ne.join(e,"learnings.jsonl");try{let o=(await ie.readFile(s,"utf-8")).split(`
664
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=E.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(n){O(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function ev(r,e,t){let n=E.getDb(r).prepare(`
662
+ `);i.transaction(()=>{for(let c of o){let u=_(c.path);u&&a.run(u,en(c.score)??0,en(c.size),_(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Vb(r,e,t){let s=ne.join(e,"events.jsonl");try{let o=(await ie.readFile(s,"utf-8")).split(`
663
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=E.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=_(u.type??u.action)??"unknown",p=_(u.taskId??u.task_id),m=_(u.timestamp??u.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Jb(r,e,t){let s=ne.join(e,"learnings.jsonl");try{let o=(await ie.readFile(s,"utf-8")).split(`
664
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=E.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${_(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?_(p[0]):null;a.run(d,m,c,1,_(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function zb(r,e,t){let n=E.getDb(r).prepare(`
665
665
  INSERT OR IGNORE INTO sessions
666
666
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
667
667
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
668
- `),o=l(u=>{!u||!u.id||n.run(_(u.id),_(u.projectId)??r,_(u.task)??"",_(u.status)??"completed",_(u.startedAt)??new Date().toISOString(),_(u.pausedAt),_(u.completedAt),tn(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=ne.join(e,"current.json"),a=await ns(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await ie.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=ne.join(e,"archive");try{let u=await ie.readdir(c);for(let m of u){let p=ne.join(c,m);try{if(!(await ie.stat(p)).isDirectory())continue;let w=await ie.readdir(p);for(let h of w){if(!h.endsWith(".json"))continue;let x=ne.join(p,h),T=await ns(x);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${m}/${h}`),await ie.unlink(x).catch(()=>{})}catch(I){t.errors.push({file:`sessions/archive/${m}/${h}`,error:String(I)})}}(await ie.readdir(p)).length===0&&await ie.rmdir(p).catch(()=>{})}catch{}}(await ie.readdir(c).catch(()=>[])).length===0&&await ie.rmdir(c).catch(()=>{})}catch{}try{(await ie.readdir(e)).length===0&&await ie.rmdir(e).catch(()=>{})}catch{}}async function tv(r,e,t,s){let n=l(async(i,a)=>{try{await ie.unlink(i)}catch(c){O(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Vl)await n(ne.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await n(ne.join(e,i),`cleanup:index/${i}`);await n(ne.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(ne.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function _(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function tn(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function ns(r){try{let e=await ie.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async function Ki(r){let e=A.getGlobalProjectPath(r),t=ne.join(e,"storage"),s=0;E.getDb(r);for(let{filename:w,key:b}of Vl){let h=ne.join(t,w),x=await ns(h);if(x!==null){E.setDoc(r,b,x),Ag(r,b,x);try{await ie.unlink(h)}catch{}s++}}let n=ne.join(e,"project.json"),o=await ns(n);if(o!==null){E.setDoc(r,"project",o);try{await ie.unlink(n)}catch{}s++}let i=ne.join(e,"memory");for(let w of["events.jsonl","learnings.jsonl"]){let b=ne.join(i,w);try{let x=(await ie.readFile(b,"utf-8")).split(`
668
+ `),o=l(u=>{!u||!u.id||n.run(_(u.id),_(u.projectId)??r,_(u.task)??"",_(u.status)??"completed",_(u.startedAt)??new Date().toISOString(),_(u.pausedAt),_(u.completedAt),en(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=ne.join(e,"current.json"),a=await ns(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await ie.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=ne.join(e,"archive");try{let u=await ie.readdir(c);for(let p of u){let m=ne.join(c,p);try{if(!(await ie.stat(m)).isDirectory())continue;let w=await ie.readdir(m);for(let h of w){if(!h.endsWith(".json"))continue;let x=ne.join(m,h),T=await ns(x);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${p}/${h}`),await ie.unlink(x).catch(()=>{})}catch(I){t.errors.push({file:`sessions/archive/${p}/${h}`,error:String(I)})}}(await ie.readdir(m)).length===0&&await ie.rmdir(m).catch(()=>{})}catch{}}(await ie.readdir(c).catch(()=>[])).length===0&&await ie.rmdir(c).catch(()=>{})}catch{}try{(await ie.readdir(e)).length===0&&await ie.rmdir(e).catch(()=>{})}catch{}}async function Xb(r,e,t,s){let n=l(async(i,a)=>{try{await ie.unlink(i)}catch(c){O(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Nl)await n(ne.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await n(ne.join(e,i),`cleanup:index/${i}`);await n(ne.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(ne.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function _(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function en(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function ns(r){try{let e=await ie.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async function Vi(r){let e=A.getGlobalProjectPath(r),t=ne.join(e,"storage"),s=0;E.getDb(r);for(let{filename:w,key:b}of Nl){let h=ne.join(t,w),x=await ns(h);if(x!==null){E.setDoc(r,b,x),yg(r,b,x);try{await ie.unlink(h)}catch{}s++}}let n=ne.join(e,"project.json"),o=await ns(n);if(o!==null){E.setDoc(r,"project",o);try{await ie.unlink(n)}catch{}s++}let i=ne.join(e,"memory");for(let w of["events.jsonl","learnings.jsonl"]){let b=ne.join(i,w);try{let x=(await ie.readFile(b,"utf-8")).split(`
669
669
  `).filter(I=>I.trim());if(x.length===0){await ie.unlink(b),s++;continue}let T=E.getDb(r);if(w==="events.jsonl"){let I=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let M of x)try{let y=JSON.parse(M);I.run(_(y.type??y.action)??"unknown",_(y.taskId??y.task_id),M,_(y.timestamp??y.ts)??new Date().toISOString())}catch{}})()}else{let I=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let M of x)try{let y=JSON.parse(M),j=`learning:${_(y.taskId??y.timestamp)??Date.now()}`,D=y.tags;I.run(j,_(D?.[0]),M,1,_(y.timestamp)??new Date().toISOString())}catch{}})()}await ie.unlink(b),s++}catch{}}let a=ne.join(e,"sessions"),c=l(w=>{if(!w||!w.id)return;E.getDb(r).prepare(`
670
670
  INSERT OR IGNORE INTO sessions
671
671
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
672
672
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
673
- `).run(_(w.id),_(w.projectId)??r,_(w.task)??"",_(w.status)??"completed",_(w.startedAt)??new Date().toISOString(),_(w.pausedAt),_(w.completedAt),tn(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=ne.join(a,"current.json"),d=await ns(u);d!==null&&(c(d),await ie.unlink(u).catch(()=>{}),s++);let m=ne.join(a,"archive");try{let w=await ie.readdir(m);for(let h of w){let x=ne.join(m,h);try{if(!(await ie.stat(x)).isDirectory())continue;let I=await ie.readdir(x);for(let y of I){if(!y.endsWith(".json"))continue;let j=await ns(ne.join(x,y));j!==null&&(c(j),await ie.unlink(ne.join(x,y)).catch(()=>{}),s++)}(await ie.readdir(x)).length===0&&await ie.rmdir(x).catch(()=>{})}catch{}}(await ie.readdir(m).catch(()=>[])).length===0&&await ie.rmdir(m).catch(()=>{})}catch{}try{(await ie.readdir(a)).length===0&&await ie.rmdir(a).catch(()=>{})}catch{}let p=ne.join(e,"index"),g=[...Bl.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let b=ne.join(p,w),h=await ns(b);if(h===null)continue;let x=Bl.find(T=>T.filename===w);x&&(E.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",x.key,JSON.stringify(h),new Date().toISOString()),Ig(r,x.key,h));try{await ie.unlink(b)}catch{}s++}return s}var Vl,Bl,Jl=S(()=>{"use strict";ve();W();ee();Vl=[{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"}],Bl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(zi,"migrateJsonToSqlite");l(Wb,"createBackup");l(ql,"copyFiles");l(Ag,"populateNormalized");l(Gb,"populateTasksFromState");l(qb,"populateQueueTasks");l(Bb,"populateIdeas");l(Vb,"populateShippedFeatures");l(Jb,"populateMetricsDaily");l(zb,"populateAnalysis");l(Ig,"populateIndexTables");l(Kb,"populateCategoriesIndex");l(Xb,"migrateChecksums");l(Yb,"migrateFileScores");l(Qb,"migrateEventsJsonl");l(Zb,"migrateLearningsJsonl");l(ev,"migrateSessionFiles");l(tv,"cleanupJsonFiles");l(_,"toStr");l(tn,"toNum");l(ns,"readJsonSafe");l(Ki,"sweepLegacyJson")});var Co,zl,Kl,Dg=S(()=>{"use strict";vo();X();Co=3,zl=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Co){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Co} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Co){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Co} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Co&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[et.FILE_STRUCTURE,et.ARCHITECTURE],tech_stack:[et.TECH_STACK],architecture:[et.ARCHITECTURE,et.CODE_STYLE],estimation:[et.SHIP_WORKFLOW],workflow:[et.SHIP_WORKFLOW,et.CODE_STYLE],gotcha:[et.TEST_BEHAVIOR,et.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${v()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
674
- `)}},Kl=new zl});import{z as R}from"zod";var $g,sv,nv,Mg,rv,ov,iv,av,cv,lv,uv,Og,dv,pv,dM,_g,Ng,Lg,Fg,mv,Xi,Ug=S(()=>{"use strict";$g=R.number().min(1).max(5),sv=R.enum(["exceeded","met","partial","failed"]),nv=R.enum(["definitely","probably","maybe","no"]),Mg=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),rv=R.object({estimated:R.object({hours:R.number(),confidence:R.enum(["low","medium","high"]).optional(),source:R.enum(["prd","manual","historical"]).optional()}),actual:R.object({hours:R.number(),commits:R.number().optional(),linesAdded:R.number().optional(),linesRemoved:R.number().optional(),sessions:R.number().optional()}),variance:R.object({hours:R.number(),percentage:R.number(),reason:Mg.optional(),explanation:R.string().optional()})}),ov=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),iv=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),av=R.object({metrics:R.array(ov),acceptanceCriteria:R.array(iv),overallSuccess:sv,successScore:R.number().min(0).max(100)}),cv=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),lv=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(cv)}),uv=R.object({valueDelivered:R.number().min(1).max(10),userImpact:R.enum(["none","low","medium","high","critical"]),businessImpact:R.enum(["none","low","medium","high","critical"]),roiScore:R.number(),worthIt:nv,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),Og=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:$g,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),dv=R.object({id:R.string(),featureId:R.string(),featureName:R.string(),prdId:R.string().nullable(),version:R.string().optional(),branch:R.string().optional(),prUrl:R.string().optional(),effort:rv,success:av.optional(),learnings:lv,roi:uv,rating:$g,taskOutcomes:R.array(Og).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),pv=R.object({totalFeatures:R.number(),averageEstimationAccuracy:R.number(),averageSuccessRate:R.number(),averageROI:R.number(),bySuccessLevel:R.object({exceeded:R.number(),met:R.number(),partial:R.number(),failed:R.number()}),variancePatterns:R.array(R.object({reason:Mg,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),dM=R.object({outcomes:R.array(dv),taskOutcomes:R.array(Og).optional(),aggregates:pv.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),_g={outcomes:[],taskOutcomes:[],lastUpdated:""},Ng=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),Lg=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Fg=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),mv=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Xi=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=>mv(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,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(s.reduce((d,m)=>d+m,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Xl,Hg,Wg=S(()=>{"use strict";Ug();As();X();Xl=class extends dt{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{..._g,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Xi([t,...s.outcomes]),lastUpdated:v()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,s=>({...s,taskOutcomes:[t,...s.taskOutcomes||[]],lastUpdated:v()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Xi(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Xi(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&Lt(e.duration)||60,s=t/60,n=t/60,o=Ng(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Lg(5,n);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:s,confidence:"low",source:"manual"},actual:{hours:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Fg(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}}},Hg=new Xl});import Yl from"node:fs/promises";import Yi from"node:path";var Ql,Zl,Gg,qg=S(()=>{"use strict";W();B();Ql=".prjct/.prjct-state.md",Zl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Yi.join(e,Ql);await Yl.mkdir(Yi.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Yl.writeFile(s,n,"utf-8")}async remove(e){try{await Yl.unlink(Yi.join(e,Ql))}catch(t){if(!O(t))throw t}}async exists(e){let t=Yi.join(e,Ql);return C(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
675
- `)}},Gg=new Zl});var eu,Ht,$n=S(()=>{"use strict";Te();Vs();ee();eu=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await $.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:n})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await $.getProjectId(e);return s?N.query(s,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async search(e,t,s=50){let n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-s)}async getByAction(e,t,s=50){try{let n=await $.getProjectId(e);return n?N.query(n,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;N.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=Rs.MEMORY_MAX_ENTRIES)return 0;let n=s-Rs.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Rt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Ht=new eu});import gv from"node:path";function fv(r){return Tn(gv.resolve(r))}function Po(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function hv(r){return Oc(r,e=>`${Po(e.name)}::${Po(e.source)}`)}function yv(r){return Oc(r,e=>`${Po(e.issue)}::${Po(e.file)}::${Po(e.source)}`)}var tu,wv,Bg,Vg=S(()=>{"use strict";ee();pi();En();l(fv,"repoHash");l(Po,"normalizeKey");l(hv,"dedupePatterns");l(yv,"dedupeAntiPatterns");tu=class{static{l(this,"PatternExtractor")}async extract(e){let t=fv(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=hv([...s,...n]),a=yv([...o]),c=`analysis:derived-rules:${t}`;return E.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},wv=new tu,Bg=wv});import xo from"node:fs/promises";import kv from"node:os";import jo from"node:path";function Sv(r){return`# ${r.projectName}
676
- ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function bv(r){return r.patterns.length===0?"":`
673
+ `).run(_(w.id),_(w.projectId)??r,_(w.task)??"",_(w.status)??"completed",_(w.startedAt)??new Date().toISOString(),_(w.pausedAt),_(w.completedAt),en(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=ne.join(a,"current.json"),d=await ns(u);d!==null&&(c(d),await ie.unlink(u).catch(()=>{}),s++);let p=ne.join(a,"archive");try{let w=await ie.readdir(p);for(let h of w){let x=ne.join(p,h);try{if(!(await ie.stat(x)).isDirectory())continue;let I=await ie.readdir(x);for(let y of I){if(!y.endsWith(".json"))continue;let j=await ns(ne.join(x,y));j!==null&&(c(j),await ie.unlink(ne.join(x,y)).catch(()=>{}),s++)}(await ie.readdir(x)).length===0&&await ie.rmdir(x).catch(()=>{})}catch{}}(await ie.readdir(p).catch(()=>[])).length===0&&await ie.rmdir(p).catch(()=>{})}catch{}try{(await ie.readdir(a)).length===0&&await ie.rmdir(a).catch(()=>{})}catch{}let m=ne.join(e,"index"),g=[..._l.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let b=ne.join(m,w),h=await ns(b);if(h===null)continue;let x=_l.find(T=>T.filename===w);x&&(E.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",x.key,JSON.stringify(h),new Date().toISOString()),wg(r,x.key,h));try{await ie.unlink(b)}catch{}s++}return s}var Nl,_l,Ll=S(()=>{"use strict";ve();W();ee();Nl=[{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"}],_l=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Bi,"migrateJsonToSqlite");l(_b,"createBackup");l(Ol,"copyFiles");l(yg,"populateNormalized");l(Nb,"populateTasksFromState");l(Lb,"populateQueueTasks");l(Fb,"populateIdeas");l(Ub,"populateShippedFeatures");l(Hb,"populateMetricsDaily");l(Wb,"populateAnalysis");l(wg,"populateIndexTables");l(Gb,"populateCategoriesIndex");l(qb,"migrateChecksums");l(Bb,"migrateFileScores");l(Vb,"migrateEventsJsonl");l(Jb,"migrateLearningsJsonl");l(zb,"migrateSessionFiles");l(Xb,"cleanupJsonFiles");l(_,"toStr");l(en,"toNum");l(ns,"readJsonSafe");l(Vi,"sweepLegacyJson")});var So,Fl,Ul,kg=S(()=>{"use strict";yo();K();So=3,Fl=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=So){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${So} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=So){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${So} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=So&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[et.FILE_STRUCTURE,et.ARCHITECTURE],tech_stack:[et.TECH_STACK],architecture:[et.ARCHITECTURE,et.CODE_STYLE],estimation:[et.SHIP_WORKFLOW],workflow:[et.SHIP_WORKFLOW,et.CODE_STYLE],gotcha:[et.TEST_BEHAVIOR,et.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${v()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
674
+ `)}},Ul=new Fl});import{z as R}from"zod";var Sg,Kb,Yb,bg,Qb,Zb,ev,tv,sv,nv,rv,vg,ov,iv,oM,Tg,Eg,Cg,Pg,av,Ji,xg=S(()=>{"use strict";Sg=R.number().min(1).max(5),Kb=R.enum(["exceeded","met","partial","failed"]),Yb=R.enum(["definitely","probably","maybe","no"]),bg=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Qb=R.object({estimated:R.object({hours:R.number(),confidence:R.enum(["low","medium","high"]).optional(),source:R.enum(["prd","manual","historical"]).optional()}),actual:R.object({hours:R.number(),commits:R.number().optional(),linesAdded:R.number().optional(),linesRemoved:R.number().optional(),sessions:R.number().optional()}),variance:R.object({hours:R.number(),percentage:R.number(),reason:bg.optional(),explanation:R.string().optional()})}),Zb=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),ev=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),tv=R.object({metrics:R.array(Zb),acceptanceCriteria:R.array(ev),overallSuccess:Kb,successScore:R.number().min(0).max(100)}),sv=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),nv=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(sv)}),rv=R.object({valueDelivered:R.number().min(1).max(10),userImpact:R.enum(["none","low","medium","high","critical"]),businessImpact:R.enum(["none","low","medium","high","critical"]),roiScore:R.number(),worthIt:Yb,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),vg=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:Sg,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),ov=R.object({id:R.string(),featureId:R.string(),featureName:R.string(),prdId:R.string().nullable(),version:R.string().optional(),branch:R.string().optional(),prUrl:R.string().optional(),effort:Qb,success:tv.optional(),learnings:nv,roi:rv,rating:Sg,taskOutcomes:R.array(vg).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),iv=R.object({totalFeatures:R.number(),averageEstimationAccuracy:R.number(),averageSuccessRate:R.number(),averageROI:R.number(),bySuccessLevel:R.object({exceeded:R.number(),met:R.number(),partial:R.number(),failed:R.number()}),variancePatterns:R.array(R.object({reason:bg,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),oM=R.object({outcomes:R.array(ov),taskOutcomes:R.array(vg).optional(),aggregates:iv.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),Tg={outcomes:[],taskOutcomes:[],lastUpdated:""},Eg=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),Cg=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Pg=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),av=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Ji=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=>av(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,p)=>{let m=p.effort.variance.reason;return d[m]||(d[m]={count:0,totalVariance:0}),d[m].count++,d[m].totalVariance+=p.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,p])=>({reason:d,count:p.count,averageVariance:Math.round(p.totalVariance/p.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,p)=>(d[p]=(d[p]||0)+1,d),{}),u=Object.entries(c).sort((d,p)=>p[1]-d[1]).slice(0,10).map(([d,p])=>({insight:d,frequency:p}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,p)=>d+p,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,p)=>d+p,0)/t.length):0,averageROI:Math.round(s.reduce((d,p)=>d+p,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Hl,jg,Rg=S(()=>{"use strict";xg();As();K();Hl=class extends dt{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Tg,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Ji([t,...s.outcomes]),lastUpdated:v()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,s=>({...s,taskOutcomes:[t,...s.taskOutcomes||[]],lastUpdated:v()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Ji(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Ji(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&Lt(e.duration)||60,s=t/60,n=t/60,o=Eg(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Cg(5,n);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:s,confidence:"low",source:"manual"},actual:{hours:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Pg(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}}},jg=new Hl});import Wl from"node:fs/promises";import zi from"node:path";var Gl,ql,Ag,Ig=S(()=>{"use strict";W();B();Gl=".prjct/.prjct-state.md",ql=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=zi.join(e,Gl);await Wl.mkdir(zi.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Wl.writeFile(s,n,"utf-8")}async remove(e){try{await Wl.unlink(zi.join(e,Gl))}catch(t){if(!O(t))throw t}}async exists(e){let t=zi.join(e,Gl);return C(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
675
+ `)}},Ag=new ql});var Bl,Ht,In=S(()=>{"use strict";Te();Bs();ee();Bl=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await $.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:n})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await $.getProjectId(e);return s?N.query(s,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async search(e,t,s=50){let n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-s)}async getByAction(e,t,s=50){try{let n=await $.getProjectId(e);return n?N.query(n,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;N.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=Rs.MEMORY_MAX_ENTRIES)return 0;let n=s-Rs.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Rt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Ht=new Bl});import cv from"node:path";function lv(r){return vn(cv.resolve(r))}function bo(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function uv(r){return Ac(r,e=>`${bo(e.name)}::${bo(e.source)}`)}function dv(r){return Ac(r,e=>`${bo(e.issue)}::${bo(e.file)}::${bo(e.source)}`)}var Vl,mv,Dg,$g=S(()=>{"use strict";ee();ai();Tn();l(lv,"repoHash");l(bo,"normalizeKey");l(uv,"dedupePatterns");l(dv,"dedupeAntiPatterns");Vl=class{static{l(this,"PatternExtractor")}async extract(e){let t=lv(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=uv([...s,...n]),a=dv([...o]),c=`analysis:derived-rules:${t}`;return E.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},mv=new Vl,Dg=mv});import vo from"node:fs/promises";import pv from"node:os";import To from"node:path";function gv(r){return`# ${r.projectName}
676
+ ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function fv(r){return r.patterns.length===0?"":`
677
677
  ## Patterns
678
678
  ${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
679
679
  `)}
680
- `}function vv(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
680
+ `}function hv(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
681
681
  ## Anti-Patterns
682
682
  ${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
683
683
  `)}
684
- `}function Tv(r){return r.knownGotchas.length===0?"":`
684
+ `}function yv(r){return r.knownGotchas.length===0?"":`
685
685
  ## Known Gotchas
686
686
  ${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
687
687
  `)}
688
- `}function Ev(r){return r.recentShipped.length===0?"":`
688
+ `}function wv(r){return r.recentShipped.length===0?"":`
689
689
  ## Recent Deliveries
690
690
  ${r.recentShipped.slice(0,5).map(t=>{let s=[`"${t.name}"`,t.type];return t.duration&&s.push(t.duration),t.filesChanged&&s.push(`${t.filesChanged} files`),`- ${s.join(" \u2014 ")}`}).join(`
691
691
  `)}
692
- `}function Cv(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
692
+ `}function kv(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
693
693
  ## Velocity
694
694
  ${e.join(" | ")}
695
- `}function Pv(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
695
+ `}function Sv(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
696
696
  ## Commands
697
697
  | Action | Command |
698
698
  |--------|---------|
699
699
  ${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
700
700
  `)}
701
- `}function xv(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
701
+ `}function bv(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
702
702
  ## State
703
703
  ${e.join(`
704
704
  `)}
705
- `}function jv(r){return r.userPatterns.length===0?"":`
705
+ `}function vv(r){return r.userPatterns.length===0?"":`
706
706
  ## User Patterns
707
707
  ${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
708
708
  `)}
709
- `}function Rv(r){return[bv(r),vv(r),Tv(r),Ev(r),Cv(r),Pv(r.commands),xv(r),jv(r)].filter(Boolean).join("")}function Av(r,e){let t=r.userInvocable!==!1;return`---
709
+ `}function Tv(r){return[fv(r),hv(r),yv(r),wv(r),kv(r),Sv(r.commands),bv(r),vv(r)].filter(Boolean).join("")}function Ev(r,e){let t=r.userInvocable!==!1;return`---
710
710
  description: "${r.description} (${e.projectName}, ${e.stack})"
711
711
  allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
712
712
  user-invocable: ${t}
713
- ---`}function Iv(r,e){return`${Av(r,e)}
713
+ ---`}function Cv(r,e){return`${Ev(r,e)}
714
714
 
715
- ${r.body(e)}`}var su,nu,Jg,zg=S(()=>{"use strict";xs();Is();l(Sv,"formatProjectHeader");l(bv,"formatPatterns");l(vv,"formatAntiPatterns");l(Tv,"formatGotchas");l(Ev,"formatRecentShipped");l(Cv,"formatVelocity");l(Pv,"formatCommands");l(xv,"formatState");l(jv,"formatUserPatterns");l(Rv,"formatRichContext");su=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Sv(r)}
716
- ${Rv(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
715
+ ${r.body(e)}`}var Jl,zl,Mg,Og=S(()=>{"use strict";xs();Is();l(gv,"formatProjectHeader");l(fv,"formatPatterns");l(hv,"formatAntiPatterns");l(yv,"formatGotchas");l(wv,"formatRecentShipped");l(kv,"formatVelocity");l(Sv,"formatCommands");l(bv,"formatState");l(vv,"formatUserPatterns");l(Tv,"formatRichContext");Jl=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${gv(r)}
716
+ ${Tv(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
717
717
  Active task: **${r.activeTaskDescription}**`),e.push('\n```bash\nprjct done "$ARGUMENTS" --md\n```\nRead CLI output for completion summary and next steps.\n'),e.join(`
718
718
  `)},"body")},{name:"prjct-ship",description:"Ship feature: PR, version bump, changelog. Auto-completes active task if one exists before shipping.",allowedTools:["Bash","Read","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
719
719
 
@@ -817,32 +817,32 @@ prjct tokens <input_tokens> <output_tokens>
817
817
 
818
818
  Tokens accumulate \u2014 call multiple times during a task and they add up.
819
819
  Token totals are saved to task history on completion for cost comparison across tasks.
820
- `,"body")}];l(Av,"buildFrontmatter");l(Iv,"buildSkillContent");nu=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=jo.join(kv.homedir(),".claude","skills");for(let c of su){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await xo.rm(jo.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Iv(c,o),d=jo.join(i,c.name),m=jo.join(d,"SKILL.md");await xo.mkdir(d,{recursive:!0}),await xo.writeFile(m,u,"utf-8"),n.generated.push({name:c.name,path:m})}catch(u){V.debug(`Failed to generate skill ${c.name}`,{error:we(u)}),n.skipped.push({name:c.name,reason:we(u)})}}let a=new Set(su.map(c=>c.name));try{let c=await xo.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await xo.rm(jo.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&V.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return su}},Jg=new nu});var Kg=S(()=>{"use strict"});import Dv from"node:fs/promises";import Xg from"node:path";var Qi,Yg=S(()=>{"use strict";B();Qi=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Xg.join(this.projectPath,"package.json"),t=await Dv.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Xg.join(this.projectPath,e))}}});import ru from"node:path";async function Qg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await F("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await F("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await F("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await F("git status --porcelain",{cwd:r}),i=o.trim().split(`
821
- `).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 F('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
822
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await F('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:we(t)})}return e}async function rs(r,e){let t=await C(ru.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Zg(r){let e={fileCount:0,version:"0.0.0",name:ru.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await F('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){V.debug("File count failed",{path:r,error:we(t)}),e.fileCount=0}try{let t=ru.join(r,"package.json"),s=await Ae(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await rs(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:we(t)})}return await rs(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await rs(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await rs(r,"requirements.txt")||await rs(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 ef(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 rs(r,"bun.lockb")||await rs(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rs(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 rs(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 rs(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 rs(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function tf(r){return new Qi(r).detect()}var sf=S(()=>{"use strict";xs();Kg();Je();B();Is();Yg();l(Qg,"analyzeGit");l(rs,"fileExistsInProject");l(Zg,"gatherStats");l(ef,"detectCommands");l(tf,"detectStack")});import nf from"node:fs/promises";import Zi from"node:path";var ou,iu,rf,of=S(()=>{"use strict";vt();W();Je();B();ou={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Zi.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Zi.basename(r);try{await L.read(s)}catch(n){O(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Zi.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await nf.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await nf.readFile(Zi.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!O(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},iu=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[ou.contextFilesExist(t),ou.jsonFilesValid(t),ou.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&s?.checks)for(let p of s.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let w=s.checks.slice(s.checks.indexOf(p)+1);a+=w.filter(b=>b.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()-n,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await F(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},rf=new iu});import af from"node:fs/promises";import au from"node:path";var cu,Ns,ea=S(()=>{"use strict";dl();xl();ng();ig();pg();_l();xs();lt();Os();Te();ve();yr();dr();Vs();ee();zs();tr();ho();Jl();Vt();Ks();vt();ki();X();B();Is();Dg();Wg();fr();qg();$n();Vg();zg();sf();of();cu=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await af.rm(au.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Sn()).installed){let y=await hr({autoRepair:!0});y.verified||V.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await ss.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:we(y)},error:`Context7 MCP is required but not ready: ${we(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await zi(this.projectId);try{let y=await Ki(this.projectId);y>0&&V.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){V.debug("Legacy JSON sweep failed (non-critical)",{error:we(y)})}let[a,c,u,d]=await Promise.all([Qg(this.projectPath),Zg(this.projectPath),ef(this.projectPath),tf(this.projectPath)]),m=t.full===!0,p,g=!0,w=new Set;if(!m&&og(this.projectId))try{let{diff:y,currentHashes:j}=await Ll(this.projectPath,this.projectId),D=y.added.length+y.modified.length+y.deleted.length;if(D===0&&!t.changedFiles?.length)g=!1,p={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=tg(y,this.projectId);w=sg(G.allAffected);let Q=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(he=>{let Ne=he.substring(he.lastIndexOf("."));return Q.has(Ne)}),p={isIncremental:!0,filesChanged:D,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}Nl(this.projectId,j)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:we(y)})}else try{let{currentHashes:y}=await Ll(this.projectPath,this.projectId);Nl(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:we(y)})}if(g)try{await Promise.all([Fm(this.projectPath,this.projectId),eg(this.projectPath,this.projectId),dg(this.projectPath,this.projectId)])}catch(y){V.debug("File ranking index build failed (non-critical)",{error:we(y)})}let b;try{let[y,j,D,G,Q,Ve,he,Ne,us,Ja,za]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),mt.getActive(this.projectId).catch(()=>null),it.getRecent(this.projectId,3).catch(()=>[]),sr.getMetrics(this.projectId).catch(()=>null),ce.getBacklog(this.projectId).catch(()=>[]),L.getTaskHistory(this.projectId).catch(()=>[]),L.getAllPausedTasks(this.projectId).catch(()=>[]),L.getAggregatedFeedback(this.projectId).catch(()=>null),L.getCurrentTask(this.projectId).catch(()=>null),$e.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),it.getCount(this.projectId).catch(()=>0)]),Ka={backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,hasActiveTask:!!us},Xa=y?y.patterns.map(ue=>({name:ue.name,description:ue.description,location:ue.locations?.[0]})):(j?.patterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({name:ue.name,description:ue.description,location:ue.location})),Ya=y?y.antiPatterns.map(ue=>({issue:ue.issue,file:ue.files?.[0]??"multiple",suggestion:ue.suggestion,severity:ue.severity??"medium"})):(j?.antiPatterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({issue:ue.issue,file:ue.file,suggestion:ue.suggestion,severity:ue.severity??"medium"})),Qa=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,Za={version:c.version,fileCount:c.fileCount,patterns:Xa,antiPatterns:Ya,recentShipped:D.map(ue=>({name:ue.name,type:ue.type??"feature",duration:ue.duration,filesChanged:ue.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,knownGotchas:Ne?.knownGotchas??[],userPatterns:Ne?.patternsDiscovered??[],hasActiveTask:!!us,activeTaskDescription:us?.description??"",pausedTasks:he.map(ue=>({description:ue.description,pausedAt:ue.pausedAt??""})),topBacklog:Q.slice(0,3).map(ue=>({description:ue.description,priority:ue.priority??"medium"})),ideasCount:Ja?.pending??0,shippedCount:za};b=await Jg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Qa,stack:d},Ka,Za)}catch(y){V.debug("Native skill generation failed (non-critical)",{error:we(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await mt.getActive(this.projectId),x={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,I=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ue.installGlobalConfig(),await Ue.syncCommands();let M;try{let y=await $.readConfig(this.projectPath);M=await rf.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){V.debug("Verification failed (non-critical)",{error:we(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:x,syncMetrics:I,verification:M,incremental:p,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:we(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>af.mkdir(au.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=E.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};E.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await L.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=v(),n.lastUpdated=v(),n.context={...n.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,n);try{await Gg.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:we(o)})}}async logToMemory(e,t){E.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=Fi(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:we(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Zt.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:we(a)})}let i={};try{let a=Fi(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Gi(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=ug(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:we(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await L.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Bg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await mt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:v(),status:"draft",commitHash:o??void 0})}catch(o){V.debug("Failed to save draft analysis (non-critical)",{error:we(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([it.archiveOldShipped(this.projectId).catch(()=>0),$e.markDormantIdeas(this.projectId).catch(()=>0),ce.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),Ht.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Rt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:we(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new cr,s=await Kl.learnFromTaskHistory(this.projectId,e,t);try{let n=await Hg.getFeatureOutcomes(this.projectId);n.length>0&&await Kl.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:we(e)})}}async getCliVersion(){try{let e=au.join(__dirname,"..","..","package.json");return(await Ae(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:we(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:[]}}},Ns=new cu});var df={};ye(df,{mdActionRequired:()=>It,mdBadge:()=>ta,mdCallout:()=>os,mdCodeBlock:()=>lu,mdDone:()=>fe,mdError:()=>$v,mdFooter:()=>lf,mdFrontmatter:()=>uf,mdHeader:()=>cf,mdJoin:()=>sa,mdList:()=>He,mdNextSteps:()=>le,mdObsidianNote:()=>Ls,mdOutput:()=>U,mdRelevantFiles:()=>du,mdSection:()=>te,mdStats:()=>Ye,mdSubtasks:()=>uu,mdTable:()=>sn,mdTaskHeader:()=>wr,mdWarn:()=>pu});function cf(){return"---"}function lf(){return`---
823
- prjct v${bn()}`}function U(...r){return sa(cf(),...r.filter(Boolean),lf())}function sn(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
824
- `)}function lu(r,e=""){return`\`\`\`${e}
820
+ `,"body")}];l(Ev,"buildFrontmatter");l(Cv,"buildSkillContent");zl=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=To.join(pv.homedir(),".claude","skills");for(let c of Jl){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await vo.rm(To.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Cv(c,o),d=To.join(i,c.name),p=To.join(d,"SKILL.md");await vo.mkdir(d,{recursive:!0}),await vo.writeFile(p,u,"utf-8"),n.generated.push({name:c.name,path:p})}catch(u){V.debug(`Failed to generate skill ${c.name}`,{error:we(u)}),n.skipped.push({name:c.name,reason:we(u)})}}let a=new Set(Jl.map(c=>c.name));try{let c=await vo.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await vo.rm(To.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&V.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return Jl}},Mg=new zl});var _g=S(()=>{"use strict"});import Pv from"node:fs/promises";import Ng from"node:path";var Xi,Lg=S(()=>{"use strict";B();Xi=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Ng.join(this.projectPath,"package.json"),t=await Pv.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Ng.join(this.projectPath,e))}}});import Xl from"node:path";async function Fg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await F("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await F("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await F("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await F("git status --porcelain",{cwd:r}),i=o.trim().split(`
821
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await F('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
822
+ `).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await F('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:we(t)})}return e}async function rs(r,e){let t=await C(Xl.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Ug(r){let e={fileCount:0,version:"0.0.0",name:Xl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await F('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){V.debug("File count failed",{path:r,error:we(t)}),e.fileCount=0}try{let t=Xl.join(r,"package.json"),s=await Ae(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await rs(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:we(t)})}return await rs(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await rs(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await rs(r,"requirements.txt")||await rs(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 Hg(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 rs(r,"bun.lockb")||await rs(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rs(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 rs(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 rs(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 rs(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Wg(r){return new Xi(r).detect()}var Gg=S(()=>{"use strict";xs();_g();Je();B();Is();Lg();l(Fg,"analyzeGit");l(rs,"fileExistsInProject");l(Ug,"gatherStats");l(Hg,"detectCommands");l(Wg,"detectStack")});import qg from"node:fs/promises";import Ki from"node:path";var Kl,Yl,Bg,Vg=S(()=>{"use strict";vt();W();Je();B();Kl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Ki.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Ki.basename(r);try{await L.read(s)}catch(n){O(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Ki.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await qg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await qg.readFile(Ki.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!O(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},Yl=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Kl.contextFilesExist(t),Kl.jsonFilesValid(t),Kl.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let w=s.checks.slice(s.checks.indexOf(m)+1);a+=w.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await F(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},Bg=new Yl});import Jg from"node:fs/promises";import Ql from"node:path";var Zl,Ns,Yi=S(()=>{"use strict";ol();wl();qp();Jp();Zp();xl();xs();lt();Os();Te();ve();fr();lr();Bs();ee();Js();er();mo();Ll();Vt();zs();vt();gi();K();B();Is();kg();Rg();pr();Ig();In();$g();Og();Gg();Vg();Zl=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Jg.rm(Ql.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await kn()).installed){let y=await gr({autoRepair:!0});y.verified||V.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await ss.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:we(y)},error:`Context7 MCP is required but not ready: ${we(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Bi(this.projectId);try{let y=await Vi(this.projectId);y>0&&V.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){V.debug("Legacy JSON sweep failed (non-critical)",{error:we(y)})}let[a,c,u,d]=await Promise.all([Fg(this.projectPath),Ug(this.projectPath),Hg(this.projectPath),Wg(this.projectPath)]),p=t.full===!0,m,g=!0,w=new Set;if(!p&&Vp(this.projectId))try{let{diff:y,currentHashes:j}=await Rl(this.projectPath,this.projectId),D=y.added.length+y.modified.length+y.deleted.length;if(D===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=Wp(y,this.projectId);w=Gp(G.allAffected);let Q=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(he=>{let Ne=he.substring(he.lastIndexOf("."));return Q.has(Ne)}),m={isIncremental:!0,filesChanged:D,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}jl(this.projectId,j)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:we(y)})}else try{let{currentHashes:y}=await Rl(this.projectPath,this.projectId);jl(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:we(y)})}if(g)try{await Promise.all([Pp(this.projectPath,this.projectId),Hp(this.projectPath,this.projectId),Qp(this.projectPath,this.projectId)])}catch(y){V.debug("File ranking index build failed (non-critical)",{error:we(y)})}let b;try{let[y,j,D,G,Q,Ve,he,Ne,us,Wa,Ga]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),pt.getActive(this.projectId).catch(()=>null),it.getRecent(this.projectId,3).catch(()=>[]),tr.getMetrics(this.projectId).catch(()=>null),ce.getBacklog(this.projectId).catch(()=>[]),L.getTaskHistory(this.projectId).catch(()=>[]),L.getAllPausedTasks(this.projectId).catch(()=>[]),L.getAggregatedFeedback(this.projectId).catch(()=>null),L.getCurrentTask(this.projectId).catch(()=>null),$e.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),it.getCount(this.projectId).catch(()=>0)]),qa={backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,hasActiveTask:!!us},Ba=y?y.patterns.map(ue=>({name:ue.name,description:ue.description,location:ue.locations?.[0]})):(j?.patterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({name:ue.name,description:ue.description,location:ue.location})),Va=y?y.antiPatterns.map(ue=>({issue:ue.issue,file:ue.files?.[0]??"multiple",suggestion:ue.suggestion,severity:ue.severity??"medium"})):(j?.antiPatterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({issue:ue.issue,file:ue.file,suggestion:ue.suggestion,severity:ue.severity??"medium"})),Ja=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,za={version:c.version,fileCount:c.fileCount,patterns:Ba,antiPatterns:Va,recentShipped:D.map(ue=>({name:ue.name,type:ue.type??"feature",duration:ue.duration,filesChanged:ue.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,knownGotchas:Ne?.knownGotchas??[],userPatterns:Ne?.patternsDiscovered??[],hasActiveTask:!!us,activeTaskDescription:us?.description??"",pausedTasks:he.map(ue=>({description:ue.description,pausedAt:ue.pausedAt??""})),topBacklog:Q.slice(0,3).map(ue=>({description:ue.description,priority:ue.priority??"medium"})),ideasCount:Wa?.pending??0,shippedCount:Ga};b=await Mg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Ja,stack:d},qa,za)}catch(y){V.debug("Native skill generation failed (non-critical)",{error:we(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await pt.getActive(this.projectId),x={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,I=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ue.installGlobalConfig(),await Ue.syncCommands();let M;try{let y=await $.readConfig(this.projectPath);M=await Bg.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){V.debug("Verification failed (non-critical)",{error:we(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:x,syncMetrics:I,verification:M,incremental:m,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:we(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Jg.mkdir(Ql.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=E.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};E.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await L.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=v(),n.lastUpdated=v(),n.context={...n.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,n);try{await Ag.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:we(o)})}}async logToMemory(e,t){E.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=_i(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:we(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Zt.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:we(a)})}let i={};try{let a=_i(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Ui(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Yp(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:we(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await L.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Dg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await pt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:v(),status:"draft",commitHash:o??void 0})}catch(o){V.debug("Failed to save draft analysis (non-critical)",{error:we(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([it.archiveOldShipped(this.projectId).catch(()=>0),$e.markDormantIdeas(this.projectId).catch(()=>0),ce.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),Ht.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Rt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:we(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new ir,s=await Ul.learnFromTaskHistory(this.projectId,e,t);try{let n=await jg.getFeatureOutcomes(this.projectId);n.length>0&&await Ul.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:we(e)})}}async getCliVersion(){try{let e=Ql.join(__dirname,"..","..","package.json");return(await Ae(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:we(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:[]}}},Ns=new Zl});var Yg={};ye(Yg,{mdActionRequired:()=>It,mdBadge:()=>Qi,mdCallout:()=>os,mdCodeBlock:()=>eu,mdDone:()=>fe,mdError:()=>xv,mdFooter:()=>Xg,mdFrontmatter:()=>Kg,mdHeader:()=>zg,mdJoin:()=>Zi,mdList:()=>He,mdNextSteps:()=>le,mdObsidianNote:()=>Ls,mdOutput:()=>U,mdRelevantFiles:()=>su,mdSection:()=>te,mdStats:()=>Ye,mdSubtasks:()=>tu,mdTable:()=>tn,mdTaskHeader:()=>hr,mdWarn:()=>nu});function zg(){return"---"}function Xg(){return`---
823
+ prjct v${Sn()}`}function U(...r){return Zi(zg(),...r.filter(Boolean),Xg())}function tn(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
824
+ `)}function eu(r,e=""){return`\`\`\`${e}
825
825
  ${r}
826
- \`\`\``}function ta(r,e){return`**${r}**: \`${e}\``}function os(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function te(r,e,t=3){return`### ${r}
826
+ \`\`\``}function Qi(r,e){return`**${r}**: \`${e}\``}function os(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function te(r,e,t=3){return`### ${r}
827
827
  ${e}`}function He(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
828
- `)}function wr(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
829
- > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function uu(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
830
- ${sn(t,s)}`}function du(r){return r.length===0?"":`### Relevant Files
828
+ `)}function hr(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
829
+ > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function tu(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
830
+ ${tn(t,s)}`}function su(r){return r.length===0?"":`### Relevant Files
831
831
  ${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
832
832
  `)}`}function le(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
833
- ${sn(e,t)}`}function Ye(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return sn(t,s)}function fe(r,e){return e?`## ${r}
834
- > ${e}`:`## ${r}`}function pu(r){return`> **WARNING:** ${r}`}function $v(r){return`> **ERROR:** ${r}`}function uf(r){let e=["---"];for(let[t,s]of Object.entries(r))s!=null&&(Array.isArray(s)?e.push(`${t}: [${s.map(n=>String(n)).join(", ")}]`):typeof s=="object"||e.push(`${t}: ${String(s)}`));return e.push("---"),e.join(`
835
- `)}function Ls(r,e,...t){return[uf(r),`# ${e}`,...t.filter(Boolean)].join(`
833
+ ${tn(e,t)}`}function Ye(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return tn(t,s)}function fe(r,e){return e?`## ${r}
834
+ > ${e}`:`## ${r}`}function nu(r){return`> **WARNING:** ${r}`}function xv(r){return`> **ERROR:** ${r}`}function Kg(r){let e=["---"];for(let[t,s]of Object.entries(r))s!=null&&(Array.isArray(s)?e.push(`${t}: [${s.map(n=>String(n)).join(", ")}]`):typeof s=="object"||e.push(`${t}: ${String(s)}`));return e.push("---"),e.join(`
835
+ `)}function Ls(r,e,...t){return[Kg(r),`# ${e}`,...t.filter(Boolean)].join(`
836
836
 
837
- `)}function sa(...r){return r.filter(Boolean).join(`
837
+ `)}function Zi(...r){return r.filter(Boolean).join(`
838
838
 
839
839
  `)}function It(r,e,t,s){let n=e.replace(/_/g," "),o=[`> **${r}**: ${n}`];if(s)for(let[i,a]of Object.entries(s))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
840
- `))}var hs=S(()=>{"use strict";ut();l(cf,"mdHeader");l(lf,"mdFooter");l(U,"mdOutput");l(sn,"mdTable");l(lu,"mdCodeBlock");l(ta,"mdBadge");l(os,"mdCallout");l(te,"mdSection");l(He,"mdList");l(wr,"mdTaskHeader");l(uu,"mdSubtasks");l(du,"mdRelevantFiles");l(le,"mdNextSteps");l(Ye,"mdStats");l(fe,"mdDone");l(pu,"mdWarn");l($v,"mdError");l(uf,"mdFrontmatter");l(Ls,"mdObsidianNote");l(sa,"mdJoin");l(It,"mdActionRequired")});import Ro from"chalk";function Wt(r,e={}){if(e.quiet)return;let t=mf[r]||"idle",s=vn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:pf[o]||o}));console.log(Ro.dim(`
841
- Next:`));for(let o of n){let i=Ro.cyan(o.cmd.padEnd(12));console.log(Ro.dim(` ${i} \u2192 ${o.desc}`))}}function na(r,e=!1){let t=mf[r]||"idle";return vn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:pf[n]||n}))}function Ao(r){let e=vn.getStateInfo(r);console.log(Ro.dim(`\u{1F4CD} State: ${Ro.white(r.toUpperCase())} - ${e.description}`))}var pf,mf,kr=S(()=>{"use strict";Fc();pf={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"},mf={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(Wt,"showNextSteps");l(na,"getNextSteps");l(Ao,"showStateInfo")});import Mv from"node:path";async function mu(r,e){let t=Date.now()-e;await Ue.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${Sr(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
842
- `));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Wt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function gf(r){try{let e=await Ht.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];n=xt(d)}}let o=s.filter(u=>u.action==="task_completed").length,i=s.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of s)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Sr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function gu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function ff(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function hf(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${Sr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${yi(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${gu(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${Sr(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(`
843
- `)}function yf(r,e){let t=[];t.push(`# Repository Analysis
840
+ `))}var hs=S(()=>{"use strict";ut();l(zg,"mdHeader");l(Xg,"mdFooter");l(U,"mdOutput");l(tn,"mdTable");l(eu,"mdCodeBlock");l(Qi,"mdBadge");l(os,"mdCallout");l(te,"mdSection");l(He,"mdList");l(hr,"mdTaskHeader");l(tu,"mdSubtasks");l(su,"mdRelevantFiles");l(le,"mdNextSteps");l(Ye,"mdStats");l(fe,"mdDone");l(nu,"mdWarn");l(xv,"mdError");l(Kg,"mdFrontmatter");l(Ls,"mdObsidianNote");l(Zi,"mdJoin");l(It,"mdActionRequired")});import Eo from"chalk";function Wt(r,e={}){if(e.quiet)return;let t=Zg[r]||"idle",s=bn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Qg[o]||o}));console.log(Eo.dim(`
841
+ Next:`));for(let o of n){let i=Eo.cyan(o.cmd.padEnd(12));console.log(Eo.dim(` ${i} \u2192 ${o.desc}`))}}function ea(r,e=!1){let t=Zg[r]||"idle";return bn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Qg[n]||n}))}function Co(r){let e=bn.getStateInfo(r);console.log(Eo.dim(`\u{1F4CD} State: ${Eo.white(r.toUpperCase())} - ${e.description}`))}var Qg,Zg,yr=S(()=>{"use strict";Mc();Qg={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"},Zg={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(Wt,"showNextSteps");l(ea,"getNextSteps");l(Co,"showStateInfo")});import jv from"node:path";async function ru(r,e){let t=Date.now()-e;await Ue.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${wr(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
842
+ `));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Wt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function ef(r){try{let e=await Ht.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];n=xt(d)}}let o=s.filter(u=>u.action==="task_completed").length,i=s.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of s)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function wr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function ou(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function tf(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function sf(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${wr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${mi(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${ou(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${wr(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(`
843
+ `)}function nf(r,e){let t=[];t.push(`# Repository Analysis
844
844
  `),t.push(`Generated: ${new Date().toLocaleString()}
845
- `);let s=Mv.basename(e);if(t.push(`## Project: ${s}
845
+ `);let s=jv.basename(e);if(t.push(`## Project: ${s}
846
846
  `),t.push(`## Stack Detected
847
847
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
848
848
  `),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
@@ -858,10 +858,10 @@ Next:`));for(let o of n){let i=Ro.cyan(o.cmd.padEnd(12));console.log(Ro.dim(` $
858
858
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
859
859
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
860
860
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
861
- `)}var wf=S(()=>{"use strict";Os();wi();$n();X();kr();Fe();l(mu,"showSyncResult");l(gf,"getSessionActivity");l(Sr,"formatTokens");l(gu,"formatDuration");l(ff,"generateSparkline");l(hf,"generateStatsMarkdown");l(yf,"generateAnalysisSummary")});var kf,Sf,bf=S(()=>{"use strict";kf=["task","done","ship","resume","bug","enrich"],Sf=["init","sync","pause","next","dash","history","undo","redo"]});import ys from"chalk";function Ov(r){return vf[r.toLowerCase()]||vf.default}var vf,fu,Tf,Ef=S(()=>{"use strict";vf={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(Ov,"getIcon");fu=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(ys.cyan(`
861
+ `)}var rf=S(()=>{"use strict";Os();pi();In();K();yr();Fe();l(ru,"showSyncResult");l(ef,"getSessionActivity");l(wr,"formatTokens");l(ou,"formatDuration");l(tf,"generateSparkline");l(sf,"generateStatsMarkdown");l(nf,"generateAnalysisSummary")});var of,af,cf=S(()=>{"use strict";of=["task","done","ship","resume","bug","enrich"],af=["init","sync","pause","next","dash","history","undo","redo"]});import ys from"chalk";function Rv(r){return lf[r.toLowerCase()]||lf.default}var lf,iu,uf,df=S(()=>{"use strict";lf={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(Rv,"getIcon");iu=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(ys.cyan(`
862
862
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
863
- `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Ov(t);console.log(ys.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(ys.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(ys.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(ys.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),n=e?ys.green("\u2713"):ys.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${ys.dim(`(${s})`)}
864
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${ys.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(ys.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Tf=new fu});import Cf from"node:fs";import ra from"node:path";function _v(r){if(fn()){let{Database:n}=Bt("bun:sqlite");return new n(r,{create:!0})}let e=Bt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var hu,oa,Pf=S(()=>{"use strict";ro();l(_v,"openDatabase");hu=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?ra.resolve(e):ra.join(Bt("node:os").homedir(),".prjct-cli");this.dbPath=ra.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=ra.dirname(this.dbPath);Cf.existsSync(e)||Cf.mkdirSync(e,{recursive:!0});let t=_v(this.dbPath);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
863
+ `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Rv(t);console.log(ys.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(ys.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(ys.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(ys.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),n=e?ys.green("\u2713"):ys.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${ys.dim(`(${s})`)}
864
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${ys.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(ys.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},uf=new iu});import mf from"node:fs";import ta from"node:path";function Av(r){if(gn()){let{Database:n}=Bt("bun:sqlite");return new n(r,{create:!0})}let e=Bt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var au,sa,pf=S(()=>{"use strict";eo();l(Av,"openDatabase");au=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?ta.resolve(e):ta.join(Bt("node:os").homedir(),".prjct-cli");this.dbPath=ta.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=ta.dirname(this.dbPath);mf.existsSync(e)||mf.mkdirSync(e,{recursive:!0});let t=Av(this.dbPath);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
865
865
  CREATE TABLE IF NOT EXISTS _system_migrations (
866
866
  version INTEGER PRIMARY KEY,
867
867
  name TEXT NOT NULL,
@@ -882,14 +882,14 @@ Next:`));for(let o of n){let i=Ro.cyan(o.cmd.padEnd(12));console.log(Ro.dim(` $
882
882
  INSERT OR REPLACE INTO mcp_health
883
883
  (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
884
884
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
885
- `).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},oa=new hu});import is from"node:fs/promises";import Io from"node:os";import gt from"node:path";function Nv(){try{let r=gt.dirname(Bt.resolve("prjct-cli/package.json"));return{command:"node",args:[gt.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function xf(){return Do.split("@")[1]}function ws(){return process.env.PRJCT_TEST_MODE==="1"?gt.join(Io.tmpdir(),"prjct-context7-test","mcp.json"):gt.join(Io.homedir(),".claude","mcp.json")}async function jf(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:ws(),mergeIntoExisting:!1}];let r=Io.homedir(),e=[],t=gt.join(r,".claude");await Xt(t)&&e.push({provider:"claude",configPath:gt.join(t,"mcp.json"),mergeIntoExisting:!1});let s=gt.join(r,".gemini");return await Xt(s)&&e.push({provider:"gemini",configPath:gt.join(s,"settings.json"),mergeIntoExisting:!0}),e}async function Rf(r){let e=await jf(),t=await Promise.all(e.map(async s=>({provider:s.provider,configured:await nn(r,s.configPath),path:s.configPath})));return{configured:t.some(s=>s.configured),providers:t}}async function ia(r){let e;try{e=await is.readdir(r)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let t=e.filter(s=>s.endsWith("_tokens.json")||s.endsWith(".json"));if(t.length===0)return{valid:!1,reason:"no token files found"};for(let s of t){let n=gt.join(r,s);try{let o=await is.readFile(n,"utf-8"),i=JSON.parse(o);if(i.access_token||i.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${s}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}async function Lv(){let r=xf(),e=gt.join(Io.homedir(),".mcp-auth"),t=gt.join(e,`mcp-remote-${r}`);if((await ia(t)).valid)return{migrated:!1,from:null,to:t};let n;try{n=await is.readdir(e)}catch{return{migrated:!1,from:null,to:t}}let o=n.filter(i=>i.startsWith("mcp-remote-")&&i!==`mcp-remote-${r}`).sort().reverse();for(let i of o){let a=gt.join(e,i);if((await ia(a)).valid){await is.mkdir(t,{recursive:!0});let u=await is.readdir(a);for(let d of u)await is.copyFile(gt.join(a,d),gt.join(t,d));return{migrated:!0,from:a,to:t}}}return{migrated:!1,from:null,to:t}}async function Fv(r){if((await ia(r)).valid)return!1;try{let t=await is.readdir(r);for(let s of t)await is.unlink(gt.join(r,s));return await is.rmdir(r),!0}catch{return!1}}async function Af(r){let e=[],t=!1,s=await jf();for(let n of s){let o=await wu(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=aa[r];if(i.command!==a.command||JSON.stringify(i.args)!==JSON.stringify(a.args)){e.push(`${n.provider}: ${r} config doesn't match preset (stale version?)`);let c={...o.mcpServers||{}};c[r]=a,o.mcpServers=c,await Df(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function If(r){let e=xf(),t=gt.join(Io.homedir(),".mcp-auth"),s=gt.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await ia(s);if(i.valid)return oa.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};i.reason&&i.reason!=="directory not found"&&i.reason!=="directory empty"&&(o=await Fv(s));let a=await Lv();if(a.migrated)return n=!0,oa.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:`Tokens migrated from ${gt.basename(a.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:o};let c=[];try{c=(await is.readdir(t)).filter(m=>m.startsWith("mcp-remote-")&&m!==`mcp-remote-${e}`)}catch{}let u=o?`Previous tokens were invalid and cleaned. Run in a terminal: ${yu[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${yu[r]}`:`OAuth not completed. Run in a terminal: ${yu[r]}`;return oa.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function wu(r=ws()){try{let e=await is.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=k(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${k(e)}`)}}async function Df(r,e=ws()){await de(e,r)}async function ku(r,e,t=ws()){let s=await wu(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await Df(s,t),{path:t,changed:i}}async function nn(r,e=ws()){return!!(await wu(e)).mcpServers?.[r]}var Do,aa,yu,$o=S(()=>{"use strict";Pf();W();B();Do="mcp-remote@0.1.38";l(Nv,"getPrjctMcpConfig");aa={prjct:Nv(),linear:{command:"npx",args:["-y",Do,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Do,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},yu={linear:`npx -y ${Do} https://mcp.linear.app/mcp`,jira:`npx -y ${Do} https://mcp.atlassian.com/v1/mcp`};l(xf,"getMcpRemoteVersion");l(ws,"getClaudeMcpConfigPath");l(jf,"getActiveMcpConfigPaths");l(Rf,"hasMcpServerAny");l(ia,"validateTokenFiles");l(Lv,"migrateOAuthTokens");l(Fv,"cleanCorruptedTokens");l(Af,"validateMcpConfig");l(If,"checkOAuthTokens");l(wu,"readMcpConfig");l(Df,"writeMcpConfig");l(ku,"upsertMcpServer");l(nn,"hasMcpServer")});import wt from"chalk";function Uv(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%$f.length;return $f[t]}function Hv(r,e,t="\u25B6"){let s=wt.dim(String(r+1).padStart(2)),o=Uv(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=wt.green("\u2713 Complete");break;case"in_progress":a=wt.yellow(`${t} Working...`);break;case"pending":a=wt.gray("\u25CB Pending");break;case"failed":a=wt.red("\u2717 Failed");break;case"blocked":a=wt.gray("\u2298 Blocked");break;default:a=wt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function Wv(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${wt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${wt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Hv(t,r[t]));return e.push(""),e.join(`
886
- `)}function Mf(r){console.log(Wv(r))}var $f,Of=S(()=>{"use strict";$f=[wt.cyan,wt.magenta,wt.yellow,wt.blue,wt.green,wt.redBright,wt.magentaBright,wt.cyanBright];l(Uv,"getDomainColor");l(Hv,"formatSubtaskLine");l(Wv,"renderSubtaskProgress");l(Mf,"printSubtaskProgress")});function qv(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function Bv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Gv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:qv(t)};return{detected:!1}}function Vv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function Jv(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 zv(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function Kv(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 Gv,Su,Xv,br,_f=S(()=>{"use strict";Gv=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(qv,"getHallucinationSuggestion");l(Bv,"detectHallucination");l(Vv,"isSimilarError");l(Jv,"analyzeErrorPattern");l(zv,"generateEscalationMessage");l(Kv,"generateSuggestion");Su=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=5*60*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>Vv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=Jv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:zv(e,o,this.maxAttempts),suggestion:Kv(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return Bv(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},Xv=new Su,br=Xv});function bu(r,e){let t=Mo(e),s=Mm[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function Yv(r,e){let t=Mo(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Qv(r,e,t){let s=Mo(t),n=bu(r,t),o=bu(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function ca(r,e=Xs){let t=Mo(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Zv(r,e),n=eT(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=nT(o),a=tT(o),c=sT(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=rT(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Lf(r,e,t=Xs){let s=Mo(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function Zv(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=Qv(i,n,e);if(!t.has(a)){let c=bu(i,e),u=Yv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function eT(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+oT(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>vu(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function tT(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function sT(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=vu(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function nT(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function rT(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=vu(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function vu(r){if(!r.variance)return 0;let e=Lt(r.estimatedDuration),t=Lt(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Ff(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(`
887
- `)}function oT(r){if(!r.estimatedDuration)return 0;let e=Lt(r.estimatedDuration);if(e<=0)return 0;let t=Nf[0],s=Number.POSITIVE_INFINITY;for(let n of Nf){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Mo(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Nf,Tu=S(()=>{"use strict";Eo();yo();X();l(bu,"getSprintStart");l(Yv,"getSprintEnd");l(Qv,"getSprintNumber");l(ca,"calculateVelocity");l(Lf,"projectCompletion");l(Zv,"bucketBySprint");l(eT,"buildSprintVelocities");l(tT,"detectTrend");l(sT,"calculateOverallAccuracy");l(nT,"calculateAverageVelocity");l(rT,"detectEstimationPatterns");l(vu,"parseVariancePercent");l(Ff,"formatVelocityContext");Nf=[{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(oT,"derivePoints");l(Mo,"resolveConfig")});import iT from"node:fs/promises";import la from"node:path";async function Fs(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Eu(r),c=await uT(e),u=await dT(e),d=[];for(let p of c){if(!i&&mT(p))continue;let g=pT(p,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,n);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-s}}}function Eu(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function uT(r){let e=[];async function t(s,n=""){try{let o=await iT.readdir(s,{withFileTypes:!0});for(let i of o){let a=la.join(s,i.name),c=la.join(n,i.name);if(i.isDirectory()){if(lT.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=la.extname(i.name).toLowerCase();cT.has(u)&&e.push(c)}}}catch(o){O(o)}}return l(t,"walk"),await t(r),e}async function dT(r){let e=new Map;try{let{stdout:t}=await F(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
885
+ `).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},sa=new au});import is from"node:fs/promises";import Po from"node:os";import gt from"node:path";function Iv(){try{let r=gt.dirname(Bt.resolve("prjct-cli/package.json"));return{command:"node",args:[gt.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function gf(){return xo.split("@")[1]}function ws(){return process.env.PRJCT_TEST_MODE==="1"?gt.join(Po.tmpdir(),"prjct-context7-test","mcp.json"):gt.join(Po.homedir(),".claude","mcp.json")}async function ff(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:ws(),mergeIntoExisting:!1}];let r=Po.homedir(),e=[],t=gt.join(r,".claude");await Kt(t)&&e.push({provider:"claude",configPath:gt.join(t,"mcp.json"),mergeIntoExisting:!1});let s=gt.join(r,".gemini");return await Kt(s)&&e.push({provider:"gemini",configPath:gt.join(s,"settings.json"),mergeIntoExisting:!0}),e}async function hf(r){let e=await ff(),t=await Promise.all(e.map(async s=>({provider:s.provider,configured:await sn(r,s.configPath),path:s.configPath})));return{configured:t.some(s=>s.configured),providers:t}}async function na(r){let e;try{e=await is.readdir(r)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let t=e.filter(s=>s.endsWith("_tokens.json")||s.endsWith(".json"));if(t.length===0)return{valid:!1,reason:"no token files found"};for(let s of t){let n=gt.join(r,s);try{let o=await is.readFile(n,"utf-8"),i=JSON.parse(o);if(i.access_token||i.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${s}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}async function Dv(){let r=gf(),e=gt.join(Po.homedir(),".mcp-auth"),t=gt.join(e,`mcp-remote-${r}`);if((await na(t)).valid)return{migrated:!1,from:null,to:t};let n;try{n=await is.readdir(e)}catch{return{migrated:!1,from:null,to:t}}let o=n.filter(i=>i.startsWith("mcp-remote-")&&i!==`mcp-remote-${r}`).sort().reverse();for(let i of o){let a=gt.join(e,i);if((await na(a)).valid){await is.mkdir(t,{recursive:!0});let u=await is.readdir(a);for(let d of u)await is.copyFile(gt.join(a,d),gt.join(t,d));return{migrated:!0,from:a,to:t}}}return{migrated:!1,from:null,to:t}}async function $v(r){if((await na(r)).valid)return!1;try{let t=await is.readdir(r);for(let s of t)await is.unlink(gt.join(r,s));return await is.rmdir(r),!0}catch{return!1}}async function yf(r){let e=[],t=!1,s=await ff();for(let n of s){let o=await lu(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=ra[r];if(i.command!==a.command||JSON.stringify(i.args)!==JSON.stringify(a.args)){e.push(`${n.provider}: ${r} config doesn't match preset (stale version?)`);let c={...o.mcpServers||{}};c[r]=a,o.mcpServers=c,await kf(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function wf(r){let e=gf(),t=gt.join(Po.homedir(),".mcp-auth"),s=gt.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await na(s);if(i.valid)return sa.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};i.reason&&i.reason!=="directory not found"&&i.reason!=="directory empty"&&(o=await $v(s));let a=await Dv();if(a.migrated)return n=!0,sa.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:`Tokens migrated from ${gt.basename(a.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:o};let c=[];try{c=(await is.readdir(t)).filter(p=>p.startsWith("mcp-remote-")&&p!==`mcp-remote-${e}`)}catch{}let u=o?`Previous tokens were invalid and cleaned. Run in a terminal: ${cu[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${cu[r]}`:`OAuth not completed. Run in a terminal: ${cu[r]}`;return sa.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function lu(r=ws()){try{let e=await is.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=k(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${k(e)}`)}}async function kf(r,e=ws()){await de(e,r)}async function uu(r,e,t=ws()){let s=await lu(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await kf(s,t),{path:t,changed:i}}async function sn(r,e=ws()){return!!(await lu(e)).mcpServers?.[r]}var xo,ra,cu,jo=S(()=>{"use strict";pf();W();B();xo="mcp-remote@0.1.38";l(Iv,"getPrjctMcpConfig");ra={prjct:Iv(),linear:{command:"npx",args:["-y",xo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",xo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},cu={linear:`npx -y ${xo} https://mcp.linear.app/mcp`,jira:`npx -y ${xo} https://mcp.atlassian.com/v1/mcp`};l(gf,"getMcpRemoteVersion");l(ws,"getClaudeMcpConfigPath");l(ff,"getActiveMcpConfigPaths");l(hf,"hasMcpServerAny");l(na,"validateTokenFiles");l(Dv,"migrateOAuthTokens");l($v,"cleanCorruptedTokens");l(yf,"validateMcpConfig");l(wf,"checkOAuthTokens");l(lu,"readMcpConfig");l(kf,"writeMcpConfig");l(uu,"upsertMcpServer");l(sn,"hasMcpServer")});import wt from"chalk";function Mv(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Sf.length;return Sf[t]}function Ov(r,e,t="\u25B6"){let s=wt.dim(String(r+1).padStart(2)),o=Mv(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=wt.green("\u2713 Complete");break;case"in_progress":a=wt.yellow(`${t} Working...`);break;case"pending":a=wt.gray("\u25CB Pending");break;case"failed":a=wt.red("\u2717 Failed");break;case"blocked":a=wt.gray("\u2298 Blocked");break;default:a=wt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function _v(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${wt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${wt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Ov(t,r[t]));return e.push(""),e.join(`
886
+ `)}function bf(r){console.log(_v(r))}var Sf,vf=S(()=>{"use strict";Sf=[wt.cyan,wt.magenta,wt.yellow,wt.blue,wt.green,wt.redBright,wt.magentaBright,wt.cyanBright];l(Mv,"getDomainColor");l(Ov,"formatSubtaskLine");l(_v,"renderSubtaskProgress");l(bf,"printSubtaskProgress")});function Lv(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 Fv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Nv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Lv(t)};return{detected:!1}}function Uv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function Hv(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 Wv(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function Gv(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 Nv,du,qv,kr,Tf=S(()=>{"use strict";Nv=[{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(Lv,"getHallucinationSuggestion");l(Fv,"detectHallucination");l(Uv,"isSimilarError");l(Hv,"analyzeErrorPattern");l(Wv,"generateEscalationMessage");l(Gv,"generateSuggestion");du=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=5*60*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>Uv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=Hv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Wv(e,o,this.maxAttempts),suggestion:Gv(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return Fv(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},qv=new du,kr=qv});function mu(r,e){let t=Ro(e),s=bp[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function Bv(r,e){let t=Ro(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Vv(r,e,t){let s=Ro(t),n=mu(r,t),o=mu(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function oa(r,e=Xs){let t=Ro(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Jv(r,e),n=zv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=Yv(o),a=Xv(o),c=Kv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Qv(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Cf(r,e,t=Xs){let s=Ro(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function Jv(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=Vv(i,n,e);if(!t.has(a)){let c=mu(i,e),u=Bv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function zv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+Zv(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>pu(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function Xv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function Kv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=pu(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function Yv(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function Qv(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=pu(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function pu(r){if(!r.variance)return 0;let e=Lt(r.estimatedDuration),t=Lt(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Pf(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(`
887
+ `)}function Zv(r){if(!r.estimatedDuration)return 0;let e=Lt(r.estimatedDuration);if(e<=0)return 0;let t=Ef[0],s=Number.POSITIVE_INFINITY;for(let n of Ef){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Ro(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Ef,gu=S(()=>{"use strict";ko();po();K();l(mu,"getSprintStart");l(Bv,"getSprintEnd");l(Vv,"getSprintNumber");l(oa,"calculateVelocity");l(Cf,"projectCompletion");l(Jv,"bucketBySprint");l(zv,"buildSprintVelocities");l(Xv,"detectTrend");l(Kv,"calculateOverallAccuracy");l(Yv,"calculateAverageVelocity");l(Qv,"detectEstimationPatterns");l(pu,"parseVariancePercent");l(Pf,"formatVelocityContext");Ef=[{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(Zv,"derivePoints");l(Ro,"resolveConfig")});import eT from"node:fs/promises";import ia from"node:path";async function nn(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=fu(r),c=await rT(e),u=await oT(e),d=[];for(let m of c){if(!i&&aT(m))continue;let g=iT(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,n);return{files:p,metrics:{filesScanned:c.length,filesReturned:p.length,scanDuration:Date.now()-s}}}function fu(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function rT(r){let e=[];async function t(s,n=""){try{let o=await eT.readdir(s,{withFileTypes:!0});for(let i of o){let a=ia.join(s,i.name),c=ia.join(n,i.name);if(i.isDirectory()){if(nT.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=ia.extname(i.name).toLowerCase();sT.has(u)&&e.push(c)}}}catch(o){O(o)}}return l(t,"walk"),await t(r),e}async function oT(r){let e=new Map;try{let{stdout:t}=await F(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
888
888
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
889
889
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
890
890
  END { for (f in files) print files[f], lastmod[f], f }
891
891
  '`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
892
- `).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function pT(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),m=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let h of e){d.includes(h)&&(o+=.3,n.push(`keyword:${h}`));for(let x of m)if(x.includes(h)||h.includes(x)){o+=.15;break}}o=Math.min(1,o);for(let[h,x]of Object.entries(aT))for(let T of x)if(d.includes(T)&&e.some(M=>x.includes(M)||M.includes(h)||h.includes(M))){i+=.4,n.push(`domain:${h}`);break}i=Math.min(1,i);let p=t.get(r);p&&(p.daysAgo<=1?(a=1,n.push("recent:1d")):p.daysAgo<=3?(a=.8,n.push("recent:3d")):p.daysAgo<=7?(a=.6,n.push("recent:1w")):p.daysAgo<=30&&(a=.3,n.push("recent:1m")),p.commits>=5&&(a=Math.min(1,a+.2)));let g=la.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(h=>h.startsWith("import:"))||n.push("import:1")),s){let h=s.get(r);h!==void 0&&(u=(h+1)/2,h>0?n.push("history:boosted"):h<0&&n.push("history:penalized"))}let b=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,b),reasons:[...new Set(n)]}}function mT(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 aT,cT,lT,Oo=S(()=>{"use strict";W();Je();aT={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"]},cT=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),lT=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Fs,"findRelevantFiles");l(Eu,"extractKeywords");l(uT,"getAllCodeFiles");l(dT,"getGitRecency");l(pT,"scoreFile");l(mT,"isTestFile")});async function _o(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await hT(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await fT(r,t);return o=o.filter(c=>!yT(c.path)).slice(0,s),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,s),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function fT(r,e){let{stdout:t}=await F(`git log -${e} --pretty=format:"%ct" --name-only | awk '
892
+ `).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function iT(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let h of e){d.includes(h)&&(o+=.3,n.push(`keyword:${h}`));for(let x of p)if(x.includes(h)||h.includes(x)){o+=.15;break}}o=Math.min(1,o);for(let[h,x]of Object.entries(tT))for(let T of x)if(d.includes(T)&&e.some(M=>x.includes(M)||M.includes(h)||h.includes(M))){i+=.4,n.push(`domain:${h}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,n.push("recent:1d")):m.daysAgo<=3?(a=.8,n.push("recent:3d")):m.daysAgo<=7?(a=.6,n.push("recent:1w")):m.daysAgo<=30&&(a=.3,n.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=ia.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(h=>h.startsWith("import:"))||n.push("import:1")),s){let h=s.get(r);h!==void 0&&(u=(h+1)/2,h>0?n.push("history:boosted"):h<0&&n.push("history:penalized"))}let b=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,b),reasons:[...new Set(n)]}}function aT(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 tT,sT,nT,Ao=S(()=>{"use strict";W();Je();tT={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"]},sT=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),nT=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(nn,"findRelevantFiles");l(fu,"extractKeywords");l(rT,"getAllCodeFiles");l(oT,"getGitRecency");l(iT,"scoreFile");l(aT,"isTestFile")});async function aa(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await uT(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await lT(r,t);return o=o.filter(c=>!dT(c.path)).slice(0,s),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,s),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function lT(r,e){let{stdout:t}=await F(`git log -${e} --pretty=format:"%ct" --name-only | awk '
893
893
  /^[0-9]+$/ { timestamp=$1; next }
894
894
  NF {
895
895
  count[$0]++
@@ -899,7 +899,7 @@ Next:`));for(let o of n){let i=Ro.cyan(o.cmd.padEnd(12));console.log(Ro.dim(` $
899
899
  for (f in count) print count[f], lastmod[f], f
900
900
  }
901
901
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
902
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),w=Math.floor(p/3600),b=Math.max(0,1-g/30),h=u/i,x=b*.6+h*.4,T;w<1?T="just now":w<24?T=`${w}h ago`:g<7?T=`${g}d ago`:g<30?T=`${Math.floor(g/7)}w ago`:T=`${Math.floor(g/30)}mo ago`,s.push({path:m,changes:u,heatScore:Math.round(x*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function hT(r){let e="main";try{await F("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await F(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
902
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),w=Math.floor(m/3600),b=Math.max(0,1-g/30),h=u/i,x=b*.6+h*.4,T;w<1?T="just now":w<24?T=`${w}h ago`:g<7?T=`${g}d ago`:g<30?T=`${Math.floor(g/7)}w ago`:T=`${Math.floor(g/30)}mo ago`,s.push({path:p,changes:u,heatScore:Math.round(x*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function uT(r){let e="main";try{await F("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await F(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
903
903
  `).filter(Boolean),{stdout:n}=await F(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
904
904
  /^[0-9]+$/ { timestamp=$1; next }
905
905
  NF {
@@ -910,15 +910,15 @@ Next:`));for(let o of n){let i=Ro.cyan(o.cmd.padEnd(12));console.log(Ro.dim(` $
910
910
  for (f in count) print count[f], lastmod[f], f
911
911
  }
912
912
  '`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
913
- `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let m=parseInt(d[1],10);m>c&&(c=m)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let m=parseInt(d[1],10),p=parseInt(d[2],10),g=d[3],w=a-p,b=Math.floor(w/86400),h=Math.floor(w/3600),x=Math.max(0,1-b/14),T=m/c,I=x*.5+T*.5,M;h<1?M="just now":h<24?M=`${h}h ago`:M=`${b}d ago`,o.push({path:g,changes:m,heatScore:Math.round(I*100)/100,lastChanged:M,lastChangedAt:new Date(p*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function yT(r){let e=r.split("/").pop()||"";for(let t of gT)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var gT,Cu=S(()=>{"use strict";Je();gT=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(_o,"getRecentFiles");l(fT,"getHotFilesFromCommits");l(hT,"getBranchOnlyFiles");l(yT,"shouldIgnore")});function Pu(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Uf(r,e){let t=wT[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Hf(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ua(r,e){let t=Pu(r),s=Pu(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=Uf(n,kT),a=xu.map(c=>({model:c,...Uf(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Hf(i.total),byModel:a}}}function Mn(r){let e=Pu(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:xu.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function ju(r){if(r.length===0)return Mn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),s=r.reduce((a,c)=>a+c.tokens.saved,0),n=e>0?(e-t)/e:0,o=xu.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:s},compression:n,cost:{saved:i,formatted:Hf(i),byModel:o}}}var wT,kT,xu,da=S(()=>{"use strict";Hi();wT={"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}},kT="claude-sonnet-4.5";l(Pu,"countTokens");xu=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Uf,"calculateModelCost");l(Hf,"formatCostSaved");l(ua,"measureCompression");l(Mn,"noCompression");l(ju,"combineMetrics")});import qf from"node:fs/promises";import as from"node:path";async function rn(r,e=process.cwd()){let t=as.isAbsolute(r)?r:as.join(e,r),s=as.resolve(e),n=as.resolve(t);if(!n.startsWith(s+as.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Mn("")};let o;try{o=await qf.readFile(t,"utf-8")}catch(m){if(O(m))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Mn("")};throw m}let i=as.extname(r).toLowerCase(),a=Bf[i]||"unknown",c=TT[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Mn(o)};let u=ET(o,c),d=u.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
914
- `);return{file:r,language:a,signatures:u,fallback:!1,metrics:ua(o,d)}}async function Ru(r,e=process.cwd(),t={}){let s=as.isAbsolute(r)?r:as.join(e,r),n=[];async function o(i){let a=await qf.readdir(i,{withFileTypes:!0});for(let c of a){let u=as.join(i,c.name),d=as.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=as.extname(c.name).toLowerCase();if(Bf[m]){let p=await rn(d,e);n.push(p)}}}}return l(o,"processDir"),await o(s),n}function ET(r,e){let t=[],s=r.split(`
913
+ `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],w=a-m,b=Math.floor(w/86400),h=Math.floor(w/3600),x=Math.max(0,1-b/14),T=p/c,I=x*.5+T*.5,M;h<1?M="just now":h<24?M=`${h}h ago`:M=`${b}d ago`,o.push({path:g,changes:p,heatScore:Math.round(I*100)/100,lastChanged:M,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function dT(r){let e=r.split("/").pop()||"";for(let t of cT)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var cT,hu=S(()=>{"use strict";Je();cT=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(aa,"getRecentFiles");l(lT,"getHotFilesFromCommits");l(uT,"getBranchOnlyFiles");l(dT,"shouldIgnore")});function yu(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function xf(r,e){let t=mT[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function jf(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ca(r,e){let t=yu(r),s=yu(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=xf(n,pT),a=wu.map(c=>({model:c,...xf(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:jf(i.total),byModel:a}}}function Dn(r){let e=yu(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:wu.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function ku(r){if(r.length===0)return Dn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),s=r.reduce((a,c)=>a+c.tokens.saved,0),n=e>0?(e-t)/e:0,o=wu.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:s},compression:n,cost:{saved:i,formatted:jf(i),byModel:o}}}var mT,pT,wu,la=S(()=>{"use strict";Li();mT={"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}},pT="claude-sonnet-4.5";l(yu,"countTokens");wu=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(xf,"calculateModelCost");l(jf,"formatCostSaved");l(ca,"measureCompression");l(Dn,"noCompression");l(ku,"combineMetrics")});import If from"node:fs/promises";import as from"node:path";async function $n(r,e=process.cwd()){let t=as.isAbsolute(r)?r:as.join(e,r),s=as.resolve(e),n=as.resolve(t);if(!n.startsWith(s+as.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Dn("")};let o;try{o=await If.readFile(t,"utf-8")}catch(p){if(O(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Dn("")};throw p}let i=as.extname(r).toLowerCase(),a=Df[i]||"unknown",c=yT[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Dn(o)};let u=wT(o,c),d=u.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
914
+ `);return{file:r,language:a,signatures:u,fallback:!1,metrics:ca(o,d)}}async function $f(r,e=process.cwd(),t={}){let s=as.isAbsolute(r)?r:as.join(e,r),n=[];async function o(i){let a=await If.readdir(i,{withFileTypes:!0});for(let c of a){let u=as.join(i,c.name),d=as.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=as.extname(c.name).toLowerCase();if(Df[p]){let m=await $n(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function wT(r,e){let t=[],s=r.split(`
915
915
  `),n=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(n.has(c))continue;n.add(c);let u=i.index,d=r.substring(0,u).split(`
916
- `).length,m=i[0].trim(),p;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:CT(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function CT(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Bf,Wf,ST,bT,vT,Gf,TT,pa=S(()=>{"use strict";W();da();Bf={".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"},Wf=[{type:"function",pattern:/^export\s+(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1},{type:"function",pattern:/^const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1},{type:"interface",pattern:/^export\s+interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^export\s+type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1,exported:!0},{type:"type",pattern:/^type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1},{type:"class",pattern:/^export\s+(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"enum",pattern:/^export\s+enum\s+(\w+)\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)\s*\{/gm,nameIndex:1},{type:"const",pattern:/^export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/gm,nameIndex:1,exported:!0}],ST=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],bT=[{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}],vT=[{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}],Gf=[{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}],TT={typescript:Wf,javascript:Wf,python:ST,go:bT,rust:vT,java:Gf,csharp:Gf,php:[],ruby:[],unknown:[]};l(rn,"extractSignatures");l(Ru,"extractDirectorySignatures");l(ET,"extractFromContent");l(CT,"cleanSignature")});import Au from"node:path";var PT,xT,Iu,jT,$t,vr=S(()=>{"use strict";ve();Ut();X();B();PT="outcomes",xT="outcomes.jsonl",Iu=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Au.join(t,PT)}getOutcomesPath(e){return Au.join(this.getOutcomesDir(e),xT)}async record(e,t){let s={...t,id:Z()},n=this.getOutcomesPath(e);return await rt(Au.dirname(n)),await ic(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await C(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await _e(t);if(!a.trim())return[];let c=a.trim().split(`
916
+ `).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:kT(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function kT(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Df,Rf,gT,fT,hT,Af,yT,ua=S(()=>{"use strict";W();la();Df={".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"},Rf=[{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}],gT=[{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}],fT=[{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}],hT=[{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}],Af=[{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}],yT={typescript:Rf,javascript:Rf,python:gT,go:fT,rust:hT,java:Af,csharp:Af,php:[],ruby:[],unknown:[]};l($n,"extractSignatures");l($f,"extractDirectorySignatures");l(wT,"extractFromContent");l(kT,"cleanSignature")});import Su from"node:path";var ST,bT,bu,vT,$t,Sr=S(()=>{"use strict";ve();Ut();K();B();ST="outcomes",bT="outcomes.jsonl",bu=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Su.join(t,ST)}getOutcomesPath(e){return Su.join(this.getOutcomesDir(e),bT)}async record(e,t){let s={...t,id:Z()},n=this.getOutcomesPath(e);return await rt(Su.dirname(n)),await tc(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await C(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await _e(t);if(!a.trim())return[];let c=a.trim().split(`
917
917
  `).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await _e(t);return s.trim()?s.trim().split(`
918
- `).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let s=t.filter(n=>{if(!n.variance)return!1;let o=Kn(n.variance),i=Lt(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},jT=new Iu,$t=jT});import{z as Qe}from"zod";var ma,Tr,RT,uN,Du,Vf,ga=S(()=>{"use strict";ma=Qe.string(),Tr=Qe.object({primaryDomain:ma,secondaryDomains:Qe.array(ma),confidence:Qe.number().min(0).max(1),filePatterns:Qe.array(Qe.string()),relevantAgents:Qe.array(Qe.string())}),RT=Qe.object({classification:Tr,classifiedAt:Qe.string(),source:Qe.enum(["cache","history","llm","heuristic"]),descriptionHash:Qe.string(),projectId:Qe.string()}),uN=Qe.object({entries:Qe.record(Qe.string(),RT),confirmedPatterns:Qe.array(Qe.object({descriptionHash:Qe.string(),classification:Tr,confirmedAt:Qe.string(),taskDescription:Qe.string()}))}),Du={entries:{},confirmedPatterns:[]},Vf={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import IT from"node:fs/promises";import Kf from"node:path";function Jf(r){return Tn(r.toLowerCase().trim())}async function zf(r){try{let e=Kf.join(r,"storage","classification-cache.json"),t=await IT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e)?Du:(console.warn("[classifier] Failed to load cache:",k(e)),Du)}}async function DT(r,e){try{let t=Kf.join(r,"storage","classification-cache.json");await de(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function $T(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Gs(s.classifiedAt,36e5)?null:s.classification}function MT(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var $u,OT,Xf,Yf=S(()=>{"use strict";io();ga();W();kn();B();En();l(Jf,"hashDescription");l(zf,"loadCache");l(DT,"saveCache");l($T,"lookupCache");l(MT,"lookupPatterns");$u=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=Jf(e),o=await zf(s),i=$T(o,n,t);if(i)return{classification:i,source:"cache"};let a=MT(o,n);return a?{classification:a,source:"history"}:{classification:Vf,source:"heuristic"}}async confirmClassification(e,t,s){let n=Jf(e),o=await zf(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await DT(s,o))}},OT=new $u,Xf=OT});import _T from"node:fs/promises";import NT from"node:path";var Mu,LT,fa,Ou=S(()=>{"use strict";Tu();Te();ve();yo();dr();tr();vt();Oo();Cu();pa();W();Je();vr();Yf();Mu=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await $.getProjectId(s),o=A.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],m=[],p=u.map((M,y)=>{if(M.status==="fulfilled")return M.value;m.push(d[y]),console.warn(`Context tool "${d[y]}" failed: ${k(M.reason)}`)}),[g,w,b]=p,h={level:m.length===0?"full":m.length>=2?"minimal":"partial",failedTools:m},x=this.shouldFragment(a,t),T=null;x&&e==="task"&&(T=await this.createSubtasks(t,a,[],n));let I=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:x,subtasks:T,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:w??null,velocityContext:b??null,contextDegradation:h,rpiContext:I}}resolveRpiPhase(e){try{let{prjctDb:t}=(ee(),bt(li)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),Fs(e,t,{maxFiles:10,minScore:.15}),_o(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await rn(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(`
918
+ `).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let s=t.filter(n=>{if(!n.variance)return!1;let o=zn(n.variance),i=Lt(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},vT=new bu,$t=vT});import{z as Qe}from"zod";var da,ma,TT,rN,vu,Mf,Tu=S(()=>{"use strict";da=Qe.string(),ma=Qe.object({primaryDomain:da,secondaryDomains:Qe.array(da),confidence:Qe.number().min(0).max(1),filePatterns:Qe.array(Qe.string()),relevantAgents:Qe.array(Qe.string())}),TT=Qe.object({classification:ma,classifiedAt:Qe.string(),source:Qe.enum(["cache","history","llm","heuristic"]),descriptionHash:Qe.string(),projectId:Qe.string()}),rN=Qe.object({entries:Qe.record(Qe.string(),TT),confirmedPatterns:Qe.array(Qe.object({descriptionHash:Qe.string(),classification:ma,confirmedAt:Qe.string(),taskDescription:Qe.string()}))}),vu={entries:{},confirmedPatterns:[]},Mf={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import CT from"node:fs/promises";import Nf from"node:path";function Of(r){return vn(r.toLowerCase().trim())}async function _f(r){try{let e=Nf.join(r,"storage","classification-cache.json"),t=await CT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e)?vu:(console.warn("[classifier] Failed to load cache:",k(e)),vu)}}async function PT(r,e){try{let t=Nf.join(r,"storage","classification-cache.json");await de(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function xT(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Ws(s.classifiedAt,36e5)?null:s.classification}function jT(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Eu,RT,Lf,Ff=S(()=>{"use strict";so();Tu();W();wn();B();Tn();l(Of,"hashDescription");l(_f,"loadCache");l(PT,"saveCache");l(xT,"lookupCache");l(jT,"lookupPatterns");Eu=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=Of(e),o=await _f(s),i=xT(o,n,t);if(i)return{classification:i,source:"cache"};let a=jT(o,n);return a?{classification:a,source:"history"}:{classification:Mf,source:"heuristic"}}async confirmClassification(e,t,s){let n=Of(e),o=await _f(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await PT(s,o))}},RT=new Eu,Lf=RT});import AT from"node:fs/promises";import IT from"node:path";var Cu,DT,pa,Pu=S(()=>{"use strict";gu();Te();ve();po();lr();er();vt();Ao();hu();ua();W();Je();Sr();Ff();Cu=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await $.getProjectId(s),o=A.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=u.map((M,y)=>{if(M.status==="fulfilled")return M.value;p.push(d[y]),console.warn(`Context tool "${d[y]}" failed: ${k(M.reason)}`)}),[g,w,b]=m,h={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},x=this.shouldFragment(a,t),T=null;x&&e==="task"&&(T=await this.createSubtasks(t,a,[],n));let I=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:x,subtasks:T,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:w??null,velocityContext:b??null,contextDegradation:h,rpiContext:I}}resolveRpiPhase(e){try{let{prjctDb:t}=(ee(),bt(ri)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),nn(e,t,{maxFiles:10,minScore:.15}),aa(t,{commits:10,maxFiles:10})]),i=n.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(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
919
919
  `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,s]=await Promise.all([F("git branch --show-current",{cwd:e}),F("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
920
- `).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:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Qt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await mt.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 $t.getAll(e);if(t.length===0)return null;let s=ca(t,Xs);return s.sprints.length===0?null:Ff(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=NT.join(e,"analysis","repo-analysis.json"),s=await _T.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return O(t)||console.warn("Failed to load repo-analysis.json:",k(t)),null}}async detectDomains(e,t,s){let n=A.getGlobalProjectPath(t),{classification:o}=await Xf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,m=i.get(c)||[],p=m.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:p?"in_progress":"pending",dependsOn:m,order:u+1}});return await L.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let u=s[c];if(e.includes(u)){let d=n.get(u);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(u=>!n.has(u.id)&&u.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},LT=new Mu,fa=LT});function FT(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var _u,UT,tt,Qf=S(()=>{"use strict";Ut();X();xn();xn();l(FT,"generateApprovalPrompt");_u=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return sl.includes(e)}isDestructive(e){return nl.includes(e)}isToolAllowedInPlanning(e){return vi.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>vi.includes(s)):t}startPlanning(e,t,s){let n={id:Z(),projectId:e,command:t,params:s,status:me.GATHERING,startedAt:v(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[me.GATHERING,me.ANALYZING,me.PROPOSING,me.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:v()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===me.APPROVED?s.approvedAt=v():t===me.EXECUTING?s.executionStartedAt=v():(t===me.COMPLETED||t===me.ABORTED)&&(s.completedAt=v()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=me.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=me.PENDING_APPROVAL,this.formatPlanForApproval(s)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let s=this.getActivePlan(e);return!s||s.status!==me.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=me.APPROVED,s.approvedAt=v(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.args})),{approved:!0,planId:s.id,steps:s.steps,message:`Plan approved. ${s.steps.length} steps to execute.`})}rejectPlan(e,t=null){let s=this.getActivePlan(e);return s?(s.status=me.REJECTED,s.userFeedback=t,s.completedAt=v(),this.activePlans.delete(e),{rejected:!0,planId:s.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==me.APPROVED?null:(t.status=me.EXECUTING,t.executionStartedAt=v(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==me.EXECUTING)return null;let s=t.steps[t.currentStep];return s?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:s,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let s=this.getActivePlan(e);return!s||s.status!==me.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=v(),s.currentStep++,this.getNextStep(e))}failStep(e,t){let s=this.getActivePlan(e);return s?(s.steps[s.currentStep].status="failed",s.steps[s.currentStep].error=t,{failed:!0,step:s.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=me.COMPLETED,t.completedAt=v();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),s}abortPlan(e,t="User requested"){let s=this.getActivePlan(e);if(!s)return null;s.status=me.ABORTED,s.completedAt=v(),s.abortReason=t;let n={aborted:!0,planId:s.id,reason:t,completedSteps:s.steps.filter(o=>o.status==="completed").length,totalSteps:s.steps.length};return this.activePlans.delete(e),n}generateApprovalPrompt(e,t){return FT(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[me.GATHERING]:"\u{1F50D}",[me.ANALYZING]:"\u{1F9E0}",[me.PROPOSING]:"\u{1F4DD}",[me.PENDING_APPROVAL]:"\u23F3",[me.APPROVED]:"\u2705",[me.EXECUTING]:"\u26A1",[me.COMPLETED]:"\u{1F389}",[me.REJECTED]:"\u274C",[me.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===me.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
921
- `)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},UT=new _u,tt=UT});var Nu,HT,Zf,eh=S(()=>{"use strict";X();vr();Nu=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await $t.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,n=await $t.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await $t.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let n=[];for(let[o,i]of s){let a=i.length,c=i.filter(b=>b.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((b,h)=>b+h.qualityScore,0)/a,m=i.filter(b=>{if(!b.variance)return!1;let h=Kn(b.variance),x=Lt(b.estimatedDuration);return x===0?!1:Math.abs(h)/x<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let b of i.filter(h=>h.completedAsPlanned))for(let h of b.tags||[])g.set(h,(g.get(h)||0)+1);let w=[...g.entries()].sort((b,h)=>h[1]-b[1]).slice(0,3).map(([b])=>b);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:w})}return n}async detectPatterns(e){let t=await $t.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>Kn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>Kn(c.variance)<0);o.length/t.length>.6&&s.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&s.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&s.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return s.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let n=(await $t.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+Lt(c.actualDuration),0),i=Math.round(o/n.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},HT=new Nu,Zf=HT});var oh={};ye(oh,{AgentAssignmentSchema:()=>th,OUTPUT_SCHEMAS:()=>nh,SubtaskBreakdownSchema:()=>sh,TaskClassificationSchema:()=>Tr,renderSchemaForPrompt:()=>WT});import{z as ft}from"zod";function WT(r){let e=nh[r];return e?`## OUTPUT FORMAT
920
+ `).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Qt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await pt.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 $t.getAll(e);if(t.length===0)return null;let s=oa(t,Xs);return s.sprints.length===0?null:Pf(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=IT.join(e,"analysis","repo-analysis.json"),s=await AT.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return O(t)||console.warn("Failed to load repo-analysis.json:",k(t)),null}}async detectDomains(e,t,s){let n=A.getGlobalProjectPath(t),{classification:o}=await Lf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,p=i.get(c)||[],m=p.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:m?"in_progress":"pending",dependsOn:p,order:u+1}});return await L.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let u=s[c];if(e.includes(u)){let d=n.get(u);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(u=>!n.has(u.id)&&u.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},DT=new Cu,pa=DT});function $T(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 xu,MT,tt,Uf=S(()=>{"use strict";Ut();K();Pn();Pn();l($T,"generateApprovalPrompt");xu=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Yc.includes(e)}isDestructive(e){return Qc.includes(e)}isToolAllowedInPlanning(e){return yi.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>yi.includes(s)):t}startPlanning(e,t,s){let n={id:Z(),projectId:e,command:t,params:s,status:pe.GATHERING,startedAt:v(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[pe.GATHERING,pe.ANALYZING,pe.PROPOSING,pe.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:v()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===pe.APPROVED?s.approvedAt=v():t===pe.EXECUTING?s.executionStartedAt=v():(t===pe.COMPLETED||t===pe.ABORTED)&&(s.completedAt=v()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=pe.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=pe.PENDING_APPROVAL,this.formatPlanForApproval(s)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let s=this.getActivePlan(e);return!s||s.status!==pe.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=pe.APPROVED,s.approvedAt=v(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.args})),{approved:!0,planId:s.id,steps:s.steps,message:`Plan approved. ${s.steps.length} steps to execute.`})}rejectPlan(e,t=null){let s=this.getActivePlan(e);return s?(s.status=pe.REJECTED,s.userFeedback=t,s.completedAt=v(),this.activePlans.delete(e),{rejected:!0,planId:s.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==pe.APPROVED?null:(t.status=pe.EXECUTING,t.executionStartedAt=v(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==pe.EXECUTING)return null;let s=t.steps[t.currentStep];return s?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:s,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let s=this.getActivePlan(e);return!s||s.status!==pe.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=v(),s.currentStep++,this.getNextStep(e))}failStep(e,t){let s=this.getActivePlan(e);return s?(s.steps[s.currentStep].status="failed",s.steps[s.currentStep].error=t,{failed:!0,step:s.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=pe.COMPLETED,t.completedAt=v();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),s}abortPlan(e,t="User requested"){let s=this.getActivePlan(e);if(!s)return null;s.status=pe.ABORTED,s.completedAt=v(),s.abortReason=t;let n={aborted:!0,planId:s.id,reason:t,completedSteps:s.steps.filter(o=>o.status==="completed").length,totalSteps:s.steps.length};return this.activePlans.delete(e),n}generateApprovalPrompt(e,t){return $T(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[pe.GATHERING]:"\u{1F50D}",[pe.ANALYZING]:"\u{1F9E0}",[pe.PROPOSING]:"\u{1F4DD}",[pe.PENDING_APPROVAL]:"\u23F3",[pe.APPROVED]:"\u2705",[pe.EXECUTING]:"\u26A1",[pe.COMPLETED]:"\u{1F389}",[pe.REJECTED]:"\u274C",[pe.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===pe.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
921
+ `)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},MT=new xu,tt=MT});var ju,OT,Hf,Wf=S(()=>{"use strict";K();Sr();ju=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await $t.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((p,m)=>p+m.qualityScore,0)/t.length,n=await $t.getEstimateAccuracy(e),o=new Map;for(let p of t)for(let m of p.blockers||[])o.set(m,(o.get(m)||0)+1);let i=[...o.entries()].sort((p,m)=>m[1]-p[1]).slice(0,5).map(([p])=>p),c=(await this.getAgentMetrics(e)).sort((p,m)=>m.successRate-p.successRate).slice(0,3).map(p=>p.agent),d=(await this.detectPatterns(e)).map(p=>p.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await $t.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let n=[];for(let[o,i]of s){let a=i.length,c=i.filter(b=>b.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((b,h)=>b+h.qualityScore,0)/a,p=i.filter(b=>{if(!b.variance)return!1;let h=zn(b.variance),x=Lt(b.estimatedDuration);return x===0?!1:Math.abs(h)/x<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let b of i.filter(h=>h.completedAsPlanned))for(let h of b.tags||[])g.set(h,(g.get(h)||0)+1);let w=[...g.entries()].sort((b,h)=>h[1]-b[1]).slice(0,3).map(([b])=>b);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:w})}return n}async detectPatterns(e){let t=await $t.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>zn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>zn(c.variance)<0);o.length/t.length>.6&&s.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&s.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&s.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return s.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let n=(await $t.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+Lt(c.actualDuration),0),i=Math.round(o/n.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},OT=new ju,Hf=OT});var Jf={};ye(Jf,{AgentAssignmentSchema:()=>Gf,OUTPUT_SCHEMAS:()=>Bf,SubtaskBreakdownSchema:()=>qf,renderSchemaForPrompt:()=>_T});import{z as ft}from"zod";function _T(r){let e=Bf[r];return e?`## OUTPUT FORMAT
922
922
 
923
923
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
924
924
 
@@ -927,10 +927,10 @@ ${e.example}
927
927
  \`\`\`
928
928
 
929
929
  Fields:
930
- ${GT(e.schema)}`:null}function GT(r){if(r instanceof ft.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${rh(s)}`).join(`
931
- `)}return"(see example above)"}function rh(r){return r instanceof ft.ZodString?"string":r instanceof ft.ZodNumber?"number":r instanceof ft.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ft.ZodArray?`array of ${rh(r.element)}`:r instanceof ft.ZodObject?"object":"any"}var th,sh,nh,ih=S(()=>{"use strict";ga();ga();th=ft.object({agentName:ft.string(),reasoning:ft.string(),confidence:ft.number().min(0).max(1)}),sh=ft.object({subtasks:ft.array(ft.object({description:ft.string(),domain:ma,agent:ft.string(),dependsOn:ft.array(ft.number())})),effort:ft.enum(["low","medium","high"])}),nh={classification:{schema:Tr,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:th,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:sh,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(WT,"renderSchemaForPrompt");l(GT,"describeSchema");l(rh,"describeField")});import ah from"node:fs/promises";import Er from"node:path";function ha(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
932
- ... (truncated to ~${e} tokens)`}function ch(r){return Math.ceil(r.length/4)}var Lu,Fu,Uu,qT,lh,uh=S(()=>{"use strict";Hi();Vt();vt();W();B();ut();eh();fs();Lu={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ha,"truncateToTokenBudget");l(ch,"estimateTokens");Fu=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Lu,...e}}addSection(e,t){let s=ha(e,t),n=ch(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ha(s,o);return this.used+=ch(i),i}return this.used+=n,s}},Uu=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await C(e)){let n=await ah.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){O(n)||console.error(`Template loading warning: ${k(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=ht(`global/modules/${e}`);if(t)return t;let s=Er.join(jt,"templates/global/modules",e);return this.getTemplate(s)}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=$s("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=ht(n);if(o){let i=Er.basename(n,".md");t[i]=o}}}else{let n=Er.join(jt,"templates","checklists");if(await C(n)){let o=(await ah.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Er.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){O(s)||console.error(`Checklist loading warning: ${k(s)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[s,n]=await Promise.all([L.read(e),ce.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(O(s)||s instanceof SyntaxError)return null;throw s}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let s=[];if(s.push("## AUTO-INJECTED CONTEXT"),s.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);s.push(`**Current Task**: ${t.currentTask.description}`),s.push(`- Started: ${o} ago`)}else s.push("**Current Task**: None");if(s.push(""),t.queue.length>0){s.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)s.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&s.push(`- ... and ${t.queue.length-3} more`)}s.push("");try{let o=await Zf.detectPatterns(e);if(o.length>0){s.push("**Project Conventions**");for(let i of o.slice(0,3))s.push(`- ${i.description}`),i.suggestedAction&&s.push(` \u2192 ${i.suggestedAction}`);s.push("")}}catch(o){!O(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${k(o)}`)}s.push("---"),s.push("");let n=s.join(`
933
- `);return ha(n,Lu.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=Er.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let m=d?.skipNativeContext??!1,p=d?.mcpActive??!1,g=[],w=e.frontmatter?.name?.replace("p:","")||"",b={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&b.agents&&(g.push(`# AGENT: ${n.name}
930
+ ${NT(e.schema)}`:null}function NT(r){if(r instanceof ft.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${Vf(s)}`).join(`
931
+ `)}return"(see example above)"}function Vf(r){return r instanceof ft.ZodString?"string":r instanceof ft.ZodNumber?"number":r instanceof ft.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ft.ZodArray?`array of ${Vf(r.element)}`:r instanceof ft.ZodObject?"object":"any"}var Gf,qf,Bf,zf=S(()=>{"use strict";Tu();Gf=ft.object({agentName:ft.string(),reasoning:ft.string(),confidence:ft.number().min(0).max(1)}),qf=ft.object({subtasks:ft.array(ft.object({description:ft.string(),domain:da,agent:ft.string(),dependsOn:ft.array(ft.number())})),effort:ft.enum(["low","medium","high"])}),Bf={classification:{schema:ma,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Gf,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:qf,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(_T,"renderSchemaForPrompt");l(NT,"describeSchema");l(Vf,"describeField")});import Xf from"node:fs/promises";import br from"node:path";function ga(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
932
+ ... (truncated to ~${e} tokens)`}function Kf(r){return Math.ceil(r.length/4)}var Ru,Au,Iu,LT,Yf,Qf=S(()=>{"use strict";Li();Vt();vt();W();B();ut();Wf();fs();Ru={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ga,"truncateToTokenBudget");l(Kf,"estimateTokens");Au=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Ru,...e}}addSection(e,t){let s=ga(e,t),n=Kf(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ga(s,o);return this.used+=Kf(i),i}return this.used+=n,s}},Iu=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await C(e)){let n=await Xf.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){O(n)||console.error(`Template loading warning: ${k(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=ht(`global/modules/${e}`);if(t)return t;let s=br.join(jt,"templates/global/modules",e);return this.getTemplate(s)}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=$s("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=ht(n);if(o){let i=br.basename(n,".md");t[i]=o}}}else{let n=br.join(jt,"templates","checklists");if(await C(n)){let o=(await Xf.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=br.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){O(s)||console.error(`Checklist loading warning: ${k(s)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[s,n]=await Promise.all([L.read(e),ce.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(O(s)||s instanceof SyntaxError)return null;throw s}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let s=[];if(s.push("## AUTO-INJECTED CONTEXT"),s.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);s.push(`**Current Task**: ${t.currentTask.description}`),s.push(`- Started: ${o} ago`)}else s.push("**Current Task**: None");if(s.push(""),t.queue.length>0){s.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)s.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&s.push(`- ... and ${t.queue.length-3} more`)}s.push("");try{let o=await Hf.detectPatterns(e);if(o.length>0){s.push("**Project Conventions**");for(let i of o.slice(0,3))s.push(`- ${i.description}`),i.suggestedAction&&s.push(` \u2192 ${i.suggestedAction}`);s.push("")}}catch(o){!O(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${k(o)}`)}s.push("---"),s.push("");let n=s.join(`
933
+ `);return ga(n,Ru.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=br.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&u.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let p=d?.skipNativeContext??!1,m=d?.mcpActive??!1,g=[],w=e.frontmatter?.name?.replace("p:","")||"",b={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&b.agents&&(g.push(`# AGENT: ${n.name}
934
934
  `),n.role&&g.push(`Role: ${n.role}
935
935
  `),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
936
936
  `),g.push(`
@@ -939,7 +939,7 @@ Apply specialized expertise. Read agent file for details if needed.
939
939
  `)),g.push(`TASK: ${e.frontmatter.description}
940
940
  `),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
941
941
  `);let h=t;(h.params?.task||h.params?.description)&&g.push(`INPUT: ${h.params.task||h.params.description}
942
- `);let x=t.projectPath;if(x){let j=[`project: ${Er.basename(x)}`,`path: ${x}`,"git: true"];u?.realContext?.gitBranch&&j.push(`branch: ${u.realContext.gitBranch}`),j.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
942
+ `);let x=t.projectPath;if(x){let j=[`project: ${br.basename(x)}`,`path: ${x}`,"git: true"];u?.realContext?.gitBranch&&j.push(`branch: ${u.realContext.gitBranch}`),j.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
943
943
  <env>
944
944
  ${j.join(`
945
945
  `)}
@@ -956,14 +956,14 @@ ${j.join(`
956
956
  `),y.testDir&&g.push(`**Test Dir**: ${y.testDir}
957
957
  `),g.push(`**Files Analyzed**: ${y.fileCount}
958
958
  `),g.push(`**Analysis Status**: ${y.status}${y.commitHash?` (commit: ${y.commitHash.slice(0,8)})`:""}
959
- `),!m)){if(y.patterns?.length>0){g.push(`
959
+ `),!p)){if(y.patterns?.length>0){g.push(`
960
960
  ### Code Patterns (Follow These)
961
961
  `);for(let j of y.patterns)g.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
962
962
  `)}if(y.antiPatterns?.length>0){g.push(`
963
963
  ### Anti-Patterns (Avoid These)
964
964
  `);for(let j of y.antiPatterns)g.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
965
965
  `)}}g.push(`
966
- `)}if(!m){let y=s?.codePatterns||"";if(b.patterns&&y&&y.trim()){let D=this.extractPatternSummary(y);D&&(g.push(`## CODE PATTERNS
966
+ `)}if(!p){let y=s?.codePatterns||"";if(b.patterns&&y&&y.trim()){let D=this.extractPatternSummary(y);D&&(g.push(`## CODE PATTERNS
967
967
  `),g.push(D),g.push(`
968
968
  Full patterns: Read analysis/patterns.md
969
969
  `))}let j=s?.analysis||"";if(b.patterns&&j&&j.trim()){let D=j.match(/Stack[:\s]+([^\n]+)/i)||j.match(/Technology[:\s]+([^\n]+)/i),G=D?D[1].trim():"detected";g.push(`
@@ -1034,7 +1034,7 @@ Read files before modifying.
1034
1034
  `)}g.push(`Plan:
1035
1035
  `);for(let y=0;y<i.plan.length;y++)g.push(` ${y+1}. ${i.plan[y]}
1036
1036
  `);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
1037
- `)}if(!p&&a&&a.length>0){g.push(`
1037
+ `)}if(!m&&a&&a.length>0){g.push(`
1038
1038
  ## CONTEXT (apply these)
1039
1039
  `);for(let y of a)g.push(`- **${y.title}**: ${y.content}
1040
1040
  `),y.tags&&y.tags.length>0&&g.push(` Tags: ${y.tags.join(", ")}
@@ -1081,7 +1081,7 @@ ${y.planDoc}
1081
1081
  **Context for this subtask:**
1082
1082
  ${j.outputForNextAgent}
1083
1083
  `)}g.push(`
1084
- `)}let M=this.getSchemaTypeForCommand(w);if(M){let{renderSchemaForPrompt:y}=await Promise.resolve().then(()=>(ih(),oh)),j=y(M);j&&g.push(`
1084
+ `)}let M=this.getSchemaTypeForCommand(w);if(M){let{renderSchemaForPrompt:y}=await Promise.resolve().then(()=>(zf(),Jf)),j=y(M);j&&g.push(`
1085
1085
  ${j}
1086
1086
  `)}if(b.checklist){let y=await this.loadChecklistRouting(),j=await this.loadChecklists();y&&Object.keys(j).length>0&&(g.push(`
1087
1087
  ## QUALITY CHECKLISTS
@@ -1094,7 +1094,7 @@ ${j}
1094
1094
  `),g.push(`- Be concise. No preamble, no filler.
1095
1095
  `),g.push(`- Use sub-agents for exploration that produces >5 file reads.
1096
1096
  `),g.push(`- Prefer file:line references over dumping full file contents.
1097
- `),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new Fu({totalPrompt:Lu.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
1097
+ `),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new Au({totalPrompt:Ru.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
1098
1098
  ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
1099
1099
 
1100
1100
  `):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
@@ -1111,13 +1111,13 @@ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
1111
1111
  `);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
1112
1112
  Avoid:
1113
1113
  ${a}`)}let o=t.join(`
1114
- `);return ha(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},qT=new Uu,lh=qT});import Hu from"node:fs/promises";import BT from"node:os";import Wu from"node:path";function dh(){let r=process.env.PRJCT_CLI_HOME?.trim()||Wu.join(BT.homedir(),".prjct-cli");return Wu.join(r,".running")}async function VT(r){try{let e=dh(),t=Wu.dirname(e);await C(t)||await Hu.mkdir(t,{recursive:!0}),await Hu.writeFile(e,`/p:${r}`)}catch{}}async function JT(){try{let r=dh();await C(r)&&await Hu.unlink(r)}catch{}}var Gu,zT,ya,qu=S(()=>{"use strict";bf();W();Ef();B();$o();Of();ji();_f();Mi();Ou();Qf();uh();fs();l(dh,"getRunningFilePath");l(VT,"signalStart");l(JT,"signalEnd");Gu=class{static{l(this,"CommandExecutor")}async signalStart(e){await VT(e)}async signalEnd(){await JT()}requiresOrchestration(e){return kf.includes(e)?!0:!Sf.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(br.shouldEscalate(e,n)){let o=br.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Sl.load(e),i=await An.build(s,t),a=tt.requiresPlanning(e),c=tt.isDestructive(e),u=tt.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=tt.startPlanning(i.projectId,e,t):u&&(d=tt.getActivePlan(i.projectId));let m=t.task||t.description||"",p=null;if(this.requiresOrchestration(e)&&m)try{if(p=await fa.execute(e,m,s),p.detectedDomains.length>0&&Tf.orchestrate(p.detectedDomains),p.requiresFragmentation&&p.subtasks){let D=p.subtasks.map(G=>({id:G.id,domain:G.domain,description:G.description,status:G.status}));Mf(D)}}catch(D){console.warn(`\u26A0\uFE0F Orchestrator warning: ${k(D)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},w=await An.loadState(i),b=await nn("prjct"),h=null,x=null;i.projectId&&(h={commit_footer:await Tt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Tt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Tt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Tt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},b||(x=await Tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let T={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:tt.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},y=(await(lt(),bt(Nt)).getActiveProvider()).name==="claude",j=await lh.build(o,g,w,null,h,null,x,T,p,{skipNativeContext:y,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),br.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:w,prompt:j,agenticDelegation:!0,agenticMode:!0,learnedPatterns:h,relevantMemories:x,orchestratorContext:p,memory:{create:l(D=>Tt.createMemory(i.projectId,D),"create"),autoRemember:l((D,G,Q)=>Tt.autoRemember(i.projectId,D,G,Q),"autoRemember"),search:l(D=>Tt.searchMemories(i.projectId,D),"search"),findByTags:l(D=>Tt.findByTags(i.projectId,D),"findByTags"),getStats:l(()=>Tt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(D=>tt.recordGatheredInfo(i.projectId,D),"recordInfo"),setAnalysis:l(D=>tt.setAnalysis(i.projectId,D),"setAnalysis"),propose:l(D=>tt.proposePlan(i.projectId,D),"propose"),approve:l(D=>tt.approvePlan(i.projectId,D),"approve"),reject:l(D=>tt.rejectPlan(i.projectId,D),"reject"),getApprovalPrompt:l(()=>tt.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>tt.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>tt.getNextStep(i.projectId),"getNextStep"),completeStep:l(D=>tt.completeStep(i.projectId,D),"completeStep"),failStep:l(D=>tt.failStep(i.projectId,D),"failStep"),abort:l(D=>tt.abortPlan(i.projectId,D),"abort"),getStatus:l(()=>tt.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>tt.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=br.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=br.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:k(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},zT=new Gu,ya=zT});import KT from"node:https";import XT from"node:os";import Bu from"node:path";import cs from"chalk";var Vu,wa,Ju=S(()=>{"use strict";W();B();Vu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Bu.join(XT.homedir(),".prjct-cli","config"),this.cacheFile=Bu.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=Bu.join(__dirname,"..","..","package.json");return(await Ae(e))?.version??null}catch(e){return console.error("Error reading package version:",k(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},n=KT.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await Ae(this.cacheFile)}catch{}return null}async writeCache(e){try{await de(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),s=Date.now();if(t?.lastCheck&&s-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
1114
+ `);return ga(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},LT=new Iu,Yf=LT});import Du from"node:fs/promises";import FT from"node:os";import $u from"node:path";function Zf(){let r=process.env.PRJCT_CLI_HOME?.trim()||$u.join(FT.homedir(),".prjct-cli");return $u.join(r,".running")}async function UT(r){try{let e=Zf(),t=$u.dirname(e);await C(t)||await Du.mkdir(t,{recursive:!0}),await Du.writeFile(e,`/p:${r}`)}catch{}}async function HT(){try{let r=Zf();await C(r)&&await Du.unlink(r)}catch{}}var Mu,WT,fa,Ou=S(()=>{"use strict";cf();W();df();B();jo();vf();Ci();Tf();Ii();Pu();Uf();Qf();fs();l(Zf,"getRunningFilePath");l(UT,"signalStart");l(HT,"signalEnd");Mu=class{static{l(this,"CommandExecutor")}async signalStart(e){await UT(e)}async signalEnd(){await HT()}requiresOrchestration(e){return of.includes(e)?!0:!af.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(kr.shouldEscalate(e,n)){let o=kr.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await dl.load(e),i=await jn.build(s,t),a=tt.requiresPlanning(e),c=tt.isDestructive(e),u=tt.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=tt.startPlanning(i.projectId,e,t):u&&(d=tt.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await pa.execute(e,p,s),m.detectedDomains.length>0&&uf.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let D=m.subtasks.map(G=>({id:G.id,domain:G.domain,description:G.description,status:G.status}));bf(D)}}catch(D){console.warn(`\u26A0\uFE0F Orchestrator warning: ${k(D)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},w=await jn.loadState(i),b=await sn("prjct"),h=null,x=null;i.projectId&&(h={commit_footer:await Tt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Tt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Tt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Tt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},b||(x=await Tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let T={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:tt.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},y=(await(lt(),bt(Nt)).getActiveProvider()).name==="claude",j=await Yf.build(o,g,w,null,h,null,x,T,m,{skipNativeContext:y,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),kr.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:w,prompt:j,agenticDelegation:!0,agenticMode:!0,learnedPatterns:h,relevantMemories:x,orchestratorContext:m,memory:{create:l(D=>Tt.createMemory(i.projectId,D),"create"),autoRemember:l((D,G,Q)=>Tt.autoRemember(i.projectId,D,G,Q),"autoRemember"),search:l(D=>Tt.searchMemories(i.projectId,D),"search"),findByTags:l(D=>Tt.findByTags(i.projectId,D),"findByTags"),getStats:l(()=>Tt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(D=>tt.recordGatheredInfo(i.projectId,D),"recordInfo"),setAnalysis:l(D=>tt.setAnalysis(i.projectId,D),"setAnalysis"),propose:l(D=>tt.proposePlan(i.projectId,D),"propose"),approve:l(D=>tt.approvePlan(i.projectId,D),"approve"),reject:l(D=>tt.rejectPlan(i.projectId,D),"reject"),getApprovalPrompt:l(()=>tt.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>tt.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>tt.getNextStep(i.projectId),"getNextStep"),completeStep:l(D=>tt.completeStep(i.projectId,D),"completeStep"),failStep:l(D=>tt.failStep(i.projectId,D),"failStep"),abort:l(D=>tt.abortPlan(i.projectId,D),"abort"),getStatus:l(()=>tt.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>tt.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=kr.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=kr.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:k(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},WT=new Mu,fa=WT});import GT from"node:https";import qT from"node:os";import _u from"node:path";import cs from"chalk";var Nu,ha,Lu=S(()=>{"use strict";W();B();Nu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=_u.join(qT.homedir(),".prjct-cli","config"),this.cacheFile=_u.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=_u.join(__dirname,"..","..","package.json");return(await Ae(e))?.version??null}catch(e){return console.error("Error reading package version:",k(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},n=GT.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await Ae(this.cacheFile)}catch{}return null}async writeCache(e){try{await de(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),s=Date.now();if(t?.lastCheck&&s-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
1115
1115
  `+cs.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")+`
1116
1116
  `+cs.yellow("\u2502")+" "+cs.bold("Update available!")+" "+cs.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+cs.yellow("\u2502")+`
1117
1117
  `+cs.yellow("\u2502")+" "+cs.yellow("\u2502")+`
1118
1118
  `+cs.yellow("\u2502")+" Run: "+cs.cyan("npm update -g prjct-cli")+" "+cs.yellow("\u2502")+`
1119
1119
  `+cs.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")+`
1120
- `}},wa=Vu});import ph from"node:path";async function ZT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(ph.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(ph.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function eE(){return{...YT}}function tE(){return{...QT}}async function mh(){return ka||(ka=await ZT()?eE():tE(),ka)}var ka,YT,QT,gh=S(()=>{"use strict";B();ka=null,YT={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},QT={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(ZT,"isClaudeEnvironment");l(eE,"getClaudeAgent");l(tE,"getTerminalAgent");l(mh,"detect")});import Sa from"node:fs/promises";var zu,fh,hh=S(()=>{"use strict";W();B();zu=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let s={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${s[t]||s.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${k(t)}`)}return await Sa.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(s){console.warn(`MCP writeFile failed, falling back to fs: ${k(s)}`)}await Sa.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${k(t)}`)}return await Sa.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await Sa.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1120
+ `}},ha=Nu});import eh from"node:path";async function JT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(eh.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(eh.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function zT(){return{...BT}}function XT(){return{...VT}}async function th(){return ya||(ya=await JT()?zT():XT(),ya)}var ya,BT,VT,sh=S(()=>{"use strict";B();ya=null,BT={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},VT={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(JT,"isClaudeEnvironment");l(zT,"getClaudeAgent");l(XT,"getTerminalAgent");l(th,"detect")});import wa from"node:fs/promises";var Fu,nh,rh=S(()=>{"use strict";W();B();Fu=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let s={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${s[t]||s.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${k(t)}`)}return await wa.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(s){console.warn(`MCP writeFile failed, falling back to fs: ${k(s)}`)}await wa.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${k(t)}`)}return await wa.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await wa.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1121
1121
  ${e.map((t,s)=>`${s+1}. ${t}`).join(`
1122
1122
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
1123
1123
 
@@ -1162,8 +1162,8 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
1162
1162
 
1163
1163
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
1164
1164
 
1165
- 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}}},fh=zu});function yh(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&nE.has(e.code))return!0;if(e.code&&kh.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 rE(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&kh.has(e.code))}function wh(r,e,t){let s=on.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(on.delete(r),!1):!0:!1}function Ku(r,e){let t=on.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),on.set(r,t)}function oE(r){on.delete(r)}var nE,kh,on,ba,Sh,VL,bh=S(()=>{"use strict";nE=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),kh=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(yh,"isTransientError");l(rE,"isPermanentError");on=new Map;l(wh,"isCircuitOpen");l(Ku,"recordFailure");l(oE,"recordSuccess");ba=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(wh(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return oE(t),o}catch(o){if(s=o,n++,rE(o))throw Ku(t,this.options.circuitBreakerThreshold),o;if(!(yh(o)&&n<this.options.maxAttempts))throw Ku(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Ku(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return yh(e)}isCircuitOpen(e){return wh(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return on.get(e)}resetCircuit(e){on.delete(e)}resetAllCircuits(){on.clear()}},Sh=new ba({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),VL=new ba({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var iE,Xu,va,vh=S(()=>{"use strict";xs();gh();hh();bh();iE=["claude"],Xu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Sh.execute(async()=>{if(this.agentInfo=await mh(),!this.agentInfo?.isSupported)throw ao.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!iE.includes(e))throw ao.notSupported(this.agentInfo?.type??"unknown");return this.agent=new fh,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},va=new Xu});var Yu,Cr,Qu=S(()=>{"use strict";Yu=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Cr=new Yu});import Et from"node:path";async function aE(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 C(Et.join(r,"pnpm-lock.yaml"))?"pnpm":await C(Et.join(r,"yarn.lock"))?"yarn":await C(Et.join(r,"bun.lockb"))||await C(Et.join(r,"bun.lock"))?"bun":(await C(Et.join(r,"package-lock.json")),"npm")}function Th(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function cE(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Pr(r,e){for(let n of lE)if(await C(Et.join(r,n)))return n;let s=(e??await Cs(r)).find(n=>n.endsWith(uE));if(s)return s}async function Us(r){for(let e of dE)if(await C(Et.join(r,e)))return e}async function Ta(r){let e=Et.join(r,"package.json"),t=await Ae(e,null);if(t){let a=await aE(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Th(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Th(a,"typecheck")}),c.test&&(u.test={tool:a,command:cE(a)}),u.versionFile=await Pr(r),u.changelogFile=await Us(r),u}if(await C(Et.join(r,"pytest.ini"))){let a=await Pr(r),c=await Us(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await _e(Et.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Pr(r),c=await Us(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(Et.join(r,"Cargo.toml"))){let a=await Us(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(Et.join(r,"go.mod"))){let a=await Pr(r),c=await Us(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await Cs(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Pr(r,n),c=await Us(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(Et.join(r,"pom.xml"))){let a=await Us(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(Et.join(r,"gradlew"))&&(await C(Et.join(r,"build.gradle"))||await C(Et.join(r,"build.gradle.kts")))){let a=await Us(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Pr(r),i=await Us(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var lE,uE,dE,Zu=S(()=>{"use strict";B();l(aE,"detectPackageManager");l(Th,"pmRun");l(cE,"pmTest");lE=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],uE=".csproj",dE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Pr,"detectVersionFile");l(Us,"detectChangelogFile");l(Ta,"detectProjectCommands")});import*as Se from"@clack/prompts";import On from"chalk";var Ea,Eh,No,Ch=S(()=>{"use strict";B();Fe();Ea=[{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."}],Eh=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],No=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){Se.intro(On.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return Se.outro(On.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=Ea.findIndex(s=>s.value===this.detectedType),t=await Se.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Ea.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?Ea[e].value:void 0});return Se.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Se.multiselect({message:"Which AI agents do you use?",options:Eh.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return Se.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);Se.note(e,"Detected stack");let t=await Se.confirm({message:"Is this stack correct?",initialValue:!0});if(Se.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await Se.group({language:l(()=>Se.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>Se.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:s.language||this.detectedStack.language,framework:s.framework||void 0}}return!0}async stepPreferences(){let e=await Se.group({verbosity:l(()=>Se.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(()=>Se.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=[`${On.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${On.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${On.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${On.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${On.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1166
- `);Se.note(e,"Configuration Summary");let t=await Se.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Se.isCancel(t)||!t?(Se.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await Xt(e.join(t.homedir(),".claude"))&&s.push("claude"),await C(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await C(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await C(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await Xt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Je(),ap));await n("which codex"),s.push("codex")}catch{await Xt(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};s.language=c.typescript?"TypeScript":"JavaScript",c.next?s.framework="Next.js":c.nuxt?s.framework="Nuxt":c.react?s.framework="React":c.vue?s.framework="Vue":c["@angular/core"]?s.framework="Angular":c.express?s.framework="Express":c.hono?s.framework="Hono":c.fastify?s.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(s.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.includes("package-lock.json")&&(s.packageManager="npm"),(c.prisma||c["@prisma/client"])&&s.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&s.technologies.push("Drizzle"),c.tailwindcss&&s.technologies.push("Tailwind CSS"),c.zod&&s.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&s.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,Se.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Ea.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Eh.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});var Ph={};ye(Ph,{PlanningCommands:()=>Nn});import Ca from"node:fs/promises";import _n from"node:path";async function pE(){if(!ed){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(xa(),xh));ed=new r}return ed}var ed,Nn,Pa=S(()=>{"use strict";ri();Os();Te();ve();Ut();zs();Vt();wo();W();X();B();hs();kr();Fe();Zu();Ch();Mt();ed=null;l(pE,"getAnalysisCommands");Nn=class extends Ce{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let s={};if(typeof e=="string"||e===null?s={idea:e}:s=e,await this.initializeAgent(),await $.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=s.yes||!o||process.env.CI==="true",a=null;if(i)o&&s.yes&&(a=await new No(t).runNonInteractive());else if(a=await new No(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Qn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
1165
+ 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}}},nh=Fu});function oh(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&YT.has(e.code))return!0;if(e.code&&ah.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 QT(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&ah.has(e.code))}function ih(r,e,t){let s=rn.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(rn.delete(r),!1):!0:!1}function Uu(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 ZT(r){rn.delete(r)}var YT,ah,rn,ka,ch,FL,lh=S(()=>{"use strict";YT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),ah=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(oh,"isTransientError");l(QT,"isPermanentError");rn=new Map;l(ih,"isCircuitOpen");l(Uu,"recordFailure");l(ZT,"recordSuccess");ka=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(ih(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return ZT(t),o}catch(o){if(s=o,n++,QT(o))throw Uu(t,this.options.circuitBreakerThreshold),o;if(!(oh(o)&&n<this.options.maxAttempts))throw Uu(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Uu(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return oh(e)}isCircuitOpen(e){return ih(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return rn.get(e)}resetCircuit(e){rn.delete(e)}resetAllCircuits(){rn.clear()}},ch=new ka({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),FL=new ka({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var eE,Hu,Sa,uh=S(()=>{"use strict";xs();sh();rh();lh();eE=["claude"],Hu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await ch.execute(async()=>{if(this.agentInfo=await th(),!this.agentInfo?.isSupported)throw no.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!eE.includes(e))throw no.notSupported(this.agentInfo?.type??"unknown");return this.agent=new nh,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Sa=new Hu});var Wu,vr,Gu=S(()=>{"use strict";Wu=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},vr=new Wu});import Et from"node:path";async function tE(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 C(Et.join(r,"pnpm-lock.yaml"))?"pnpm":await C(Et.join(r,"yarn.lock"))?"yarn":await C(Et.join(r,"bun.lockb"))||await C(Et.join(r,"bun.lock"))?"bun":(await C(Et.join(r,"package-lock.json")),"npm")}function dh(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function sE(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Tr(r,e){for(let n of nE)if(await C(Et.join(r,n)))return n;let s=(e??await Cs(r)).find(n=>n.endsWith(rE));if(s)return s}async function Fs(r){for(let e of oE)if(await C(Et.join(r,e)))return e}async function ba(r){let e=Et.join(r,"package.json"),t=await Ae(e,null);if(t){let a=await tE(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:dh(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:dh(a,"typecheck")}),c.test&&(u.test={tool:a,command:sE(a)}),u.versionFile=await Tr(r),u.changelogFile=await Fs(r),u}if(await C(Et.join(r,"pytest.ini"))){let a=await Tr(r),c=await Fs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await _e(Et.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Tr(r),c=await Fs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(Et.join(r,"Cargo.toml"))){let a=await Fs(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(Et.join(r,"go.mod"))){let a=await Tr(r),c=await Fs(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await Cs(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Tr(r,n),c=await Fs(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(Et.join(r,"pom.xml"))){let a=await Fs(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(Et.join(r,"gradlew"))&&(await C(Et.join(r,"build.gradle"))||await C(Et.join(r,"build.gradle.kts")))){let a=await Fs(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Tr(r),i=await Fs(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var nE,rE,oE,qu=S(()=>{"use strict";B();l(tE,"detectPackageManager");l(dh,"pmRun");l(sE,"pmTest");nE=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],rE=".csproj",oE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Tr,"detectVersionFile");l(Fs,"detectChangelogFile");l(ba,"detectProjectCommands")});import*as Se from"@clack/prompts";import Mn from"chalk";var va,mh,Io,ph=S(()=>{"use strict";B();Fe();va=[{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."}],mh=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],Io=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){Se.intro(Mn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return Se.outro(Mn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=va.findIndex(s=>s.value===this.detectedType),t=await Se.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:va.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?va[e].value:void 0});return Se.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Se.multiselect({message:"Which AI agents do you use?",options:mh.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return Se.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);Se.note(e,"Detected stack");let t=await Se.confirm({message:"Is this stack correct?",initialValue:!0});if(Se.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await Se.group({language:l(()=>Se.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>Se.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:s.language||this.detectedStack.language,framework:s.framework||void 0}}return!0}async stepPreferences(){let e=await Se.group({verbosity:l(()=>Se.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(()=>Se.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=[`${Mn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Mn.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${Mn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Mn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Mn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1166
+ `);Se.note(e,"Configuration Summary");let t=await Se.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Se.isCancel(t)||!t?(Se.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await Kt(e.join(t.homedir(),".claude"))&&s.push("claude"),await C(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await C(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await C(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await Kt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Je(),Bd));await n("which codex"),s.push("codex")}catch{await Kt(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};s.language=c.typescript?"TypeScript":"JavaScript",c.next?s.framework="Next.js":c.nuxt?s.framework="Nuxt":c.react?s.framework="React":c.vue?s.framework="Vue":c["@angular/core"]?s.framework="Angular":c.express?s.framework="Express":c.hono?s.framework="Hono":c.fastify?s.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(s.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.includes("package-lock.json")&&(s.packageManager="npm"),(c.prisma||c["@prisma/client"])&&s.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&s.technologies.push("Drizzle"),c.tailwindcss&&s.technologies.push("Tailwind CSS"),c.zod&&s.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&s.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,Se.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return va.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return mh.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});var gh={};ye(gh,{PlanningCommands:()=>_n});import Ta from"node:fs/promises";import On from"node:path";async function iE(){if(!Bu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ca(),fh));Bu=new r}return Bu}var Bu,_n,Ea=S(()=>{"use strict";Zo();Os();Te();ve();Ut();Js();Vt();go();W();K();B();hs();yr();Fe();qu();ph();Mt();Bu=null;l(iE,"getAnalysisCommands");_n=class extends Ce{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let s={};if(typeof e=="string"||e===null?s={idea:e}:s=e,await this.initializeAgent(),await $.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=s.yes||!o||process.env.CI==="true",a=null;if(i)o&&s.yes&&(a=await new Io(t).runNonInteractive());else if(a=await new Io(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Yn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await $.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await A.ensureProjectStructure(p);let m=A.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
1167
1167
 
1168
1168
  No current task. Use \`/p:now\` to set focus.
1169
1169
  `,"core/next.md":`# NEXT
@@ -1183,7 +1183,7 @@ No current task. Use \`/p:now\` to set focus.
1183
1183
  `,"planning/roadmap.md":`# ROADMAP
1184
1184
 
1185
1185
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
1186
- `,"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[x,T]of Object.entries(g))await Ca.writeFile(_n.join(p,x),T);let w=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!w){f.step(3,4,"Analyzing project...");let x=await pE();if((await x.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await x.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let h=s.idea;if(w&&!b){if(!h)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};f.spin("architect mode...");let x=_n.join(p,"planning","architect-session.md"),T=`# Architect Session
1186
+ `,"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[x,T]of Object.entries(g))await Ta.writeFile(On.join(m,x),T);let w=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!w){f.step(3,4,"Analyzing project...");let x=await iE();if((await x.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await x.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let h=s.idea;if(w&&!b){if(!h)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let x=On.join(m,"planning","architect-session.md"),T=`# Architect Session
1187
1187
 
1188
1188
  ## Idea
1189
1189
  ${h}
@@ -1192,8 +1192,8 @@ ${h}
1192
1192
  Initialized - awaiting stack recommendation
1193
1193
 
1194
1194
  Generated: ${new Date().toLocaleString()}
1195
- `;return await Ca.writeFile(x,T),await Ue.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:h,wizard:a}}return await Ue.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(s=>{switch(s){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return f.fail("description required"),{success:!1,error:"Description required"};let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=Z();return await ce.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:v()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await ce.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:v()}),s.md?console.log(U(te("Bug Reported",e),Ye({Severity:i,Priority:c}),le([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Wt("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let s=await this.ensureProjectInit(t);if(!s.success)return s;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
1196
- `);let n=await this.getGlobalProjectPath(t),o=_n.join(n,"planning","architect-session.md"),i;try{i=await _e(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1195
+ `;return await Ta.writeFile(x,T),await Ue.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:h,wizard:a}}return await Ue.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(s=>{switch(s){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return f.fail("description required"),{success:!1,error:"Description required"};let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=Z();return await ce.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:v()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await ce.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:v()}),s.md?console.log(U(te("Bug Reported",e),Ye({Severity:i,Priority:c}),le([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Wt("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let s=await this.ensureProjectInit(t);if(!s.success)return s;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
1196
+ `);let n=await this.getGlobalProjectPath(t),o=On.join(n,"planning","architect-session.md"),i;try{i=await _e(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1197
1197
 
1198
1198
  Create a plan first:
1199
1199
  1. Run /p:init in an empty directory
@@ -1201,11 +1201,11 @@ Create a plan first:
1201
1201
  3. Plan will be auto-generated
1202
1202
  4. Then run /p:architect execute`}}if(!i||i.trim()==="")return{success:!1,message:"\u274C Architect plan is empty"};console.log(`\u{1F4CB} Reading architect plan...
1203
1203
  `);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),d=a?a[1].split(`
1204
- `)[0].trim():"Unknown project",m=c?c[1]:"Not specified",p=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
1204
+ `)[0].trim():"Unknown project",p=c?c[1]:"Not specified",m=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
1205
1205
  \u{1F527} Stack:
1206
- ${m}`),console.log(`
1207
- \u{1F4CB} Implementation Steps:
1208
1206
  ${p}`),console.log(`
1207
+ \u{1F4CB} Implementation Steps:
1208
+ ${m}`),console.log(`
1209
1209
  ${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
1210
1210
  The architect plan is ready. Claude will now:
1211
1211
  1. Read the architectural plan
@@ -1214,7 +1214,7 @@ The architect plan is ready. Claude will now:
1214
1214
  4. Create starter files with boilerplate
1215
1215
  `),console.log(`
1216
1216
  \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.
1217
- `),await this.logToMemory(t,"architect_executed",{timestamp:v(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=_n.join(c,"planning","architect-session.md"),d=`# Architect Session
1217
+ `),await this.logToMemory(t,"architect_executed",{timestamp:v(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=On.join(c,"planning","architect-session.md"),d=`# Architect Session
1218
1218
 
1219
1219
  ## Idea
1220
1220
  ${e}
@@ -1229,14 +1229,14 @@ Initialized - awaiting architecture design
1229
1229
  4. Generate roadmap
1230
1230
 
1231
1231
  Generated: ${new Date().toLocaleString()}
1232
- `;return await Ca.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:v()}),s.md?console.log(U(te("Idea Captured",e),Ye({Mode:"architecture"}),le([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1232
+ `;return await Ta.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:v()}),s.md?console.log(U(te("Idea Captured",e),Ye({Mode:"architecture"}),le([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1233
1233
  \u{1F4A1} Use /p:architect execute to continue planning
1234
- `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await $e.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:v()}),s.md?console.log(U(te("Idea Captured",e),Ye({Mode:"capture"}),le([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),Wt("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=A.getGlobalProjectPath(n),m=_n.join(d,"planning","specs");try{let w=(await(await import("node:fs/promises")).readdir(m)).filter(b=>b.endsWith(".md")&&b!==".gitkeep");return w.length===0?(f.warn("no specs yet"),console.log(`
1234
+ `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await $e.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:v()}),s.md?console.log(U(te("Idea Captured",e),Ye({Mode:"capture"}),le([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),Wt("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=A.getGlobalProjectPath(n),p=On.join(d,"planning","specs");try{let w=(await(await import("node:fs/promises")).readdir(p)).filter(b=>b.endsWith(".md")&&b!==".gitkeep");return w.length===0?(f.warn("no specs yet"),console.log(`
1235
1235
  \u{1F4A1} Create one with /p:spec "feature name"
1236
1236
  `),{success:!0,specs:[]}):(console.log(`
1237
1237
  \u{1F4CB} SPECIFICATIONS
1238
1238
  `),console.log("\u2550".repeat(50)),w.forEach((b,h)=>{let x=b.replace(".md","").replace(/-/g," ");console.log(` ${h+1}. ${x}`)}),console.log(`${"\u2550".repeat(50)}
1239
- `),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=_n.join(o,"planning","specs");await rt(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=_n.join(i,`${a}.md`),u=`# Specification: ${e}
1239
+ `),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=On.join(o,"planning","specs");await rt(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=On.join(i,`${a}.md`),u=`# Specification: ${e}
1240
1240
 
1241
1241
  ## Overview
1242
1242
  [Brief description of the feature]
@@ -1266,35 +1266,35 @@ Generated: ${new Date().toLocaleString()}
1266
1266
  ---
1267
1267
  Created: ${new Date().toLocaleString()}
1268
1268
  Status: Draft
1269
- `;return await Ca.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:v()}),f.done(`spec created: ${a}.md`),console.log(`
1269
+ `;return await Ta.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:v()}),f.done(`spec created: ${a}.md`),console.log(`
1270
1270
  \u{1F4DD} Edit: ~/.prjct-cli/projects/${n}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
1271
- `),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await Ta(t),n=0;je.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:n++,createdAt:new Date().toISOString()}),s.lint&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var td,Ln,jh=S(()=>{"use strict";xs();ri();Te();ve();W();B();Fe();td=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Pa(),Ph)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw Zo.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await A.ensureProjectStructure(t),A.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Qn();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 Cs(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return O(t)||console.error(`Directory check error: ${k(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Cs(e)).some(n=>t.includes(n))}catch(t){return O(t)||console.error(`Code check error: ${k(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Ln=new td});var Ce,Mt=S(()=>{"use strict";qu();Ju();vh();Qu();$n();jh();Ce=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new wa,this.updateNotificationShown=!1,this.commandExecutor=ya}get agent(){return va.getAgent()}get agentInfo(){return va.getInfo()}get currentAuthor(){return Ln.getCurrentAuthor()}async initializeAgent(){return va.initialize()}async ensureProjectInit(e){return Ln.ensureInit(e)}async ensureAuthor(){return Ln.ensureAuthor()}async getGlobalProjectPath(e){return Ln.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Ht.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return Ln.isEmptyDirectory(e)}async _detectExistingCode(e){return Ln.hasExistingCode(e)}_breakdownFeatureTasks(e){return Cr.breakdownFeature(e)}_detectBugSeverity(e){return Cr.detectBugSeverity(e)}}});var xh={};ye(xh,{AnalysisCommands:()=>Un});import ja from"node:fs/promises";import Rh from"node:path";import*as Fn from"@clack/prompts";var Ah,Un,xa=S(()=>{"use strict";ji();Mi();jm();Os();Te();ve();wi();El();Bm();Ym();Ol();ea();dr();ee();tr();ho();W();X();hs();kr();Fe();wf();Mt();Ah=`{version:1, commitHash, analyzedAt,
1271
+ `),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await ba(t),n=0;je.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:n++,createdAt:new Date().toISOString()}),s.lint&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var Vu,Nn,hh=S(()=>{"use strict";xs();Zo();Te();ve();W();B();Fe();Vu=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ea(),gh)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw zo.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await A.ensureProjectStructure(t),A.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Yn();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 Cs(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return O(t)||console.error(`Directory check error: ${k(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Cs(e)).some(n=>t.includes(n))}catch(t){return O(t)||console.error(`Code check error: ${k(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Nn=new Vu});var Ce,Mt=S(()=>{"use strict";Ou();Lu();uh();Gu();In();hh();Ce=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new ha,this.updateNotificationShown=!1,this.commandExecutor=fa}get agent(){return Sa.getAgent()}get agentInfo(){return Sa.getInfo()}get currentAuthor(){return Nn.getCurrentAuthor()}async initializeAgent(){return Sa.initialize()}async ensureProjectInit(e){return Nn.ensureInit(e)}async ensureAuthor(){return Nn.ensureAuthor()}async getGlobalProjectPath(e){return Nn.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Ht.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return Nn.isEmptyDirectory(e)}async _detectExistingCode(e){return Nn.hasExistingCode(e)}_breakdownFeatureTasks(e){return vr.breakdownFeature(e)}_detectBugSeverity(e){return vr.detectBugSeverity(e)}}});var fh={};ye(fh,{AnalysisCommands:()=>Fn});import Pa from"node:fs/promises";import yh from"node:path";import*as Ln from"@clack/prompts";var wh,Fn,Ca=S(()=>{"use strict";Ci();Ii();pp();Os();Te();ve();pi();fl();Dp();Lp();Pl();Yi();lr();ee();er();mo();W();K();hs();yr();Fe();rf();Mt();wh=`{version:1, commitHash, analyzedAt,
1272
1272
  architecture:{style:"monolith|monorepo|microservices|modular-monolith", insights:[], domains:[]},
1273
1273
  patterns:[{name, description, locations:[], confidence:0-1, category:"architecture|data-flow|error-handling|testing"}],
1274
1274
  antiPatterns:[{issue, reasoning, files:[], suggestion, severity:"low|medium|high", confidence:0-1}],
1275
1275
  techDebt:[{description, area, effort:"small|medium|large", impact, priority:"low|medium|high"}],
1276
1276
  riskAreas:[{path, reason, risk, severity}], refactorSuggestions:[{description, files:[], benefit, effort}],
1277
1277
  projectInsights:[], conventions:[{category, rule, example}],
1278
- commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,Un=class extends Ce{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1279
- `),pt.init(t);let s=await An.build(t,e),n={packageJson:await pt.readPackageJson(),cargoToml:await pt.readCargoToml(),goMod:await pt.readGoMod(),requirements:await pt.readRequirements(),directories:await pt.listDirectories(),fileCount:await pt.countFiles(),gitStats:await pt.getGitStats(),gitLog:await pt.getGitLog(20),hasDockerfile:await pt.fileExists("Dockerfile"),hasDockerCompose:await pt.fileExists("docker-compose.yml"),hasReadme:await pt.fileExists("README.md"),hasTsconfig:await pt.fileExists("tsconfig.json"),hasViteConfig:await pt.fileExists("vite.config.ts")||await pt.fileExists("vite.config.js"),hasNextConfig:await pt.fileExists("next.config.js")||await pt.fileExists("next.config.mjs")},o=yf(n,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await ja.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:v(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(lt(),bt(Nt)).getActiveProvider(),d=await Ue.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1278
+ commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,Fn=class extends Ce{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1279
+ `),mt.init(t);let s=await jn.build(t,e),n={packageJson:await mt.readPackageJson(),cargoToml:await mt.readCargoToml(),goMod:await mt.readGoMod(),requirements:await mt.readRequirements(),directories:await mt.listDirectories(),fileCount:await mt.countFiles(),gitStats:await mt.getGitStats(),gitLog:await mt.getGitLog(20),hasDockerfile:await mt.fileExists("Dockerfile"),hasDockerCompose:await mt.fileExists("docker-compose.yml"),hasReadme:await mt.fileExists("README.md"),hasTsconfig:await mt.fileExists("tsconfig.json"),hasViteConfig:await mt.fileExists("vite.config.ts")||await mt.fileExists("vite.config.js"),hasNextConfig:await mt.fileExists("next.config.js")||await mt.fileExists("next.config.mjs")},o=nf(n,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Pa.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:v(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(lt(),bt(Nt)).getActiveProvider(),d=await Ue.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1280
1280
  `),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1281
- `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(n),i=Date.now();if(t.package){let m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!p){let w=m.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await Ns.sync(e,{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(U(fe(`Synced package: ${p.name}`))):f.done(`Synced package: ${p.name}`),{success:g.success}}let a=Rh.join(o,"context","CLAUDE.md"),c=null;try{c=await ja.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let m=await Ns.sync(e,{full:t.full});if(!m.success)return t.md?(console.log(U("## 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}):(f.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await ja.readFile(a,"utf-8")}catch{p=""}let g=zm(c,p);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(U(fe("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let w=l(async()=>{c!=null&&await ja.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await w();let h=[];for(let T of g.added)h.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)h.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)h.push(`Removed: ${T.name} (${T.lineCount} lines)`);let x=U("## Sync Preview",h.length>0?te("Changes",He(h)):"No section changes.",Ye({"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(x),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await w();let h={added:g.added.map(x=>({name:x.name,lineCount:x.lineCount})),modified:g.modified.map(x=>({name:x.name,lineCount:x.lineCount})),removed:g.removed.map(x=>({name:x.name,lineCount:x.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:h,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Km(g)),t.preview)return await w(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await Fn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Fn.isCancel(b)||b==="cancel")return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(b==="diff"){console.log(`
1282
- ${Xm(g)}`);let h=await Fn.confirm({message:"Apply these changes?",initialValue:!0});if(Fn.isCancel(h)||!h)return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),mu(m,i)}t.md||f.spin("Syncing project...");let d=await Ns.sync(e,{full:t.full});if(!d.success)return t.md?console.log(U("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let m=Date.now()-i,p=d.generatedSkills?.generated?.length??0,g=null;try{let j=await mt.diff(n);j?.hasChanges&&(g=Tl(j))}catch{}let w=d.git.recentCommits[0]?.hash??null,b=w&&Qt.isCurrent(n,w),h=null;if(!b)try{let j=await Dl(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Ah,"```","### Data","```json",JSON.stringify(j),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1283
- `)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let x=na("sync",!0),T=d.syncMetrics?.indexes,I={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${p} generated`,"Files indexed":d.stats.fileCount};if(T?.bm25Files){let j=T.bm25Files*(T.bm25AvgTokens||0);I["Tokens indexed"]=`${Math.round(j/1e3)}K`,I["Import edges"]=T.importEdges||0,I["Co-change commits"]=T.cochangeCommits||0}let M=null;try{let D=(await $.readGlobalConfig(n))?.integrations?.obsidian;D?.vaultPath&&(M=`### Obsidian
1281
+ `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(n),i=Date.now();if(t.package){let p=await A.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!m){let w=p.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await Ns.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:g.success,package:m.name,path:m.relativePath})):t.md?console.log(U(fe(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=yh.join(o,"context","CLAUDE.md"),c=null;try{c=await Pa.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let p=await Ns.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(U("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(f.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await Pa.readFile(a,"utf-8")}catch{m=""}let g=Op(c,m);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(U(fe("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let w=l(async()=>{c!=null&&await Pa.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await w();let h=[];for(let T of g.added)h.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)h.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)h.push(`Removed: ${T.name} (${T.lineCount} lines)`);let x=U("## Sync Preview",h.length>0?te("Changes",He(h)):"No section changes.",Ye({"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(x),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await w();let h={added:g.added.map(x=>({name:x.name,lineCount:x.lineCount})),modified:g.modified.map(x=>({name:x.name,lineCount:x.lineCount})),removed:g.removed.map(x=>({name:x.name,lineCount:x.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:h,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(_p(g)),t.preview)return await w(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await Ln.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Ln.isCancel(b)||b==="cancel")return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(b==="diff"){console.log(`
1282
+ ${Np(g)}`);let h=await Ln.confirm({message:"Apply these changes?",initialValue:!0});if(Ln.isCancel(h)||!h)return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),ru(p,i)}t.md||f.spin("Syncing project...");let d=await Ns.sync(e,{full:t.full});if(!d.success)return t.md?console.log(U("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,g=null;try{let j=await pt.diff(n);j?.hasChanges&&(g=gl(j))}catch{}let w=d.git.recentCommits[0]?.hash??null,b=w&&Qt.isCurrent(n,w),h=null;if(!b)try{let j=await Tl(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",wh,"```","### Data","```json",JSON.stringify(j),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1283
+ `)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let x=ea("sync",!0),T=d.syncMetrics?.indexes,I={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(T?.bm25Files){let j=T.bm25Files*(T.bm25AvgTokens||0);I["Tokens indexed"]=`${Math.round(j/1e3)}K`,I["Import edges"]=T.importEdges||0,I["Co-change commits"]=T.cochangeCommits||0}let M=null;try{let D=(await $.readGlobalConfig(n))?.integrations?.obsidian;D?.vaultPath&&(M=`### Obsidian
1284
1284
  Configured: \`${D.vaultPath}\`
1285
- Write \`_insights.md\` to vault after analysis.`)}catch{}let y=U(fe("Sync Complete"),Ye(I),g,d.git.hasChanges?pu("Uncommitted changes detected"):null,h,M,le(x.map(j=>({label:j.desc,command:j.cmd}))));return console.log(y),{success:!0,data:d,metrics:{elapsed:m,skillCount:p,fileCount:d.stats.fileCount}}}return mu(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ns.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Qt.isCurrent(n,i))return t.md?console.log(U(fe("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await Dl(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Ah,"```","### Data","```json",JSON.stringify(a),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Qt.save(o,i),s.md?console.log(U(fe("LLM Analysis Saved"),Ye({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Qt.getActive(n);if(!o)return t.md?console.log(U("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[fe(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(te("Architecture Insights",He(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(te(`Patterns (${o.patterns.length})`,He(a.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(te(`Anti-Patterns (${o.antiPatterns.length})`,He(a.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(te(`Tech Debt (${o.techDebt.length})`,He(a.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}o.conventions.length>0&&i.push(te("Conventions",He(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Zt.getSummary(n),i=await Zt.getDailyStats(n,30),a=await gf(n),c=await Tt.getPatternsSummary(n);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.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let u="Unknown";try{u=E.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Zt.read(n),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: ${Sr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${yi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${gu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=ff(i);if(console.log(` ${p} ${Sr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=hf(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Wi(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await mt.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=Rh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=U(`## Status: ${u}`,Ye({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?te("Analysis",He(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await mt.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(U("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(U(Tl(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log($m(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await mt.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await mt.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(U(fe("Analysis Rolled Back"),Ye({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await mt.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=E.getDoc(n,"project")?.repoPath||e}catch{}let i=await mt.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var sd,H,Lo=S(()=>{"use strict";Te();ve();W();X();sd=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,n){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,n)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(n=>n.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:A.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:v()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:k(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},H=new sd});import mE from"node:fs/promises";import gE from"node:path";var xr,nd=S(()=>{"use strict";ji();Te();Ol();Gc();ee();zs();Vt();Ks();vt();W();X();hs();Fe();Mt();Lo();xr=class extends Ce{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=gE.basename(t),a=await L.getCurrentTask(o),c=await ce.getActiveTasks(o),u=await it.getRecent(o,5),d=await $e.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 f.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=Bs(m),g=[];try{let h=p.toISOString();g=E.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",h).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let w={tasksCompleted:g.filter(h=>h.action==="task_completed").length,featuresShipped:g.filter(h=>h.action==="feature_shipped").length,totalActions:g.length};console.log(`
1285
+ Write \`_insights.md\` to vault after analysis.`)}catch{}let y=U(fe("Sync Complete"),Ye(I),g,d.git.hasChanges?nu("Uncommitted changes detected"):null,h,M,le(x.map(j=>({label:j.desc,command:j.cmd}))));return console.log(y),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return ru(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ns.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Qt.isCurrent(n,i))return t.md?console.log(U(fe("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await Tl(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",wh,"```","### Data","```json",JSON.stringify(a),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Qt.save(o,i),s.md?console.log(U(fe("LLM Analysis Saved"),Ye({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Qt.getActive(n);if(!o)return t.md?console.log(U("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[fe(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(te("Architecture Insights",He(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(te(`Patterns (${o.patterns.length})`,He(a.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(te(`Anti-Patterns (${o.antiPatterns.length})`,He(a.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(te(`Tech Debt (${o.techDebt.length})`,He(a.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}o.conventions.length>0&&i.push(te("Conventions",He(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Zt.getSummary(n),i=await Zt.getDailyStats(n,30),a=await ef(n),c=await Tt.getPatternsSummary(n);if(t.json){let m={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(m)),{success:!0,data:m}}let u="Unknown";try{u=E.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Zt.read(n),p=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${wr(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: ${ou(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=tf(i);if(console.log(` ${m} ${wr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let m=sf(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Fi(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await pt.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=yh.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=U(`## Status: ${u}`,Ye({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?te("Analysis",He(m)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await pt.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(U("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(U(gl(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Sp(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await pt.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await pt.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(U(fe("Analysis Rolled Back"),Ye({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await pt.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=E.getDoc(n,"project")?.repoPath||e}catch{}let i=await pt.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var Ju,H,Do=S(()=>{"use strict";Te();ve();W();K();Ju=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,n){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,n)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(n=>n.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:A.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:v()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:k(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},H=new Ju});import aE from"node:fs/promises";import cE from"node:path";var Er,zu=S(()=>{"use strict";Ci();Te();Pl();Lc();ee();Js();Vt();zs();vt();W();K();hs();Fe();Mt();Do();Er=class extends Ce{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=cE.basename(t),a=await L.getCurrentTask(o),c=await ce.getActiveTasks(o),u=await it.getRecent(o,5),d=await $e.getPending(o);if(e==="compact"){let p=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",m=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=qs(p),g=[];try{let h=m.toISOString();g=E.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",h).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let w={tasksCompleted:g.filter(h=>h.action==="task_completed").length,featuresShipped:g.filter(h=>h.action==="feature_shipped").length,totalActions:g.length};console.log(`
1286
1286
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1287
- `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let b=this._generateSparkline(g,m);return console.log(`
1287
+ `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let b=this._generateSparkline(g,p);return console.log(`
1288
1288
  Activity: ${b}
1289
- `),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let m=await An.build(t),p=null;try{p=await mE.readFile(m.paths.roadmap,"utf-8")}catch{p=null}if(console.log(`
1289
+ `),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let p=await jn.build(t),m=null;try{m=await aE.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
1290
1290
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1291
- `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1292
- `);else{let g=p.split("##").filter(w=>w.trim()&&!w.includes("ROADMAP"));g.slice(0,5).forEach((w,b)=>{let h=w.split(`
1291
+ `),console.log("\u2550".repeat(50)),!m||m.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1292
+ `);else{let g=m.split("##").filter(w=>w.trim()&&!w.includes("ROADMAP"));g.slice(0,5).forEach((w,b)=>{let h=w.split(`
1293
1293
  `)[0].trim();console.log(` ${b+1}. ${h}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1294
- `),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${js(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(h=>{let x=h.priority?` [${h.priority}]`:"";return`${h.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${x}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(h=>{let x=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";return`${h.name}${x?` (${x})`:""}`}):["Nothing shipped yet"],w=null;try{let h=go.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
1295
- `+sn(["Zone","%"],[["Smart",`${h.smartPercent}%`],["Warning",`${h.warningPercent}%`],["Dumb",`${h.dumbPercent}%`],["Compactions",`${h.compactions}`]]))}catch{}let b=U(`## Dashboard: ${i}`,te("Current Focus",m),te(`Queue (${c.length})`,He(p,!0)),te("Recent Ships",He(g)),te("Ideas",`${d.length} pending`),w,le([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(b)}else{console.log(`
1294
+ `),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${js(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(h=>{let x=h.priority?` [${h.priority}]`:"";return`${h.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${x}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(h=>{let x=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";return`${h.name}${x?` (${x})`:""}`}):["Nothing shipped yet"],w=null;try{let h=lo.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
1295
+ `+tn(["Zone","%"],[["Smart",`${h.smartPercent}%`],["Warning",`${h.warningPercent}%`],["Dumb",`${h.dumbPercent}%`],["Compactions",`${h.compactions}`]]))}catch{}let b=U(`## Dashboard: ${i}`,te("Current Focus",p),te(`Queue (${c.length})`,He(m,!0)),te("Recent Ships",He(g)),te("Ideas",`${d.length} pending`),w,le([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(b)}else{console.log(`
1296
1296
  \u{1F4CA} DASHBOARD - ${i}
1297
- `),console.log("\u2550".repeat(50));let m=Wi(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1297
+ `),console.log("\u2550".repeat(50));let p=Fi(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
1298
1298
  ${g}`),console.log(`
1299
1299
  \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=js(new Date(a.startedAt));console.log(` Started: ${w} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1300
1300
  \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((w,b)=>{let h=w.priority?`[${w.priority}]`:"";console.log(` ${b+1}. ${w.description.slice(0,40)} ${h}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
@@ -1303,8 +1303,8 @@ ${g}`),console.log(`
1303
1303
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1304
1304
  `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:v()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1305
1305
  PRJCT COMMANDS
1306
- `),console.log("=".repeat(50));let i=H.getAllCategories(),a=H.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(`
1307
- ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1306
+ `),console.log("=".repeat(50));let i=H.getAllCategories(),a=H.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let p=i.get(u);console.log(`
1307
+ ${p?.title||u}:`),d.forEach(m=>{let g=m.params?` ${m.params}`:"";console.log(` ${m.name}${g}`),console.log(` ${m.description}`)})}),console.log(`
1308
1308
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1309
1309
  `),{success:!0,topic:"overview"}}let s=H.getByName(e);if(s){if(console.log(`
1310
1310
  \u{1F4DA} HELP: /p:${s.name}
@@ -1316,9 +1316,9 @@ ${"\u2550".repeat(50)}
1316
1316
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1317
1317
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1318
1318
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1319
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var Dh={};ye(Dh,{ContextCommands:()=>an,contextCommands:()=>Ih,default:()=>yE});import fE from"node:fs/promises";import hE from"node:path";var an,Ih,yE,Ra=S(()=>{"use strict";Ou();Te();ve();vt();W();hs();an=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await $.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=A.getGlobalProjectPath(c),d=await L.read(c),m=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(b=>({id:b.id,description:b.description,status:b.status,domain:b.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,p=null;if(i)try{p=await fa.execute(o,i,t)}catch(b){console.error(`Warning: Orchestrator failed: ${k(b)}`)}let g=await this.loadRepoAnalysis(u),w={projectId:c,globalPath:u,currentTask:m,domains:p?.detectedDomains||[],primaryDomain:p?.primaryDomain||null,subtasks:p?.subtasks?.map(b=>({id:b.id,description:b.description,domain:b.domain,agent:b.agent,status:b.status,order:b.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(w)):console.log(JSON.stringify(w)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${k(n)}`}}}formatContextMd(e){let t=[];if(t.push(te("Project",sa(ta("ID",e.projectId),ta("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(wr({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
1320
- `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(te("Stack",Ye({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),U(...t)}async loadRepoAnalysis(e){try{let t=hE.join(e,"analysis","repo-analysis.json"),s=await fE.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return O(t),null}}},Ih=new an,yE=Ih});import rd from"node:fs";import $h from"node:path";async function Aa(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}async function Ia(r){let e=await $.getProjectId(r);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}async function od(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await Aa(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await $.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=N.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;N.run(s,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await $e.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${k(a)}`)}try{let c=(await ce.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${k(a)}`)}return await Ia(e),await Ht.log(e,"cleanup_performed",{items:n.length,timestamp:v()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(k(t)),{success:!1,error:k(t)}}}async function Mh(r){let e=A.getGlobalBasePath(),t=$h.join(e,"projects");if(!rd.existsSync(t))return{success:!0,message:"No projects directory found"};let s=rd.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=$h.join(t,a);if(!wE.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),rd.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
1321
- `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var wE,id=S(()=>{"use strict";Te();ve();$n();ee();zs();Vt();W();X();Fe();l(Aa,"cleanupMemory");l(Ia,"cleanupMemoryInternal");l(od,"cleanup");wE=[/^qa-/,/^nonexistent-/,/^test-/];l(Mh,"cleanupProjects")});import Oh from"node:path";async function ad(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await $.getProjectId(t),a=Oh.join(A.getGlobalProjectPath(i),"planning","designs");await rt(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1319
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var Sh={};ye(Sh,{ContextCommands:()=>on,contextCommands:()=>kh,default:()=>dE});import lE from"node:fs/promises";import uE from"node:path";var on,kh,dE,xa=S(()=>{"use strict";Pu();Te();ve();vt();W();hs();on=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await $.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=A.getGlobalProjectPath(c),d=await L.read(c),p=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(b=>({id:b.id,description:b.description,status:b.status,domain:b.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,m=null;if(i)try{m=await pa.execute(o,i,t)}catch(b){console.error(`Warning: Orchestrator failed: ${k(b)}`)}let g=await this.loadRepoAnalysis(u),w={projectId:c,globalPath:u,currentTask:p,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,subtasks:m?.subtasks?.map(b=>({id:b.id,description:b.description,domain:b.domain,agent:b.agent,status:b.status,order:b.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(w)):console.log(JSON.stringify(w)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${k(n)}`}}}formatContextMd(e){let t=[];if(t.push(te("Project",Zi(Qi("ID",e.projectId),Qi("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(hr({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
1320
+ `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(te("Stack",Ye({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),U(...t)}async loadRepoAnalysis(e){try{let t=uE.join(e,"analysis","repo-analysis.json"),s=await lE.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return O(t),null}}},kh=new on,dE=kh});import Xu from"node:fs";import bh from"node:path";async function Ku(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}async function Yu(r){let e=await $.getProjectId(r);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}async function vh(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await Ku(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await $.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=N.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;N.run(s,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await $e.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${k(a)}`)}try{let c=(await ce.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${k(a)}`)}return await Yu(e),await Ht.log(e,"cleanup_performed",{items:n.length,timestamp:v()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(k(t)),{success:!1,error:k(t)}}}async function Th(r){let e=A.getGlobalBasePath(),t=bh.join(e,"projects");if(!Xu.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Xu.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=bh.join(t,a);if(!mE.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),Xu.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
1321
+ `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var mE,Eh=S(()=>{"use strict";Te();ve();In();ee();Js();Vt();W();K();Fe();l(Ku,"cleanupMemory");l(Yu,"cleanupMemoryInternal");l(vh,"cleanup");mE=[/^qa-/,/^nonexistent-/,/^test-/];l(Th,"cleanupProjects")});import Ch from"node:path";async function Ph(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await $.getProjectId(t),a=Ch.join(A.getGlobalProjectPath(i),"planning","designs");await rt(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1322
1322
 
1323
1323
  *Use templates/design/architecture.md for full design*
1324
1324
  `;break;case"api":c=`# API Design: ${o}
@@ -1333,14 +1333,14 @@ ${"\u2550".repeat(50)}
1333
1333
  `;break;case"flow":c=`# Flow Design: ${o}
1334
1334
 
1335
1335
  *Use templates/design/flow.md for full design*
1336
- `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Oh.join(a,u);return await Pt(d,c),await Ht.log(t,"design_created",{type:s,target:o,timestamp:v()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}var cd=S(()=>{"use strict";Te();ve();$n();W();X();B();Fe();l(ad,"design")});var at,_h=S(()=>{"use strict";at={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 ld,Ct,Fo,Nh=S(()=>{"use strict";xs();ee();_h();xn();Is();ld=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=km.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&V.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(at.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(at.ALL);n&&t.push(...n);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let s=e(t);s instanceof Promise&&await s}catch(s){throw V.error("Event callback error:",s),s}}async logEvent(e){try{E.appendEvent(this.projectId,e.type,e)}catch(t){V.debug("Failed to log event:",we(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.type.startsWith(t))),s.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Ct=new ld,Fo={sessionStarted:l(r=>Ct.emit(at.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>Ct.emit(at.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>Ct.emit(at.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>Ct.emit(at.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>Ct.emit(at.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>Ct.emit(at.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>Ct.emit(at.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>Ct.emit(at.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>Ct.emit(at.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>Ct.emit(at.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>Ct.emit(at.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>Ct.emit(at.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>Ct.emit(at.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>Ct.emit(at.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>Ct.emit(at.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>Ct.emit(at.ANALYSIS_COMPLETED,r),"analysisCompleted")}});function Da(r){let e=0,t=null;for(let s of r.timeline)s.type==="start"||s.type==="resume"?t=new Date(s.at):(s.type==="pause"||s.type==="complete")&&t&&(e+=new Date(s.at).getTime()-t.getTime(),t=null);return t&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}function Fh(r){return xt(r*1e3)}var Lh,Uh=S(()=>{"use strict";Ut();X();Lh=Z;l(Da,"calculateDuration");l(Fh,"formatDuration")});function Hh(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}var $a,Wh=S(()=>{"use strict";Nh();Te();ee();W();Je();Uh();l(Hh,"rowToSession");$a=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await $.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");E.getDb(this.projectId),this.initialized=!0}generateId(){return Lh()}async getCurrent(){this.initialized||await this.initialize();let e=E.get(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status IN ('active', 'paused') ORDER BY started_at DESC LIMIT 1",this.projectId);return e?Hh(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let s=new Date().toISOString(),n={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:s,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:s}]};return this.saveSession(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await Fo.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let s=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:s}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await Fo.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=Da(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Fo.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=Da(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await Fo.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Da(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await F(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await F(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1336
+ `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Ch.join(a,u);return await Pt(d,c),await Ht.log(t,"design_created",{type:s,target:o,timestamp:v()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}var xh=S(()=>{"use strict";Te();ve();In();W();K();B();Fe();l(Ph,"design")});var at,jh=S(()=>{"use strict";at={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 Qu,Ct,$o,Rh=S(()=>{"use strict";xs();ee();jh();Pn();Is();Qu=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=sp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&V.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(at.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(at.ALL);n&&t.push(...n);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let s=e(t);s instanceof Promise&&await s}catch(s){throw V.error("Event callback error:",s),s}}async logEvent(e){try{E.appendEvent(this.projectId,e.type,e)}catch(t){V.debug("Failed to log event:",we(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.type.startsWith(t))),s.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Ct=new Qu,$o={sessionStarted:l(r=>Ct.emit(at.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>Ct.emit(at.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>Ct.emit(at.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>Ct.emit(at.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>Ct.emit(at.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>Ct.emit(at.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>Ct.emit(at.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>Ct.emit(at.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>Ct.emit(at.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>Ct.emit(at.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>Ct.emit(at.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>Ct.emit(at.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>Ct.emit(at.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>Ct.emit(at.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>Ct.emit(at.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>Ct.emit(at.ANALYSIS_COMPLETED,r),"analysisCompleted")}});function ja(r){let e=0,t=null;for(let s of r.timeline)s.type==="start"||s.type==="resume"?t=new Date(s.at):(s.type==="pause"||s.type==="complete")&&t&&(e+=new Date(s.at).getTime()-t.getTime(),t=null);return t&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}function Ih(r){return xt(r*1e3)}var Ah,Dh=S(()=>{"use strict";Ut();K();Ah=Z;l(ja,"calculateDuration");l(Ih,"formatDuration")});function $h(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}var Ra,Mh=S(()=>{"use strict";Rh();Te();ee();W();Je();Dh();l($h,"rowToSession");Ra=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await $.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");E.getDb(this.projectId),this.initialized=!0}generateId(){return Ah()}async getCurrent(){this.initialized||await this.initialize();let e=E.get(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status IN ('active', 'paused') ORDER BY started_at DESC LIMIT 1",this.projectId);return e?$h(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let s=new Date().toISOString(),n={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:s,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:s}]};return this.saveSession(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await $o.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let s=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:s}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await $o.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=ja(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await $o.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=ja(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await $o.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return ja(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await F(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await F(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1337
1337
  `),c=(i[i.length-2]||"").match(/(\d+) files? changed(?:, (\d+) insertions?)?(?:, (\d+) deletions?)?/);c&&(t.filesChanged=parseInt(c[1],10)||0,t.linesAdded=parseInt(c[2],10)||0,t.linesRemoved=parseInt(c[3],10)||0)}catch(s){O(s)||console.error(`Metrics calculation warning: ${k(s)}`)}return t}saveSession(e){E.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1338
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),E.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Hh)}async logEvent(e,t){try{E.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Fh(e)}}});import jr from"node:path";async function ud(r=process.cwd()){try{if(!await $.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new $a(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1338
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),E.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map($h)}async logEvent(e,t){try{E.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Ih(e)}}});import Cr from"node:path";async function Oh(r=process.cwd()){try{if(!await $.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new Ra(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1339
1339
  Found abandoned session:
1340
1340
  `),console.log(` Task: ${n.task}`),n.startedAt){let o=js(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1341
1341
  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
1342
- `),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function dd(r=process.cwd()){try{f.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jr.join(A.getGlobalProjectPath(e),"snapshots");await rt(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=jr.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await _e(c);u=JSON.parse(d)}catch(d){if(!O(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await Pt(c,JSON.stringify(u,null,2)),await Ht.log(r,"undo_performed",{snapshotId:a,timestamp:v()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(o)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function pd(r=process.cwd()){try{f.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jr.join(A.getGlobalProjectPath(e),"snapshots"),s=jr.join(t,"history.json"),n;try{let i=await _e(s);n=JSON.parse(i)}catch(i){if(O(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1343
- `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await Pt(s,JSON.stringify(n,null,2)),await Ht.log(r,"redo_performed",{timestamp:v()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(i)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function md(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jr.join(A.getGlobalProjectPath(e),"snapshots"),s=jr.join(t,"history.json"),n;try{let o=await _e(s);n=JSON.parse(o)}catch(o){if(O(o)||o instanceof SyntaxError)return console.log(`
1342
+ `),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function _h(r=process.cwd()){try{f.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Cr.join(A.getGlobalProjectPath(e),"snapshots");await rt(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=Cr.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await _e(c);u=JSON.parse(d)}catch(d){if(!O(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await Pt(c,JSON.stringify(u,null,2)),await Ht.log(r,"undo_performed",{snapshotId:a,timestamp:v()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(o)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Nh(r=process.cwd()){try{f.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Cr.join(A.getGlobalProjectPath(e),"snapshots"),s=Cr.join(t,"history.json"),n;try{let i=await _e(s);n=JSON.parse(i)}catch(i){if(O(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1343
+ `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await Pt(s,JSON.stringify(n,null,2)),await Ht.log(r,"redo_performed",{timestamp:v()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(i)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Lh(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Cr.join(A.getGlobalProjectPath(e),"snapshots"),s=Cr.join(t,"history.json"),n;try{let o=await _e(s);n=JSON.parse(o)}catch(o){if(O(o)||o instanceof SyntaxError)return console.log(`
1344
1344
  SNAPSHOT HISTORY
1345
1345
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1346
1346
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1348,26 +1348,26 @@ ${"\u2550".repeat(50)}
1348
1348
  `),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1349
1349
  `)):(n.snapshots.forEach((o,i)=>{let a=i===n.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${n.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1350
1350
  `)),console.log(`${"=".repeat(50)}
1351
- `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var gd=S(()=>{"use strict";Te();ve();$n();Wh();W();X();B();Fe();l(ud,"recover");l(dd,"undo");l(pd,"redo");l(md,"history")});var Rr,fd=S(()=>{"use strict";Oo();Mt();id();cd();gd();id();cd();gd();Rr=class extends Ce{static{l(this,"MaintenanceCommands")}_cleanupMemory=Aa;_cleanupMemoryInternal=Ia;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?od(e,t):s}async cleanupProjects(e={}){return Mh(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?ad(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ud(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?dd(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?pd(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?md(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await Fs(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(u=>({path:u.path,score:Number(u.score.toFixed(3)),reasons:u.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(s.json)return console.log(JSON.stringify(c)),{success:!0};if(s.md){let u=[];if(u.push("## Enrichment Context"),u.push(""),u.push(`- Query: ${o}`),i&&u.push(`- Issue ID: ${i}`),u.push(`- Candidate files: ${c.files.length}`),u.push(""),u.push("### Suggested Files"),u.push(""),c.files.length===0)u.push("- No relevant files found.");else for(let d of c.files)u.push(`- \`${d.path}\` (${d.score})`);return u.push(""),u.push("### Publish"),u.push(""),u.push("- Update description via MCP"),u.push("- Add enrichment as comment via MCP"),u.push("- Or keep local only"),console.log(u.join(`
1352
- `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});import st from"node:fs/promises";import q from"node:path";var hd,Ar,Gh=S(()=>{"use strict";ee();Vt();Ks();vt();hs();hd=class r{static{l(this,"ObsidianExporter")}getProjectPath(e,t){let s=e.projectFolder||t;return q.join(e.vaultPath,"projects",s)}async exportAll(e,t,s){let n=this.getProjectPath(s,t),o=[],i={success:!0,projectFolder:n,exported:{board:0,queue:0,shipped:0,roadmap:0,daily:!1},errors:o};await this.ensureStructure(n);try{i.exported.board=await this.exportBoard(e,n)}catch(a){o.push(`board: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.queue=await this.exportQueue(e,n)}catch(a){o.push(`queue: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.shipped=await this.exportShipped(e,n)}catch(a){o.push(`shipped: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.roadmap=await this.exportRoadmap(e,n)}catch(a){o.push(`roadmap: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.daily=await this.exportDaily(e,n)}catch(a){o.push(`daily: ${a instanceof Error?a.message:String(a)}`)}try{await this.exportIndex(t,n)}catch(a){o.push(`index: ${a instanceof Error?a.message:String(a)}`)}return i.success=o.length===0,i}async ensureStructure(e){let t=["board","queue","shipped","roadmap","architecture","design","research","meetings","notes","daily","retros"];for(let s of t)await st.mkdir(q.join(e,s),{recursive:!0})}async writeLink(e,t,s){let n=[`projectId: ${t}`,`projectPath: ${s}`,`linkedAt: ${new Date().toISOString()}`].join(`
1353
- `);await st.writeFile(q.join(e,".prjct-link.yml"),n,"utf-8")}async exportBoard(e,t){let s=await L.read(e),n=q.join(t,"board"),o=0;if(s.currentTask){let c=s.currentTask,u=c.subtasks||[],d=c.currentSubtaskIndex??0,m={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,estimated_points:c.estimatedPoints,started_at:c.startedAt,updated_at:new Date().toISOString()},p=u.map((h,x)=>{let T=h.status==="completed"?"x":" ",I=x===d&&h.status!=="completed"?" <- current":"";return`- [${T}] ${h.description}${I}`}),g=u.filter(h=>h.status==="completed").length,w=u.length>0?`${g}/${u.length} (${Math.round(g/u.length*100)}%)`:"",b=Ls(m,c.description,p.length>0?`## Subtasks
1354
- ${p.join(`
1351
+ `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var Fh=S(()=>{"use strict";Te();ve();In();Mh();W();K();B();Fe();l(Oh,"recover");l(_h,"undo");l(Nh,"redo");l(Lh,"history")});var Pr,Zu=S(()=>{"use strict";Ao();Mt();Eh();xh();Fh();Pr=class extends Ce{static{l(this,"MaintenanceCommands")}_cleanupMemory=Ku;_cleanupMemoryInternal=Yu;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?vh(e,t):s}async cleanupProjects(e={}){return Th(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Ph(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Oh(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?_h(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nh(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Lh(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await nn(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(u=>({path:u.path,score:Number(u.score.toFixed(3)),reasons:u.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(s.json)return console.log(JSON.stringify(c)),{success:!0};if(s.md){let u=[];if(u.push("## Enrichment Context"),u.push(""),u.push(`- Query: ${o}`),i&&u.push(`- Issue ID: ${i}`),u.push(`- Candidate files: ${c.files.length}`),u.push(""),u.push("### Suggested Files"),u.push(""),c.files.length===0)u.push("- No relevant files found.");else for(let d of c.files)u.push(`- \`${d.path}\` (${d.score})`);return u.push(""),u.push("### Publish"),u.push(""),u.push("- Update description via MCP"),u.push("- Add enrichment as comment via MCP"),u.push("- Or keep local only"),console.log(u.join(`
1352
+ `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});import st from"node:fs/promises";import q from"node:path";var ed,xr,Uh=S(()=>{"use strict";ee();Vt();zs();vt();hs();ed=class r{static{l(this,"ObsidianExporter")}getProjectPath(e,t){let s=e.projectFolder||t;return q.join(e.vaultPath,"projects",s)}async exportAll(e,t,s){let n=this.getProjectPath(s,t),o=[],i={success:!0,projectFolder:n,exported:{board:0,queue:0,shipped:0,roadmap:0,daily:!1},errors:o};await this.ensureStructure(n);try{i.exported.board=await this.exportBoard(e,n)}catch(a){o.push(`board: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.queue=await this.exportQueue(e,n)}catch(a){o.push(`queue: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.shipped=await this.exportShipped(e,n)}catch(a){o.push(`shipped: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.roadmap=await this.exportRoadmap(e,n)}catch(a){o.push(`roadmap: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.daily=await this.exportDaily(e,n)}catch(a){o.push(`daily: ${a instanceof Error?a.message:String(a)}`)}try{await this.exportIndex(t,n)}catch(a){o.push(`index: ${a instanceof Error?a.message:String(a)}`)}return i.success=o.length===0,i}async ensureStructure(e){let t=["board","queue","shipped","roadmap","architecture","design","research","meetings","notes","daily","retros"];for(let s of t)await st.mkdir(q.join(e,s),{recursive:!0})}async writeLink(e,t,s){let n=[`projectId: ${t}`,`projectPath: ${s}`,`linkedAt: ${new Date().toISOString()}`].join(`
1353
+ `);await st.writeFile(q.join(e,".prjct-link.yml"),n,"utf-8")}async exportBoard(e,t){let s=await L.read(e),n=q.join(t,"board"),o=0;if(s.currentTask){let c=s.currentTask,u=c.subtasks||[],d=c.currentSubtaskIndex??0,p={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,estimated_points:c.estimatedPoints,started_at:c.startedAt,updated_at:new Date().toISOString()},m=u.map((h,x)=>{let T=h.status==="completed"?"x":" ",I=x===d&&h.status!=="completed"?" <- current":"";return`- [${T}] ${h.description}${I}`}),g=u.filter(h=>h.status==="completed").length,w=u.length>0?`${g}/${u.length} (${Math.round(g/u.length*100)}%)`:"",b=Ls(p,c.description,m.length>0?`## Subtasks
1354
+ ${m.join(`
1355
1355
  `)}`:null,w?`## Progress
1356
- ${w}`:null);await st.writeFile(q.join(n,`${c.id}.md`),b,"utf-8"),o++}let i=s.pausedTasks||[];for(let c of i){let u=c.id||`paused_${Date.now()}`,d={prjct_id:u,prjct_type:"task",status:"paused",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,updated_at:new Date().toISOString()},m=Ls(d,c.description,"Status: paused");await st.writeFile(q.join(n,`${u}.md`),m,"utf-8"),o++}let a=s.activeTasks||[];for(let c of a){let u={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,started_at:c.startedAt,worktree:c.worktreePath,updated_at:new Date().toISOString()},d=Ls(u,c.description);await st.writeFile(q.join(n,`${c.id}.md`),d,"utf-8"),o++}return await this.generateKanbanBoard(s,n),o}async generateKanbanBoard(e,t){let s=["---","kanban-plugin: board","---",""],n=[],o=[],i=[];e.currentTask&&n.push(`- [[${e.currentTask.id}]]`);for(let c of e.activeTasks||[])n.push(`- [[${c.id}]]`);for(let c of e.pausedTasks||[])c.id&&o.push(`- [[${c.id}]]`);let a=e.taskHistory||[];for(let c of a.slice(0,5))i.push(`- [[${c.taskId}]]`);s.push("## In Progress"),s.push(...n.length>0?n:[""]),s.push(""),s.push("## Paused"),s.push(...o.length>0?o:[""]),s.push(""),s.push("## Done"),s.push(...i.length>0?i:[""]),await st.writeFile(q.join(t,"_kanban.md"),s.join(`
1357
- `),"utf-8")}async exportQueue(e,t){let s=await ce.read(e),n=q.join(t,"queue"),o=0;for(let i of s.tasks){if(i.completed)continue;let a={prjct_id:i.id,prjct_type:"queue",priority:i.priority,type:i.type,section:i.section,created_at:i.createdAt,updated_at:new Date().toISOString()};i.agent&&(a.agent=i.agent),i.groupName&&(a.group=i.groupName),i.featureId&&(a.feature_id=i.featureId);let c=Ls(a,i.description);await st.writeFile(q.join(n,`${i.id}.md`),c,"utf-8"),o++}return o}async exportShipped(e,t){let s=await it.read(e),n=q.join(t,"shipped"),o=0;for(let i of s.shipped){let a={prjct_id:i.id,prjct_type:"shipped",name:i.name,version:i.version,type:i.type,shipped_at:i.shippedAt};i.duration&&(a.duration=i.duration),i.codeMetrics?.filesChanged&&(a.files_changed=i.codeMetrics.filesChanged),i.codeMetrics?.linesAdded&&(a.lines_added=i.codeMetrics.linesAdded),i.codeMetrics?.linesRemoved&&(a.lines_removed=i.codeMetrics.linesRemoved);let c=[];if(i.changes&&i.changes.length>0){let d=i.changes.map(m=>`- ${m.type?`**${m.type}**: `:""}${m.description}`);c.push(`## Changes
1356
+ ${w}`:null);await st.writeFile(q.join(n,`${c.id}.md`),b,"utf-8"),o++}let i=s.pausedTasks||[];for(let c of i){let u=c.id||`paused_${Date.now()}`,d={prjct_id:u,prjct_type:"task",status:"paused",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,updated_at:new Date().toISOString()},p=Ls(d,c.description,"Status: paused");await st.writeFile(q.join(n,`${u}.md`),p,"utf-8"),o++}let a=s.activeTasks||[];for(let c of a){let u={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,started_at:c.startedAt,worktree:c.worktreePath,updated_at:new Date().toISOString()},d=Ls(u,c.description);await st.writeFile(q.join(n,`${c.id}.md`),d,"utf-8"),o++}return await this.generateKanbanBoard(s,n),o}async generateKanbanBoard(e,t){let s=["---","kanban-plugin: board","---",""],n=[],o=[],i=[];e.currentTask&&n.push(`- [[${e.currentTask.id}]]`);for(let c of e.activeTasks||[])n.push(`- [[${c.id}]]`);for(let c of e.pausedTasks||[])c.id&&o.push(`- [[${c.id}]]`);let a=e.taskHistory||[];for(let c of a.slice(0,5))i.push(`- [[${c.taskId}]]`);s.push("## In Progress"),s.push(...n.length>0?n:[""]),s.push(""),s.push("## Paused"),s.push(...o.length>0?o:[""]),s.push(""),s.push("## Done"),s.push(...i.length>0?i:[""]),await st.writeFile(q.join(t,"_kanban.md"),s.join(`
1357
+ `),"utf-8")}async exportQueue(e,t){let s=await ce.read(e),n=q.join(t,"queue"),o=0;for(let i of s.tasks){if(i.completed)continue;let a={prjct_id:i.id,prjct_type:"queue",priority:i.priority,type:i.type,section:i.section,created_at:i.createdAt,updated_at:new Date().toISOString()};i.agent&&(a.agent=i.agent),i.groupName&&(a.group=i.groupName),i.featureId&&(a.feature_id=i.featureId);let c=Ls(a,i.description);await st.writeFile(q.join(n,`${i.id}.md`),c,"utf-8"),o++}return o}async exportShipped(e,t){let s=await it.read(e),n=q.join(t,"shipped"),o=0;for(let i of s.shipped){let a={prjct_id:i.id,prjct_type:"shipped",name:i.name,version:i.version,type:i.type,shipped_at:i.shippedAt};i.duration&&(a.duration=i.duration),i.codeMetrics?.filesChanged&&(a.files_changed=i.codeMetrics.filesChanged),i.codeMetrics?.linesAdded&&(a.lines_added=i.codeMetrics.linesAdded),i.codeMetrics?.linesRemoved&&(a.lines_removed=i.codeMetrics.linesRemoved);let c=[];if(i.changes&&i.changes.length>0){let d=i.changes.map(p=>`- ${p.type?`**${p.type}**: `:""}${p.description}`);c.push(`## Changes
1358
1358
  ${d.join(`
1359
- `)}`)}if(i.codeMetrics){let d=i.codeMetrics,m=[];d.filesChanged&&m.push(`- **Files**: ${d.filesChanged} changed`),(d.linesAdded||d.linesRemoved)&&m.push(`- **Lines**: +${d.linesAdded||0} / -${d.linesRemoved||0}`),i.duration&&m.push(`- **Duration**: ${i.duration}`),m.length>0&&c.push(`## Metrics
1360
- ${m.join(`
1361
- `)}`)}let u=Ls(a,i.name,i.description||null,...c);await st.writeFile(q.join(n,`${i.id}.md`),u,"utf-8"),o++}return o}async exportRoadmap(e,t){let s=E.getDoc(e,"roadmap");if(!s)return 0;let n=q.join(t,"roadmap"),o=0,i=s.features||[];for(let a of i){let c={prjct_id:a.id,prjct_type:"feature",status:a.status,impact:a.impact,progress:a.progress,updated_at:new Date().toISOString()};a.phase&&(c.phase=a.phase),a.quarter&&(c.quarter=a.quarter),a.dependencies&&a.dependencies.length>0&&(c.dependencies=a.dependencies);let u=(a.tasks||[]).map(m=>`- [${m.completed?"x":" "}] ${m.description}`),d=Ls(c,a.name,a.description||null,u.length>0?`## Tasks
1359
+ `)}`)}if(i.codeMetrics){let d=i.codeMetrics,p=[];d.filesChanged&&p.push(`- **Files**: ${d.filesChanged} changed`),(d.linesAdded||d.linesRemoved)&&p.push(`- **Lines**: +${d.linesAdded||0} / -${d.linesRemoved||0}`),i.duration&&p.push(`- **Duration**: ${i.duration}`),p.length>0&&c.push(`## Metrics
1360
+ ${p.join(`
1361
+ `)}`)}let u=Ls(a,i.name,i.description||null,...c);await st.writeFile(q.join(n,`${i.id}.md`),u,"utf-8"),o++}return o}async exportRoadmap(e,t){let s=E.getDoc(e,"roadmap");if(!s)return 0;let n=q.join(t,"roadmap"),o=0,i=s.features||[];for(let a of i){let c={prjct_id:a.id,prjct_type:"feature",status:a.status,impact:a.impact,progress:a.progress,updated_at:new Date().toISOString()};a.phase&&(c.phase=a.phase),a.quarter&&(c.quarter=a.quarter),a.dependencies&&a.dependencies.length>0&&(c.dependencies=a.dependencies);let u=(a.tasks||[]).map(p=>`- [${p.completed?"x":" "}] ${p.description}`),d=Ls(c,a.name,a.description||null,u.length>0?`## Tasks
1362
1362
  ${u.join(`
1363
1363
  `)}`:null);await st.writeFile(q.join(n,`${a.id}.md`),d,"utf-8"),o++}return await this.generateCanvas(i,n),o}async generateCanvas(e,t){let s={shipped:"4",completed:"4",active:"5",planned:"0"},n=e.map((a,c)=>({id:a.id,type:"text",text:`**${a.name}**
1364
1364
  Status: ${a.status}${a.quarter?`
1365
- Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120,color:s[a.status]||"0"})),o=[];for(let a of e)for(let c of a.dependencies||[])e.some(u=>u.id===c)&&o.push({id:`edge_${a.id}_${c}`,fromNode:c,toNode:a.id,label:"depends on"});let i=JSON.stringify({nodes:n,edges:o},null,2);await st.writeFile(q.join(t,"roadmap.canvas"),i,"utf-8")}async exportDaily(e,t){let s=await L.read(e),n=await ce.read(e),o=new Date().toISOString().split("T")[0],i=q.join(t,"daily"),a={prjct_type:"daily",date:o,has_active_task:!!s.currentTask,queue_depth:n.tasks.filter(m=>!m.completed).length},c=[];if(s.currentTask){let m=s.currentTask,p=m.subtasks||[],g=p.filter(w=>w.status==="completed").length;c.push(`## Active Task
1366
- **${m.description}**
1367
- `+(m.branch?`Branch: \`${m.branch}\`
1368
- `:"")+(p.length>0?`Progress: ${g}/${p.length}`:""))}else c.push(`## Active Task
1369
- No active task.`);let u=n.tasks.filter(m=>!m.completed).slice(0,5);if(u.length>0){let m=u.map(p=>[p.priority,p.type,p.description]);c.push(`## Queue (Top ${u.length})
1370
- ${sn(["Priority","Type","Description"],m)}`)}let d=Ls(a,`Daily: ${o}`,...c);return await st.writeFile(q.join(i,`${o}.md`),d,"utf-8"),!0}async exportIndex(e,t){let s=`# ${e}
1365
+ Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120,color:s[a.status]||"0"})),o=[];for(let a of e)for(let c of a.dependencies||[])e.some(u=>u.id===c)&&o.push({id:`edge_${a.id}_${c}`,fromNode:c,toNode:a.id,label:"depends on"});let i=JSON.stringify({nodes:n,edges:o},null,2);await st.writeFile(q.join(t,"roadmap.canvas"),i,"utf-8")}async exportDaily(e,t){let s=await L.read(e),n=await ce.read(e),o=new Date().toISOString().split("T")[0],i=q.join(t,"daily"),a={prjct_type:"daily",date:o,has_active_task:!!s.currentTask,queue_depth:n.tasks.filter(p=>!p.completed).length},c=[];if(s.currentTask){let p=s.currentTask,m=p.subtasks||[],g=m.filter(w=>w.status==="completed").length;c.push(`## Active Task
1366
+ **${p.description}**
1367
+ `+(p.branch?`Branch: \`${p.branch}\`
1368
+ `:"")+(m.length>0?`Progress: ${g}/${m.length}`:""))}else c.push(`## Active Task
1369
+ No active task.`);let u=n.tasks.filter(p=>!p.completed).slice(0,5);if(u.length>0){let p=u.map(m=>[m.priority,m.type,m.description]);c.push(`## Queue (Top ${u.length})
1370
+ ${tn(["Priority","Type","Description"],p)}`)}let d=Ls(a,`Daily: ${o}`,...c);return await st.writeFile(q.join(i,`${o}.md`),d,"utf-8"),!0}async exportIndex(e,t){let s=`# ${e}
1371
1371
 
1372
1372
  ## Board
1373
1373
  \`\`\`dataview
@@ -1400,21 +1400,21 @@ FROM "${q.basename(q.dirname(t))}/${q.basename(t)}/architecture" OR "${q.basenam
1400
1400
  SORT file.mtime DESC
1401
1401
  LIMIT 10
1402
1402
  \`\`\`
1403
- `;await st.writeFile(q.join(t,"_index.md"),s,"utf-8")}static ALLOWED_EXTENSIONS=new Set([".md",".markdown",".txt",".canvas"]);static BLOCKED_DIRS=new Set([".obsidian",".git",".trash","node_modules"]);validatePath(e,t){let s=q.resolve(e,t);if(!s.startsWith(q.resolve(e)))throw new Error(`Path traversal blocked: ${t}`);let o=q.relative(e,s).split(q.sep);for(let i of o)if(r.BLOCKED_DIRS.has(i))throw new Error(`Blocked directory: ${i}`);return s}validateFileExtension(e){let t=q.extname(e).toLowerCase();if(t&&!r.ALLOWED_EXTENSIONS.has(t))throw new Error(`Blocked file extension: ${t}. Allowed: ${[...r.ALLOWED_EXTENSIONS].join(", ")}`)}async readNote(e,t,s){let n=this.getProjectPath(e,t),o=this.validatePath(n,s);this.validateFileExtension(o);let i=await st.readFile(o,"utf-8"),a=null,c=i,u=i.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);return u&&(a=this.parseYamlFrontmatter(u[1]),c=u[2]),{content:c,frontmatter:a}}async writeNote(e,t,s,n,o){let i=this.getProjectPath(e,t),a=this.validatePath(i,s);this.validateFileExtension(a),await st.mkdir(q.dirname(a),{recursive:!0});let c=n;if(o&&Object.keys(o).length>0){let{mdFrontmatter:u}=await Promise.resolve().then(()=>(hs(),df));c=`${u(o)}
1403
+ `;await st.writeFile(q.join(t,"_index.md"),s,"utf-8")}static ALLOWED_EXTENSIONS=new Set([".md",".markdown",".txt",".canvas"]);static BLOCKED_DIRS=new Set([".obsidian",".git",".trash","node_modules"]);validatePath(e,t){let s=q.resolve(e,t);if(!s.startsWith(q.resolve(e)))throw new Error(`Path traversal blocked: ${t}`);let o=q.relative(e,s).split(q.sep);for(let i of o)if(r.BLOCKED_DIRS.has(i))throw new Error(`Blocked directory: ${i}`);return s}validateFileExtension(e){let t=q.extname(e).toLowerCase();if(t&&!r.ALLOWED_EXTENSIONS.has(t))throw new Error(`Blocked file extension: ${t}. Allowed: ${[...r.ALLOWED_EXTENSIONS].join(", ")}`)}async readNote(e,t,s){let n=this.getProjectPath(e,t),o=this.validatePath(n,s);this.validateFileExtension(o);let i=await st.readFile(o,"utf-8"),a=null,c=i,u=i.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);return u&&(a=this.parseYamlFrontmatter(u[1]),c=u[2]),{content:c,frontmatter:a}}async writeNote(e,t,s,n,o){let i=this.getProjectPath(e,t),a=this.validatePath(i,s);this.validateFileExtension(a),await st.mkdir(q.dirname(a),{recursive:!0});let c=n;if(o&&Object.keys(o).length>0){let{mdFrontmatter:u}=await Promise.resolve().then(()=>(hs(),Yg));c=`${u(o)}
1404
1404
 
1405
- ${n}`}await st.writeFile(a,c,"utf-8")}async searchNotes(e,t,s,n={}){let o=this.getProjectPath(e,t),i=n.folder?this.validatePath(o,n.folder):o,a=n.limit||20,c=[],u=s.toLowerCase(),d=u.split(/\s+/).filter(p=>p.length>1),m=await this.walkDir(i);for(let p of m)if(r.ALLOWED_EXTENSIONS.has(q.extname(p).toLowerCase()))try{let g=await st.readFile(p,"utf-8"),w=g.toLowerCase(),b=q.relative(o,p),h=0;for(let x of d){let T=0,I=0;for(;(T=w.indexOf(x,T))!==-1;)I++,T+=x.length;I>0&&(h+=Math.log(1+I)),b.toLowerCase().includes(x)&&(h+=2)}if(h>0){let x=g.match(/^#\s+(.+)$/m),T=x?x[1]:q.basename(p,q.extname(p)),I=w.indexOf(u.split(/\s+/)[0]),M=Math.max(0,I-50),y=Math.min(g.length,I+150),j=(M>0?"...":"")+g.slice(M,y).replace(/\n/g," ").trim()+(y<g.length?"...":"");c.push({path:b,title:T,excerpt:j,score:h})}}catch{}return c.sort((p,g)=>g.score-p.score),c.slice(0,a)}async listNotes(e,t,s){let n=this.getProjectPath(e,t),o=s?this.validatePath(n,s):n,i=await st.readdir(o,{withFileTypes:!0}),a=[];for(let c of i){if(r.BLOCKED_DIRS.has(c.name)||c.name.startsWith("."))continue;let u=s?`${s}/${c.name}`:c.name;if(c.isDirectory())a.push({path:u,name:c.name,isDir:!0});else if(r.ALLOWED_EXTENSIONS.has(q.extname(c.name).toLowerCase())){let d=await st.stat(q.join(o,c.name));a.push({path:u,name:c.name,isDir:!1,size:d.size})}}return a}async getVaultStats(e,t){let s=this.getProjectPath(e,t),n={},o=0,i=0,a=await this.walkDir(s);for(let c of a){if(!r.ALLOWED_EXTENSIONS.has(q.extname(c).toLowerCase()))continue;let u=q.relative(s,c),d=q.dirname(u).split(q.sep)[0]||".";n[d]=(n[d]||0)+1,o++;try{let m=await st.stat(c);i+=m.size}catch{}}return{totalNotes:o,folders:n,totalSize:i}}parseYamlFrontmatter(e){let t={};for(let s of e.split(`
1406
- `)){let n=s.match(/^(\w[\w-]*)\s*:\s*(.*)$/);if(n){let[,o,i]=n;i.startsWith("[")&&i.endsWith("]")?t[o]=i.slice(1,-1).split(",").map(a=>a.trim()).filter(Boolean):i==="true"?t[o]=!0:i==="false"?t[o]=!1:!Number.isNaN(Number(i))&&i.trim()!==""?t[o]=Number(i):t[o]=i}}return t}async walkDir(e){let t=[];try{let s=await st.readdir(e,{withFileTypes:!0});for(let n of s){if(r.BLOCKED_DIRS.has(n.name)||n.name.startsWith("."))continue;let o=q.join(e,n.name);n.isDirectory()?t.push(...await this.walkDir(o)):t.push(o)}}catch{}return t}},Ar=new hd});import Ir from"node:path";var Dr,yd=S(()=>{"use strict";Te();ve();Gh();B();hs();Fe();Mt();Dr=class extends Ce{static{l(this,"ObsidianCommands")}async obsidian(e=null,t=process.cwd()){let s=(e||"status").split(" ").filter(Boolean),n=s[0],o=s.includes("--md"),i,a=s.indexOf("--vault-path");a!==-1&&s[a+1]&&(i=s[a+1]);let c=!s.includes("--no-auto-export"),u={md:o,vaultPath:i,autoExport:c};switch(n){case"setup":return this.setup(t,u);case"export":return this.export(t,u);case"status":return this.status(t,u);default:return{success:!1,message:u.md?U(os("error",`Unknown subcommand: ${n}. Use: setup, export, status`)):`Unknown subcommand: ${n}`}}}async setup(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=t.vaultPath;if(!o){let g="Vault path required. Usage: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(g),{success:!1,message:t.md?U(os("error",g)):""}}if(!await C(o)){let g=`Vault path does not exist: ${o}`;return t.md||f.fail(g),{success:!1,message:t.md?U(os("error",g)):""}}let i=Ir.basename(e),a={vaultPath:o,projectFolder:i,autoExport:t.autoExport??!0},c=A.getGlobalProjectPath(n),u=Ir.join(c,"project.json"),d=await Ae(u)||{},m=d.integrations||{};m.obsidian=a,d.integrations=m,await de(u,d);let p=Ar.getProjectPath(a,i);return await Ar.ensureStructure(p),await Ar.writeLink(p,n,e),t.md||(f.done("Obsidian vault linked"),f.info(`Vault: ${o}`),f.info(`Project folder: projects/${i}/`),f.info("Run `prjct obsidian export` to populate the vault")),{success:!0,message:t.md?U(fe("Obsidian Linked"),Ye({Vault:o,"Project folder":`projects/${i}/`,"Auto-export":a.autoExport?"enabled":"disabled"}),le([{label:"Export project data to vault",command:"prjct obsidian export"},{label:"Check integration status",command:"prjct obsidian status"}])):""}}async export(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o){let c="Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(c),{success:!1,message:t.md?U(os("error",c)):""}}let i=Ir.basename(e);t.md||f.info("Exporting to Obsidian vault...");let a=await Ar.exportAll(n,i,o);if(!t.md)if(a.success)f.done("Export complete"),f.info(`Board: ${a.exported.board} tasks`),f.info(`Queue: ${a.exported.queue} items`),f.info(`Shipped: ${a.exported.shipped} items`),f.info(`Roadmap: ${a.exported.roadmap} features`),f.info(`Daily: ${a.exported.daily?"generated":"skipped"}`);else{f.warn("Export completed with errors");for(let c of a.errors)f.fail(c)}return{success:a.success,message:t.md?U(fe("Obsidian Export",a.success?"All sections exported":"Completed with errors"),Ye({Board:`${a.exported.board} tasks`,Queue:`${a.exported.queue} items`,Shipped:`${a.exported.shipped} items`,Roadmap:`${a.exported.roadmap} features`,Daily:a.exported.daily?"generated":"skipped"}),a.errors.length>0?`### Errors
1405
+ ${n}`}await st.writeFile(a,c,"utf-8")}async searchNotes(e,t,s,n={}){let o=this.getProjectPath(e,t),i=n.folder?this.validatePath(o,n.folder):o,a=n.limit||20,c=[],u=s.toLowerCase(),d=u.split(/\s+/).filter(m=>m.length>1),p=await this.walkDir(i);for(let m of p)if(r.ALLOWED_EXTENSIONS.has(q.extname(m).toLowerCase()))try{let g=await st.readFile(m,"utf-8"),w=g.toLowerCase(),b=q.relative(o,m),h=0;for(let x of d){let T=0,I=0;for(;(T=w.indexOf(x,T))!==-1;)I++,T+=x.length;I>0&&(h+=Math.log(1+I)),b.toLowerCase().includes(x)&&(h+=2)}if(h>0){let x=g.match(/^#\s+(.+)$/m),T=x?x[1]:q.basename(m,q.extname(m)),I=w.indexOf(u.split(/\s+/)[0]),M=Math.max(0,I-50),y=Math.min(g.length,I+150),j=(M>0?"...":"")+g.slice(M,y).replace(/\n/g," ").trim()+(y<g.length?"...":"");c.push({path:b,title:T,excerpt:j,score:h})}}catch{}return c.sort((m,g)=>g.score-m.score),c.slice(0,a)}async listNotes(e,t,s){let n=this.getProjectPath(e,t),o=s?this.validatePath(n,s):n,i=await st.readdir(o,{withFileTypes:!0}),a=[];for(let c of i){if(r.BLOCKED_DIRS.has(c.name)||c.name.startsWith("."))continue;let u=s?`${s}/${c.name}`:c.name;if(c.isDirectory())a.push({path:u,name:c.name,isDir:!0});else if(r.ALLOWED_EXTENSIONS.has(q.extname(c.name).toLowerCase())){let d=await st.stat(q.join(o,c.name));a.push({path:u,name:c.name,isDir:!1,size:d.size})}}return a}async getVaultStats(e,t){let s=this.getProjectPath(e,t),n={},o=0,i=0,a=await this.walkDir(s);for(let c of a){if(!r.ALLOWED_EXTENSIONS.has(q.extname(c).toLowerCase()))continue;let u=q.relative(s,c),d=q.dirname(u).split(q.sep)[0]||".";n[d]=(n[d]||0)+1,o++;try{let p=await st.stat(c);i+=p.size}catch{}}return{totalNotes:o,folders:n,totalSize:i}}parseYamlFrontmatter(e){let t={};for(let s of e.split(`
1406
+ `)){let n=s.match(/^(\w[\w-]*)\s*:\s*(.*)$/);if(n){let[,o,i]=n;i.startsWith("[")&&i.endsWith("]")?t[o]=i.slice(1,-1).split(",").map(a=>a.trim()).filter(Boolean):i==="true"?t[o]=!0:i==="false"?t[o]=!1:!Number.isNaN(Number(i))&&i.trim()!==""?t[o]=Number(i):t[o]=i}}return t}async walkDir(e){let t=[];try{let s=await st.readdir(e,{withFileTypes:!0});for(let n of s){if(r.BLOCKED_DIRS.has(n.name)||n.name.startsWith("."))continue;let o=q.join(e,n.name);n.isDirectory()?t.push(...await this.walkDir(o)):t.push(o)}}catch{}return t}},xr=new ed});import jr from"node:path";var Rr,td=S(()=>{"use strict";Te();ve();Uh();B();hs();Fe();Mt();Rr=class extends Ce{static{l(this,"ObsidianCommands")}async obsidian(e=null,t=process.cwd()){let s=(e||"status").split(" ").filter(Boolean),n=s[0],o=s.includes("--md"),i,a=s.indexOf("--vault-path");a!==-1&&s[a+1]&&(i=s[a+1]);let c=!s.includes("--no-auto-export"),u={md:o,vaultPath:i,autoExport:c};switch(n){case"setup":return this.setup(t,u);case"export":return this.export(t,u);case"status":return this.status(t,u);default:return{success:!1,message:u.md?U(os("error",`Unknown subcommand: ${n}. Use: setup, export, status`)):`Unknown subcommand: ${n}`}}}async setup(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=t.vaultPath;if(!o){let g="Vault path required. Usage: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(g),{success:!1,message:t.md?U(os("error",g)):""}}if(!await C(o)){let g=`Vault path does not exist: ${o}`;return t.md||f.fail(g),{success:!1,message:t.md?U(os("error",g)):""}}let i=jr.basename(e),a={vaultPath:o,projectFolder:i,autoExport:t.autoExport??!0},c=A.getGlobalProjectPath(n),u=jr.join(c,"project.json"),d=await Ae(u)||{},p=d.integrations||{};p.obsidian=a,d.integrations=p,await de(u,d);let m=xr.getProjectPath(a,i);return await xr.ensureStructure(m),await xr.writeLink(m,n,e),t.md||(f.done("Obsidian vault linked"),f.info(`Vault: ${o}`),f.info(`Project folder: projects/${i}/`),f.info("Run `prjct obsidian export` to populate the vault")),{success:!0,message:t.md?U(fe("Obsidian Linked"),Ye({Vault:o,"Project folder":`projects/${i}/`,"Auto-export":a.autoExport?"enabled":"disabled"}),le([{label:"Export project data to vault",command:"prjct obsidian export"},{label:"Check integration status",command:"prjct obsidian status"}])):""}}async export(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o){let c="Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(c),{success:!1,message:t.md?U(os("error",c)):""}}let i=jr.basename(e);t.md||f.info("Exporting to Obsidian vault...");let a=await xr.exportAll(n,i,o);if(!t.md)if(a.success)f.done("Export complete"),f.info(`Board: ${a.exported.board} tasks`),f.info(`Queue: ${a.exported.queue} items`),f.info(`Shipped: ${a.exported.shipped} items`),f.info(`Roadmap: ${a.exported.roadmap} features`),f.info(`Daily: ${a.exported.daily?"generated":"skipped"}`);else{f.warn("Export completed with errors");for(let c of a.errors)f.fail(c)}return{success:a.success,message:t.md?U(fe("Obsidian Export",a.success?"All sections exported":"Completed with errors"),Ye({Board:`${a.exported.board} tasks`,Queue:`${a.exported.queue} items`,Shipped:`${a.exported.shipped} items`,Roadmap:`${a.exported.roadmap} features`,Daily:a.exported.daily?"generated":"skipped"}),a.errors.length>0?`### Errors
1407
1407
  ${a.errors.map(c=>`- ${c}`).join(`
1408
- `)}`:null,le([{label:"Open vault in Obsidian",command:`open ${o.vaultPath}`},{label:"Re-export",command:"prjct obsidian export"}])):""}}async status(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o)return t.md||f.info("Obsidian integration is not enabled. All data is stored in the local database by default."),{success:!0,message:t.md?U(os("info","Obsidian integration is not enabled. All data is stored in the local database by default."),le([{label:"Enable Obsidian (optional)",command:"prjct obsidian setup --vault-path /path/to/vault"}])):""};let i=Ir.basename(e),a=Ar.getProjectPath(o,i),c=await C(Ir.join(a,".prjct-link.yml"));return t.md||(f.done("Obsidian configured"),f.info(`Vault: ${o.vaultPath}`),f.info(`Project folder: projects/${o.projectFolder||i}/`),f.info(`Auto-export: ${o.autoExport?"enabled":"disabled"}`),f.info(`Link file: ${c?"present":"missing"}`)),{success:!0,message:t.md?U(fe("Obsidian Status"),Ye({Vault:o.vaultPath,"Project folder":`projects/${o.projectFolder||i}/`,"Auto-export":o.autoExport?"enabled":"disabled","Link file":c?"present":"missing"}),le([{label:"Export data to vault",command:"prjct obsidian export"}])):""}}async getObsidianConfig(e){let t=A.getGlobalProjectPath(e),s=Ir.join(t,"project.json"),n=await Ae(s);if(!n)return null;let o=n.integrations;return o?.obsidian?o.obsidian:null}}});var wd,kE,$r,qh=S(()=>{"use strict";Vt();pi();wd=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await ce.getActiveTasks(e),o=t.includeBacklog?await ce.getBacklog(e):[],i=[...n,...o],c=di(i).filter(u=>!u.completed).slice(0,s).map(u=>({id:u.id,title:u.description,priority:u.priority,source:"queue",queueTaskId:u.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
1408
+ `)}`:null,le([{label:"Open vault in Obsidian",command:`open ${o.vaultPath}`},{label:"Re-export",command:"prjct obsidian export"}])):""}}async status(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o)return t.md||f.info("Obsidian integration is not enabled. All data is stored in the local database by default."),{success:!0,message:t.md?U(os("info","Obsidian integration is not enabled. All data is stored in the local database by default."),le([{label:"Enable Obsidian (optional)",command:"prjct obsidian setup --vault-path /path/to/vault"}])):""};let i=jr.basename(e),a=xr.getProjectPath(o,i),c=await C(jr.join(a,".prjct-link.yml"));return t.md||(f.done("Obsidian configured"),f.info(`Vault: ${o.vaultPath}`),f.info(`Project folder: projects/${o.projectFolder||i}/`),f.info(`Auto-export: ${o.autoExport?"enabled":"disabled"}`),f.info(`Link file: ${c?"present":"missing"}`)),{success:!0,message:t.md?U(fe("Obsidian Status"),Ye({Vault:o.vaultPath,"Project folder":`projects/${o.projectFolder||i}/`,"Auto-export":o.autoExport?"enabled":"disabled","Link file":c?"present":"missing"}),le([{label:"Export data to vault",command:"prjct obsidian export"}])):""}}async getObsidianConfig(e){let t=A.getGlobalProjectPath(e),s=jr.join(t,"project.json"),n=await Ae(s);if(!n)return null;let o=n.integrations;return o?.obsidian?o.obsidian:null}}});var sd,pE,Ar,Hh=S(()=>{"use strict";Vt();ai();sd=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await ce.getActiveTasks(e),o=t.includeBacklog?await ce.getBacklog(e):[],i=[...n,...o],c=ii(i).filter(u=>!u.completed).slice(0,s).map(u=>({id:u.id,title:u.description,priority:u.priority,source:"queue",queueTaskId:u.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
1409
1409
  `)}let n=["assignee = currentUser()",'statusCategory = "To Do"'];return t.sprint?n.push("sprint in openSprints()"):t.backlog&&n.push("sprint is EMPTY"),t.labels?.length&&n.push(`labels in (${t.labels.join(", ")})`),t.priority&&n.push(`priority = "${t.priority}"`),["Use the Jira MCP tool `searchJiraIssuesUsingJql` with:",`- jql: "${`${n.join(" AND ")} ORDER BY priority DESC`}"`,`- maxResults: ${s}`,"","Return the results as a JSON array with fields: key, summary, priority, storyPoints.","I will use this to create parallel worktrees for each ticket."].join(`
1410
- `)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,m=a[u.priority?.toLowerCase()||"none"]??4;return d-m})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
1411
- `)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},kE=new wd,$r=kE});var Mr,Hn,jH,kd=S(()=>{"use strict";Te();Ut();qh();lo();vt();W();Fe();Mt();Mr=null,Hn=class extends Ce{static{l(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:k(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t),i=this.slugify(e),a=await Yt.create(t,i,{branch:s.branch});await Yt.setup(a.path,t);let c=Z();return await L.startTaskInWorkspace(o,{id:Z(),description:e,sessionId:Z(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:k(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Yt.create(t,a);await Yt.setup(c.path,t);let u=Z();await L.startTaskInWorkspace(n,{id:Z(),description:i,sessionId:Z(),workspaceId:u,worktreePath:c.path},u),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${k(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:k(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=$r.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=$r.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await $r.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(Mr=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info($r.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Mr||Mr.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of Mr.items){let i=$r.slugify(o);try{let a=await Yt.create(t,i);await Yt.setup(a.path,t);let c=Z();await L.startTaskInWorkspace(e,{id:Z(),description:o.title,sessionId:Z(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:Mr.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${k(a)}`)}}Mr=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([L.getActiveTasks(e),Yt.list(t)]),o=await L.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
1412
- Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(p=>p.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",m=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${m}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
1413
- Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await L.getActiveTasks(e),n=await Yt.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Yt.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},jH=new Hn});import We from"chalk";function Ma(r,e,t){return t==="below"?r<=e?We.green("\u2713"):We.yellow("\u26A0"):r>=e?We.green("\u2713"):We.yellow("\u26A0")}var cn,Or,Sd=S(()=>{"use strict";Te();Pi();W();Fe();Mt();cn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(Ma,"statusIcon");Or=class extends Ce{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Rn.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1410
+ `)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,p=a[u.priority?.toLowerCase()||"none"]??4;return d-p})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
1411
+ `)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},pE=new sd,Ar=pE});var Ir,Un,wH,nd=S(()=>{"use strict";Te();Ut();Hh();oo();vt();W();Fe();Mt();Ir=null,Un=class extends Ce{static{l(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:k(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t),i=this.slugify(e),a=await Yt.create(t,i,{branch:s.branch});await Yt.setup(a.path,t);let c=Z();return await L.startTaskInWorkspace(o,{id:Z(),description:e,sessionId:Z(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:k(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Yt.create(t,a);await Yt.setup(c.path,t);let u=Z();await L.startTaskInWorkspace(n,{id:Z(),description:i,sessionId:Z(),workspaceId:u,worktreePath:c.path},u),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${k(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:k(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=Ar.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=Ar.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await Ar.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(Ir=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(Ar.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Ir||Ir.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of Ir.items){let i=Ar.slugify(o);try{let a=await Yt.create(t,i);await Yt.setup(a.path,t);let c=Z();await L.startTaskInWorkspace(e,{id:Z(),description:o.title,sessionId:Z(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:Ir.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${k(a)}`)}}Ir=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([L.getActiveTasks(e),Yt.list(t)]),o=await L.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
1412
+ Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(m=>m.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",p=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${p}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
1413
+ Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await L.getActiveTasks(e),n=await Yt.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Yt.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},wH=new Un});import We from"chalk";function Aa(r,e,t){return t==="below"?r<=e?We.green("\u2713"):We.yellow("\u26A0"):r>=e?We.green("\u2713"):We.yellow("\u26A0")}var an,Dr,rd=S(()=>{"use strict";Te();Ti();W();Fe();Mt();an={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(Aa,"statusIcon");Dr=class extends Ce{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await xn.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1414
1414
  ${We.dim("No performance data yet.")}`),console.log(`${We.dim("Metrics are collected automatically as you use the CLI.")}
1415
1415
  `),{success:!0,message:"No data"};if(console.log(`
1416
- ${We.cyan("Performance Report")} ${We.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Ma(i.startup.avg,cn.startup.max,"below");console.log(` Startup: avg ${We.bold(`${i.startup.avg}ms`)} ${We.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${We.dim(`target: <${cn.startup.max}ms`)}`)}if(i.memory){let c=Ma(i.memory.peakHeapMB,cn.heapMB.max,"below");console.log(` Memory: avg ${We.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${We.dim(`target: <${cn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Ma(i.contextCorrectness.rate,cn.contextRate.min,"above");console.log(` Context: ${We.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${We.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${We.dim(`target: ${cn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Ma(i.subtaskHandoff.rate,cn.handoffRate.min,"above");console.log(` Handoff: ${We.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${We.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${We.dim(`target: ${cn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1417
- ${We.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${We.bold(`${u.avg}ms`)} ${We.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}}});import SE from"node:fs/promises";import bE from"node:path";var Vh,Bh,bd,vE,Dt,Oa=S(()=>{"use strict";ve();B();Vh="https://api.prjct.app",Bh={apiKey:null,apiUrl:Vh,userId:null,email:null,lastAuth:null},bd=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=A.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ae(this.configPath);return this.cachedConfig=e??{...Bh},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await rt(bE.dirname(this.configPath)),await de(this.configPath,s),await SE.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Vh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Bh},await de(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},vE=new bd,Dt=vE});function EE(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function CE(r){let e={};for(let[t,s]of Object.entries(r))e[EE(t)]=s;return e}function PE(r,e){let[t,s]=e.type.split("."),n=TE[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=CE(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}function Jh(r,e){return e.map(t=>PE(r,t)).filter(t=>t!==null)}var TE,zh=S(()=>{"use strict";TE={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l(EE,"camelToSnake");l(CE,"snakeCaseKeys");l(PE,"mapCliEventToWebFormat");l(Jh,"mapCliEventsToWebFormat")});var vd,_r,Td=S(()=>{"use strict";xn();Oa();zh();vd=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Jh(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),rr("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Dt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Dt.getApiUrl(),Dt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),rr("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${rr("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},_r=new vd});var Ed,xE,Kh,Xh=S(()=>{"use strict";Ac();zs();Vt();Ks();vt();Oa();Td();Ed=class{static{l(this,"SyncManager")}async hasAuth(){return await Dt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await _r.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Js.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await _r.pushEvents(e,n);if(o.success)return await Js.clearPending(e),await Js.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await Js.getLastSync(e))?.timestamp,n=await _r.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await Js.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await L.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await L.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await ce.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await $e.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await $e.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await it.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await ce.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},xE=new Ed,Kh=xE});import jE from"node:fs/promises";import RE from"node:http";import AE from"node:path";import ae from"chalk";var Nr,Cd=S(()=>{"use strict";Os();Te();ve();fr();Oa();Td();Xh();W();Je();B();$o();Fe();ut();Mt();Nr=class extends Ce{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await Dt.write({apiKey:o,...i?{apiUrl:i}:{}}),await _r.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ae.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1416
+ ${We.cyan("Performance Report")} ${We.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Aa(i.startup.avg,an.startup.max,"below");console.log(` Startup: avg ${We.bold(`${i.startup.avg}ms`)} ${We.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${We.dim(`target: <${an.startup.max}ms`)}`)}if(i.memory){let c=Aa(i.memory.peakHeapMB,an.heapMB.max,"below");console.log(` Memory: avg ${We.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${We.dim(`target: <${an.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Aa(i.contextCorrectness.rate,an.contextRate.min,"above");console.log(` Context: ${We.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${We.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${We.dim(`target: ${an.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Aa(i.subtaskHandoff.rate,an.handoffRate.min,"above");console.log(` Handoff: ${We.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${We.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${We.dim(`target: ${an.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1417
+ ${We.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${We.bold(`${u.avg}ms`)} ${We.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}}});import gE from"node:fs/promises";import fE from"node:path";var Gh,Wh,od,hE,Dt,Ia=S(()=>{"use strict";ve();B();Gh="https://api.prjct.app",Wh={apiKey:null,apiUrl:Gh,userId:null,email:null,lastAuth:null},od=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=A.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ae(this.configPath);return this.cachedConfig=e??{...Wh},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await rt(fE.dirname(this.configPath)),await de(this.configPath,s),await gE.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Gh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Wh},await de(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},hE=new od,Dt=hE});function wE(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function kE(r){let e={};for(let[t,s]of Object.entries(r))e[wE(t)]=s;return e}function SE(r,e){let[t,s]=e.type.split("."),n=yE[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=kE(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}function qh(r,e){return e.map(t=>SE(r,t)).filter(t=>t!==null)}var yE,Bh=S(()=>{"use strict";yE={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l(wE,"camelToSnake");l(kE,"snakeCaseKeys");l(SE,"mapCliEventToWebFormat");l(qh,"mapCliEventsToWebFormat")});var id,$r,ad=S(()=>{"use strict";Pn();Ia();Bh();id=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=qh(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),nr("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Dt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Dt.getApiUrl(),Dt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),nr("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${nr("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},$r=new id});var cd,bE,Vh,Jh=S(()=>{"use strict";Cc();Js();Vt();zs();vt();Ia();ad();cd=class{static{l(this,"SyncManager")}async hasAuth(){return await Dt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await $r.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Vs.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await $r.pushEvents(e,n);if(o.success)return await Vs.clearPending(e),await Vs.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await Vs.getLastSync(e))?.timestamp,n=await $r.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await Vs.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await L.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await L.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await ce.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await $e.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await $e.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await it.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await ce.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},bE=new cd,Vh=bE});import vE from"node:fs/promises";import TE from"node:http";import EE from"node:path";import ae from"chalk";var Mr,ld=S(()=>{"use strict";Os();Te();ve();pr();Ia();ad();Jh();W();Je();B();jo();Fe();ut();Mt();Mr=class extends Ce{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await Dt.write({apiKey:o,...i?{apiUrl:i}:{}}),await $r.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ae.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1418
1418
  - **Status**: Connected
1419
1419
  - **Key**: \`${o.substring(0,12)}...\`
1420
1420
  - **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(ae.dim(`Key: ${o.substring(0,12)}...`)),f.info(ae.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
@@ -1431,13 +1431,13 @@ Key: ${t.apiKeyPrefix}`),f.info(`Run ${ae.cyan("prjct logout")} first to re-a
1431
1431
  - **Email**: ${t.email}
1432
1432
  - **Key**: \`${t.apiKeyPrefix}\`
1433
1433
 
1434
- Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=RE.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),m=c.searchParams.get("user_id");if(u){await Dt.saveAuth(u,m||"",d||"");let p=`${s}/api`;await Dt.write({apiUrl:p}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
1434
+ Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=TE.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(u){await Dt.saveAuth(u,p||"",d||"");let m=`${s}/api`;await Dt.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
1435
1435
  Key: ${u.substring(0,12)}...
1436
1436
  Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
1437
1437
  - **Email**: ${d}
1438
1438
  - **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
1439
1439
  Authentication failed: no API key received`:""}));return}a.writeHead(404),a.end("Not found")});o.listen(0,"127.0.0.1",async()=>{let i=o.address();if(!i||typeof i=="string"){o.close(),e.md||f.fail("Failed to start callback server"),n({success:!1,message:e.md?`## Error
1440
- Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(ae.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await F(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${ae.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},5*60*1e3)})}async logout(){return(await Dt.getStatus()).authenticated?(await Dt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await $.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await Kh.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
1440
+ Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(ae.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await F(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${ae.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},5*60*1e3)})}async logout(){return(await Dt.getStatus()).authenticated?(await Dt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await $.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await Vh.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
1441
1441
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
1442
1442
  <title>prjct CLI Connected</title>
1443
1443
  <style>
@@ -1501,17 +1501,17 @@ Please install one first:
1501
1501
  - OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Ue.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1502
1502
  \u2705 Installed ${a.installed?.length??0} commands to:
1503
1503
  ${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1504
- \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(yr(),Ji));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${k(a)}`)}return await this.setupMcpServers(),console.log(`
1504
+ \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(fr(),qi));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${k(a)}`)}return await this.setupMcpServers(),console.log(`
1505
1505
  \u{1F389} Setup complete!`),console.log(`
1506
1506
  Next steps:`),console.log(` 1. Open ${i}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1507
1507
  `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ue.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ue.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1508
1508
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1509
1509
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1510
1510
  \u{1F4DD} Installing global configuration...`);let s=await Ue.installGlobalConfig(),n=s.path?A.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(lt(),bt(Nt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1511
- \u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(yr(),Ji));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${k(c)}`)}return await this.setupMcpServers(),console.log(`
1511
+ \u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(fr(),qi));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${k(c)}`)}return await this.setupMcpServers(),console.log(`
1512
1512
  \u{1F389} Setup complete!
1513
1513
  `),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
1514
- \u{1F50C} Configuring MCP servers...`);try{await ss.install();let e=await ss.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${k(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=ws();await nn("linear",e)?console.log("\u2705 Linear MCP already configured"):(await ku("linear",aa.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${k(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=ws();await nn("jira",e)?console.log("\u2705 Jira MCP already configured"):(await ku("jira",aa.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${k(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),s=AE.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1514
+ \u{1F50C} Configuring MCP servers...`);try{await ss.install();let e=await ss.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${k(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=ws();await sn("linear",e)?console.log("\u2705 Linear MCP already configured"):(await uu("linear",ra.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${k(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=ws();await sn("jira",e)?console.log("\u2705 Jira MCP already configured"):(await uu("jira",ra.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${k(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),s=EE.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1515
1515
  # prjct Status Line for Claude Code
1516
1516
  # Shows version update notifications and current task
1517
1517
 
@@ -1567,14 +1567,14 @@ fi
1567
1567
 
1568
1568
  # Default: show prjct branding
1569
1569
  echo "\u26A1 prjct"
1570
- `;await jE.writeFile(s,n,{mode:493});let o={};if(await C(t))try{o=await Ae(t)??{}}catch{}return o.statusLine={type:"command",command:s},await de(t,o),{success:!0}}catch(e){return{success:!1,error:k(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${ke} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import Yh from"node:path";var IE,DE,_a,Qh=S(()=>{"use strict";X();B();IE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],DE=`# Changelog
1570
+ `;await vE.writeFile(s,n,{mode:493});let o={};if(await C(t))try{o=await Ae(t)??{}}catch{}return o.statusLine={type:"command",command:s},await de(t,o),{success:!0}}catch(e){return{success:!1,error:k(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${ke} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import zh from"node:path";var CE,PE,Da,Xh=S(()=>{"use strict";K();B();CE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],PE=`# Changelog
1571
1571
 
1572
1572
  All notable changes to this project will be documented in this file.
1573
1573
 
1574
1574
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
1575
1575
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1576
- `,_a=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of IE){let n=Yh.join(this.projectPath,s);if(await C(n)){let o=await _e(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=Yh.join(this.projectPath,e);return await Pt(t,`${DE}
1577
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await _e(t.filePath),n=e.date||Pp(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Pt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
1576
+ `,Da=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of CE){let n=zh.join(this.projectPath,s);if(await C(n)){let o=await _e(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=zh.join(this.projectPath,e);return await Pt(t,`${PE}
1577
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await _e(t.filePath),n=e.date||um(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Pt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
1578
1578
  ${a}`}return`${e.trimEnd()}
1579
1579
 
1580
1580
  ${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
@@ -1584,31 +1584,31 @@ ${a}`}return`${n}
1584
1584
 
1585
1585
  ${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push("### Added"),s.push(`- ${e.description}`),s.push(""));return s.join(`
1586
1586
  `)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
1587
- `)}}});import Lr from"node:path";function Zh(r){return/^\d+\.\d+\.\d+/.test(r)}function Fr(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function $E(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function ME(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}function OE(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Na,ey=S(()=>{"use strict";Je();B();Na=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let s=await t();if(s)return s}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Lr.join(this.projectPath,"package.json"),t=await Ae(e,null);return t?.version?{current:t.version,next:Fr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Lr.join(this.projectPath,"Cargo.toml"),t=await _e(e,"");if(!t)return null;let s=$E(t);return s?{current:s,next:Fr(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Lr.join(this.projectPath,"pyproject.toml"),t=await _e(e,"");if(!t)return null;let s=ME(t);return s?{current:s,next:Fr(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Cs(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Lr.join(this.projectPath,e[0]),s=await _e(t,"");if(!s)return null;let n=OE(s);return n?{current:n,next:Fr(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Lr.join(this.projectPath,e),s=await _e(t,"");if(!s)return null;let n=s.trim();return Zh(n)?{current:n,next:Fr(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await F("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1588
- `);for(let s of t){let n=s.trim().replace(/^v/,"");if(Zh(n))return{current:n,next:Fr(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Lr.join(this.projectPath,"VERSION");return await Pt(e,`0.1.0
1589
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await hn("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Pt(e.file,`${e.next}
1590
- `);break}}async writeJsonVersion(e,t){let s=await Ae(e,{});s&&(s.version=t,await de(e,s))}async writeTomlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Pt(e,n)}async writeXmlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Pt(e,n)}};l(Zh,"isSemver");l(Fr,"bumpPatch");l($E,"parseTomlVersion");l(ME,"parsePyprojectVersion");l(OE,"parseCsprojVersion")});import Gt from"chalk";async function ls(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=je.getRulesForCommand(r,e).filter(m=>m.position===t),a=i.filter(m=>m.type==="gate");for(let m of a){let p=m.description||m.action;console.log(`
1591
- ${Gt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await F(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let w=Date.now()-g,b=w>1e3?`${(w/1e3).toFixed(1)}s`:`${w}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${Gt.red("\u2717")} gate failed: ${p}`),n.gatesFailed.push(p),n.success=!1,n.output+=`Gate failed: ${p}
1587
+ `)}}});import Or from"node:path";function Kh(r){return/^\d+\.\d+\.\d+/.test(r)}function _r(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function xE(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function jE(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}function RE(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var $a,Yh=S(()=>{"use strict";Je();B();$a=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let s=await t();if(s)return s}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Or.join(this.projectPath,"package.json"),t=await Ae(e,null);return t?.version?{current:t.version,next:_r(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Or.join(this.projectPath,"Cargo.toml"),t=await _e(e,"");if(!t)return null;let s=xE(t);return s?{current:s,next:_r(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Or.join(this.projectPath,"pyproject.toml"),t=await _e(e,"");if(!t)return null;let s=jE(t);return s?{current:s,next:_r(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Cs(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Or.join(this.projectPath,e[0]),s=await _e(t,"");if(!s)return null;let n=RE(s);return n?{current:n,next:_r(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Or.join(this.projectPath,e),s=await _e(t,"");if(!s)return null;let n=s.trim();return Kh(n)?{current:n,next:_r(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await F("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1588
+ `);for(let s of t){let n=s.trim().replace(/^v/,"");if(Kh(n))return{current:n,next:_r(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Or.join(this.projectPath,"VERSION");return await Pt(e,`0.1.0
1589
+ `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await fn("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Pt(e.file,`${e.next}
1590
+ `);break}}async writeJsonVersion(e,t){let s=await Ae(e,{});s&&(s.version=t,await de(e,s))}async writeTomlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Pt(e,n)}async writeXmlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Pt(e,n)}};l(Kh,"isSemver");l(_r,"bumpPatch");l(xE,"parseTomlVersion");l(jE,"parsePyprojectVersion");l(RE,"parseCsprojVersion")});import Gt from"chalk";async function ls(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=je.getRulesForCommand(r,e).filter(p=>p.position===t),a=i.filter(p=>p.type==="gate");for(let p of a){let m=p.description||p.action;console.log(`
1591
+ ${Gt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let w=Date.now()-g,b=w>1e3?`${(w/1e3).toFixed(1)}s`:`${w}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${Gt.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
1592
1592
  ${k(g)}
1593
- `,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
1594
- ${Gt.dim(`[instruction] ${t}-${e}: ${p}`)}`),n.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
1595
- ${Gt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await F(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`(${w})`)}`)}catch(p){console.log(`${Gt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),n.hooksFailed.push(m.description||m.action),n.output+=`Hook failed: ${m.action}
1596
- ${k(p)}
1597
- `}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
1598
- ${Gt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await F(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`step passed (${w})`)}`),n.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${Gt.red("\u2717")} step failed: ${m.action}`),n.gatesFailed.push(m.description||m.action),n.success=!1,n.output+=`Step failed: ${m.action}
1599
- ${k(p)}
1600
- `,n}}return n}var Pd=S(()=>{"use strict";wo();W();Je();l(ls,"executeWorkflowRules")});var Ur,xd=S(()=>{"use strict";Mi();Te();Qh();ea();ey();Ks();vt();W();X();Je();hs();kr();Fe();Pd();Mt();Ur=class extends Ce{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await L.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await L.completeTask(o)),i||(i="current work");let c=await ls(o,"ship","before",{projectPath:t,skipRules:s.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};s.md||f.step(1,4,"Bumping version...");let d=await new Na(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new _a(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let h=await this._gitPush(t);g=h.success?"pushed":h.message}await it.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:v()}),await Tt.learnDecision(o,"commit_footer","prjct","ship"),await Tt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let w=await ls(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),b=[...c.instructions,...w.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Ns.sync(t),s.md||f.done("\u2713 AI context updated")}catch(h){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",k(h))}if(s.md){let h=na("ship",!0),x=U(fe(`Shipped: ${i}`,`Version: ${d}`),te("Results",He([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),b.length>0?te("Agent Instructions",He(b)):null,le(h.map(T=>({label:T.desc,command:T.cmd}))));console.log(x)}else f.done(`v${d} shipped`),Wt("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async _createShipCommit(e,t){try{await F("git add .");let s=`feat: ${e}
1593
+ `,n}}let c=i.filter(p=>p.type==="instruction");for(let p of c){let m=p.description||p.action;console.log(`
1594
+ ${Gt.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let u=i.filter(p=>p.type==="hook");for(let p of u){console.log(`
1595
+ ${Gt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`(${w})`)}`)}catch(m){console.log(`${Gt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
1596
+ ${k(m)}
1597
+ `}}let d=i.filter(p=>p.type==="step");for(let p of d){console.log(`
1598
+ ${Gt.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`step passed (${w})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${Gt.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
1599
+ ${k(m)}
1600
+ `,n}}return n}var ud=S(()=>{"use strict";go();W();Je();l(ls,"executeWorkflowRules")});var Nr,dd=S(()=>{"use strict";Ii();Te();Xh();Yi();Yh();zs();vt();W();K();Je();hs();yr();Fe();ud();Mt();Nr=class extends Ce{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await L.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await L.completeTask(o)),i||(i="current work");let c=await ls(o,"ship","before",{projectPath:t,skipRules:s.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};s.md||f.step(1,4,"Bumping version...");let d=await new $a(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new Da(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let h=await this._gitPush(t);g=h.success?"pushed":h.message}await it.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:v()}),await Tt.learnDecision(o,"commit_footer","prjct","ship"),await Tt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let w=await ls(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),b=[...c.instructions,...w.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Ns.sync(t),s.md||f.done("\u2713 AI context updated")}catch(h){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",k(h))}if(s.md){let h=ea("ship",!0),x=U(fe(`Shipped: ${i}`,`Version: ${d}`),te("Results",He([`Version: ${d}`,`Commit: ${m.success?"created":m.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),b.length>0?te("Agent Instructions",He(b)):null,le(h.map(T=>({label:T.desc,command:T.cmd}))));console.log(x)}else f.done(`v${d} shipped`),Wt("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async _createShipCommit(e,t){try{await F("git add .");let s=`feat: ${e}
1601
1601
 
1602
- Generated with [p/](https://www.prjct.app/)`;return await hn("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return O(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await F("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return O(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import{execSync as Wr}from"node:child_process";import jd from"node:fs/promises";import Uo from"node:path";import Hr from"chalk";function ty(){try{return!!Wr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function sy(){try{let e=Wr("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}var Gr,Rd=S(()=>{"use strict";Os();ai();ve();Ju();Jl();W();Fe();ut();Mt();l(ty,"isHomebrewInstall");l(sy,"getCurrentVersion");Gr=class extends Ce{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),!s&&o.phase1.success&&this.redirectToInstalledPackage(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await uo.updateVersion(ke)}catch{}try{await new wa().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(k(i)),{success:!1,error:k(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=sy();if(e)return ty()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(ty()){try{Wr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Wr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Wr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=sy();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(n){t.success=!1,t.errors.push(k(n))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let n=0,o=0;for(let i of s)if(!e)try{let a=await zi(i),c=await Ki(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${k(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Ms().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${k(n)}`)}try{let o=await new Ms().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${k(n)}`)}try{await new Ms().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${k(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(lt(),Nt)),o=await n(),i=Uo.join(Bt("node:os").homedir());if(o.gemini.installed){let a=Uo.join(i,".gemini","GEMINI.md");try{let c=await jd.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let{getTemplateContent:m}=await Promise.resolve().then(()=>(fs(),bl)),p=m("global/GEMINI.md");if(p?.includes(u)&&p.includes(d)){let g=p.substring(p.indexOf(u),p.indexOf(d)+d.length),w=c.substring(0,c.indexOf(u)),b=c.substring(c.indexOf(d)+d.length),h=w+g+b,x="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",T="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(h.includes(x)&&h.includes(T)){let I=h.substring(0,h.indexOf(x)),M=h.substring(h.indexOf(T)+T.length);h=`${(I+M).replace(/\n{3,}/g,`
1602
+ Generated with [p/](https://www.prjct.app/)`;return await fn("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return O(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await F("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return O(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import{execSync as Fr}from"node:child_process";import md from"node:fs/promises";import Mo from"node:path";import Lr from"chalk";function Qh(){try{return!!Fr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function Zh(){try{let e=Fr("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}var Ur,pd=S(()=>{"use strict";Os();si();ve();Lu();Ll();W();Fe();ut();Mt();l(Qh,"isHomebrewInstall");l(Zh,"getCurrentVersion");Ur=class extends Ce{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),!s&&o.phase1.success&&this.redirectToInstalledPackage(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await io.updateVersion(ke)}catch{}try{await new ha().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(k(i)),{success:!1,error:k(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=Zh();if(e)return Qh()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(Qh()){try{Fr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Fr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Fr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Zh();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(n){t.success=!1,t.errors.push(k(n))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let n=0,o=0;for(let i of s)if(!e)try{let a=await Bi(i),c=await Vi(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${k(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Ms().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${k(n)}`)}try{let o=await new Ms().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${k(n)}`)}try{await new Ms().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${k(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(lt(),Nt)),o=await n(),i=Mo.join(Bt("node:os").homedir());if(o.gemini.installed){let a=Mo.join(i,".gemini","GEMINI.md");try{let c=await md.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let{getTemplateContent:p}=await Promise.resolve().then(()=>(fs(),ml)),m=p("global/GEMINI.md");if(m?.includes(u)&&m.includes(d)){let g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),w=c.substring(0,c.indexOf(u)),b=c.substring(c.indexOf(d)+d.length),h=w+g+b,x="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",T="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(h.includes(x)&&h.includes(T)){let I=h.substring(0,h.indexOf(x)),M=h.substring(h.indexOf(T)+T.length);h=`${(I+M).replace(/\n{3,}/g,`
1603
1603
 
1604
1604
  `).trim()}
1605
- `}await jd.writeFile(a,h,"utf-8"),t.details.push("Gemini global config updated")}}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:s,stopDaemon:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Ts(),vs));await s()?(await n()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(k(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?Hr.green("\u2713"):c?Hr.red("\u2717"):Hr.yellow("\u26A0");console.log(` ${u} ${Hr.bold(i)}`);for(let d of a.details)console.log(` ${Hr.dim(d)}`);for(let d of a.errors)console.log(` ${Hr.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1606
- `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}redirectToInstalledPackage(){try{let e=Wr("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),t=Uo.join(e,"prjct-cli"),s=Uo.join(t,"package.json"),{existsSync:n,lstatSync:o,readFileSync:i}=Bt("node:fs");if(!n(s)||o(t).isSymbolicLink())return;try{if(JSON.parse(i(s,"utf-8")).name!=="prjct-cli")return}catch{return}yc(t);let{resetBundle:c}=(fs(),bt(bl));c()}catch{}}async getAllProjectIds(){let e=Uo.join(A.getGlobalBasePath(),"projects");try{return(await jd.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Ge from"chalk";var qr,Ad=S(()=>{"use strict";Tu();Te();yo();ki();W();Fe();vr();Mt();qr=class extends Ce{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await $t.getAll(n);if(i.length===0)return console.log(`
1605
+ `}await md.writeFile(a,h,"utf-8"),t.details.push("Gemini global config updated")}}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:s,stopDaemon:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Ts(),vs));await s()?(await n()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(k(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?Lr.green("\u2713"):c?Lr.red("\u2717"):Lr.yellow("\u26A0");console.log(` ${u} ${Lr.bold(i)}`);for(let d of a.details)console.log(` ${Lr.dim(d)}`);for(let d of a.errors)console.log(` ${Lr.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1606
+ `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}redirectToInstalledPackage(){try{let e=Fr("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),t=Mo.join(e,"prjct-cli"),s=Mo.join(t,"package.json"),{existsSync:n,lstatSync:o,readFileSync:i}=Bt("node:fs");if(!n(s)||o(t).isSymbolicLink())return;try{if(JSON.parse(i(s,"utf-8")).name!=="prjct-cli")return}catch{return}mc(t);let{resetBundle:c}=(fs(),bt(ml));c()}catch{}}async getAllProjectIds(){let e=Mo.join(A.getGlobalBasePath(),"projects");try{return(await md.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Ge from"chalk";var Hr,gd=S(()=>{"use strict";gu();Te();po();gi();W();Fe();Sr();Mt();Hr=class extends Ce{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await $t.getAll(n);if(i.length===0)return console.log(`
1607
1607
  ${Ge.dim("No velocity data yet.")}`),console.log(`${Ge.dim("Complete tasks with estimates to build velocity history.")}
1608
- `),{success:!0,message:"No data"};let a=ca(i,o);await sr.saveMetrics(n,a),console.log(`
1609
- ${Ge.cyan("Sprint Velocity")} ${Ge.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?Ge.green:m.estimationAccuracy>=60?Ge.yellow:Ge.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ge.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ge.green("\u2191"):a.velocityTrend==="declining"?Ge.red("\u2193"):Ge.dim("\u2192");if(console.log(` Average: ${Ge.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ge.bold(`${a.estimationAccuracy}%`)} ${Ge.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1610
- ${Ge.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ge.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ge.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ge.green("\u2713")} ${m.category} tasks estimated within ${Ge.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Lf(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1611
- ${Ge.dim("Projection:")}`),console.log(` Backlog: ${Ge.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ge.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async loadVelocityConfig(e){try{let s=await $.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...Xs,...s.velocity}}catch{}return Xs}}});var ry,Wn,ny,oy,iy,_E,Id=S(()=>{"use strict";Eo();X();vr();ry=l(r=>Cl.includes(r),"isValidPoint"),Wn=l(r=>Pl[r],"pointsToMinutes"),ny=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"),oy=l(r=>{let e=Wn(r);return`${ny(e.min)}\u2013${ny(e.max)}`},"pointsToTimeRange"),iy=l(async(r,e)=>{let s=(await $t.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+Lt(c.actualDuration),0)/s.length;return{points:_E(o),basedOn:s.length}},"suggestFromHistory"),_E=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Cl){let n=Math.abs(Pl[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import Dd from"node:fs/promises";import NE from"node:os";import La from"node:path";var $d,Md,ay=S(()=>{"use strict";W();B();$d=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=La.join(NE.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Dd.mkdir(this.commandsPath,{recursive:!0});let s=La.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await Dd.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=La.join(this.commandsPath,`${e}.md`);return await Dd.unlink(t),{success:!0}}catch(t){return O(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=La.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
1608
+ `),{success:!0,message:"No data"};let a=oa(i,o);await tr.saveMetrics(n,a),console.log(`
1609
+ ${Ge.cyan("Sprint Velocity")} ${Ge.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let p of c){let m=p.estimationAccuracy>=80?Ge.green:p.estimationAccuracy>=60?Ge.yellow:Ge.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${Ge.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ge.green("\u2191"):a.velocityTrend==="declining"?Ge.red("\u2193"):Ge.dim("\u2192");if(console.log(` Average: ${Ge.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ge.bold(`${a.estimationAccuracy}%`)} ${Ge.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1610
+ ${Ge.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${Ge.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${Ge.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${Ge.green("\u2713")} ${p.category} tasks estimated within ${Ge.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=Cf(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1611
+ ${Ge.dim("Projection:")}`),console.log(` Backlog: ${Ge.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ge.bold(m)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async loadVelocityConfig(e){try{let s=await $.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...Xs,...s.velocity}}catch{}return Xs}}});var ty,Hn,ey,sy,ny,AE,fd=S(()=>{"use strict";ko();K();Sr();ty=l(r=>hl.includes(r),"isValidPoint"),Hn=l(r=>yl[r],"pointsToMinutes"),ey=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"),sy=l(r=>{let e=Hn(r);return`${ey(e.min)}\u2013${ey(e.max)}`},"pointsToTimeRange"),ny=l(async(r,e)=>{let s=(await $t.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+Lt(c.actualDuration),0)/s.length;return{points:AE(o),basedOn:s.length}},"suggestFromHistory"),AE=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of hl){let n=Math.abs(yl[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import hd from"node:fs/promises";import IE from"node:os";import Ma from"node:path";var yd,wd,ry=S(()=>{"use strict";W();B();yd=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ma.join(IE.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await hd.mkdir(this.commandsPath,{recursive:!0});let s=Ma.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await hd.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=Ma.join(this.commandsPath,`${e}.md`);return await hd.unlink(t),{success:!0}}catch(t){return O(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=Ma.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
1612
1612
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1613
1613
  ---
1614
1614
 
@@ -1644,97 +1644,97 @@ Suggest relevant actions based on the workflow results:
1644
1644
  - View rules: \`prjct workflow ${e} --md\`
1645
1645
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1646
1646
  - Run again: \`p. ${e}\`
1647
- `}},Md=new $d});function LE(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function FE(r,e){let t=Cr.detectTaskType(e),s=await iy(r,t);if(s){let a=Wn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=Cr.estimateComplexity(e),o=LE(n.level),i=Wn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var Od,cy=S(()=>{"use strict";Id();Qu();l(LE,"complexityToPoints");l(FE,"estimateTaskForStart");Od=FE});async function Fa(r){try{let{stdout:e}=await F("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function ly(r,e=20){try{let{stdout:t}=await F("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
1648
- `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var _d=S(()=>{"use strict";Je();l(Fa,"getGitBranch");l(ly,"getModifiedFiles")});var Br,UE,Nd,ln,uy=S(()=>{"use strict";ve();ee();X();_d();Br="session-snapshot",UE=30,Nd=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Fa(t),o=await ly(t),i=s.startedAt?Math.round((Date.now()-new Date(s.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(s,i),u={sessionId:s.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:s.taskDescription,taskStatus:s.taskStatus,activeSubtaskIndex:s.activeSubtaskIndex,subtaskCount:s.subtaskCount,branch:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:v(),resumeHint:c};return E.setDoc(e,Br,u),u}getSnapshot(e){try{return E.getDoc(e,Br)}catch{return null}}clearSnapshot(e){try{E.deleteDoc(e,Br)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!E.exists(s))continue;let n=E.getDoc(s,Br);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=UE){let t=await A.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!E.exists(o))continue;let i=E.getDoc(o,Br);i&&new Date(i.timestamp).getTime()<s&&(E.deleteDoc(o,Br),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${xt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${xt(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1649
- `)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${xt(t*1e3)} of work`),s.join(" ")}},ln=new Nd});var Ld,Ho,dy=S(()=>{"use strict";ee();Ld=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){E.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1647
+ `}},wd=new yd});function DE(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function $E(r,e){let t=vr.detectTaskType(e),s=await ny(r,t);if(s){let a=Hn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=vr.estimateComplexity(e),o=DE(n.level),i=Hn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var kd,oy=S(()=>{"use strict";fd();Gu();l(DE,"complexityToPoints");l($E,"estimateTaskForStart");kd=$E});async function Oa(r){try{let{stdout:e}=await F("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function iy(r,e=20){try{let{stdout:t}=await F("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
1648
+ `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var Sd=S(()=>{"use strict";Je();l(Oa,"getGitBranch");l(iy,"getModifiedFiles")});var Wr,ME,bd,cn,ay=S(()=>{"use strict";ve();ee();K();Sd();Wr="session-snapshot",ME=30,bd=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Oa(t),o=await iy(t),i=s.startedAt?Math.round((Date.now()-new Date(s.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(s,i),u={sessionId:s.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:s.taskDescription,taskStatus:s.taskStatus,activeSubtaskIndex:s.activeSubtaskIndex,subtaskCount:s.subtaskCount,branch:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:v(),resumeHint:c};return E.setDoc(e,Wr,u),u}getSnapshot(e){try{return E.getDoc(e,Wr)}catch{return null}}clearSnapshot(e){try{E.deleteDoc(e,Wr)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!E.exists(s))continue;let n=E.getDoc(s,Wr);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=ME){let t=await A.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!E.exists(o))continue;let i=E.getDoc(o,Wr);i&&new Date(i.timestamp).getTime()<s&&(E.deleteDoc(o,Wr),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${xt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${xt(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1649
+ `)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${xt(t*1e3)} of work`),s.join(" ")}},cn=new bd});var vd,Oo,cy=S(()=>{"use strict";ee();vd=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){E.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1650
1650
  VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=E.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!n)return;let o=new Set(JSON.parse(n.suggested_files)),i=new Set(s),a=[...o].filter(d=>i.has(d)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;E.run(e,`UPDATE context_feedback
1651
1651
  SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
1652
1652
  WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=E.get(e,"SELECT precision, recall FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);return s?{precision:s.precision,recall:s.recall}:null}getHistoricalBoosts(e,t){let s=new Map;if(t.length===0)return s;let n=E.query(e,`SELECT * FROM context_feedback
1653
1653
  WHERE actual_files IS NOT NULL
1654
- ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),m=[...o].filter(h=>d.has(h)).length,p=new Set([...o,...d]).size,g=p>0?m/p:0;if(g===0)continue;let w=new Set(JSON.parse(c.suggested_files)),b=new Set(JSON.parse(c.actual_files));for(let h of b){let x=i.get(h)??0;i.set(h,x+g)}for(let h of w)if(!b.has(h)){let x=i.get(h)??0;i.set(h,x-g*.5)}}if(i.size===0)return s;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,u]of i)s.set(c,u/a);return s}},Ho=new Ld});function py(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(m=>m.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}function my(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=Cn.readDomainsSync(e);if(n?.domains)for(let o of n.domains){if(t.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){s.add(o.name);break}}}catch{}return s.size>0?[...s]:["general"]}function Fd(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=py(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1654
+ ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(h=>d.has(h)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let w=new Set(JSON.parse(c.suggested_files)),b=new Set(JSON.parse(c.actual_files));for(let h of b){let x=i.get(h)??0;i.set(h,x+g)}for(let h of w)if(!b.has(h)){let x=i.get(h)??0;i.set(h,x-g*.5)}}if(i.size===0)return s;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,u]of i)s.set(c,u/a);return s}},Oo=new vd});function ly(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(p=>p.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}function uy(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=En.readDomainsSync(e);if(n?.domains)for(let o of n.domains){if(t.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){s.add(o.name);break}}}catch{}return s.size>0?[...s]:["general"]}function Td(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=ly(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1655
1655
 
1656
- ${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),p;if(Array.isArray(s))for(let w=0;w<s.length;w++){if(o.has(w))continue;let b=`${s[w].issue} ${s[w].suggestion}`.toLowerCase();if(m.some(h=>b.includes(h))){p=s[w],o.add(w);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return p&&g.push(` - VIOLATION: ${p.issue} \u2014 ${p.suggestion}`),g.join(`
1656
+ ${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),m;if(Array.isArray(s))for(let w=0;w<s.length;w++){if(o.has(w))continue;let b=`${s[w].issue} ${s[w].suggestion}`.toLowerCase();if(p.some(h=>b.includes(h))){m=s[w],o.add(w);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
1657
1657
  `)}).join(`
1658
1658
 
1659
- `)}`}function Ud(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
1660
- `)}var Hd=S(()=>{"use strict";Vc();l(py,"rankPatterns");l(my,"detectDomainsFromTask");l(Fd,"buildPatternBriefing");l(Ud,"buildContextContract")});import HE from"node:fs/promises";import WE from"node:path";function qE(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
1661
- `)}function BE(r){try{let{prjctDb:e}=(ee(),bt(li)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
1662
- `)}catch{return null}}function gy(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 VE(r){try{let e=WE.join(r,"analysis","repo-analysis.json"),t=await HE.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e),null}}function JE(r,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),s=e.filter(p=>p.type==="instruction"&&p.position==="before"),n=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),c=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=l((p,g,w)=>{let b=g.map(I=>` ${I.enabled?w:"o"} #${I.id} ${I.action}`),h=[p,...b],T=Math.max(...h.map(I=>I.length))+2;u.push(`+${"-".repeat(T)}+`);for(let I of h)u.push(`| ${I.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"drawBox"),m=l(p=>{p.push(" |"),p.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),m(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),m(u)),n.length>0&&(d("HOOKS (before)",n,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(m(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(m(u),d("HOOKS (after)",a,">")),c.length>0&&(m(u),d("STEPS (after)",c,">")),u.join(`
1663
- `)}async function zE(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
1659
+ `)}`}function Ed(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
1660
+ `)}var Cd=S(()=>{"use strict";Hc();l(ly,"rankPatterns");l(uy,"detectDomainsFromTask");l(Td,"buildPatternBriefing");l(Ed,"buildContextContract")});import OE from"node:fs/promises";import _E from"node:path";function LE(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
1661
+ `)}function FE(r){try{let{prjctDb:e}=(ee(),bt(ri)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
1662
+ `)}catch{return null}}function dy(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 UE(r){try{let e=_E.join(r,"analysis","repo-analysis.json"),t=await OE.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e),null}}function HE(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),s=e.filter(m=>m.type==="instruction"&&m.position==="before"),n=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),c=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=l((m,g,w)=>{let b=g.map(I=>` ${I.enabled?w:"o"} #${I.id} ${I.action}`),h=[m,...b],T=Math.max(...h.map(I=>I.length))+2;u.push(`+${"-".repeat(T)}+`);for(let I of h)u.push(`| ${I.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"drawBox"),p=l(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(u)),n.length>0&&(d("HOOKS (before)",n,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),c.length>0&&(p(u),d("STEPS (after)",c,">")),u.join(`
1663
+ `)}async function WE(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
1664
1664
  `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",n);for(let i of o.split(`
1665
1665
  `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
1666
- `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function KE(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}var GE,Vr,Wd=S(()=>{"use strict";qu();Id();Te();ve();ay();Ut();fr();cy();_d();uy();dr();dy();gi();Vt();vt();wo();Oo();W();X();$o();hs();kr();Fe();Zu();Pd();vr();Mt();Hd();Hd();GE=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Vr=class extends Ce{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await ls(o,"task","before",{projectPath:t,skipRules:s.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e)&&(a=e),s.md){try{await ss.ensureReady()}catch(xe){return It("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:k(xe)}),{success:!1,error:k(xe)}}let p=await Od(o,c),g=await L.getCurrentTask(o),w=await L.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(lo(),oi)),h=await b.detect(t);if(h){let xe=w.find(St=>St.worktreePath===h.path);if(xe)return It("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:xe.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:xe}}let x;if(g&&!h){let xe=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let St=await b.create(t,xe);await b.setup(St.path,t),x=St.path,os("info",`Parallel session created: \`${St.branch}\` at \`${St.path}\``)}catch{return It("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(x||h){let xe=Z();await L.startTaskInWorkspace(o,{id:Z(),description:c,sessionId:Z(),workspaceId:xe,worktreePath:x||h.path,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes},xe)}else await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes});let I=A.getGlobalProjectPath(o),M=Eu(c),y;try{y=Ho.getHistoricalBoosts(o,M),y.size===0&&(y=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[p.taskType]??80)>=80?15:10,[G,Q,,Ve]=await Promise.all([Fa(t),mt.getActive(o).catch(()=>null),VE(I),Fs(c,t,{maxFiles:D,minScore:.15,historicalBoosts:y}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),he=null;try{let xe=ln.getSnapshot(o);xe&&(he=ln.formatContinuityContext(xe),ln.clearSnapshot(o))}catch{}let Ne=null;if(Q?.analyzedAt){let xe=new Date(Q.analyzedAt),St=Math.floor((Date.now()-xe.getTime())/(1e3*60*60*24));St>7&&(Ne=os("warn",`Analysis is ${St} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Q||(Ne=os("info","No project analysis found. Run `p. sync` for better context targeting."));let us=null;if(y&&y.size>0){let xe=[...y.entries()].filter(([,St])=>St>.3).sort((St,ec)=>ec[1]-St[1]).slice(0,5);xe.length>0&&(us=`### Previously Useful Files
1667
- ${xe.map(([ec])=>`\`${ec}\``).join(", ")}`)}let Ja=my(c,o),za=wr({description:c,branch:G,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes,estimateSource:p.source,domains:Ja}),Ka=du(Ve.files.map(xe=>({path:xe.path,description:xe.reasons.join(", ")}))),Xa=Ve.files.map(xe=>xe.path),Ya=Fd(Q,Xa),Qa=Ud(Ve.files,Q),Za=le([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ue=qE(),ow=BE(o);console.log(U(he,Ne,za,Qa,Ka,us,Ya,ow,ue,Za));try{let xe=await L.getCurrentTask(o);xe&&Ho.recordSuggestions(o,xe.id,M,Ve.files.map(St=>St.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:v()}),await ls(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await ya.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let m=await Od(o,c);return await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes}),f.done(`${e}`),Ao("working"),Wt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:v()}),await ls(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:ry,pointsToMinutes:Wn,pointsToTimeRange:oy,storeEstimate:l(async p=>{let g=Wn(p);return await L.updateCurrentTask(o,{estimatedPoints:p,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?js(new Date(i.startedAt)):void 0,c=wr({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?uu(u,d):"",p=le([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(c,m,p))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=k(n);return s.md?o.includes("Cannot run")||o.includes("working state")?It("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):f.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(lo(),oi)),i=await o.detect(e),a=await L.getCurrentTask(n),c;if(i){let G=(await L.getActiveTasks(n)).find(Q=>Q.worktreePath===i.path);G&&(a=G,c=G.workspaceId)}if(!a)return t.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let u=await ls(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!u.success)return{success:!1,error:u.gatesFailed.length>0?`Blocked: ${u.gatesFailed.join(", ")}`:`Hook failed: ${u.hooksFailed.join(", ")}`};let d=a.description,m="",p=0;if(a.startedAt){let D=new Date(a.startedAt);m=js(D),p=Math.round((Date.now()-D.getTime())/6e4)}let g=a.estimatedMinutes,w=a.estimatedPoints,b=a.type||"feature",h=a.linearId;try{await $t.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:v(),estimatedDuration:g?gy(g):"0m",actualDuration:m||"0m",variance:g?KE(p-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[b,h].filter(Boolean)})}catch{}let x="";if(w&&g){let D=p-g,G=g>0?Math.round((p-g)/g*100):0,Q=D>=0?"+":"";x=` | est: ${w}pt (${gy(g)}) \u2192 ${Q}${G}%`}let T=[],I=null,M=null;try{if(T=await zE(e,a.startedAt),T.length>0){Ho.completeFeedback(n,a.id,T);let D=Ho.getFeedback(n,a.id);D&&(I=D.precision,M=D.recall)}}catch{}c?await L.completeTaskInWorkspace(n,c,t.feedback):await L.completeTask(n,t.feedback);try{ln.clearSnapshot(n)}catch{}let y=a.linearId,j=y!=null?await nn("linear",ws()).catch(()=>!1):!1;if(t.md){let D=m?` (${m})`:"",G=null;if(T.length>0){let he=T.slice(0,10).map(us=>`\`${us}\``),Ne=T.length>10?`, +${T.length-10} more`:"";G=`### Files Modified (${T.length})
1666
+ `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function GE(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}var NE,Gr,Pd=S(()=>{"use strict";Ou();fd();Te();ve();ry();Ut();pr();oy();Sd();ay();lr();cy();li();Vt();vt();go();Ao();W();K();jo();hs();yr();Fe();qu();ud();Sr();Mt();Cd();Cd();NE=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Gr=class extends Ce{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await ls(o,"task","before",{projectPath:t,skipRules:s.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e)&&(a=e),s.md){try{await ss.ensureReady()}catch(xe){return It("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:k(xe)}),{success:!1,error:k(xe)}}let m=await kd(o,c),g=await L.getCurrentTask(o),w=await L.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(oo(),ei)),h=await b.detect(t);if(h){let xe=w.find(St=>St.worktreePath===h.path);if(xe)return It("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:xe.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:xe}}let x;if(g&&!h){let xe=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let St=await b.create(t,xe);await b.setup(St.path,t),x=St.path,os("info",`Parallel session created: \`${St.branch}\` at \`${St.path}\``)}catch{return It("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(x||h){let xe=Z();await L.startTaskInWorkspace(o,{id:Z(),description:c,sessionId:Z(),workspaceId:xe,worktreePath:x||h.path,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes},xe)}else await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let I=A.getGlobalProjectPath(o),M=fu(c),y;try{y=Oo.getHistoricalBoosts(o,M),y.size===0&&(y=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[G,Q,,Ve]=await Promise.all([Oa(t),pt.getActive(o).catch(()=>null),UE(I),nn(c,t,{maxFiles:D,minScore:.15,historicalBoosts:y}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),he=null;try{let xe=cn.getSnapshot(o);xe&&(he=cn.formatContinuityContext(xe),cn.clearSnapshot(o))}catch{}let Ne=null;if(Q?.analyzedAt){let xe=new Date(Q.analyzedAt),St=Math.floor((Date.now()-xe.getTime())/(1e3*60*60*24));St>7&&(Ne=os("warn",`Analysis is ${St} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Q||(Ne=os("info","No project analysis found. Run `p. sync` for better context targeting."));let us=null;if(y&&y.size>0){let xe=[...y.entries()].filter(([,St])=>St>.3).sort((St,Xa)=>Xa[1]-St[1]).slice(0,5);xe.length>0&&(us=`### Previously Useful Files
1667
+ ${xe.map(([Xa])=>`\`${Xa}\``).join(", ")}`)}let Wa=uy(c,o),Ga=hr({description:c,branch:G,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:Wa}),qa=su(Ve.files.map(xe=>({path:xe.path,description:xe.reasons.join(", ")}))),Ba=Ve.files.map(xe=>xe.path),Va=Td(Q,Ba),Ja=Ed(Ve.files,Q),za=le([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ue=LE(),Qy=FE(o);console.log(U(he,Ne,Ga,Ja,qa,us,Va,Qy,ue,za));try{let xe=await L.getCurrentTask(o);xe&&Oo.recordSuggestions(o,xe.id,M,Ve.files.map(St=>St.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:v()}),await ls(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await fa.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let p=await kd(o,c);return await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),Co("working"),Wt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:v()}),await ls(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:ty,pointsToMinutes:Hn,pointsToTimeRange:sy,storeEstimate:l(async m=>{let g=Hn(m);return await L.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?js(new Date(i.startedAt)):void 0,c=hr({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,p=u.length>0?tu(u,d):"",m=le([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(c,p,m))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=k(n);return s.md?o.includes("Cannot run")||o.includes("working state")?It("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):f.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(oo(),ei)),i=await o.detect(e),a=await L.getCurrentTask(n),c;if(i){let G=(await L.getActiveTasks(n)).find(Q=>Q.worktreePath===i.path);G&&(a=G,c=G.workspaceId)}if(!a)return t.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let u=await ls(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!u.success)return{success:!1,error:u.gatesFailed.length>0?`Blocked: ${u.gatesFailed.join(", ")}`:`Hook failed: ${u.hooksFailed.join(", ")}`};let d=a.description,p="",m=0;if(a.startedAt){let D=new Date(a.startedAt);p=js(D),m=Math.round((Date.now()-D.getTime())/6e4)}let g=a.estimatedMinutes,w=a.estimatedPoints,b=a.type||"feature",h=a.linearId;try{await $t.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:v(),estimatedDuration:g?dy(g):"0m",actualDuration:p||"0m",variance:g?GE(m-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[b,h].filter(Boolean)})}catch{}let x="";if(w&&g){let D=m-g,G=g>0?Math.round((m-g)/g*100):0,Q=D>=0?"+":"";x=` | est: ${w}pt (${dy(g)}) \u2192 ${Q}${G}%`}let T=[],I=null,M=null;try{if(T=await WE(e,a.startedAt),T.length>0){Oo.completeFeedback(n,a.id,T);let D=Oo.getFeedback(n,a.id);D&&(I=D.precision,M=D.recall)}}catch{}c?await L.completeTaskInWorkspace(n,c,t.feedback):await L.completeTask(n,t.feedback);try{cn.clearSnapshot(n)}catch{}let y=a.linearId,j=y!=null?await sn("linear",ws()).catch(()=>!1):!1;if(t.md){let D=p?` (${p})`:"",G=null;if(T.length>0){let he=T.slice(0,10).map(us=>`\`${us}\``),Ne=T.length>10?`, +${T.length-10} more`:"";G=`### Files Modified (${T.length})
1668
1668
  ${he.join(", ")}${Ne}`}let Q=null;if(I!==null&&M!==null){let he=Math.round(I*100),Ne=Math.round(M*100);Q=`### Context Accuracy
1669
1669
  | Metric | Value |
1670
1670
  |--------|-------|
1671
1671
  | Precision | ${he}% of suggested files were used |
1672
- | Recall | ${Ne}% of modified files were suggested |`}let Ve=null;try{let{prjctDb:he}=(ee(),bt(li)),Ne=he.getDoc(n,"rpi:current:research"),us=he.getDoc(n,"rpi:current:plan");Ne?us||(Ve=`### RPI Phase: Plan Ready
1673
- Research is available. Create your implementation plan next.`):Ve="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(fe("Completed",`${d}${D}`),Ye({Duration:m||"unknown",...x?{Variance:x.replace(" | ","")}:{}}),G,Q,Ve,le([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let D=m?` (${m}${x})`:"";y&&j?f.done(`${d}${D} \u2192 Linear linked (update via MCP)`):f.done(`${d}${D}`),Ao("completed"),Wt("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:m,estimatedPoints:w,estimatedMinutes:g,actualMinutes:p,timestamp:v()}),await ls(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:m}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ce.getActiveTasks(n);if(o.length===0)return t.md?It("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let a=o.slice(0,10).map(c=>{let u=c.type?` [${c.type}]`:"",d=c.priority?` ${c.priority}`:"";return`${c.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${u}${d}`});o.length>10&&a.push(`...and ${o.length-10} more`),console.log(U(te("Queue",`${o.length} task${o.length!==1?"s":""}`),He(a,!0),le([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Wt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=js(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(s.md)console.log(U(fe("Task Paused",`**Paused:** ${i.description}`),Ye({Reason:e||void 0,"Duration worked":a||void 0}),le([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),Ao("paused"),Wt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:v()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return s.md?It("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(s.md?console.log(U(fe("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Ao("working"),Wt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:v()}),{success:!0,task:a.description}):(s.md?It("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of GE){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let u=Ke.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ke.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=je.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ke.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ke.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=je.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ke.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=Ke.getAllWorkflows(t).map(h=>h.name).join(", "),b=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[m]=this._parseAction(d);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=je.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):f.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!je.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(fe("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=je.resetRules(e);return t.md?console.log(U(fe("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let u=je.getRuleById(t,o);if(!u){let d=`Rule #${o} not found`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}if(!u.enabled){let d=`Rule #${o} is already disabled`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!0,message:d}}return je.updateRule(t,o,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${o} [${u.type}] ${u.action}`),le([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${u.action}`),{success:!0,ruleId:o}}let i=je.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let u=`No rules matching "${n}"`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(a.length===1){let u=a[0];return je.updateRule(t,u.id,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${u.id} [${u.type}] ${u.action}`))):f.done(`disabled rule #${u.id}: ${u.action}`),{success:!0,ruleId:u.id}}let c=a.slice(0,5);if(s.md){let u=c.map(d=>`#${d.id} [${d.type}] ${d.position} ${d.command} -> \`${d.action}\``);a.length>5&&u.push(`...and ${a.length-5} more`),console.log(U(te("Multiple matches",`${a.length} rules match "${n}"`),He(u),le(c.map(d=>({label:`Disable #${d.id}`,command:`prjct workflow disable ${d.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let u of c)console.log(` #${u.id} [${u.type}] ${u.position} ${u.command} -> ${u.action}`);a.length>5&&console.log(` ...and ${a.length-5} more`)}return{success:!0,matches:a.map(u=>u.id)}}async _workflowHelp(e){return e.md?console.log(U(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",He(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),te("Natural Language (EN/ES)",He(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return s.md?console.log(U(te("Workflow Rules","No rules configured"),le([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(JE(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(te(c,u),a.length>0?lu(a.join(`
1672
+ | Recall | ${Ne}% of modified files were suggested |`}let Ve=null;try{let{prjctDb:he}=(ee(),bt(ri)),Ne=he.getDoc(n,"rpi:current:research"),us=he.getDoc(n,"rpi:current:plan");Ne?us||(Ve=`### RPI Phase: Plan Ready
1673
+ Research is available. Create your implementation plan next.`):Ve="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(fe("Completed",`${d}${D}`),Ye({Duration:p||"unknown",...x?{Variance:x.replace(" | ","")}:{}}),G,Q,Ve,le([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let D=p?` (${p}${x})`:"";y&&j?f.done(`${d}${D} \u2192 Linear linked (update via MCP)`):f.done(`${d}${D}`),Co("completed"),Wt("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:p,estimatedPoints:w,estimatedMinutes:g,actualMinutes:m,timestamp:v()}),await ls(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:p}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ce.getActiveTasks(n);if(o.length===0)return t.md?It("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let a=o.slice(0,10).map(c=>{let u=c.type?` [${c.type}]`:"",d=c.priority?` ${c.priority}`:"";return`${c.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${u}${d}`});o.length>10&&a.push(`...and ${o.length-10} more`),console.log(U(te("Queue",`${o.length} task${o.length!==1?"s":""}`),He(a,!0),le([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Wt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=js(new Date(i.startedAt))),await L.pauseTask(o,e);try{await cn.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(s.md)console.log(U(fe("Task Paused",`**Paused:** ${i.description}`),Ye({Reason:e||void 0,"Duration worked":a||void 0}),le([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),Co("paused"),Wt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:v()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return s.md?It("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(s.md?console.log(U(fe("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Co("working"),Wt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:v()}),{success:!0,task:a.description}):(s.md?It("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of NE){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=Xe.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=Xe.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=je.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Xe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=Xe.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=je.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Xe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=Xe.getAllWorkflows(t).map(h=>h.name).join(", "),b=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=je.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!je.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(fe("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=je.resetRules(e);return t.md?console.log(U(fe("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let u=je.getRuleById(t,o);if(!u){let d=`Rule #${o} not found`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}if(!u.enabled){let d=`Rule #${o} is already disabled`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!0,message:d}}return je.updateRule(t,o,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${o} [${u.type}] ${u.action}`),le([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${u.action}`),{success:!0,ruleId:o}}let i=je.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let u=`No rules matching "${n}"`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(a.length===1){let u=a[0];return je.updateRule(t,u.id,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${u.id} [${u.type}] ${u.action}`))):f.done(`disabled rule #${u.id}: ${u.action}`),{success:!0,ruleId:u.id}}let c=a.slice(0,5);if(s.md){let u=c.map(d=>`#${d.id} [${d.type}] ${d.position} ${d.command} -> \`${d.action}\``);a.length>5&&u.push(`...and ${a.length-5} more`),console.log(U(te("Multiple matches",`${a.length} rules match "${n}"`),He(u),le(c.map(d=>({label:`Disable #${d.id}`,command:`prjct workflow disable ${d.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let u of c)console.log(` #${u.id} [${u.type}] ${u.position} ${u.command} -> ${u.action}`);a.length>5&&console.log(` ...and ${a.length-5} more`)}return{success:!0,matches:a.map(u=>u.id)}}async _workflowHelp(e){return e.md?console.log(U(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",He(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),te("Natural Language (EN/ES)",He(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return s.md?console.log(U(te("Workflow Rules","No rules configured"),le([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(HE(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(te(c,u),a.length>0?eu(a.join(`
1674
1674
 
1675
- `),""):null,le([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let i=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(i),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let a of o){let c=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,s){let n=je.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await Ta(t),i=0,a=[],c=je.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=je.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=je.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(s.md)console.log(U(fe("Workflow Initialized",`Added ${a.length} default ship rules`),He(a),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Ke.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Ke.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Ke.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=Ke.createWorkflow(t,{name:i,description:a}),d=await Md.generateWorkflowTemplate(i,a);if(!d.success){Ke.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${m}`):f.fail(m),{success:!1,error:m}}return n.md?console.log(U(fe("Workflow Created",`Created workflow: ${i}`),te("Description",a),te("Template",`Installed at ${d.path}`),le([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1676
- Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Ke.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
1675
+ `),""):null,le([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let i=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(i),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let a of o){let c=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,s){let n=je.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await ba(t),i=0,a=[],c=je.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=je.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=je.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(s.md)console.log(U(fe("Workflow Initialized",`Added ${a.length} default ship rules`),He(a),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Xe.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Xe.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Xe.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=Xe.createWorkflow(t,{name:i,description:a}),d=await wd.generateWorkflowTemplate(i,a);if(!d.success){Xe.deleteWorkflow(t,i);let p=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}return n.md?console.log(U(fe("Workflow Created",`Created workflow: ${i}`),te("Description",a),te("Template",`Installed at ${d.path}`),le([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1676
+ Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Xe.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
1677
1677
  `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Custom Workflows",a.join(`
1678
1678
  `)))}console.log(U(...i,le([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(f.done(`${s.length} workflow${s.length!==1?"s":""}`),n.length>0){console.log(`
1679
1679
  Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1680
- Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!Ke.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Md.deleteWorkflowTemplate(n),s.md?console.log(U(fe("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=Ke.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await ls(o,i,"before",{projectPath:t});if(!c.success){if(s.md)It("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await ls(o,i,"after",{projectPath:t}),s.md?console.log(U(fe(`Workflow: ${i}`,a.description||""),le([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await ln.cleanup();return t.md?console.log(fe("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await ln.listAllSnapshots();if(s.length===0)return t.md?It("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let o=s.slice(0,10).map(i=>{let a=xt(Date.now()-new Date(i.timestamp).getTime()),c=i.projectName||i.projectId.slice(0,8),u=i.subtaskCount&&i.activeSubtaskIndex!==void 0?` (${i.activeSubtaskIndex+1}/${i.subtaskCount})`:"";return`[${i.taskStatus}] **${c}** \u2014 ${i.taskDescription}${u} (${a} ago)`});s.length>10&&o.push(`...and ${s.length-10} more`),console.log(U(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),He(o),le([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=xt(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let m="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(te("Tokens",m))):f.fail(m),{success:!1,error:m}}let d=await L.addTokens(o,c,u);return d?(s.md?console.log(U(te("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),Ye({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(qE,"buildEfficiencySection");l(BE,"buildRpiSection");l(gy,"formatMinutesToDuration");l(VE,"loadRepoAnalysis");l(JE,"buildFlowDiagram");l(zE,"getFilesModifiedSinceTaskStart");l(KE,"formatVariance")});var un,Xq,Gd=S(()=>{"use strict";xa();nd();Ra();fd();yd();kd();Sd();Pa();Cd();xd();Rd();Ad();Wd();un=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;obsidianCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Vr,this.planning=new Nn,this.shipping=new Ur,this.analytics=new xr,this.performanceCmds=new Or,this.maintenance=new Rr,this.analysis=new Un,this.setupCmds=new Nr,this.updateCmds=new Gr,this.velocityCmds=new qr,this.contextCmds=new an,this.obsidianCmds=new Dr,this.parallelCmds=new Hn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async obsidian(e=null,t=process.cwd()){return this.obsidianCmds.obsidian(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},Xq=new un});var Wo,Jr,qd=S(()=>{"use strict";Wo={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}},Jr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"obsidian",group:"optional",description:"Obsidian vault integration \u2014 Kanban board, KB, and bidirectional sync",usage:{claude:"/p:obsidian [command]",terminal:"prjct obsidian [command]"},params:"[setup|export|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Export tasks as Kanban board with Obsidian Kanban plugin support","Export queue, shipped, and roadmap as Obsidian notes","Generate Canvas roadmap with dependency arrows","Daily standup notes with task progress","Dataview-compatible frontmatter on all files"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var ky={};ye(ky,{UninstallCommands:()=>qo,uninstall:()=>wy});import{execSync as Ua}from"node:child_process";import Ot from"node:fs/promises";import XE from"node:os";import Hs from"node:path";import YE from"node:readline";import Me from"chalk";async function hy(r){let e=0;try{let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Hs.join(r,s.name);if(s.isDirectory())e+=await hy(n);else try{let o=await Ot.stat(n);e+=o.size}catch{}}}catch{}return e}function fy(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 QE(r){try{return(await Ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function ZE(){let r={homebrew:!1,npm:!1};try{Ua("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ua("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function eC(){let r=[],e=Im(),t=A.getGlobalBasePath(),s=await C(t),n=s?await QE(Hs.join(t,"projects")):0,o=s?await hy(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=Hs.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let T=await Ot.readFile(i,"utf-8");c=T.includes(Ha)&&T.includes(Go)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await C(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=Hs.join(e.claude.config,"prjct-statusline.sh"),p=await C(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,w=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let b=Hs.join(e.gemini.config,"GEMINI.md"),h=await C(b),x=!1;if(h)try{let T=await Ot.readFile(b,"utf-8");x=T.includes(Ha)&&T.includes(Go)}catch{}return h&&x&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function tC(r){try{let e=await Ot.readFile(r,"utf-8");if(!e.includes(Ha)||!e.includes(Go))return!1;let t=e.indexOf(Ha),s=e.indexOf(Go)+Go.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1680
+ Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!Xe.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await wd.deleteWorkflowTemplate(n),s.md?console.log(U(fe("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=Xe.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await ls(o,i,"before",{projectPath:t});if(!c.success){if(s.md)It("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await ls(o,i,"after",{projectPath:t}),s.md?console.log(U(fe(`Workflow: ${i}`,a.description||""),le([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await cn.cleanup();return t.md?console.log(fe("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await cn.listAllSnapshots();if(s.length===0)return t.md?It("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let o=s.slice(0,10).map(i=>{let a=xt(Date.now()-new Date(i.timestamp).getTime()),c=i.projectName||i.projectId.slice(0,8),u=i.subtaskCount&&i.activeSubtaskIndex!==void 0?` (${i.activeSubtaskIndex+1}/${i.subtaskCount})`:"";return`[${i.taskStatus}] **${c}** \u2014 ${i.taskDescription}${u} (${a} ago)`});s.length>10&&o.push(`...and ${s.length-10} more`),console.log(U(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),He(o),le([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=xt(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(te("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await L.addTokens(o,c,u);return d?(s.md?console.log(U(te("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),Ye({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(LE,"buildEfficiencySection");l(FE,"buildRpiSection");l(dy,"formatMinutesToDuration");l(UE,"loadRepoAnalysis");l(HE,"buildFlowDiagram");l(WE,"getFilesModifiedSinceTaskStart");l(GE,"formatVariance")});var ln,Uq,xd=S(()=>{"use strict";Ca();zu();xa();Zu();td();nd();rd();Ea();ld();dd();pd();gd();Pd();ln=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;obsidianCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Gr,this.planning=new _n,this.shipping=new Nr,this.analytics=new Er,this.performanceCmds=new Dr,this.maintenance=new Pr,this.analysis=new Fn,this.setupCmds=new Mr,this.updateCmds=new Ur,this.velocityCmds=new Hr,this.contextCmds=new on,this.obsidianCmds=new Rr,this.parallelCmds=new Un,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async obsidian(e=null,t=process.cwd()){return this.obsidianCmds.obsidian(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},Uq=new ln});var _o,qr,jd=S(()=>{"use strict";_o={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}},qr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"obsidian",group:"optional",description:"Obsidian vault integration \u2014 Kanban board, KB, and bidirectional sync",usage:{claude:"/p:obsidian [command]",terminal:"prjct obsidian [command]"},params:"[setup|export|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Export tasks as Kanban board with Obsidian Kanban plugin support","Export queue, shipped, and roadmap as Obsidian notes","Generate Canvas roadmap with dependency arrows","Daily standup notes with task progress","Dataview-compatible frontmatter on all files"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var hy={};ye(hy,{UninstallCommands:()=>Lo,uninstall:()=>fy});import{execSync as _a}from"node:child_process";import Ot from"node:fs/promises";import qE from"node:os";import Us from"node:path";import BE from"node:readline";import Me from"chalk";async function py(r){let e=0;try{let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Us.join(r,s.name);if(s.isDirectory())e+=await py(n);else try{let o=await Ot.stat(n);e+=o.size}catch{}}}catch{}return e}function my(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 VE(r){try{return(await Ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function JE(){let r={homebrew:!1,npm:!1};try{_a("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{_a("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function zE(){let r=[],e=wp(),t=A.getGlobalBasePath(),s=await C(t),n=s?await VE(Us.join(t,"projects")):0,o=s?await py(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=Us.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let T=await Ot.readFile(i,"utf-8");c=T.includes(Na)&&T.includes(No)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await C(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=Us.join(e.claude.config,"prjct-statusline.sh"),m=await C(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,w=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let b=Us.join(e.gemini.config,"GEMINI.md"),h=await C(b),x=!1;if(h)try{let T=await Ot.readFile(b,"utf-8");x=T.includes(Na)&&T.includes(No)}catch{}return h&&x&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function XE(r){try{let e=await Ot.readFile(r,"utf-8");if(!e.includes(Na)||!e.includes(No))return!1;let t=e.indexOf(Na),s=e.indexOf(No)+No.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1681
1681
 
1682
1682
  `).trim(),!n||n.trim().length===0?await Ot.unlink(r):await Ot.writeFile(r,`${n}
1683
- `,"utf-8"),!0}catch{return!1}}async function sC(){let r=XE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Hs.join(r,`.prjct-backup-${e}`);try{await Ot.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await C(s)&&await yy(s,Hs.join(t,".prjct-cli")),t}catch{return null}}async function yy(r,e){await Ot.mkdir(e,{recursive:!0});let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Hs.join(r,s.name),o=Hs.join(e,s.name);s.isDirectory()?await yy(n,o):await Ot.copyFile(n,o)}}async function nC(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await tC(o.path)&&s.push(o.path):o.type==="directory"?(await Ot.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await Ot.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${k(i)}`)}try{await new Ms().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ua(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||Ua("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${k(o)}`)}}return{deleted:s,errors:n}}async function rC(r){let e=YE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function wy(r={},e=process.cwd()){let t=await eC(),s=ZE(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Me.yellow(`
1684
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Me.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Me.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Me.dim("(section only)"):c.size&&(d=Me.dim(`(${fy(c.size)})`)),console.log(` ${Me.cyan(u.padEnd(35))} ${d}`),console.log(` ${Me.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Me.cyan("Homebrew".padEnd(35))} ${Me.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Me.cyan("npm global".padEnd(35))} ${Me.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Me.dim(` Total size: ${fy(o)}`)),console.log("")),r.dryRun)return console.log(Me.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Me.blue("Creating backup..."));let c=await sC();c?(console.log(Me.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Me.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Me.yellow('Type "uninstall" to confirm:')),!await rC("> ")))return console.log(Me.yellow(`
1685
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Me.blue("Removing prjct..."));let{deleted:i,errors:a}=await nC(t,s,r);if(console.log(""),i.length>0&&console.log(Me.green(`Removed ${i.length} items`)),a.length>0){console.log(Me.yellow(`
1686
- ${a.length} errors:`));for(let c of a)console.log(Me.red(` - ${c}`))}return console.log(""),console.log(Me.green("prjct has been uninstalled.")),console.log(Me.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Ha,Go,qo,Bd=S(()=>{"use strict";Os();ve();W();B();Mt();Ha="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Go="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(hy,"getDirectorySize");l(fy,"formatSize");l(QE,"countDirectoryItems");l(ZE,"detectInstallation");l(eC,"gatherUninstallItems");l(tC,"removePrjctSection");l(sC,"createBackup");l(yy,"copyDirectory");l(nC,"performUninstall");l(rC,"promptConfirmation");l(wy,"uninstall");qo=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return wy(e,t)}}});function pC(){for(let[r,e]of Object.entries(Wo))H.registerCategory(r,e)}function mC(){if(H.has("work"))return;pC();let r=l(e=>Jr.find(t=>t.name===e),"getMeta");H.registerMethod("task",dn,"now",r("task")),H.registerMethod("done",dn,"done",r("done")),H.registerMethod("next",dn,"next",r("next")),H.registerMethod("pause",dn,"pause",r("pause")),H.registerMethod("resume",dn,"resume",r("resume")),H.registerMethod("workflow",dn,"workflow",r("workflow")),H.registerMethod("tokens",dn,"tokens",r("tokens")),H.registerMethod("sessions",dn,"sessions",r("sessions")),H.registerMethod("init",Wa,"init",r("init")),H.registerMethod("bug",Wa,"bug",r("bug")),H.registerMethod("idea",Wa,"idea",r("idea")),H.registerMethod("spec",Wa,"spec",r("spec")),H.registerMethod("ship",oC,"ship",r("ship")),H.registerMethod("dash",Sy,"dash",r("dash")),H.registerMethod("help",Sy,"help",r("help")),H.registerMethod("perf",iC,"perf",r("perf")),H.registerMethod("velocity",cC,"velocity",r("velocity")),H.registerMethod("cleanup",pn,"cleanup",r("cleanup")),H.registerMethod("cleanup-projects",pn,"cleanupProjects",r("cleanup-projects")),H.registerMethod("design",pn,"design",r("design")),H.registerMethod("recover",pn,"recover",r("recover")),H.registerMethod("undo",pn,"undo",r("undo")),H.registerMethod("redo",pn,"redo",r("redo")),H.registerMethod("history",pn,"history",r("history")),H.registerMethod("enrich",pn,"enrich",r("enrich")),H.registerMethod("analyze",zr,"analyze",r("analyze")),H.registerMethod("sync",zr,"sync",r("sync")),H.registerMethod("stats",zr,"stats",r("stats")),H.registerMethod("status",zr,"status",r("status")),H.registerMethod("seal",zr,"seal",r("seal")),H.registerMethod("verify",zr,"verify",r("verify")),H.registerMethod("start",Bo,"start",r("start")),H.registerMethod("setup",Bo,"setup",r("setup")),H.registerMethod("login",Bo,"login",r("login")),H.registerMethod("logout",Bo,"logout",r("logout")),H.registerMethod("auth",Bo,"auth",r("auth")),H.registerMethod("uninstall",uC,"uninstall",r("uninstall")),H.registerMethod("update",dC,"update",r("update")),H.registerMethod("context",aC,"context",r("context")),H.registerMethod("obsidian",lC,"obsidian",r("obsidian")),H.registerMethod("parallel",Vd,"parallel",r("parallel")),H.registerMethod("worktree",Vd,"parallel",r("worktree")),H.registerMethod("conductor",Vd,"parallel",r("conductor"))}var dn,Wa,oC,Sy,iC,pn,zr,Bo,aC,cC,lC,Vd,uC,dC,Jd=S(()=>{"use strict";xa();nd();qd();Ra();fd();yd();kd();Sd();Pa();Lo();Cd();xd();Bd();Rd();Ad();Wd();dn=new Vr,Wa=new Nn,oC=new Ur,Sy=new xr,iC=new Or,pn=new Rr,zr=new Un,Bo=new Nr,aC=new an,cC=new qr,lC=new Dr,Vd=new Hn,uC=new qo,dC=new Gr;l(pC,"registerCategories");l(mC,"registerAllCommands");mC()});var Ty={};ye(Ty,{shutdown:()=>Gn,startDaemon:()=>hC});import Ze from"node:fs";import{createServer as gC}from"node:net";async function hC(r){let e=Le.socket(),t=Le.pid(),s=Le.runDir();if(Ze.mkdirSync(s,{recursive:!0}),Ze.existsSync(t)){let i=parseInt(Ze.readFileSync(t,"utf-8").trim(),10);bC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ze.unlinkSync(t)}Ze.existsSync(e)&&Ze.unlinkSync(e),EC();let n=vC(),o=null;if(n)try{o=Ze.statSync(n).mtimeMs}catch{}if(Oe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:tc,idleTimer:null,entryPath:n,entryMtime:o},Pe=new un,Kr=gC(i=>yC(i)),Kr.listen(e,()=>{Ze.chmodSync(e,384),Ze.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),by()}),Kr.on("error",i=>{console.error("Daemon socket error:",i.message),Gn(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||bi;Vo=Si({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Vo.start()}}catch{}if(process.on("SIGTERM",()=>Gn(0)),process.on("SIGINT",()=>Gn(0)),process.on("SIGHUP",()=>{Pe=new un,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function yC(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>sc){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(gn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1687
- `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await wC(o);r.write(gn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(gn(i))}}}),r.on("error",()=>{})}async function wC(r){if(!Oe||!Pe)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(by(),Oe.commandsServed++,Oe.lastActivity=Date.now(),Oe.commandsServed%fC===0&&N.checkpointAll(),vy()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),Gn(0)},200)),r.command==="daemon")return SC(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await kC(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1683
+ `,"utf-8"),!0}catch{return!1}}async function KE(){let r=qE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Us.join(r,`.prjct-backup-${e}`);try{await Ot.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await C(s)&&await gy(s,Us.join(t,".prjct-cli")),t}catch{return null}}async function gy(r,e){await Ot.mkdir(e,{recursive:!0});let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Us.join(r,s.name),o=Us.join(e,s.name);s.isDirectory()?await gy(n,o):await Ot.copyFile(n,o)}}async function YE(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await XE(o.path)&&s.push(o.path):o.type==="directory"?(await Ot.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await Ot.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${k(i)}`)}try{await new Ms().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||_a(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||_a("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${k(o)}`)}}return{deleted:s,errors:n}}async function QE(r){let e=BE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function fy(r={},e=process.cwd()){let t=await zE(),s=JE(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Me.yellow(`
1684
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Me.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Me.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Me.dim("(section only)"):c.size&&(d=Me.dim(`(${my(c.size)})`)),console.log(` ${Me.cyan(u.padEnd(35))} ${d}`),console.log(` ${Me.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Me.cyan("Homebrew".padEnd(35))} ${Me.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Me.cyan("npm global".padEnd(35))} ${Me.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Me.dim(` Total size: ${my(o)}`)),console.log("")),r.dryRun)return console.log(Me.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Me.blue("Creating backup..."));let c=await KE();c?(console.log(Me.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Me.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Me.yellow('Type "uninstall" to confirm:')),!await QE("> ")))return console.log(Me.yellow(`
1685
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Me.blue("Removing prjct..."));let{deleted:i,errors:a}=await YE(t,s,r);if(console.log(""),i.length>0&&console.log(Me.green(`Removed ${i.length} items`)),a.length>0){console.log(Me.yellow(`
1686
+ ${a.length} errors:`));for(let c of a)console.log(Me.red(` - ${c}`))}return console.log(""),console.log(Me.green("prjct has been uninstalled.")),console.log(Me.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 Na,No,Lo,Rd=S(()=>{"use strict";Os();ve();W();B();Mt();Na="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",No="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(py,"getDirectorySize");l(my,"formatSize");l(VE,"countDirectoryItems");l(JE,"detectInstallation");l(zE,"gatherUninstallItems");l(XE,"removePrjctSection");l(KE,"createBackup");l(gy,"copyDirectory");l(YE,"performUninstall");l(QE,"promptConfirmation");l(fy,"uninstall");Lo=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return fy(e,t)}}});function iC(){for(let[r,e]of Object.entries(_o))H.registerCategory(r,e)}function aC(){if(H.has("work"))return;iC();let r=l(e=>qr.find(t=>t.name===e),"getMeta");H.registerMethod("task",un,"now",r("task")),H.registerMethod("done",un,"done",r("done")),H.registerMethod("next",un,"next",r("next")),H.registerMethod("pause",un,"pause",r("pause")),H.registerMethod("resume",un,"resume",r("resume")),H.registerMethod("workflow",un,"workflow",r("workflow")),H.registerMethod("tokens",un,"tokens",r("tokens")),H.registerMethod("sessions",un,"sessions",r("sessions")),H.registerMethod("init",La,"init",r("init")),H.registerMethod("bug",La,"bug",r("bug")),H.registerMethod("idea",La,"idea",r("idea")),H.registerMethod("spec",La,"spec",r("spec")),H.registerMethod("ship",ZE,"ship",r("ship")),H.registerMethod("dash",yy,"dash",r("dash")),H.registerMethod("help",yy,"help",r("help")),H.registerMethod("perf",eC,"perf",r("perf")),H.registerMethod("velocity",sC,"velocity",r("velocity")),H.registerMethod("cleanup",dn,"cleanup",r("cleanup")),H.registerMethod("cleanup-projects",dn,"cleanupProjects",r("cleanup-projects")),H.registerMethod("design",dn,"design",r("design")),H.registerMethod("recover",dn,"recover",r("recover")),H.registerMethod("undo",dn,"undo",r("undo")),H.registerMethod("redo",dn,"redo",r("redo")),H.registerMethod("history",dn,"history",r("history")),H.registerMethod("enrich",dn,"enrich",r("enrich")),H.registerMethod("analyze",Br,"analyze",r("analyze")),H.registerMethod("sync",Br,"sync",r("sync")),H.registerMethod("stats",Br,"stats",r("stats")),H.registerMethod("status",Br,"status",r("status")),H.registerMethod("seal",Br,"seal",r("seal")),H.registerMethod("verify",Br,"verify",r("verify")),H.registerMethod("start",Fo,"start",r("start")),H.registerMethod("setup",Fo,"setup",r("setup")),H.registerMethod("login",Fo,"login",r("login")),H.registerMethod("logout",Fo,"logout",r("logout")),H.registerMethod("auth",Fo,"auth",r("auth")),H.registerMethod("uninstall",rC,"uninstall",r("uninstall")),H.registerMethod("update",oC,"update",r("update")),H.registerMethod("context",tC,"context",r("context")),H.registerMethod("obsidian",nC,"obsidian",r("obsidian")),H.registerMethod("parallel",Ad,"parallel",r("parallel")),H.registerMethod("worktree",Ad,"parallel",r("worktree")),H.registerMethod("conductor",Ad,"parallel",r("conductor"))}var un,La,ZE,yy,eC,dn,Br,Fo,tC,sC,nC,Ad,rC,oC,Id=S(()=>{"use strict";Ca();zu();jd();xa();Zu();td();nd();rd();Ea();Do();ld();dd();Rd();pd();gd();Pd();un=new Gr,La=new _n,ZE=new Nr,yy=new Er,eC=new Dr,dn=new Pr,Br=new Fn,Fo=new Mr,tC=new on,sC=new Hr,nC=new Rr,Ad=new Un,rC=new Lo,oC=new Ur;l(iC,"registerCategories");l(aC,"registerAllCommands");aC()});var Sy={};ye(Sy,{shutdown:()=>Wn,startDaemon:()=>uC});import Ze from"node:fs";import{createServer as cC}from"node:net";async function uC(r){let e=Le.socket(),t=Le.pid(),s=Le.runDir();if(Ze.mkdirSync(s,{recursive:!0}),Ze.existsSync(t)){let i=parseInt(Ze.readFileSync(t,"utf-8").trim(),10);fC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ze.unlinkSync(t)}Ze.existsSync(e)&&Ze.unlinkSync(e),wC();let n=hC(),o=null;if(n)try{o=Ze.statSync(n).mtimeMs}catch{}if(Oe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ka,idleTimer:null,entryPath:n,entryMtime:o},Pe=new ln,Vr=cC(i=>dC(i)),Vr.listen(e,()=>{Ze.chmodSync(e,384),Ze.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),wy()}),Vr.on("error",i=>{console.error("Daemon socket error:",i.message),Wn(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||hi;Uo=fi({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Uo.start()}}catch{}if(process.on("SIGTERM",()=>Wn(0)),process.on("SIGINT",()=>Wn(0)),process.on("SIGHUP",()=>{Pe=new ln,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function dC(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Ya){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(pn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1687
+ `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await mC(o);r.write(pn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(pn(i))}}}),r.on("error",()=>{})}async function mC(r){if(!Oe||!Pe)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(wy(),Oe.commandsServed++,Oe.lastActivity=Date.now(),Oe.commandsServed%lC===0&&N.checkpointAll(),ky()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),Wn(0)},200)),r.command==="daemon")return gC(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await pC(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1688
1688
  `)||o.message||void 0,stderr:t.join(`
1689
- `)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function kC(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return Pe.sync(r.cwd,{preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Pe.status(r.cwd,{json:t.json===!0,md:s});case"stats":return Pe.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return Pe.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return Pe.seal(r.cwd,{json:t.json===!0});case"rollback":return Pe.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return Pe.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Pe.task(e,r.cwd,{md:s});case"done":return Pe.done(r.cwd,{md:s});case"next":return Pe.next(r.cwd,{md:s});case"pause":return Pe.pause(e||"",r.cwd,{md:s});case"resume":return Pe.resume(e,r.cwd,{md:s});case"bug":return Pe.bug(e||"",r.cwd,{md:s});case"idea":return Pe.idea(e||"",r.cwd,{md:s});case"ship":return Pe.ship(e,r.cwd,{md:s});case"dash":return Pe.dash(e||"default",r.cwd,{md:s});case"workflow":return Pe.workflowPrefs(e,r.cwd,{md:s});case"sessions":return Pe.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return Pe.design(e||"",t,r.cwd);case"analysis-payload":return Pe.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return Pe.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return Pe.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return Pe.analyze(t,r.cwd);case"cleanup":return Pe.cleanup(t,r.cwd);case"cleanup-projects":return Pe.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return H.execute(r.command,e,r.cwd)}}function SC(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Le.socket(),uptime:Oe?Date.now()-Oe.startedAt:0,commandsServed:Oe?.commandsServed??0,lastActivity:Oe?new Date(Oe.lastActivity).toISOString():null,registeredCommands:H.list().length,stale:vy()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Gn(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function by(){Oe&&(Oe.idleTimer&&clearTimeout(Oe.idleTimer),Oe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Oe.idleTimeoutMs/1e3/60} minutes, shutting down`),Gn(0)},Oe.idleTimeoutMs),Oe.idleTimer.unref&&Oe.idleTimer.unref())}function Gn(r){console.log("Daemon shutting down..."),Oe?.idleTimer&&clearTimeout(Oe.idleTimer),Vo&&(Vo.stop(),Vo=null),Kr&&(Kr.close(),Kr=null),N.close();let e=Le.socket(),t=Le.pid();try{Ze.existsSync(e)&&Ze.unlinkSync(e)}catch{}try{Ze.existsSync(t)&&Ze.unlinkSync(t)}catch{}process.exit(r)}function bC(r){try{return process.kill(r,0),!0}catch{return!1}}function vC(){let r=Bt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Ze.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ze.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(Ze.existsSync(n))return n;let s=process.argv[1];return s&&Ze.existsSync(s)?s:null}function EC(){let r=Le.log();try{if(Ze.statSync(r).size>TC){let t=`${r}.1`;try{Ze.unlinkSync(t)}catch{}Ze.renameSync(r,t)}}catch{}}function vy(){if(!Oe?.entryPath||Oe.entryMtime===null)return!1;try{return Ze.statSync(Oe.entryPath).mtimeMs!==Oe.entryMtime}catch{return!1}}var fC,Kr,Vo,Pe,Oe,TC,Ey=S(()=>{"use strict";Gd();Lo();Jd();Te();tl();ee();Jo();fC=50,Kr=null,Vo=null,Pe=null,Oe=null;l(hC,"startDaemon");l(yC,"handleConnection");l(wC,"handleRequest");l(kC,"executeCommand");l(SC,"handleDaemonCommand");l(by,"resetIdleTimer");l(Gn,"shutdown");l(bC,"isProcessRunning");l(vC,"resolveEntryPath");TC=1024*1024;l(EC,"rotateLog");l(vy,"isCodeStale")});var xy={};ye(xy,{runStart:()=>MC});import ks from"node:fs/promises";import Cy from"node:os";import Ss from"node:path";import K from"chalk";function xC(){console.clear(),console.log(CC),console.log(PC)}function Py(r,e){console.log(`
1690
- ${K.bold(" Select AI providers to configure:")}
1691
- `),console.log(` ${K.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1692
- `),r.forEach((t,s)=>{let n=s===e?K.cyan("\u276F"):" ",o=t.selected?K.green("[\u2713]"):K.dim("[ ]"),i=t.installed?K.green("(installed)"):K.yellow("(will install)"),a=s===e?K.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function jC(){let r=await Ps(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed},{name:"codex",displayName:"OpenAI Codex",installed:r.codex.installed,selected:r.codex.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let s=0,n=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Py(e,s)},"render");Py(e,s),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
1689
+ `)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function pC(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return Pe.sync(r.cwd,{preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Pe.status(r.cwd,{json:t.json===!0,md:s});case"stats":return Pe.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return Pe.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return Pe.seal(r.cwd,{json:t.json===!0});case"rollback":return Pe.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return Pe.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Pe.task(e,r.cwd,{md:s});case"done":return Pe.done(r.cwd,{md:s});case"next":return Pe.next(r.cwd,{md:s});case"pause":return Pe.pause(e||"",r.cwd,{md:s});case"resume":return Pe.resume(e,r.cwd,{md:s});case"bug":return Pe.bug(e||"",r.cwd,{md:s});case"idea":return Pe.idea(e||"",r.cwd,{md:s});case"ship":return Pe.ship(e,r.cwd,{md:s});case"dash":return Pe.dash(e||"default",r.cwd,{md:s});case"workflow":return Pe.workflowPrefs(e,r.cwd,{md:s});case"sessions":return Pe.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return Pe.design(e||"",t,r.cwd);case"analysis-payload":return Pe.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return Pe.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return Pe.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return Pe.analyze(t,r.cwd);case"cleanup":return Pe.cleanup(t,r.cwd);case"cleanup-projects":return Pe.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return H.execute(r.command,e,r.cwd)}}function gC(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Le.socket(),uptime:Oe?Date.now()-Oe.startedAt:0,commandsServed:Oe?.commandsServed??0,lastActivity:Oe?new Date(Oe.lastActivity).toISOString():null,registeredCommands:H.list().length,stale:ky()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Wn(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function wy(){Oe&&(Oe.idleTimer&&clearTimeout(Oe.idleTimer),Oe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Oe.idleTimeoutMs/1e3/60} minutes, shutting down`),Wn(0)},Oe.idleTimeoutMs),Oe.idleTimer.unref&&Oe.idleTimer.unref())}function Wn(r){console.log("Daemon shutting down..."),Oe?.idleTimer&&clearTimeout(Oe.idleTimer),Uo&&(Uo.stop(),Uo=null),Vr&&(Vr.close(),Vr=null),N.close();let e=Le.socket(),t=Le.pid();try{Ze.existsSync(e)&&Ze.unlinkSync(e)}catch{}try{Ze.existsSync(t)&&Ze.unlinkSync(t)}catch{}process.exit(r)}function fC(r){try{return process.kill(r,0),!0}catch{return!1}}function hC(){let r=Bt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Ze.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ze.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(Ze.existsSync(n))return n;let s=process.argv[1];return s&&Ze.existsSync(s)?s:null}function wC(){let r=Le.log();try{if(Ze.statSync(r).size>yC){let t=`${r}.1`;try{Ze.unlinkSync(t)}catch{}Ze.renameSync(r,t)}}catch{}}function ky(){if(!Oe?.entryPath||Oe.entryMtime===null)return!1;try{return Ze.statSync(Oe.entryPath).mtimeMs!==Oe.entryMtime}catch{return!1}}var lC,Vr,Uo,Pe,Oe,yC,by=S(()=>{"use strict";xd();Do();Id();Te();Kc();ee();Wo();lC=50,Vr=null,Uo=null,Pe=null,Oe=null;l(uC,"startDaemon");l(dC,"handleConnection");l(mC,"handleRequest");l(pC,"executeCommand");l(gC,"handleDaemonCommand");l(wy,"resetIdleTimer");l(Wn,"shutdown");l(fC,"isProcessRunning");l(hC,"resolveEntryPath");yC=1024*1024;l(wC,"rotateLog");l(ky,"isCodeStale")});var Ey={};ye(Ey,{runStart:()=>jC});import ks from"node:fs/promises";import vy from"node:os";import Ss from"node:path";import X from"chalk";function bC(){console.clear(),console.log(kC),console.log(SC)}function Ty(r,e){console.log(`
1690
+ ${X.bold(" Select AI providers to configure:")}
1691
+ `),console.log(` ${X.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1692
+ `),r.forEach((t,s)=>{let n=s===e?X.cyan("\u276F"):" ",o=t.selected?X.green("[\u2713]"):X.dim("[ ]"),i=t.installed?X.green("(installed)"):X.yellow("(will install)"),a=s===e?X.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function vC(){let r=await Ps(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed},{name:"codex",displayName:"OpenAI Codex",installed:r.codex.installed,selected:r.codex.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let s=0,n=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Ty(e,s)},"render");Ty(e,s),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
1693
1693
  Cancelled.
1694
1694
  `),process.exit(0)),a==="\r"||a===`
1695
1695
  `){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(s=Math.max(0,s-1),n()),a==="\x1B[B"&&(s=Math.min(e.length-1,s+1),n()),a===" "&&(e[s].selected=!e[s].selected,n())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1696
- ${K.bold(" Detected providers:")}
1697
- `),e.forEach(t=>{t.installed&&console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function RC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=Ss.join(e.configDir,"commands");await ks.mkdir(t,{recursive:!0});let{getPackageRoot:s}=await Promise.resolve().then(()=>(ut(),Yn)),n=s(),o=r==="claude"?"p.md":"p.toml",i=Ss.join(n,"templates","commands",o),a=Ss.join(t,o);return await C(i)?(await ks.copyFile(i,a),!0):!1}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function AC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=r==="gemini"?Ss.join(e.configDir,"commands"):Ss.join(e.configDir,"commands","p");await ks.mkdir(t,{recursive:!0});let s=new Set(["p.md","p.toml"]),o=$s("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!s.has(i));for(let i of o){let a=ht(`commands/${i}`);a&&await ks.writeFile(Ss.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${r} subcommands: ${k(t)}`),!1}}async function IC(r){let e=ze[r];if(!e.configDir)return!1;try{await ks.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(ut(),Yn)),s=t(),n=r==="claude"?"CLAUDE.md":"GEMINI.md",o=Ss.join(s,"templates","global",n),i=Ss.join(e.configDir,n);if(await C(o)){let a=await ks.readFile(o,"utf-8");if(await C(i)){let c=await ks.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 ks.writeFile(i,m+g+p)}else await ks.writeFile(i,`${c}
1698
-
1699
- ${a}`)}else await ks.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${r} config: ${k(t)}`),!1}}async function DC(r){let e=Ss.join(Cy.homedir(),".prjct-cli","config","installed-editors.json"),t={version:ke,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:Ss.join(Cy.homedir(),`.${r[0]}`,"commands")};await de(e,t)}function $C(r){console.log(`
1700
- ${K.green.bold(" \u2713 Setup complete!")}
1701
- `),console.log(` ${K.dim("Configured providers:")}`),r.forEach(e=>{let t=ze[e];console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(`
1702
- ${K.bold("Next steps:")}
1703
-
1704
- ${K.cyan("1.")} Navigate to your project directory
1705
- ${K.cyan("2.")} Run ${K.bold("p. init")} to initialize prjct for that project
1706
- ${K.cyan("3.")} Start tracking with ${K.bold('p. task "your task"')}
1707
-
1708
- ${K.dim("Tips:")}
1709
- ${K.dim("\u2022")} Use ${K.bold("p. sync")} to analyze your codebase
1710
- ${K.dim("\u2022")} Use ${K.bold("p. done")} to complete tasks
1711
- ${K.dim("\u2022")} Use ${K.bold("p. ship")} to create PRs
1712
-
1713
- ${K.dim("Learn more: https://prjct.app/docs")}
1714
- `)}async function MC(){xC();let r=await jC();console.log(`
1715
- ${K.cyan("Setting up...")}
1716
- `);for(let e of r){let t=ze[e];process.stdout.write(` ${K.dim("\u2022")} ${t.displayName}... `);let s=await RC(e),n=await AC(e),o=await IC(e);console.log(s&&n&&o?K.green("\u2713"):s||o?K.yellow("partial"):K.yellow("skipped"))}await DC(r),$C(r)}var Xr,Yr,Qr,Zr,eo,CC,PC,jy=S(()=>{"use strict";fs();lt();W();B();ut();Xr=K.rgb(180,180,175),Yr=K.rgb(200,200,195),Qr=K.rgb(220,220,215),Zr=K.rgb(235,235,230),eo=K.rgb(250,250,245),CC=`
1717
-
1718
- ${Xr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Yr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Qr(" \u2588\u2588\u2557")}${Zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${eo("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1719
- ${Xr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Yr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Qr(" \u2588\u2588\u2551")}${Zr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${eo("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1720
- ${Xr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Yr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Qr(" \u2588\u2588\u2551")}${Zr("\u2588\u2588\u2551 ")}${eo(" \u2588\u2588\u2551 ")}
1721
- ${Xr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${Yr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Qr("\u2588\u2588 \u2588\u2588\u2551")}${Zr("\u2588\u2588\u2551 ")}${eo(" \u2588\u2588\u2551 ")}
1722
- ${Xr(" \u2588\u2588\u2551 ")}${Yr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Qr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Zr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${eo(" \u2588\u2588\u2551 ")}
1723
- ${Xr(" \u255A\u2550\u255D ")}${Yr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Qr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Zr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${eo(" \u255A\u2550\u255D ")}
1724
-
1725
- `,PC=` ${K.white("Context Layer for AI Agents")} ${K.dim(`v${ke}`)}
1726
-
1727
- ${K.dim(`Project context layer for AI coding agents.
1696
+ ${X.bold(" Detected providers:")}
1697
+ `),e.forEach(t=>{t.installed&&console.log(` ${X.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function TC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=Ss.join(e.configDir,"commands");await ks.mkdir(t,{recursive:!0});let{getPackageRoot:s}=await Promise.resolve().then(()=>(ut(),Kn)),n=s(),o=r==="claude"?"p.md":"p.toml",i=Ss.join(n,"templates","commands",o),a=Ss.join(t,o);return await C(i)?(await ks.copyFile(i,a),!0):!1}catch(t){return console.error(` ${X.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function EC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=r==="gemini"?Ss.join(e.configDir,"commands"):Ss.join(e.configDir,"commands","p");await ks.mkdir(t,{recursive:!0});let s=new Set(["p.md","p.toml"]),o=$s("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!s.has(i));for(let i of o){let a=ht(`commands/${i}`);a&&await ks.writeFile(Ss.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${X.yellow("\u26A0")} Failed to install ${r} subcommands: ${k(t)}`),!1}}async function CC(r){let e=ze[r];if(!e.configDir)return!1;try{await ks.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(ut(),Kn)),s=t(),n=r==="claude"?"CLAUDE.md":"GEMINI.md",o=Ss.join(s,"templates","global",n),i=Ss.join(e.configDir,n);if(await C(o)){let a=await ks.readFile(o,"utf-8");if(await C(i)){let c=await ks.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=c.substring(0,c.indexOf(u)),m=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await ks.writeFile(i,p+g+m)}else await ks.writeFile(i,`${c}
1698
+
1699
+ ${a}`)}else await ks.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${X.yellow("\u26A0")} Failed to install ${r} config: ${k(t)}`),!1}}async function PC(r){let e=Ss.join(vy.homedir(),".prjct-cli","config","installed-editors.json"),t={version:ke,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:Ss.join(vy.homedir(),`.${r[0]}`,"commands")};await de(e,t)}function xC(r){console.log(`
1700
+ ${X.green.bold(" \u2713 Setup complete!")}
1701
+ `),console.log(` ${X.dim("Configured providers:")}`),r.forEach(e=>{let t=ze[e];console.log(` ${X.green("\u2713")} ${t.displayName}`)}),console.log(`
1702
+ ${X.bold("Next steps:")}
1703
+
1704
+ ${X.cyan("1.")} Navigate to your project directory
1705
+ ${X.cyan("2.")} Run ${X.bold("p. init")} to initialize prjct for that project
1706
+ ${X.cyan("3.")} Start tracking with ${X.bold('p. task "your task"')}
1707
+
1708
+ ${X.dim("Tips:")}
1709
+ ${X.dim("\u2022")} Use ${X.bold("p. sync")} to analyze your codebase
1710
+ ${X.dim("\u2022")} Use ${X.bold("p. done")} to complete tasks
1711
+ ${X.dim("\u2022")} Use ${X.bold("p. ship")} to create PRs
1712
+
1713
+ ${X.dim("Learn more: https://prjct.app/docs")}
1714
+ `)}async function jC(){bC();let r=await vC();console.log(`
1715
+ ${X.cyan("Setting up...")}
1716
+ `);for(let e of r){let t=ze[e];process.stdout.write(` ${X.dim("\u2022")} ${t.displayName}... `);let s=await TC(e),n=await EC(e),o=await CC(e);console.log(s&&n&&o?X.green("\u2713"):s||o?X.yellow("partial"):X.yellow("skipped"))}await PC(r),xC(r)}var Jr,zr,Xr,Kr,Yr,kC,SC,Cy=S(()=>{"use strict";fs();lt();W();B();ut();Jr=X.rgb(180,180,175),zr=X.rgb(200,200,195),Xr=X.rgb(220,220,215),Kr=X.rgb(235,235,230),Yr=X.rgb(250,250,245),kC=`
1717
+
1718
+ ${Jr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Xr(" \u2588\u2588\u2557")}${Kr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Yr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1719
+ ${Jr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${zr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Xr(" \u2588\u2588\u2551")}${Kr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${Yr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1720
+ ${Jr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Xr(" \u2588\u2588\u2551")}${Kr("\u2588\u2588\u2551 ")}${Yr(" \u2588\u2588\u2551 ")}
1721
+ ${Jr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${zr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Xr("\u2588\u2588 \u2588\u2588\u2551")}${Kr("\u2588\u2588\u2551 ")}${Yr(" \u2588\u2588\u2551 ")}
1722
+ ${Jr(" \u2588\u2588\u2551 ")}${zr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Xr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Kr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Yr(" \u2588\u2588\u2551 ")}
1723
+ ${Jr(" \u255A\u2550\u255D ")}${zr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Xr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Kr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${Yr(" \u255A\u2550\u255D ")}
1724
+
1725
+ `,SC=` ${X.white("Context Layer for AI Agents")} ${X.dim(`v${ke}`)}
1726
+
1727
+ ${X.dim(`Project context layer for AI coding agents.
1728
1728
  Works with Claude Code, Gemini CLI, Codex, and more.`)}
1729
- ${K.cyan("https://prjct.app")}
1730
- `;l(xC,"showBanner");l(Py,"showProviderSelection");l(jC,"selectProviders");l(RC,"installRouter");l(AC,"installSubcommands");l(IC,"installGlobalConfig");l(DC,"saveSetupConfig");l($C,"showCompletion");l(MC,"runStart")});import Iy from"node:fs/promises";import Ws from"node:path";async function to(r,e=process.cwd(),t={}){let s=Ws.isAbsolute(r)?r:Ws.join(e,r),n;try{n=await Iy.readFile(s,"utf-8")}catch(g){if(O(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=Ws.extname(r).toLowerCase(),i=LC[o]||"unknown",a=NC[i]||[],c=await FC(n,a,s,e),u=[];t.reverse&&(u=await HC(r,e));let d;t.depth&&t.depth>0&&(d=await Dy(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 FC(r,e,t,s){let n=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let 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 UC(c,t,s)),n.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function UC(r,e,t){let s=Ws.dirname(e);if(r.startsWith("@/")){let o=Ws.join(t,"src",r.slice(2));return Ay(o,t)}let n=Ws.resolve(s,r);return Ay(n,t)}async function Ay(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await Iy.stat(n)).isFile())return Ws.relative(e,n)}catch{}}return null}async function HC(r,e){let t=[],s=Ws.basename(r,Ws.extname(r));try{let o=[`from ['"].*${s}['"]`,`from ['"]\\./${s}['"]`,`import\\(['"'].*${s}['"]`,`require\\(['"'].*${s}['"]`].join("|"),{stdout:i}=await F(`grep -r -l -E '${o}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),a=i.trim().split(`
1731
- `).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function Dy(r,e,t,s=0,n=new Set){let o={file:r,imports:[],depth:s};if(s>=t||n.has(r))return o;n.add(r);let i=await to(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Dy(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var Ry,OC,_C,NC,LC,zd=S(()=>{"use strict";W();Je();Ry=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],OC=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],_C=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],NC={typescript:Ry,javascript:Ry,python:OC,go:_C},LC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(to,"analyzeImports");l(FC,"extractImports");l(UC,"resolveImport");l(Ay,"tryResolve");l(HC,"findImportedBy");l(Dy,"buildDependencyTree")});import $y from"node:fs/promises";import bs from"node:path";async function Ga(r,e=process.cwd()){let t=bs.isAbsolute(r)?r:bs.join(e,r),s;try{s=await $y.readFile(t,"utf-8")}catch(p){if(O(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Mn("")};throw p}let n=bs.extname(r).toLowerCase(),o=My[n]||"unknown",i=await rn(r,e),a=await to(r,e),c=GC(s,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?qC(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=BC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:ua(s,m)}}async function Kd(r,e=process.cwd(),t={}){let s=bs.isAbsolute(r)?r:bs.join(e,r),n=[];async function o(i){let a=await $y.readdir(i,{withFileTypes:!0});for(let c of a){let u=bs.join(i,c.name),d=bs.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=bs.extname(c.name).toLowerCase();if(My[m]){let p=await Ga(d,e);n.push(p)}}}}return l(o,"processDir"),await o(s),n}function GC(r,e){let t=WC[e]||[],s=r.split(`
1729
+ ${X.cyan("https://prjct.app")}
1730
+ `;l(bC,"showBanner");l(Ty,"showProviderSelection");l(vC,"selectProviders");l(TC,"installRouter");l(EC,"installSubcommands");l(CC,"installGlobalConfig");l(PC,"saveSetupConfig");l(xC,"showCompletion");l(jC,"runStart")});import jy from"node:fs/promises";import Hs from"node:path";async function Ho(r,e=process.cwd(),t={}){let s=Hs.isAbsolute(r)?r:Hs.join(e,r),n;try{n=await jy.readFile(s,"utf-8")}catch(g){if(O(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=Hs.extname(r).toLowerCase(),i=DC[o]||"unknown",a=IC[i]||[],c=await $C(n,a,s,e),u=[];t.reverse&&(u=await OC(r,e));let d;t.depth&&t.depth>0&&(d=await Ry(r,e,t.depth));let p=c.filter(g=>g.isExternal).length,m=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:p,internalImports:m,importedByCount:u.length}}}async function $C(r,e,t,s){let n=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let m=a[i.namesIndex];m&&(u=m.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),p=null;d||(p=await MC(c,t,s)),n.push({source:c,resolved:p,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function MC(r,e,t){let s=Hs.dirname(e);if(r.startsWith("@/")){let o=Hs.join(t,"src",r.slice(2));return xy(o,t)}let n=Hs.resolve(s,r);return xy(n,t)}async function xy(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await jy.stat(n)).isFile())return Hs.relative(e,n)}catch{}}return null}async function OC(r,e){let t=[],s=Hs.basename(r,Hs.extname(r));try{let o=[`from ['"].*${s}['"]`,`from ['"]\\./${s}['"]`,`import\\(['"'].*${s}['"]`,`require\\(['"'].*${s}['"]`].join("|"),{stdout:i}=await F(`grep -r -l -E '${o}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),a=i.trim().split(`
1731
+ `).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function Ry(r,e,t,s=0,n=new Set){let o={file:r,imports:[],depth:s};if(s>=t||n.has(r))return o;n.add(r);let i=await Ho(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Ry(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var Py,RC,AC,IC,DC,Dd=S(()=>{"use strict";W();Je();Py=[{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}],RC=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],AC=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],IC={typescript:Py,javascript:Py,python:RC,go:AC},DC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Ho,"analyzeImports");l($C,"extractImports");l(MC,"resolveImport");l(xy,"tryResolve");l(OC,"findImportedBy");l(Ry,"buildDependencyTree")});import Ay from"node:fs/promises";import bs from"node:path";async function $d(r,e=process.cwd()){let t=bs.isAbsolute(r)?r:bs.join(e,r),s;try{s=await Ay.readFile(t,"utf-8")}catch(m){if(O(m))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Dn("")};throw m}let n=bs.extname(r).toLowerCase(),o=Iy[n]||"unknown",i=await $n(r,e),a=await Ho(r,e),c=NC(s,o),u=i.signatures.filter(m=>m.exported).map(m=>({name:m.name,type:m.type,signature:m.signature,description:m.docstring?LC(m.docstring):void 0})),d=a.imports.filter(m=>!m.isExternal&&m.resolved).map(m=>m.resolved).slice(0,10),p=FC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:ca(s,p)}}async function Dy(r,e=process.cwd(),t={}){let s=bs.isAbsolute(r)?r:bs.join(e,r),n=[];async function o(i){let a=await Ay.readdir(i,{withFileTypes:!0});for(let c of a){let u=bs.join(i,c.name),d=bs.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=bs.extname(c.name).toLowerCase();if(Iy[p]){let m=await $d(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function NC(r,e){let t=_C[e]||[],s=r.split(`
1732
1732
  `);for(let o=0;o<Math.min(30,s.length);o++){let i=s[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<s.length&&a.start.test(s[u].trim());)c.push(s[u].trim().replace(a.start,"").trim()),u++;if(c.length>0)return c.slice(0,3).join(" ").trim()}else if(a.end){let c="",u=o;for(;u<s.length&&(c+=`${s[u]}
1733
1733
  `,!a.end.test(s[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
1734
- `).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 n=r.split(`
1735
- `)[0]||"";return`Module: ${bs.basename(n,bs.extname(n))}`}function qC(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1736
- `)[0].trim()}function BC(r,e,t){let s=[];if(s.push(`Purpose: ${r}`),s.push(""),e.length>0){s.push("Public API:");for(let n of e){let o=n.description?` - ${n.description}`:"";s.push(` ${n.type} ${n.name}: ${n.signature}${o}`)}s.push("")}return t.length>0&&s.push(`Dependencies: ${t.join(", ")}`),s.join(`
1737
- `)}var WC,My,Oy=S(()=>{"use strict";W();zd();pa();da();WC={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},My={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ga,"summarizeFile");l(Kd,"summarizeDirectory");l(GC,"extractFilePurpose");l(qC,"extractDescriptionFromDocstring");l(BC,"buildSummaryText")});var _y={};ye(_y,{analyzeImports:()=>to,extractDirectorySignatures:()=>Ru,extractSignatures:()=>rn,findRelevantFiles:()=>Fs,getRecentFiles:()=>_o,runContextTool:()=>VC,summarizeDirectory:()=>Kd,summarizeFile:()=>Ga});async function VC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await JC(o,t);break;case"signatures":i=await zC(o,t);break;case"imports":i=await KC(o,t);break;case"recent":i=await XC(o,t);break;case"summary":i=await YC(o,t);break;case"help":return{tool:"error",result:{error:tP(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-s,c=QC(i),u=ZC(i);return await eP(e,{tool:n,timestamp:v(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:k(i),code:"EXECUTION_ERROR"}}}}async function JC(r,e){let t={},s=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:s.push(r[i]);let n=s.join(" ");return n?{tool:"files",result:await Fs(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function zC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Ru(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=ju(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 rn(t,e)}}async function KC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let s={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?s.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(s.depth=parseInt(r[++o],10));return{tool:"imports",result:await to(t,e,s)}}async function XC(r,e){let t={};for(let n=0;n<r.length;n++)r[n]==="--branch"||r[n]==="-b"?t.branch=!0:r[n]==="--max"&&r[n+1]?t.maxFiles=parseInt(r[++n],10):/^\d+$/.test(r[n])&&(t.commits=parseInt(r[n],10));return{tool:"recent",result:await _o(e,t)}}async function YC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Kd(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:ju(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ga(t,e)}}function QC(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 ZC(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 eP(r,e){try{await Zt.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function tP(){return`
1734
+ `).map(p=>p.replace(/^\s*\*\s?/,"").trim()).filter(p=>p.length>0&&!p.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let n=r.split(`
1735
+ `)[0]||"";return`Module: ${bs.basename(n,bs.extname(n))}`}function LC(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1736
+ `)[0].trim()}function FC(r,e,t){let s=[];if(s.push(`Purpose: ${r}`),s.push(""),e.length>0){s.push("Public API:");for(let n of e){let o=n.description?` - ${n.description}`:"";s.push(` ${n.type} ${n.name}: ${n.signature}${o}`)}s.push("")}return t.length>0&&s.push(`Dependencies: ${t.join(", ")}`),s.join(`
1737
+ `)}var _C,Iy,$y=S(()=>{"use strict";W();Dd();ua();la();_C={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}]},Iy={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l($d,"summarizeFile");l(Dy,"summarizeDirectory");l(NC,"extractFilePurpose");l(LC,"extractDescriptionFromDocstring");l(FC,"buildSummaryText")});var My={};ye(My,{runContextTool:()=>UC});async function UC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await HC(o,t);break;case"signatures":i=await WC(o,t);break;case"imports":i=await GC(o,t);break;case"recent":i=await qC(o,t);break;case"summary":i=await BC(o,t);break;case"help":return{tool:"error",result:{error:XC(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-s,c=VC(i),u=JC(i);return await zC(e,{tool:n,timestamp:v(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:k(i),code:"EXECUTION_ERROR"}}}}async function HC(r,e){let t={},s=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:s.push(r[i]);let n=s.join(" ");return n?{tool:"files",result:await nn(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function WC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await $f(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=ku(c.map(p=>p.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(p=>p.signatures.map(m=>({...m,file:p.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await $n(t,e)}}async function GC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let s={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?s.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(s.depth=parseInt(r[++o],10));return{tool:"imports",result:await Ho(t,e,s)}}async function qC(r,e){let t={};for(let n=0;n<r.length;n++)r[n]==="--branch"||r[n]==="-b"?t.branch=!0:r[n]==="--max"&&r[n+1]?t.maxFiles=parseInt(r[++n],10):/^\d+$/.test(r[n])&&(t.commits=parseInt(r[n],10));return{tool:"recent",result:await aa(e,t)}}async function BC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Dy(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(p=>({...p,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:ku(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await $d(t,e)}}function VC(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 JC(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 zC(r,e){try{await Zt.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function XC(){return`
1738
1738
  Context Tools - Smart context filtering for AI agents
1739
1739
 
1740
1740
  USAGE:
@@ -1795,7 +1795,7 @@ TOOLS:
1795
1795
  OUTPUT:
1796
1796
  All tools output JSON for easy parsing by AI agents.
1797
1797
  Each output includes metrics showing token savings.
1798
- `.trim()}var Ny=S(()=>{"use strict";ho();W();X();Oo();zd();Cu();pa();Oy();da();l(VC,"runContextTool");l(JC,"runFilesTool");l(zC,"runSignaturesTool");l(KC,"runImportsTool");l(XC,"runRecentTool");l(YC,"runSummaryTool");l(QC,"getTokensSaved");l(ZC,"getCompressionRate");l(eP,"recordToolUsage");l(tP,"getHelpText")});var Hy={};ye(Hy,{hooksService:()=>cP});import nt from"node:fs/promises";import qe from"node:path";import qt from"chalk";function Fy(){return`#!/bin/sh
1798
+ `.trim()}var Oy=S(()=>{"use strict";mo();W();K();Ao();Dd();hu();ua();$y();la();l(UC,"runContextTool");l(HC,"runFilesTool");l(WC,"runSignaturesTool");l(GC,"runImportsTool");l(qC,"runRecentTool");l(BC,"runSummaryTool");l(VC,"getTokensSaved");l(JC,"getCompressionRate");l(zC,"recordToolUsage");l(XC,"getHelpText")});var Fy={};ye(Fy,{hooksService:()=>sP});import nt from"node:fs/promises";import qe from"node:path";import qt from"chalk";function Ny(){return`#!/bin/sh
1799
1799
  # prjct auto-sync hook (post-commit)
1800
1800
  # Syncs project context after each commit
1801
1801
  # Installed by: prjct hooks install
@@ -1816,7 +1816,7 @@ if command -v prjct >/dev/null 2>&1; then
1816
1816
  fi
1817
1817
 
1818
1818
  exit 0
1819
- `}function Uy(){return`#!/bin/sh
1819
+ `}function Ly(){return`#!/bin/sh
1820
1820
  # prjct auto-sync hook (post-checkout)
1821
1821
  # Syncs project context after branch switch
1822
1822
  # Installed by: prjct hooks install
@@ -1848,7 +1848,7 @@ if command -v prjct >/dev/null 2>&1; then
1848
1848
  fi
1849
1849
 
1850
1850
  exit 0
1851
- `}async function Xd(r){let e=[];return(await C(qe.join(r,"lefthook.yml"))||await C(qe.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await C(qe.join(r,".husky"))||await C(qe.join(r,".husky","_")))&&e.push("husky"),await C(qe.join(r,".git"))&&e.push("direct"),e}function Ly(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function sP(r,e){let t=await C(qe.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",s=qe.join(r,t),n=await nt.readFile(s,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(n.includes(a))continue;let c=`
1851
+ `}async function Md(r){let e=[];return(await C(qe.join(r,"lefthook.yml"))||await C(qe.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await C(qe.join(r,".husky"))||await C(qe.join(r,".husky","_")))&&e.push("husky"),await C(qe.join(r,".git"))&&e.push("direct"),e}function _y(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function KC(r,e){let t=await C(qe.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",s=qe.join(r,t),n=await nt.readFile(s,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(n.includes(a))continue;let c=`
1852
1852
  ${i}:
1853
1853
  commands:
1854
1854
  ${a}:
@@ -1859,37 +1859,37 @@ ${i}:
1859
1859
  ${a}:
1860
1860
  run: prjct sync --quiet --yes
1861
1861
  fail_text: "prjct sync failed (non-blocking)"`):n=`${n.trimEnd()}
1862
- ${c}`}return await nt.writeFile(s,n,"utf-8"),!0}async function nP(r,e){let t=qe.join(r,".husky");for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Fy():Uy();if(await C(n)){if((await nt.readFile(n,"utf-8")).includes("prjct sync"))continue;await nt.appendFile(n,`
1862
+ ${c}`}return await nt.writeFile(s,n,"utf-8"),!0}async function YC(r,e){let t=qe.join(r,".husky");for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Ny():Ly();if(await C(n)){if((await nt.readFile(n,"utf-8")).includes("prjct sync"))continue;await nt.appendFile(n,`
1863
1863
  # prjct auto-sync
1864
1864
  prjct sync --quiet --yes &
1865
- `)}else await nt.writeFile(n,o,{mode:493})}return!0}async function rP(r,e){let t=qe.join(r,".git","hooks");await C(t)||await nt.mkdir(t,{recursive:!0});for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Fy():Uy();if(await C(n)){if((await nt.readFile(n,"utf-8")).includes("prjct sync"))continue;await nt.appendFile(n,`
1865
+ `)}else await nt.writeFile(n,o,{mode:493})}return!0}async function QC(r,e){let t=qe.join(r,".git","hooks");await C(t)||await nt.mkdir(t,{recursive:!0});for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Ny():Ly();if(await C(n)){if((await nt.readFile(n,"utf-8")).includes("prjct sync"))continue;await nt.appendFile(n,`
1866
1866
  # prjct auto-sync
1867
1867
  ${o.split(`
1868
1868
  `).slice(1).join(`
1869
- `)}`)}else await nt.writeFile(n,o,{mode:493})}return!0}async function oP(r){let e=await C(qe.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=qe.join(r,e);if(!await C(t))return!1;let s=await nt.readFile(t,"utf-8");return s=s.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),s=s.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await nt.writeFile(t,`${s.trimEnd()}
1870
- `,"utf-8"),!0}async function iP(r){let e=qe.join(r,".husky");for(let t of["post-commit","post-checkout"]){let s=qe.join(e,t);if(!await C(s))continue;let n=await nt.readFile(s,"utf-8");if(!n.includes("prjct sync"))continue;let o=n.split(`
1869
+ `)}`)}else await nt.writeFile(n,o,{mode:493})}return!0}async function ZC(r){let e=await C(qe.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=qe.join(r,e);if(!await C(t))return!1;let s=await nt.readFile(t,"utf-8");return s=s.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),s=s.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await nt.writeFile(t,`${s.trimEnd()}
1870
+ `,"utf-8"),!0}async function eP(r){let e=qe.join(r,".husky");for(let t of["post-commit","post-checkout"]){let s=qe.join(e,t);if(!await C(s))continue;let n=await nt.readFile(s,"utf-8");if(!n.includes("prjct sync"))continue;let o=n.split(`
1871
1871
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1872
- `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await nt.unlink(s):await nt.writeFile(s,o,{mode:493})}return!0}async function aP(r){let e=qe.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let s=qe.join(e,t);if(!await C(s))continue;let n=await nt.readFile(s,"utf-8");if(n.includes("prjct sync"))if(n.includes("Installed by: prjct hooks install"))await nt.unlink(s);else{let o=n.split(`
1872
+ `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await nt.unlink(s):await nt.writeFile(s,o,{mode:493})}return!0}async function tP(r){let e=qe.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let s=qe.join(e,t);if(!await C(s))continue;let n=await nt.readFile(s,"utf-8");if(n.includes("prjct sync"))if(n.includes("Installed by: prjct hooks install"))await nt.unlink(s);else{let o=n.split(`
1873
1873
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1874
- `);await nt.writeFile(s,o,{mode:493})}}return!0}var Yd,cP,Wy=S(()=>{"use strict";Te();ee();W();B();Fe();l(Fy,"getPostCommitScript");l(Uy,"getPostCheckoutScript");l(Xd,"detectHookManagers");l(Ly,"selectStrategy");l(sP,"installLefthook");l(nP,"installHusky");l(rP,"installDirect");l(oP,"uninstallLefthook");l(iP,"uninstallHusky");l(aP,"uninstallDirect");Yd=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await Xd(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Ly(n);try{let i=!1;switch(o){case"lefthook":i=await sP(e,s);break;case"husky":i=await nP(e,s);break;case"direct":i=await rP(e,s);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:s,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?s:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:k(i)}}}async uninstall(e){try{let s=(await this.getHookConfig(e))?.strategy||"direct",n=!1;switch(s){case"lefthook":n=await oP(e);break;case"husky":n=await iP(e);break;case"direct":n=await aP(e);break}return n&&await this.saveHookConfig(e,{enabled:!1,strategy:s,hooks:[]}),{success:n}}catch(t){return{success:!1,error:k(t)}}}async status(e){let t=await Xd(e),s=await this.getHookConfig(e),n=["post-commit","post-checkout"],o=await Promise.all(n.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,s?.strategy||null),path:await this.getHookPath(e,i,s?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:s?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await $.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await Xd(e),s=Ly(t);console.log(` Strategy: ${qt.cyan(s)}`),console.log(` Hooks: ${qt.dim("post-commit, post-checkout")}`),console.log("");let n=await this.install(e,{strategy:s});if(n.success){f.done(`Hooks installed via ${n.strategy}`),console.log("");for(let o of n.hooksInstalled)console.log(` ${qt.green("\u2713")} ${o}`);console.log(""),console.log(qt.dim(" Context will auto-sync on commit and branch switch.")),console.log(qt.dim(" Remove with: prjct hooks uninstall"))}else f.fail(n.error||"Failed to install hooks");return console.log(""),f.end(),n.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${qt.green("Active")}`),console.log(` Strategy: ${qt.cyan(t.strategy)}`)):console.log(` Status: ${qt.dim("Not installed")}`),console.log("");for(let s of t.hooks){let n=s.installed?qt.green("\u2713"):qt.dim("\u25CB"),o=s.installed?s.name:qt.dim(s.name);console.log(` ${n} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${qt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(qt.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,s){if(s==="lefthook"){let o=await C(qe.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=qe.join(e,o);return await C(i)?(await nt.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(s==="husky"){let o=qe.join(e,".husky",t);return await C(o)?(await nt.readFile(o,"utf-8")).includes("prjct sync"):!1}let n=qe.join(e,".git","hooks",t);return await C(n)?(await nt.readFile(n,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,s){return s==="lefthook"?await C(qe.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":s==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await $.getProjectId(e);if(!t)return null;try{let s=E.getDoc(t,"project");return s&&s.hooks||null}catch{return null}}async saveHookConfig(e,t){let s=await $.getProjectId(e);if(s)try{let n=E.getDoc(s,"project")||{};n.hooks=t,E.setDoc(s,"project",n)}catch{}}},cP=new Yd});var qy={};ye(qy,{DoctorService:()=>qa,doctorService:()=>uP});import{execSync as Qd}from"node:child_process";import lP from"node:fs/promises";import Gy from"node:path";import mn from"chalk";var qa,uP,By=S(()=>{"use strict";Te();ve();yr();vt();B();$o();Fe();ut();fr();qa=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=A.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),s=await this.checkProject(),n=this.generateRecommendations(t,s),o=[...t,...s].some(a=>a.status==="error"&&!a.optional),i=[...t,...s].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:s,recommendations:n,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,s,n,o){try{let a=Qd(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(s),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:n}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:n}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e.push(await this.checkMcpProvider("jira")),e.push(await this.checkMcpProvider("linear")),e}async checkPrjctConfig(){let e=Gy.join(this.projectPath,".prjct","prjct.config.json");return await C(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=Gy.join(this.globalPath,"context","CLAUDE.md");try{let t=await lP.stat(e),s=Date.now()-t.mtimeMs,n=Math.floor(s/(1e3*60*60)),o=Math.floor(n/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:n>0?i=`${n} hour${n>1?"s":""} ago`:i="recently",n>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{Qd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=Qd("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let s=e.trim().split(`
1875
- `).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await ss.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await hr({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkMcpProvider(e){try{if(!(await Rf(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await Af(e);if(!s.valid){let o=s.autoFixed?" (auto-fixed)":"";return{name:`${e} mcp`,status:"warn",message:`config issues${o}: ${s.issues.join("; ")}`,optional:!0}}let n=await If(e);if(!n.ready){let o=n.cleaned?"corrupted tokens cleaned \u2014 re-run OAuth":n.migrated?"tokens migrated \u2014 restart AI client":"OAuth tokens missing/invalid";return{name:`${e} mcp`,status:"warn",message:o,optional:!0}}return{name:`${e} mcp`,status:"ok",message:`healthy${n.validated?" (validated)":""}`,optional:!0}}catch(t){return{name:`${e} mcp`,status:"error",message:`check failed: ${t instanceof Error?t.message:"unknown error"}`,optional:!0}}}generateRecommendations(e,t){let s=[];e.find(p=>p.name==="gh"&&p.status==="error")&&s.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(p=>p.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&s.push('Run "prjct sync" to update context');let i=t.find(p=>p.name==="prjct config");i?.status==="error"&&s.push('Run "prjct init" to initialize this project'),t.find(p=>p.name==="CLAUDE.md"&&p.status==="error")&&!i?.status?.includes("error")&&s.push('Run "prjct sync" to generate context files');let c=t.find(p=>p.name==="context7 mcp");c&&c.status!=="ok"&&s.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(p=>p.name==="codex p-router");u&&u.status==="error"&&s.push('Run "prjct start" or "prjct setup" to repair Codex p. router');let d=t.find(p=>p.name==="jira mcp");d&&d.status!=="ok"&&s.push('Run "prjct jira setup" to repair Jira MCP configuration');let m=t.find(p=>p.name==="linear mcp");return m&&m.status!=="ok"&&s.push('Run "prjct linear setup" to repair Linear MCP configuration'),s}printHeader(){f.section(`prjct doctor v${ke}`)}printSection(e,t){f.section(e);let s=t.map(n=>{let o=this.getStatusIcon(n.status,n.optional),i=n.name.padEnd(14),a=n.version||n.message||"",c=n.optional&&n.status==="error"?mn.dim(" (optional)"):"";return`${o} ${i} ${mn.dim(a)}${c}`});for(let n of s)console.log(` ${n}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:mn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(mn.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return mn.green("\u2713");case"warn":return mn.yellow("\u26A0");case"error":return t?mn.dim("\u25CB"):mn.red("\u2717")}}},uP=new qa});var Vy={};ye(Vy,{WatchService:()=>Ba,watchService:()=>fP});import dP from"node:path";import kt from"chalk";import pP from"chokidar";var mP,gP,Ba,fP,Jy=S(()=>{"use strict";Te();W();X();ea();mP=["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"],gP=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Ba=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=pP.watch(mP,{cwd:this.projectPath,ignored:gP,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",s=>this.handleChange("add",s)).on("change",s=>this.handleChange("change",s)).on("unlink",s=>this.handleChange("unlink",s)).on("error",s=>this.handleError(s)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(kt.dim(`
1874
+ `);await nt.writeFile(s,o,{mode:493})}}return!0}var Od,sP,Uy=S(()=>{"use strict";Te();ee();W();B();Fe();l(Ny,"getPostCommitScript");l(Ly,"getPostCheckoutScript");l(Md,"detectHookManagers");l(_y,"selectStrategy");l(KC,"installLefthook");l(YC,"installHusky");l(QC,"installDirect");l(ZC,"uninstallLefthook");l(eP,"uninstallHusky");l(tP,"uninstallDirect");Od=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await Md(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||_y(n);try{let i=!1;switch(o){case"lefthook":i=await KC(e,s);break;case"husky":i=await YC(e,s);break;case"direct":i=await QC(e,s);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:s,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?s:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:k(i)}}}async uninstall(e){try{let s=(await this.getHookConfig(e))?.strategy||"direct",n=!1;switch(s){case"lefthook":n=await ZC(e);break;case"husky":n=await eP(e);break;case"direct":n=await tP(e);break}return n&&await this.saveHookConfig(e,{enabled:!1,strategy:s,hooks:[]}),{success:n}}catch(t){return{success:!1,error:k(t)}}}async status(e){let t=await Md(e),s=await this.getHookConfig(e),n=["post-commit","post-checkout"],o=await Promise.all(n.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,s?.strategy||null),path:await this.getHookPath(e,i,s?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:s?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await $.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await Md(e),s=_y(t);console.log(` Strategy: ${qt.cyan(s)}`),console.log(` Hooks: ${qt.dim("post-commit, post-checkout")}`),console.log("");let n=await this.install(e,{strategy:s});if(n.success){f.done(`Hooks installed via ${n.strategy}`),console.log("");for(let o of n.hooksInstalled)console.log(` ${qt.green("\u2713")} ${o}`);console.log(""),console.log(qt.dim(" Context will auto-sync on commit and branch switch.")),console.log(qt.dim(" Remove with: prjct hooks uninstall"))}else f.fail(n.error||"Failed to install hooks");return console.log(""),f.end(),n.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${qt.green("Active")}`),console.log(` Strategy: ${qt.cyan(t.strategy)}`)):console.log(` Status: ${qt.dim("Not installed")}`),console.log("");for(let s of t.hooks){let n=s.installed?qt.green("\u2713"):qt.dim("\u25CB"),o=s.installed?s.name:qt.dim(s.name);console.log(` ${n} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${qt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(qt.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,s){if(s==="lefthook"){let o=await C(qe.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=qe.join(e,o);return await C(i)?(await nt.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(s==="husky"){let o=qe.join(e,".husky",t);return await C(o)?(await nt.readFile(o,"utf-8")).includes("prjct sync"):!1}let n=qe.join(e,".git","hooks",t);return await C(n)?(await nt.readFile(n,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,s){return s==="lefthook"?await C(qe.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":s==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await $.getProjectId(e);if(!t)return null;try{let s=E.getDoc(t,"project");return s&&s.hooks||null}catch{return null}}async saveHookConfig(e,t){let s=await $.getProjectId(e);if(s)try{let n=E.getDoc(s,"project")||{};n.hooks=t,E.setDoc(s,"project",n)}catch{}}},sP=new Od});var Wy={};ye(Wy,{DoctorService:()=>Fa,doctorService:()=>rP});import{execSync as _d}from"node:child_process";import nP from"node:fs/promises";import Hy from"node:path";import mn from"chalk";var Fa,rP,Gy=S(()=>{"use strict";Te();ve();fr();vt();B();jo();Fe();ut();pr();Fa=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=A.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),s=await this.checkProject(),n=this.generateRecommendations(t,s),o=[...t,...s].some(a=>a.status==="error"&&!a.optional),i=[...t,...s].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:s,recommendations:n,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,s,n,o){try{let a=_d(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(s),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:n}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:n}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e.push(await this.checkMcpProvider("jira")),e.push(await this.checkMcpProvider("linear")),e}async checkPrjctConfig(){let e=Hy.join(this.projectPath,".prjct","prjct.config.json");return await C(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=Hy.join(this.globalPath,"context","CLAUDE.md");try{let t=await nP.stat(e),s=Date.now()-t.mtimeMs,n=Math.floor(s/(1e3*60*60)),o=Math.floor(n/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:n>0?i=`${n} hour${n>1?"s":""} ago`:i="recently",n>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{_d("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=_d("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let s=e.trim().split(`
1875
+ `).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await ss.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await gr({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkMcpProvider(e){try{if(!(await hf(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await yf(e);if(!s.valid){let o=s.autoFixed?" (auto-fixed)":"";return{name:`${e} mcp`,status:"warn",message:`config issues${o}: ${s.issues.join("; ")}`,optional:!0}}let n=await wf(e);if(!n.ready){let o=n.cleaned?"corrupted tokens cleaned \u2014 re-run OAuth":n.migrated?"tokens migrated \u2014 restart AI client":"OAuth tokens missing/invalid";return{name:`${e} mcp`,status:"warn",message:o,optional:!0}}return{name:`${e} mcp`,status:"ok",message:`healthy${n.validated?" (validated)":""}`,optional:!0}}catch(t){return{name:`${e} mcp`,status:"error",message:`check failed: ${t instanceof Error?t.message:"unknown error"}`,optional:!0}}}generateRecommendations(e,t){let s=[];e.find(m=>m.name==="gh"&&m.status==="error")&&s.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(m=>m.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&s.push('Run "prjct sync" to update context');let i=t.find(m=>m.name==="prjct config");i?.status==="error"&&s.push('Run "prjct init" to initialize this project'),t.find(m=>m.name==="CLAUDE.md"&&m.status==="error")&&!i?.status?.includes("error")&&s.push('Run "prjct sync" to generate context files');let c=t.find(m=>m.name==="context7 mcp");c&&c.status!=="ok"&&s.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(m=>m.name==="codex p-router");u&&u.status==="error"&&s.push('Run "prjct start" or "prjct setup" to repair Codex p. router');let d=t.find(m=>m.name==="jira mcp");d&&d.status!=="ok"&&s.push('Run "prjct jira setup" to repair Jira MCP configuration');let p=t.find(m=>m.name==="linear mcp");return p&&p.status!=="ok"&&s.push('Run "prjct linear setup" to repair Linear MCP configuration'),s}printHeader(){f.section(`prjct doctor v${ke}`)}printSection(e,t){f.section(e);let s=t.map(n=>{let o=this.getStatusIcon(n.status,n.optional),i=n.name.padEnd(14),a=n.version||n.message||"",c=n.optional&&n.status==="error"?mn.dim(" (optional)"):"";return`${o} ${i} ${mn.dim(a)}${c}`});for(let n of s)console.log(` ${n}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:mn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(mn.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return mn.green("\u2713");case"warn":return mn.yellow("\u26A0");case"error":return t?mn.dim("\u25CB"):mn.red("\u2717")}}},rP=new Fa});var qy={};ye(qy,{WatchService:()=>Ua,watchService:()=>lP});import oP from"node:path";import kt from"chalk";import iP from"chokidar";var aP,cP,Ua,lP,By=S(()=>{"use strict";Te();W();K();Yi();aP=["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"],cP=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Ua=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=iP.watch(aP,{cwd:this.projectPath,ignored:cP,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",s=>this.handleChange("add",s)).on("change",s=>this.handleChange("change",s)).on("unlink",s=>this.handleChange("unlink",s)).on("error",s=>this.handleError(s)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(kt.dim(`
1876
1876
  \u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let s=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(kt.dim(` ${s} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let s=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(kt.dim(` \u23F3 Rate limited, waiting ${Math.round(s/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),s);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=v().split("T")[1].split(".")[0];if(!this.options.quiet){let s=e.length===1?e[0]:`${e.length} files`;console.log(`
1877
- ${kt.dim(`[${t}]`)} ${kt.cyan("\u27F3")} ${s} changed \u2192 syncing...`)}try{let s=await Ns.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,s.success?this.options.quiet||console.log(`${kt.dim(`[${t}]`)} ${kt.green("\u2713")} Synced`):console.error(`${kt.dim(`[${t}]`)} ${kt.red("\u2717")} Sync failed: ${s.error}`)}catch(s){console.error(`${kt.dim(`[${t}]`)} ${kt.red("\u2717")} Error: ${k(s)}`)}}handleError(e){console.error(kt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(kt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(kt.dim(` Project: ${dP.basename(this.projectPath)}`)),console.log(kt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(kt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(kt.dim(" Press Ctrl+C to stop")),console.log("")}},fP=new Ba});var ew={};ye(ew,{formatAgentCommandHelp:()=>Yy,formatCommandHelp:()=>Qy,formatCommandList:()=>Zy,formatMainHelp:()=>Ky,formatTerminalCommandHelp:()=>Xy,getHelp:()=>yP});import Y from"chalk";function Ky(){let r=[];r.push(""),r.push(`${Y.cyan.bold("prjct")} v${ke} - Context layer for AI coding agents`),r.push(Y.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(Y.bold("QUICK START")),r.push(Y.dim("\u2500".repeat(60))),r.push(` ${Y.green("1.")} prjct start ${Y.dim("# Configure AI providers")}`),r.push(` ${Y.green("2.")} cd my-project && prjct init`),r.push(` ${Y.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${Y.green("4.")} p. sync ${Y.dim("# Analyze project")}`),r.push(""),r.push(Y.bold("TERMINAL COMMANDS")),r.push(Y.dim("\u2500".repeat(60)));for(let t of zy){let s=`prjct ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(""),r.push(`${Y.bold("AI AGENT COMMANDS")} ${Y.dim("(inside Claude/Gemini/Cursor)")}`),r.push(Y.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${Y.dim("\u2500".repeat(56))}`);let e=Jr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let s=`p. ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(` ${Y.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(Y.bold("FLAGS")),r.push(Y.dim("\u2500".repeat(60)));for(let t of hP)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(Y.bold("MORE INFO")),r.push(Y.dim("\u2500".repeat(60))),r.push(` Documentation: ${Y.cyan("https://prjct.app")}`),r.push(` GitHub: ${Y.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
1878
- `)}function Xy(r){let e=zy.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${Y.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(Y.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(Y.bold("OPTIONS"));for(let s of e.options)t.push(` ${s}`);t.push("")}if(e.subcommands){t.push(Y.bold("SUBCOMMANDS"));for(let s of e.subcommands)t.push(` ${s}`);t.push("")}return t.join(`
1879
- `)}function Yy(r){let e=Jr.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${Y.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(Y.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(Y.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(Y.bold("FEATURES"));for(let n of e.features)t.push(` \u2022 ${n}`);t.push("")}e.blockingRules&&(t.push(Y.bold("REQUIREMENTS")),t.push(` ${Y.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let s=Wo[e.group];return s&&(t.push(Y.dim(`Category: ${s.title}`)),e.isOptional&&t.push(Y.dim("This is an optional command.")),t.push("")),t.join(`
1880
- `)}function Qy(r){let e=Xy(r);if(e)return e;let t=Yy(r);return t||`
1877
+ ${kt.dim(`[${t}]`)} ${kt.cyan("\u27F3")} ${s} changed \u2192 syncing...`)}try{let s=await Ns.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,s.success?this.options.quiet||console.log(`${kt.dim(`[${t}]`)} ${kt.green("\u2713")} Synced`):console.error(`${kt.dim(`[${t}]`)} ${kt.red("\u2717")} Sync failed: ${s.error}`)}catch(s){console.error(`${kt.dim(`[${t}]`)} ${kt.red("\u2717")} Error: ${k(s)}`)}}handleError(e){console.error(kt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(kt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(kt.dim(` Project: ${oP.basename(this.projectPath)}`)),console.log(kt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(kt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(kt.dim(" Press Ctrl+C to stop")),console.log("")}},lP=new Ua});var Jy={};ye(Jy,{getHelp:()=>hP});import Y from"chalk";function dP(){let r=[];r.push(""),r.push(`${Y.cyan.bold("prjct")} v${ke} - Context layer for AI coding agents`),r.push(Y.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(Y.bold("QUICK START")),r.push(Y.dim("\u2500".repeat(60))),r.push(` ${Y.green("1.")} prjct start ${Y.dim("# Configure AI providers")}`),r.push(` ${Y.green("2.")} cd my-project && prjct init`),r.push(` ${Y.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${Y.green("4.")} p. sync ${Y.dim("# Analyze project")}`),r.push(""),r.push(Y.bold("TERMINAL COMMANDS")),r.push(Y.dim("\u2500".repeat(60)));for(let t of Vy){let s=`prjct ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(""),r.push(`${Y.bold("AI AGENT COMMANDS")} ${Y.dim("(inside Claude/Gemini/Cursor)")}`),r.push(Y.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${Y.dim("\u2500".repeat(56))}`);let e=qr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let s=`p. ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(` ${Y.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(Y.bold("FLAGS")),r.push(Y.dim("\u2500".repeat(60)));for(let t of uP)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(Y.bold("MORE INFO")),r.push(Y.dim("\u2500".repeat(60))),r.push(` Documentation: ${Y.cyan("https://prjct.app")}`),r.push(` GitHub: ${Y.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
1878
+ `)}function mP(r){let e=Vy.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${Y.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(Y.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(Y.bold("OPTIONS"));for(let s of e.options)t.push(` ${s}`);t.push("")}if(e.subcommands){t.push(Y.bold("SUBCOMMANDS"));for(let s of e.subcommands)t.push(` ${s}`);t.push("")}return t.join(`
1879
+ `)}function pP(r){let e=qr.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${Y.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(Y.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(Y.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(Y.bold("FEATURES"));for(let n of e.features)t.push(` \u2022 ${n}`);t.push("")}e.blockingRules&&(t.push(Y.bold("REQUIREMENTS")),t.push(` ${Y.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let s=_o[e.group];return s&&(t.push(Y.dim(`Category: ${s.title}`)),e.isOptional&&t.push(Y.dim("This is an optional command.")),t.push("")),t.join(`
1880
+ `)}function gP(r){let e=mP(r);if(e)return e;let t=pP(r);return t||`
1881
1881
  ${Y.yellow(`Command '${r}' not found.`)}
1882
1882
 
1883
1883
  Run 'prjct help' to see all available commands.
1884
- `}function Zy(){let r=[];r.push(""),r.push(Y.cyan.bold("All Commands")),r.push("");let e=Object.entries(Wo).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=Jr.filter(o=>o.group===t);if(n.length!==0){r.push(`${Y.bold(s.title)} ${Y.dim(`(${n.length} commands)`)}`),r.push(Y.dim(s.description)),r.push("");for(let o of n){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(Y.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1885
- `)}function yP(r){return r?r==="commands"||r==="all"?Zy():Qy(r):Ky()}var zy,hP,tw=S(()=>{"use strict";qd();ut();zy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],hP=[{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(Ky,"formatMainHelp");l(Xy,"formatTerminalCommandHelp");l(Yy,"formatAgentCommandHelp");l(Qy,"formatCommandHelp");l(Zy,"formatCommandList");l(yP,"getHelp")});var sw=dw((eJ,wP)=>{wP.exports={name:"prjct-cli",version:"1.56.6",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@hono/node-server":"1.13.7","@modelcontextprotocol/sdk":"1.28.0","better-sqlite3":"12.6.2",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1",hono:"4.11.3","jsonc-parser":"3.3.1",zod:"3.24.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var PP={};import nw from"node:os";import Va from"node:path";import Be from"chalk";async function kP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>pw(sw()));await EP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(CP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let p=bP(r),g=p?`Did you mean 'prjct ${p}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(jn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let p=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:p}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=TP(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=SP(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await $.getProjectId(process.cwd()),c&&(await Zs.expireIfStale(c),await Zs.touch(c))}catch{}let d=new un,m;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let p=n.slice(1).join(" ");m=await d.parallelSpawn(p,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let p=n.slice(1);p.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),m=await d.parallelBatch(p,process.cwd())}else if(r==="design"){let p=n.join(" ");m=await d.design(p,o)}else if(r==="analyze")m=await d.analyze(o);else if(r==="cleanup")m=await d.cleanup(o);else if(r==="cleanup-projects")m=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")m=await d.setup(o);else if(r==="update")m=await d.update(o);else{let p=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor"),obsidian:l(h=>d.obsidian(h,process.cwd()),"obsidian")}[r];if(b)m=await b(p);else throw new Error(`Command '${r}' has no handler`)}if(c){let p=Date.now()-u;try{await Zs.trackCommand(c,r,p)}catch{}try{await Rn.recordTiming(c,"command_duration",p,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await Rn.recordTiming(c,"startup_time",w)}await Rn.recordMemory(c,{command:r})}catch{}}m?.message&&console.log(m.message),t||f.end(),process.exit(m?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(oc(s)),t||f.end(),process.exit(1)}}function SP(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return jn("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function bP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=vP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function vP(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function TP(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function EP(r){let e=await Ps(),t=Va.join(nw.homedir(),".claude","commands","p.md"),s=Va.join(nw.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Va.join(process.cwd(),".cursor","commands","sync.md")),C(Va.join(process.cwd(),".cursor"))]),c=await Vn();if(console.log(`
1884
+ `}function fP(){let r=[];r.push(""),r.push(Y.cyan.bold("All Commands")),r.push("");let e=Object.entries(_o).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=qr.filter(o=>o.group===t);if(n.length!==0){r.push(`${Y.bold(s.title)} ${Y.dim(`(${n.length} commands)`)}`),r.push(Y.dim(s.description)),r.push("");for(let o of n){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(Y.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1885
+ `)}function hP(r){return r?r==="commands"||r==="all"?fP():gP(r):dP()}var Vy,uP,zy=S(()=>{"use strict";jd();ut();Vy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],uP=[{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(dP,"formatMainHelp");l(mP,"formatTerminalCommandHelp");l(pP,"formatAgentCommandHelp");l(gP,"formatCommandHelp");l(fP,"formatCommandList");l(hP,"getHelp")});var Xy=rw((qV,yP)=>{yP.exports={name:"prjct-cli",version:"1.56.10",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 .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@hono/node-server":"1.13.7","@modelcontextprotocol/sdk":"1.28.0","better-sqlite3":"12.6.2",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1",hono:"4.11.3","jsonc-parser":"3.3.1",zod:"3.24.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var CP={};import Ky from"node:os";import Ha from"node:path";import Be from"chalk";async function wP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>ow(Xy()));await TP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(EP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let m=SP(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(ho("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=vP(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=kP(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await $.getProjectId(process.cwd()),c&&(await Qs.expireIfStale(c),await Qs.touch(c))}catch{}let d=new ln,p;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let m=n.slice(1).join(" ");p=await d.parallelSpawn(m,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let m=n.slice(1);m.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),p=await d.parallelBatch(m,process.cwd())}else if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor"),obsidian:l(h=>d.obsidian(h,process.cwd()),"obsidian")}[r];if(b)p=await b(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Qs.trackCommand(c,r,m)}catch{}try{await xn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await xn.recordTiming(c,"startup_time",w)}await xn.recordMemory(c,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(ec(s)),t||f.end(),process.exit(1)}}function kP(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return ho("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function SP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=bP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function bP(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function vP(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function TP(r){let e=await Ps(),t=Ha.join(Ky.homedir(),".claude","commands","p.md"),s=Ha.join(Ky.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Ha.join(process.cwd(),".cursor","commands","sync.md")),C(Ha.join(process.cwd(),".cursor"))]),c=await Bn();if(console.log(`
1886
1886
  ${Be.cyan("p/")} prjct v${r}
1887
1887
  ${Be.dim("Context layer for AI coding agents")}
1888
1888
 
1889
1889
  ${Be.dim("Providers:")}`),e.claude.installed){let u=n?Be.green("\u2713 ready"):Be.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${Be.dim(d)}`)}else console.log(` Claude Code ${Be.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?Be.green("\u2713 ready"):Be.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${Be.dim(d)}`)}else console.log(` Gemini CLI ${Be.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?Be.green("\u2713 ready"):Be.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${Be.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${Be.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${Be.green("\u2713 ready")} ${Be.dim("(use /sync, /task)")}`:a?` Cursor IDE ${Be.yellow("\u25CF detected")} ${Be.dim("(run prjct init)")}`:` Cursor IDE ${Be.dim("\u25CB no .cursor/ folder")}`),console.log(`
1890
1890
  ${Be.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1891
1891
  ${Be.cyan("https://prjct.app")}
1892
- `)}function CP(){console.log(`
1892
+ `)}function EP(){console.log(`
1893
1893
  prjct - Context layer for AI coding agents
1894
1894
  Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
1895
1895
 
@@ -1948,7 +1948,7 @@ MORE INFO
1948
1948
  ---------
1949
1949
  Documentation: https://prjct.app
1950
1950
  GitHub: https://github.com/jlopezlira/prjct-cli
1951
- `)}var rw=S(()=>{"use strict";Gd();Lo();Jd();lt();Te();Pi();Ci();W();bo();B();Fe();l(kP,"main");l(SP,"validateCommandParams");l(bP,"findClosestCommand");l(vP,"editDistance");l(TP,"parseCommandArgs");l(EP,"displayVersion");l(CP,"displayHelp");kP().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(oc(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var so=process.argv.slice(2),Zd=so.find(r=>!r.startsWith("--")&&!r.startsWith("-")),xP=new Set(["daemon","stop","restart","start","setup","update","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","jira","help","-h","--help","version","-v","--version"]);if(Zd&&!xP.has(Zd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Jo(),tp)),t=e.socket();if(r.existsSync(t)){let{sendRequest:s}=await Promise.resolve().then(()=>(Ts(),vs)),n=await import("node:crypto"),o=[],i={};for(let a=0;a<so.length;a++){let c=so[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<so.length&&!so[a+1].startsWith("--")?i[u]=so[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await s({id:n.randomUUID(),command:Zd,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 jP(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:s}=await Promise.resolve().then(()=>(lt(),Nt)),n=(await Promise.resolve().then(()=>(Te(),Dp))).default,o=(await Promise.resolve().then(()=>(ai(),Mp))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(tl(),hm)),{fileExists:c}=await Promise.resolve().then(()=>(B(),_t)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(uc(),wp)),{VERSION:d}=await Promise.resolve().then(()=>(ut(),Yn));async function m(){let T=r.homedir(),I=await s();if(I.claude.installed){let M=e.join(T,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(j=>j.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if(I.gemini.installed){let M=e.join(T,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(j=>j.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!I.claude.installed&&!I.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(T=>T==="--quiet"||T==="-q"),w=g!==-1;if(w){p.splice(g,1);let{setQuietMode:T}=await Promise.resolve().then(()=>(Fe(),bm));T(!0)}let b=p.indexOf("--refresh"),h=b!==-1;h&&(p.splice(b,1),await u());async function x(T){let I=Date.now();try{let M=await n.getProjectId(process.cwd());if(M){let{sessionTracker:y}=await Promise.resolve().then(()=>(Ci(),Em));return await y.expireIfStale(M),await y.touch(M),()=>{let j=Date.now()-I;y.trackCommand(M,T,j).catch(()=>{}),Promise.resolve().then(()=>(Pi(),Pm)).then(({performanceTracker:D})=>{D.recordTiming(M,"command_duration",j,{command:T}).catch(()=>{}),D.recordMemory(M,{command:T}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(x,"trackSession"),p[0]==="daemon"){let T=p[1]||"status";if(T==="start"){let{isDaemonRunning:I,spawnDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(await I())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:j}=await Promise.resolve().then(()=>(Ey(),Ty)),D=parseInt(p.find(Q=>Q.startsWith("--port="))?.split("=")[1]||"",10)||void 0,G=p.includes("--no-http");await j({port:D,noHttp:G,foreground:!0})}else await M()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(T==="stop"){let{isDaemonRunning:I,stopDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(await I()){let y=await M();console.log(y?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=y?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(T==="status"){let{getDaemonStatus:I}=await Promise.resolve().then(()=>(Ts(),vs)),M=await I();if(M.running){let y=M.uptime?Math.round(M.uptime/1e3):0,j=M.stale;console.log(`Daemon running (PID ${M.pid})${j?" \u26A0 STALE":""}`),console.log(` Uptime: ${y}s`),console.log(` Commands served: ${M.commandsServed??0}`),M.lastActivity&&console.log(` Last activity: ${M.lastActivity}`),j&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${T}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="stop"){let{isDaemonRunning:T,stopDaemon:I,forceKillDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(p.includes("--force")||p.includes("-f")){let j=M();console.log(j?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await T()?await I()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),M(),console.log("Daemon force-killed."),process.exitCode=0):(M(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(p[0]==="restart"){let{isDaemonRunning:T,stopDaemon:I,forceKillDaemon:M,spawnDaemon:y}=await Promise.resolve().then(()=>(Ts(),vs));await T()?(await I()||M(),await new Promise(G=>setTimeout(G,300))):M(),await y()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(p[0]==="start"||p[0]==="setup"){let{runStart:T}=await Promise.resolve().then(()=>(jy(),xy));await T()}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 T=process.cwd(),I=await n.getProjectId(T);if(!I)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=parseInt(p[1],10)||i;await a(I,T,M)}}catch(T){console.error("Server error:",T.message),process.exitCode=1}else if(p[0]==="context"){let T=process.cwd(),I=await n.getProjectId(T);if(!I)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=await x("context"),y=p.slice(1).filter(D=>D!=="--md"&&D!=="--json"),j=p.includes("--md");if(y.length===0){let{ContextCommands:D}=await Promise.resolve().then(()=>(Ra(),Dh)),Q=await new D().context(null,T,{md:j});process.exitCode=Q.success?0:1}else{let{runContextTool:D}=await Promise.resolve().then(()=>(Ny(),_y)),G=await D(y,I,T);console.log(JSON.stringify(G,null,2)),process.exitCode=G.tool==="error"?1:0}M()}}else if(p[0]==="hooks"){let T=await x("hooks"),{hooksService:I}=await Promise.resolve().then(()=>(Wy(),Hy)),M=p[1]||"status",y=await I.run(process.cwd(),M);process.exitCode=y,T()}else if(p[0]==="doctor"){let T=await x("doctor"),{doctorService:I}=await Promise.resolve().then(()=>(By(),qy)),M=await I.run(process.cwd());process.exitCode=M,T()}else if(p[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(Bd(),ky)),I=p.includes("--force")||p.includes("-f"),M=p.includes("--backup")||p.includes("-b"),y=p.includes("--dry-run")||p.includes("-n"),j=p.includes("--keep-package"),D=await T({force:I,backup:M,dryRun:y,keepPackage:j});process.exitCode=D.success?0:1}else if(p[0]==="watch"){let T=process.cwd();if(!await n.getProjectId(T))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:M}=await Promise.resolve().then(()=>(Jy(),Vy)),y=p.includes("--verbose")||p.includes("-v"),j=p.find(he=>he.startsWith("--debounce=")),D=j?parseInt(j.split("=")[1],10):void 0,G=p.find(he=>he.startsWith("--interval=")),Q=G?parseInt(G.split("=")[1],10)*1e3:void 0,Ve=await M.start(T,{verbose:y,quiet:w,debounceMs:D,minIntervalMs:Q});Ve.success||(console.error(Ve.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:T}=await import("node:child_process"),I=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","linear.ts"),j=e.join(__dirname,"..","dist","cli","linear.mjs"),D=e.join(__dirname,"..","cli","linear.mjs"),G,Q;if(I.existsSync(y)?(G=y,Q="bun"):I.existsSync(D)?(G=D,Q="node"):I.existsSync(j)?(G=j,Q="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Q=""),G){let Ve=[...p.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(p[0]==="jira"){let{spawn:T}=await import("node:child_process"),I=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","jira.ts"),j=e.join(__dirname,"..","dist","cli","jira.mjs"),D=e.join(__dirname,"..","cli","jira.mjs"),G,Q;if(I.existsSync(y)?(G=y,Q="bun"):I.existsSync(D)?(G=D,Q="node"):I.existsSync(j)?(G=j,Q="node"):(console.error('Jira CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Q=""),G){let Ve=[...p.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:T}=await Promise.resolve().then(()=>(tw(),ew)),I=p[1];console.log(T(I)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let T=await s(h),I=r.homedir(),M=process.cwd(),[y,j,D,G,Q,Ve]=await Promise.all([c(e.join(I,".claude","commands","p.md")),c(e.join(I,".gemini","commands","p.toml")),c(e.join(M,".cursor")),c(e.join(M,".cursor","rules","prjct.mdc")),c(e.join(M,".windsurf")),c(e.join(M,".windsurf","rules","prjct.md"))]);if(console.log(`
1951
+ `)}var Yy=S(()=>{"use strict";xd();Do();Id();lt();Te();Ti();vi();W();ki();B();Fe();l(wP,"main");l(kP,"validateCommandParams");l(SP,"findClosestCommand");l(bP,"editDistance");l(vP,"parseCommandArgs");l(TP,"displayVersion");l(EP,"displayHelp");wP().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(ec(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var Qr=process.argv.slice(2),Nd=Qr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),PP=new Set(["daemon","stop","restart","start","setup","update","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","jira","help","-h","--help","version","-v","--version"]);if(Nd&&!PP.has(Nd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Wo(),Fd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:s}=await Promise.resolve().then(()=>(Ts(),vs)),n=await import("node:crypto"),o=[],i={};for(let a=0;a<Qr.length;a++){let c=Qr[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<Qr.length&&!Qr[a+1].startsWith("--")?i[u]=Qr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await s({id:n.randomUUID(),command:Nd,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 xP(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:s}=await Promise.resolve().then(()=>(lt(),Nt)),n=(await Promise.resolve().then(()=>(Te(),hm))).default,o=(await Promise.resolve().then(()=>(si(),wm))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(Kc(),Zm)),{fileExists:c}=await Promise.resolve().then(()=>(B(),_t)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(oc(),sm)),{VERSION:d}=await Promise.resolve().then(()=>(ut(),Kn));async function p(){let T=r.homedir(),I=await s();if(I.claude.installed){let M=e.join(T,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(j=>j.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if(I.gemini.installed){let M=e.join(T,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(j=>j.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!I.claude.installed&&!I.gemini.installed,!0}l(p,"checkRoutersInstalled");let m=process.argv.slice(2),g=m.findIndex(T=>T==="--quiet"||T==="-q"),w=g!==-1;if(w){m.splice(g,1);let{setQuietMode:T}=await Promise.resolve().then(()=>(Fe(),ip));T(!0)}let b=m.indexOf("--refresh"),h=b!==-1;h&&(m.splice(b,1),await u());async function x(T){let I=Date.now();try{let M=await n.getProjectId(process.cwd());if(M){let{sessionTracker:y}=await Promise.resolve().then(()=>(vi(),lp));return await y.expireIfStale(M),await y.touch(M),()=>{let j=Date.now()-I;y.trackCommand(M,T,j).catch(()=>{}),Promise.resolve().then(()=>(Ti(),dp)).then(({performanceTracker:D})=>{D.recordTiming(M,"command_duration",j,{command:T}).catch(()=>{}),D.recordMemory(M,{command:T}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(x,"trackSession"),m[0]==="daemon"){let T=m[1]||"status";if(T==="start"){let{isDaemonRunning:I,spawnDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(await I())console.log("Daemon is already running."),process.exitCode=0;else if(m.includes("--foreground")||m.includes("-f")){let{startDaemon:j}=await Promise.resolve().then(()=>(by(),Sy)),D=parseInt(m.find(Q=>Q.startsWith("--port="))?.split("=")[1]||"",10)||void 0,G=m.includes("--no-http");await j({port:D,noHttp:G,foreground:!0})}else await M()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(T==="stop"){let{isDaemonRunning:I,stopDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(await I()){let y=await M();console.log(y?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=y?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(T==="status"){let{getDaemonStatus:I}=await Promise.resolve().then(()=>(Ts(),vs)),M=await I();if(M.running){let y=M.uptime?Math.round(M.uptime/1e3):0,j=M.stale;console.log(`Daemon running (PID ${M.pid})${j?" \u26A0 STALE":""}`),console.log(` Uptime: ${y}s`),console.log(` Commands served: ${M.commandsServed??0}`),M.lastActivity&&console.log(` Last activity: ${M.lastActivity}`),j&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${T}. Use: start, stop, status`),process.exitCode=1}else if(m[0]==="stop"){let{isDaemonRunning:T,stopDaemon:I,forceKillDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(m.includes("--force")||m.includes("-f")){let j=M();console.log(j?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await T()?await I()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),M(),console.log("Daemon force-killed."),process.exitCode=0):(M(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(m[0]==="restart"){let{isDaemonRunning:T,stopDaemon:I,forceKillDaemon:M,spawnDaemon:y}=await Promise.resolve().then(()=>(Ts(),vs));await T()?(await I()||M(),await new Promise(G=>setTimeout(G,300))):M(),await y()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(m[0]==="start"||m[0]==="setup"){let{runStart:T}=await Promise.resolve().then(()=>(Cy(),Ey));await T()}else if(m[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(m[0]==="web"||m[0]==="serve")try{let T=process.cwd(),I=await n.getProjectId(T);if(!I)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=parseInt(m[1],10)||i;await a(I,T,M)}}catch(T){console.error("Server error:",T.message),process.exitCode=1}else if(m[0]==="context"){let T=process.cwd(),I=await n.getProjectId(T);if(!I)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=await x("context"),y=m.slice(1).filter(D=>D!=="--md"&&D!=="--json"),j=m.includes("--md");if(y.length===0){let{ContextCommands:D}=await Promise.resolve().then(()=>(xa(),Sh)),Q=await new D().context(null,T,{md:j});process.exitCode=Q.success?0:1}else{let{runContextTool:D}=await Promise.resolve().then(()=>(Oy(),My)),G=await D(y,I,T);console.log(JSON.stringify(G,null,2)),process.exitCode=G.tool==="error"?1:0}M()}}else if(m[0]==="hooks"){let T=await x("hooks"),{hooksService:I}=await Promise.resolve().then(()=>(Uy(),Fy)),M=m[1]||"status",y=await I.run(process.cwd(),M);process.exitCode=y,T()}else if(m[0]==="doctor"){let T=await x("doctor"),{doctorService:I}=await Promise.resolve().then(()=>(Gy(),Wy)),M=await I.run(process.cwd());process.exitCode=M,T()}else if(m[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(Rd(),hy)),I=m.includes("--force")||m.includes("-f"),M=m.includes("--backup")||m.includes("-b"),y=m.includes("--dry-run")||m.includes("-n"),j=m.includes("--keep-package"),D=await T({force:I,backup:M,dryRun:y,keepPackage:j});process.exitCode=D.success?0:1}else if(m[0]==="watch"){let T=process.cwd();if(!await n.getProjectId(T))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:M}=await Promise.resolve().then(()=>(By(),qy)),y=m.includes("--verbose")||m.includes("-v"),j=m.find(he=>he.startsWith("--debounce=")),D=j?parseInt(j.split("=")[1],10):void 0,G=m.find(he=>he.startsWith("--interval=")),Q=G?parseInt(G.split("=")[1],10)*1e3:void 0,Ve=await M.start(T,{verbose:y,quiet:w,debounceMs:D,minIntervalMs:Q});Ve.success||(console.error(Ve.error),process.exitCode=1)}}else if(m[0]==="linear"){let{spawn:T}=await import("node:child_process"),I=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","linear.ts"),j=e.join(__dirname,"..","dist","cli","linear.mjs"),D=e.join(__dirname,"..","cli","linear.mjs"),G,Q;if(I.existsSync(y)?(G=y,Q="bun"):I.existsSync(D)?(G=D,Q="node"):I.existsSync(j)?(G=j,Q="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Q=""),G){let Ve=[...m.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(m[0]==="jira"){let{spawn:T}=await import("node:child_process"),I=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","jira.ts"),j=e.join(__dirname,"..","dist","cli","jira.mjs"),D=e.join(__dirname,"..","cli","jira.mjs"),G,Q;if(I.existsSync(y)?(G=y,Q="bun"):I.existsSync(D)?(G=D,Q="node"):I.existsSync(j)?(G=j,Q="node"):(console.error('Jira CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Q=""),G){let Ve=[...m.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(m[0]==="help"||m[0]==="-h"||m[0]==="--help"){let{getHelp:T}=await Promise.resolve().then(()=>(zy(),Jy)),I=m[1];console.log(T(I)),process.exitCode=0}else if(m[0]==="version"||m[0]==="-v"||m[0]==="--version"){let T=await s(h),I=r.homedir(),M=process.cwd(),[y,j,D,G,Q,Ve]=await Promise.all([c(e.join(I,".claude","commands","p.md")),c(e.join(I,".gemini","commands","p.toml")),c(e.join(M,".cursor")),c(e.join(M,".cursor","rules","prjct.mdc")),c(e.join(M,".windsurf")),c(e.join(M,".windsurf","rules","prjct.md"))]);if(console.log(`
1952
1952
  ${t.cyan("p/")} prjct v${d}
1953
1953
  ${t.dim("Context layer for AI coding agents")}
1954
1954
 
@@ -1956,7 +1956,7 @@ ${t.dim("Providers:")}`),T.claude.installed){let he=y?t.green("\u2713 ready"):t.
1956
1956
  ${t.dim("Run 'prjct start' to configure (CLI providers)")}
1957
1957
  ${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1958
1958
  ${t.cyan("https://prjct.app")}
1959
- `)}else{let T=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),I=await m();if(!new Set(["auth","login","logout","init"]).has(p[0])&&(!await c(T)||!I))console.log(`
1959
+ `)}else{let T=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),I=await p();if(!new Set(["auth","login","logout","init"]).has(m[0])&&(!await c(T)||!I))console.log(`
1960
1960
  ${t.cyan.bold(" Welcome to prjct!")}
1961
1961
 
1962
1962
  Run ${t.bold("prjct start")} to configure your AI providers.
@@ -1965,4 +1965,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
1965
1965
  Claude Code, Gemini CLI, or both.`)}
1966
1966
  `),process.exitCode=0;else{try{let y=await o.getLastVersion();if(y&&y!==d){console.log(`
1967
1967
  ${t.yellow("\u2139")} Updating prjct v${y} \u2192 v${d}...
1968
- `);try{let{default:j}=await Promise.resolve().then(()=>(yr(),Ji));await j.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Ts(),vs)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>(rw(),PP))}}}l(jP,"main");jP().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
1968
+ `);try{let{default:j}=await Promise.resolve().then(()=>(fr(),qi));await j.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}m.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Ts(),vs)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>(Yy(),CP))}}}l(xP,"main");xP().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});