prjct-cli 1.56.0 → 1.56.6

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 sw=Object.create;var to=Object.defineProperty;var nw=Object.getOwnPropertyDescriptor;var rw=Object.getOwnPropertyNames;var ow=Object.getPrototypeOf,iw=Object.prototype.hasOwnProperty;var l=(r,e)=>to(r,"name",{value:e,configurable:!0}),_t=(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 aw=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Se=(r,e)=>{for(var t in e)to(r,t,{get:e[t],enumerable:!0})},Jd=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of rw(e))!iw.call(r,n)&&n!==t&&to(r,n,{get:()=>e[n],enumerable:!(s=nw(e,n))||s.enumerable});return r};var cw=(r,e,t)=>(t=r!=null?sw(ow(r)):{},Jd(e||!r||!r.__esModule?to(t,"default",{value:r,enumerable:!0}):t,r)),Ct=r=>Jd(to({},"__esModule",{value:!0}),r);var zd={};Se(zd,{DAEMON_PATHS:()=>Le,IDLE_TIMEOUT_MS:()=>ec,MAX_BUFFER_SIZE:()=>tc,decodeMessage:()=>lw,encodeMessage:()=>gn});function gn(r){return Buffer.from(`${JSON.stringify(r)}
8
- `)}function lw(r){return JSON.parse(r.trim())}var Le,ec,tc,Vo=S(()=>{"use strict";Le={runDir:l(()=>`${process.env.HOME||_t("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")},ec=1800*1e3,tc=1024*1024;l(gn,"encodeMessage");l(lw,"decodeMessage")});function Kd(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function sc(){if(Kd()==="bun")return!0;try{let{execSync:r}=_t("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function fn(){return Kd()==="bun"}var so=S(()=>{"use strict";l(Kd,"detectRuntime");l(sc,"isBunAvailable");l(fn,"isBun")});var bs={};Se(bs,{executeViaDaemon:()=>pw,forceKillDaemon:()=>gw,getDaemonStatus:()=>dw,isDaemonRunning:()=>Xd,sendRequest:()=>no,spawnDaemon:()=>Yd,stopDaemon:()=>mw});import Jo from"node:crypto";import ct from"node:fs";import{connect as uw}from"node:net";async function Xd(){let r=Le.socket();if(!ct.existsSync(r))return!1;try{return(await no({id:Jo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{ct.unlinkSync(r)}catch{}return!1}}async function dw(){let r=Le.socket(),e=Le.pid();if(!ct.existsSync(r))return{running:!1};try{let t=await no({id:Jo.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 no(r){return new Promise((e,t)=>{let s=Le.socket(),n=uw(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 pw(r,e,t,s,n,o=!0){let i=Le.socket();if(!ct.existsSync(i))return o&&Yd().catch(()=>{}),null;try{return await no({id:Jo.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function mw(){try{return(await no({id:Jo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function gw(){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 Yd(){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=sc()?"bun":"node";else if(ct.existsSync(n))o=n,i=sc()?"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 Xd())return!0;return!1}var vs=S(()=>{"use strict";so();Vo();l(Xd,"isDaemonRunning");l(dw,"getDaemonStatus");l(no,"sendRequest");l(pw,"executeViaDaemon");l(mw,"stopDaemon");l(gw,"forceKillDaemon");l(Yd,"spawnDaemon")});var ro=S(()=>{"use strict"});import{z as ds}from"zod";function Qd(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 LP,FP,UP,qn,HP,zo=S(()=>{"use strict";LP=ds.enum(["opus","sonnet","haiku"]),FP=ds.enum(["2.5-pro","2.5-flash","2.0-flash"]),UP=ds.string().min(1),qn=ds.object({provider:ds.string(),model:ds.string(),cliVersion:ds.string().optional(),recordedAt:ds.string()}),HP=ds.object({preferredModel:ds.string().optional(),lastAnalysisModel:qn.optional()});l(Qd,"compareSemver")});var ep={};Se(ep,{execAsync:()=>F,execFileAsync:()=>hn});import{exec as fw,execFile as hw}from"node:child_process";import{promisify as Zd}from"node:util";var F,hn,Je=S(()=>{"use strict";F=Zd(fw),hn=Zd(hw)});var tp,sp,np,nc=S(()=>{"use strict";tp=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"]),sp=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],np=/(?:import|from)\s+['"]([^'"]+)['"]/g});function yw(r){return r instanceof Error&&"code"in r}function O(r){return yw(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function rc(r){if(r instanceof Error)return r.stack}var W=S(()=>{"use strict";l(yw,"isNodeError");l(O,"isNotFoundError");l(k,"getErrorMessage");l(rc,"getErrorStack")});import ip from"node:fs/promises";async function ap(r,e){let t;try{t=await ip.readFile(r,"utf-8")}catch(o){if(O(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await rp(r,t),op(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await rp(r,t),op(r,ww(n.error)),null)}async function rp(r,e){let t=`${r}.backup`;try{await ip.writeFile(t,e,"utf-8")}catch{}}function op(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 ww(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var cp=S(()=>{"use strict";W();l(ap,"safeRead");l(rp,"createBackup");l(op,"logCorruption");l(ww,"formatZodError")});var Nt={};Se(Nt,{appendLine:()=>oc,appendToFile:()=>Sw,atomicWrite:()=>kw,batchProcess:()=>wn,copyFile:()=>Pw,deleteDir:()=>Tw,deleteFile:()=>vw,dirExists:()=>Xt,ensureDir:()=>rt,fileExists:()=>C,getFileExtension:()=>Aw,getFileModifiedTime:()=>Cw,getFileNameWithoutExtension:()=>Iw,getFileSize:()=>Ew,listFiles:()=>Es,moveFile:()=>xw,prependToFile:()=>bw,readFile:()=>_e,readJson:()=>Ae,readLines:()=>jw,walkDir:()=>yn,writeFile:()=>Pt,writeJson:()=>de,writeLines:()=>Rw});import Re from"node:fs/promises";import Ts 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(tp.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=Ts.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(Ts.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 ap(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=Ts.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=Ts.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.writeFile(r,e,"utf-8")}async function kw(r,e){let t=Ts.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 Sw(r,e){await Re.appendFile(r,e,"utf-8")}async function oc(r,e){let t=Ts.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.appendFile(r,`${e}
10
- `,"utf-8")}async function bw(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 vw(r){try{return await Re.unlink(r),!0}catch(e){if(O(e))return!1;throw e}}async function Tw(r){try{return await Re.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(O(e))return!1;throw e}}async function Es(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 Ew(r){return(await Re.stat(r)).size}async function Cw(r){return(await Re.stat(r)).mtime}async function Pw(r,e){await Re.copyFile(r,e)}async function xw(r,e){await Re.rename(r,e)}async function jw(r){return(await _e(r,"")).split(`
11
- `)}async function Rw(r,e){let t=e.join(`
12
- `);await Pt(r,t)}function Aw(r){return Ts.extname(r)}function Iw(r){return Ts.basename(r,Ts.extname(r))}var B=S(()=>{"use strict";nc();cp();W();l(yn,"walkDir");l(wn,"batchProcess");l(Ae,"readJson");l(de,"writeJson");l(_e,"readFile");l(Pt,"writeFile");l(kw,"atomicWrite");l(Sw,"appendToFile");l(oc,"appendLine");l(bw,"prependToFile");l(C,"fileExists");l(Xt,"dirExists");l(rt,"ensureDir");l(vw,"deleteFile");l(Tw,"deleteDir");l(Es,"listFiles");l(Ew,"getFileSize");l(Cw,"getFileModifiedTime");l(Pw,"copyFile");l(xw,"moveFile");l(jw,"readLines");l(Rw,"writeLines");l(Aw,"getFileExtension");l(Iw,"getFileNameWithoutExtension")});function Hs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var Bn,kn=S(()=>{"use strict";l(Hs,"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 dp={};Se(dp,{invalidateProviderCache:()=>Ow,readProviderCache:()=>ac,writeProviderCache:()=>cc});import lp from"node:fs/promises";import Dw from"node:os";import up from"node:path";async function ac(){try{let r=await lp.readFile(ic,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Hs(e.timestamp,Mw)?null:e.detection}catch{return null}}async function cc(r){let e={timestamp:new Date().toISOString(),detection:r};await de(ic,e)}async function Ow(){try{await lp.unlink(ic)}catch{}}var $w,ic,Mw,lc=S(()=>{"use strict";kn();B();$w=up.join(Dw.homedir(),".prjct-cli","cache"),ic=up.join($w,"providers.json"),Mw=600*1e3;l(ac,"readProviderCache");l(cc,"writeProviderCache");l(Ow,"invalidateProviderCache")});var Lt={};Se(Lt,{AntigravityProvider:()=>dc,ClaudeProvider:()=>Ko,CodexProvider:()=>pc,CursorProvider:()=>mp,GeminiProvider:()=>uc,Providers:()=>ze,WindsurfProvider:()=>gp,detectAllProviders:()=>Cs,detectAntigravity:()=>Vn,detectCodex:()=>Sn,detectCursorProject:()=>yp,detectProvider:()=>Xo,detectWindsurfProject:()=>wp,getActiveProvider:()=>Fw,getCapabilities:()=>Nw,getCommandsDir:()=>Vw,getGlobalContextPath:()=>Gw,getGlobalSettingsPath:()=>qw,getProjectCommandsPath:()=>Jw,getProviderBranding:()=>Yo,getSkillsPath:()=>Bw,hasProviderConfig:()=>Uw,needsCursorRouterRegeneration:()=>Hw,needsWindsurfRouterRegeneration:()=>Ww,selectProvider:()=>mc,validateCliVersion:()=>hp});import Ws from"node:os";import ot from"node:path";function Nw(r,e){return{..._w[r],...e}}async function fp(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Lw(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 Xo(r){let e=ze[r];if(!e.cliCommand)return{installed:!1};let t=await fp(e.cliCommand);if(!t)return{installed:!1};let s=await Lw(e.cliCommand),n=hp(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function hp(r,e){let t=ze[r];return!t.minCliVersion||!e?null:Qd(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 Cs(r=!1){if(!r){let i=await ac();if(i)return i}let[e,t,s]=await Promise.all([Xo("claude"),Xo("gemini"),Sn()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await cc(o).catch(()=>{}),o}async function Fw(r){if(r&&ze[r])return ze[r];let e=await Cs();return e.claude.installed&&!e.gemini.installed?Ko:e.gemini.installed&&!e.claude.installed?uc:Ko}async function Uw(r){let e=ze[r];return e.configDir?C(e.configDir):!1}function Yo(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 yp(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 Hw(r){let e=await yp(r);return e.detected&&!e.routerInstalled}async function wp(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 Ww(r){let e=await wp(r);return e.detected&&!e.routerInstalled}async function Vn(){let r=dc.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=pc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await fp("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 Gw(r){let e=ze[r];return e.configDir?ot.join(e.configDir,e.contextFile):null}function qw(r){let e=ze[r];return!e.configDir||!e.settingsFile?null:ot.join(e.configDir,e.settingsFile)}function Bw(r){return ze[r].skillsDir}function Vw(r){return ze[r].commandsDir}function Jw(r,e){let t=ze[r];return ot.join(e,t.commandsDir)}async function mc(){let r=await Cs(),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,Ko,uc,dc,mp,gp,pc,ze,lt=S(()=>{"use strict";ro();zo();Je();B();lc();_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(Nw,"getCapabilities");Ko={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ot.join(Ws.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ot.join(Ws.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"},uc={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ot.join(Ws.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ot.join(Ws.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"},dc={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ot.join(Ws.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ot.join(Ws.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"},mp={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"},gp={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"},pc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ot.join(Ws.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ot.join(Ws.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:Ko,gemini:uc,cursor:mp,antigravity:dc,windsurf:gp,codex:pc};l(fp,"whichCommand");l(Lw,"getCliVersion");l(Xo,"detectProvider");l(hp,"validateCliVersion");l(Cs,"detectAllProviders");l(Fw,"getActiveProvider");l(Uw,"hasProviderConfig");l(Yo,"getProviderBranding");l(yp,"detectCursorProject");l(Hw,"needsCursorRouterRegeneration");l(wp,"detectWindsurfProject");l(Ww,"needsWindsurfRouterRegeneration");l(Vn,"detectAntigravity");l(Sn,"detectCodex");l(Gw,"getGlobalContextPath");l(qw,"getGlobalSettingsPath");l(Bw,"getSkillsPath");l(Vw,"getCommandsDir");l(Jw,"getProjectCommandsPath");l(mc,"selectProvider")});import{z as De}from"zod";function zw(r){return r instanceof Jn}function ye(r){return zw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var zn,vx,Tx,Ex,Cx,Px,xx,Jn,Qo,Zo,oo,Ps=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}},vx=zn.create("FileError",De.object({path:De.string(),operation:De.enum(["read","write","delete","create","copy"]),reason:De.string().optional()})),Tx=zn.create("ValidationError",De.object({field:De.string(),expected:De.string(),received:De.string().optional(),message:De.string().optional()})),Ex=zn.create("PermissionError",De.object({action:De.string(),resource:De.string(),reason:De.string().optional()})),Cx=zn.create("TaskError",De.object({taskId:De.string().optional(),operation:De.enum(["create","update","complete","pause","resume","delete"]),reason:De.string()})),Px=zn.create("SessionError",De.object({sessionId:De.string().optional(),reason:De.string()})),xx=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)}},Qo=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")}},Zo=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")}},oo=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(zw,"isPrjctError");l(ye,"getErrorMessage")});import{formatDistanceToNowStrict as Ix}from"date-fns";function kp(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 Sp(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 Gs(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 xs(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 Ft(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(kp,"formatDate");l(Sp,"getYearMonthDay");l(v,"getTimestamp");l(Gs,"getDaysAgo");l(xt,"formatDuration");l(xs,"calculateDuration");l(Kn,"parseVarianceMinutes");l(Ft,"parseDurationMinutes")});var Xn={};Se(Xn,{PACKAGE_ROOT:()=>jt,VERSION:()=>we,compareVersions:()=>bp,getPackageInfo:()=>Kw,getPackageRoot:()=>hc,getVersion:()=>bn,isCompatible:()=>Xw,needsMigration:()=>Yw});import gc from"node:fs";import ti from"node:path";function hc(){if(io)return io;let r=__dirname;for(let e=0;e<5;e++){let t=ti.join(r,"package.json");if(gc.existsSync(t))try{if(JSON.parse(gc.readFileSync(t,"utf-8")).name==="prjct-cli")return io=r,r}catch{}r=ti.dirname(r)}return io=ti.join(__dirname,"..","..",".."),io}function bn(){if(ei)return ei;try{let r=ti.join(hc(),"package.json"),e=JSON.parse(gc.readFileSync(r,"utf-8"));return ei=e.version,fc=e,ei}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Kw(){return fc||bn(),fc}function bp(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 Xw(r){let e=bn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function Yw(r,e=null){let t=e||bn();return bp(r,t)<0}var ei,fc,io,we,jt,ut=S(()=>{"use strict";W();ei=null,fc=null,io=null;l(hc,"getPackageRoot");l(bn,"getVersion");l(Kw,"getPackageInfo");l(bp,"compareVersions");l(Xw,"isCompatible");l(Yw,"needsMigration");we=bn(),jt=hc()});async function si(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Qw(){let r=await si("gh api user --jq .login");return r.success&&r.output||(r=await si("git config --global github.user"),r.success&&r.output)?r.output:null}async function Zw(){let r=await si("git config user.name");return r.success&&r.output?r.output:null}async function ek(){let r=await si("git config user.email");return r.success&&r.output?r.output:null}async function Yn(){let[r,e,t]=await Promise.all([Qw(),Zw(),ek()]);return{github:r,email:t,name:e||r||"Unknown"}}var ni=S(()=>{"use strict";Je();l(si,"execCommand");l(Qw,"detectGitHubUsername");l(Zw,"detectGitName");l(ek,"detectGitEmail");l(Yn,"detect")});import tk from"node:crypto";import ps from"node:fs/promises";import wc from"node:os";import z from"node:path";import{globSync as sk}from"glob";var kc,nk,A,ve=S(()=>{"use strict";X();B();kc=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(wc.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 tk.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}=Sp(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=wc.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(),Ct(Lt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),Ct(Lt)).getActiveProvider();return(lt(),Ct(Lt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(wc.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=sk(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}},nk=new kc,A=nk});var ri={};Se(ri,{default:()=>Yt,worktreeService:()=>Tp});import Sc from"node:fs/promises";import ms from"node:path";var vp,bc,Tp,Yt,ao=S(()=>{"use strict";Je();B();vp=".worktrees",bc=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=ms.join(n,vp,t),i=s.branch||`feat/${t}`;await Sc.mkdir(ms.join(n,vp),{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 Sc.copyFile(s,ms.join(e,".env"));let n=ms.join(t,".prjct"),o=ms.join(e,".prjct");await C(n)&&!await C(o)&&await Sc.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 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(`
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}},Tp=new bc,Yt=Tp});var Cp={};Se(Cp,{default:()=>$});import vc from"node:fs/promises";import rk from"node:path";import*as oi from"jsonc-parser";function Ep(r){let e=[],t=oi.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}: ${oi.printParseErrorCode(s.error)}`)}return t}var Tc,ok,$,Te=S(()=>{"use strict";Ps();W();X();B();ut();ni();ve();l(Ep,"parseJsonc");Tc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await vc.readFile(t,"utf-8");return Ep(s)}catch(t){return O(t)||console.warn(`Warning: Could not read config at ${e}: ${ye(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 vc.readFile(t,"utf-8");return Ep(s)}catch(t){return O(t)||console.warn(`Warning: Could not read global config for ${e}: ${ye(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:we,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:we,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 vc.readdir(rk.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(()=>(ao(),ri));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))}}},ok=new Tc,$=ok});var xp={};Se(xp,{default:()=>co});import Ec from"node:fs/promises";import ik from"node:os";import Pp from"node:path";var Cc,ak,co,ii=S(()=>{"use strict";W();B();Cc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=ik.homedir(),this.configDir=Pp.join(this.homeDir,".prjct-cli","config"),this.configFile=Pp.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ec.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await Ec.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 Ec.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},ak=new Cc,co=ak});var ci={};Se(ci,{PrjctDatabase:()=>ai,default:()=>N,prjctDb:()=>E});import Pc from"node:fs";import jp from"node:path";function ck(r){if(fn()){let{Database:n}=_t("bun:sqlite");return new n(r,{create:!0})}let e=_t("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var lk,uk,ai,E,N,ee=S(()=>{"use strict";ve();so();l(ck,"openDatabase");lk=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
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(`
18
18
  -- =======================================================================
19
19
  -- Document storage (backward-compatible with JSON file pattern)
20
20
  -- =======================================================================
@@ -475,52 +475,52 @@ var sw=Object.create;var to=Object.defineProperty;var nw=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")}],uk=3,ai=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return jp.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=uk&&this.evictLru();let s=this.getDbPath(e),n=jp.dirname(s);Pc.existsSync(n)||Pc.mkdirSync(n,{recursive:!0});let o=ck(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 Pc.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")}],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(`
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 lk)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 ai,N=E});import{z as J}from"zod";var dk,pk,Rp,mk,gk,fk,hk,yk,Ap,wj,Ip=S(()=>{"use strict";dk=J.enum(["low","medium","high"]),pk=J.enum(["pending","converted","completed","archived","dormant"]),Rp=J.enum(["high","medium","low"]),mk=J.object({impact:Rp,effort:Rp}),gk=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()}),fk=J.object({name:J.string(),description:J.string()}),hk=J.object({name:J.string(),description:J.string().optional()}),yk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:dk,status:pk,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:mk.optional(),implementationNotes:J.string().optional(),stack:gk.optional(),modules:J.array(fk).optional(),roles:J.array(hk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),Ap=J.object({ideas:J.array(yk),lastUpdated:J.string()}),wj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import wk from"node:crypto";import{homedir as kk}from"node:os";import{join as Sk}from"node:path";function Z(){return wk.randomUUID()}var Ej,Ht=S(()=>{"use strict";l(Z,"generateUUID");Ej=Sk(kk(),".prjct-cli","projects")});var js,xc,Rt,qs=S(()=>{"use strict";Ht();X();ee();js={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},xc=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 xc});var jc,Bs,Rc=S(()=>{"use strict";ve();X();B();jc=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)}},Bs=new jc});var dt,Rs=S(()=>{"use strict";Rc();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 Bs.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 Ac,$e,Vs=S(()=>{"use strict";Ip();Ht();X();qs();Rs();Ac=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Ap)}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=Gs(js.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 Ac});import{z as P}from"zod";var bk,li,vk,Tk,Ek,Ic,$p,Mp,Op,Dc,Dp,Ck,Pk,xk,_p,Np,Lp,jk,Rk,Yj,$c=S(()=>{"use strict";zo();bk=P.enum(["low","medium","high","critical"]),li=P.enum(["feature","bug","improvement","chore"]),vk=P.enum(["active","backlog","previously_active"]),Tk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ek=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ic=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()}),$p=P.object({output:P.string().min(1,"Subtask output is required"),summary:Ic}),Mp=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:Tk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:Ic.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Op=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),Dc=P.object({id:P.string(),description:P.string(),type:li.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Mp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Op.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()}),Dp=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:li.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Mp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Op.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()}),Ck=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()}),Pk=P.object({taskId:P.string(),title:P.string(),classification:li,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(Ic),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:Ck.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),xk=Dc.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),_p=P.object({currentTask:Dc.nullable(),previousTask:Dp.nullable().optional(),pausedTasks:P.array(Dp).optional(),taskHistory:P.array(Pk).optional(),activeTasks:P.array(xk).optional(),lastUpdated:P.string()}),Np=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:bk,type:li,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:vk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Lp=P.object({tasks:P.array(Np),lastUpdated:P.string()}),jk=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Rk=P.object({type:Ek,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),Yj=P.object({projectId:P.string(),currentTask:Dc.nullable(),queue:P.array(Np),stats:jk,recentActivity:P.array(Rk),lastSync:P.string()})});function ui(r){return[...r].sort((e,t)=>{let s=Up[e.section]-Up[t.section];return s!==0?s:Fp[e.priority]-Fp[t.priority]})}function Mc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Fp,Up,di=S(()=>{"use strict";Fp={critical:0,high:1,medium:2,low:3},Up={active:0,previously_active:1,backlog:2};l(ui,"sortBySectionAndPriority");l(Mc,"uniqueBy")});var Oc,ce,Vt=S(()=>{"use strict";Ht();$c();di();X();qs();Rs();Oc=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Lp)}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 ui(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=Gs(js.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 Oc});import{z as re}from"zod";var Ak,Hp,Ik,Dk,$k,Mk,Ok,_k,Nk,Wp,Gp=S(()=>{"use strict";Ak=re.enum(["feature","fix","improvement","refactor"]),Hp=re.enum(["pass","warning","fail","skipped"]),Ik=re.enum(["added","changed","fixed","removed"]),Dk=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),$k=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Mk=re.object({description:re.string(),type:Ik.optional()}),Ok=re.object({lintStatus:Hp.nullable().optional(),lintDetails:re.string().optional(),testStatus:Hp.nullable().optional(),testDetails:re.string().optional()}),_k=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Nk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:Ak,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Mk).optional(),codeSnippets:re.array(re.string()).optional(),commit:_k.optional(),codeMetrics:$k.optional(),qualityMetrics:Ok.optional(),quantitativeImpact:re.string().optional(),duration:Dk.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),Wp=re.object({shipped:re.array(Nk),lastUpdated:re.string()})});var _c,it,Js=S(()=>{"use strict";Ht();Gp();X();qs();Rs();_c=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Wp)}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()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=Gs(js.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 _c});var lo,Nc,vn,Lc=S(()=>{"use strict";lo={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"}},Nc=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=lo[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 lo[e]}getPrompt(e){return lo[e].prompt}getValidCommands(e){return lo[e].transitions}formatNextSteps(e){return lo[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 Nc});var Fc,L,St=S(()=>{"use strict";Ht();$c();X();Lc();qs();Rs();Fc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",_p)}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=$p.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 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:
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 Fc});function Fk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Lk.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 pi(r,e,t){return qp>=r?(...s)=>console[t](e,...s):Hk}var Qn,Lk,qp,Uk,Hk,Wk,V,As=S(()=>{"use strict";Qn={error:0,warn:1,info:2,debug:3},Lk=new Set(["1","true","*"]);l(Fk,"getLogLevel");({level:qp,name:Uk}=Fk()),Hk=l(()=>{},"noop");l(pi,"createLogMethod");Wk={error:pi(Qn.error,"[prjct:error]","error"),warn:pi(Qn.warn,"[prjct:warn]","warn"),info:pi(Qn.info,"[prjct:info]","log"),debug:pi(Qn.debug,"[prjct:debug]","log"),isEnabled:l(()=>qp>=0,"isEnabled"),level:l(()=>Uk,"level")},V=Wk});import Gk from"node:fs/promises";import qk from"node:path";import{Hono as Bk}from"hono";function Vk(r){return A.getGlobalProjectPath(r)}function Bp(r,e){let t=new Bk,s=Vk(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=qk.join(s,"context",`${o}.md`),c=await Gk.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 Vp=S(()=>{"use strict";ve();ee();Vs();Vt();Js();St();W();As();l(Vk,"getProjectDataPath");l(Bp,"createRoutes")});function Jk(r){return{id:r.id,taskId:r.task_id,author:r.author,content:r.content,createdAt:r.created_at,updatedAt:r.updated_at}}function zk(){return`cmt_${Math.random().toString(36).slice(2,10)}${Date.now().toString(36)}`}var Uc,uo,Jp=S(()=>{"use strict";ee();l(Jk,"rowToComment");l(zk,"generateId");Uc=class{static{l(this,"CommentStorage")}addComment(e,t,s,n="user"){let o=zk(),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(Jk)}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}},uo=new Uc});var Hc,po,Wc=S(()=>{"use strict";ee();Hc=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,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)
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}}},po=new Hc});var Gc,Ke,mi=S(()=>{"use strict";ee();Gc=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 Gc});import{createHash as zp}from"node:crypto";function mo(r){return zp("sha256").update(r).digest("hex")}function Tn(r){return mo(r).slice(0,16)}function Kp(r){return zp("md5").update(r).digest("hex")}var En=S(()=>{"use strict";l(mo,"sha256");l(Tn,"sha256Short");l(Kp,"md5")});import gi from"node:fs/promises";import Xp from"node:path";function Kk(){return{version:Zn,lastUpdated:"",checksums:{}}}var Zn,qc,Cn,Bc=S(()=>{"use strict";ve();W();X();En();ee();Zn="1.0.0";l(Kk,"getDefaultChecksums");qc=class{static{l(this,"IndexStorage")}getIndexPath(e){return Xp.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await gi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==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 Kk()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return Kp(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 gi.readdir(t);await Promise.all(s.map(n=>gi.unlink(Xp.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)}},Cn=new qc});var Vc,fi,Qt,er=S(()=>{"use strict";X();ee();Vc=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}})}},fi=new Vc,Qt=fi});import{z as Xe}from"zod";function em(r,e="default"){let t=Yp[e]||Yp.default;return r/1e3*t}function hi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Xk,Yk,Qp,Zp,Yp,yi=S(()=>{"use strict";Xk=Xe.object({date:Xe.string(),tokensSaved:Xe.number(),syncs:Xe.number(),avgCompressionRate:Xe.number(),totalDuration:Xe.number()}),Yk=Xe.object({agentName:Xe.string(),usageCount:Xe.number(),tokensSaved:Xe.number()}),Qp=Xe.object({totalTokensSaved:Xe.number(),avgCompressionRate:Xe.number(),syncCount:Xe.number(),watchTriggers:Xe.number(),avgSyncDuration:Xe.number(),totalSyncDuration:Xe.number(),agentUsage:Xe.array(Yk),dailyStats:Xe.array(Xk),firstSync:Xe.string(),lastUpdated:Xe.string()}),Zp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Yp={"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(em,"estimateCostSaved");l(hi,"formatCost")});var Jc,Zt,go=S(()=>{"use strict";yi();X();Rs();Jc=class extends dt{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Qp)}getDefault(){return{...Zp}}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:em(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let 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 Jc});import{z as be}from"zod";var Qk,Zk,tm,CA,PA,xA,zs,sm,fo=S(()=>{"use strict";Qk=be.enum(["improving","stable","declining"]),Zk=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),tm=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),CA=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),PA=be.object({sprints:be.array(Zk),averageVelocity:be.number(),velocityTrend:Qk,estimationAccuracy:be.number(),overEstimated:be.array(tm),underEstimated:be.array(tm),lastUpdated:be.string()}),xA=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)}),zs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},sm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var zc,tr,wi=S(()=>{"use strict";fo();Rs();zc=class extends dt{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:sm,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 zc});function Kc(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 Xc,je,ho=S(()=>{"use strict";mi();ee();l(Kc,"rowToRule");Xc=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?Kc(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(Kc)}getAllRules(e){return E.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Kc)}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 Xc});import gs from"node:fs/promises";import Qc from"node:path";import{Hono as eS}from"hono";function yo(r){return E.getDoc(r,"project")}async function Yc(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 nm(){let r=new eS;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=yo(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 Yc(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(yo(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 Yc(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(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),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(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 m=yo(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=yo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Yc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects: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=uo.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=uo.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()?uo.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 uo.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=Qc.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(Qc.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 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=fi.getActive(t),n=fi.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=po.getSummary(t,30),n=po.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=yo(t);return e.json(s||{projectId:t})}catch{return e.json({projectId:t})}}),r}var tS,sr,rm=S(()=>{"use strict";ve();qs();Jp();Wc();mi();ee();Vs();Bc();er();go();Vt();Js();St();wi();ho();tS=A.getGlobalBasePath(),sr=Qc.join(tS,"projects");l(yo,"getProjectConfig");l(Yc,"calculateDuration");l(nm,"createExtendedRoutes")});var om=S(()=>{"use strict"});import{streamSSE as sS}from"hono/streaming";function am(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>im&&t(i)},nS),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 sS(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)}},rS),p=setTimeout(()=>{t(a)},im);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 im,nS,rS,cm=S(()=>{"use strict";om();im=3600*1e3,nS=300*1e3,rS=3e4;l(am,"createSSEManager")});var lm={};Se(lm,{DEFAULT_PORT:()=>Si,createServer:()=>ki,startServer:()=>lS});import Zc from"node:fs";import Ks from"node:path";import{Hono as oS}from"hono";import{cors as iS}from"hono/cors";import{logger as aS}from"hono/logger";import{secureHeaders as cS}from"hono/secure-headers";function ki(r){let e=new oS,t=am();e.use("*",cS()),r.enableCors!==!1&&e.use("*",iS({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("*",aS()),e.get("/health",c=>c.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/api",c=>c.json({name:"prjct-cli",version:we,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=Bp(r.projectId,r.projectPath);e.route("/api",s);let n=nm();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=>Zc.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 m=Zc.readFileSync(d),p=Ks.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=Zc.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(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 lS(r,e,t=Si){let s=ki({port:t,projectId:r,projectPath:e});return await s.start(),s}var Si,el=S(()=>{"use strict";so();ut();Vp();rm();cm();l(ki,"createServer");Si=3478;l(lS,"startServer")});import Pn from"chalk";var um,uS,dS,es,dm=S(()=>{"use strict";lt();um=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],uS=80,dS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:um,speed:uS},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(um[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")=>Yo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Yo(r).signature,"getSignature")},es=dS});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 pS[r]}var me,tl,sl,bi,pS,Jt,pm,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"},tl=["feature","spec","design","refactor","migrate"],sl=["ship","cleanup","git","migrate"],bi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],pS={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},pm={HISTORY_MAX:100}});var wo,nl=S(()=>{"use strict";wo={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{...wo[r],...e}}function rr(r,e,t){return{message:r,hint:e,...t}}var ko=S(()=>{"use strict";nl();nl();l(jn,"getError");l(rr,"createError")});var gm={};Se(gm,{ERRORS:()=>wo,ICONS:()=>Xs,OUTPUT_TIERS:()=>mm,createError:()=>rr,default:()=>f,formatForHuman:()=>yS,getError:()=>jn,getOutputTier:()=>gS,getTierConfig:()=>Ti,isQuietMode:()=>hS,limitLines:()=>vi,setOutputTier:()=>mS,setQuietMode:()=>fS});import pe from"chalk";function mS(r){ir=r}function gS(){return ir}function Ti(){return mm[ir]}function fS(r){At=r}function hS(){return At}function vi(r,e){let t=e??Ti().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}}},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(`
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 yS(r){let e=Ti();if(ir==="silent")return"";if(ir==="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&&ir==="compact"&&o.push(pe.dim(String(t.url))),vi(o.join(`
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
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?vi(n.map(o=>`${o}: ${zt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
500
- `),e.maxLines):vi(JSON.stringify(r,null,2),e.maxLines)}var N0,rl,mm,ir,Xs,or,ol,At,zt,wS,kS,f,Fe=S(()=>{"use strict";dm();xn();ko();ko();N0=es.spinner.frames,rl=es.spinner.speed,mm={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}},ir="compact";l(mS,"setOutputTier");l(gS,"getOutputTier");l(Ti,"getTierConfig");Xs={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")},or=null,ol=0,At=!1;l(fS,"setQuietMode");l(hS,"isQuietMode");zt=l((r,e)=>{let t=e??(Ti().maxCharsPerLine||Jt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(vi,"limitLines");l(yS,"formatForHuman");wS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Jt.CLEAR_WIDTH)}\r`):!0,"clear"),kS={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?(or=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(ol++,zt(r,Jt.SPINNER_MSG))}`)},rl),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(`${Xs.success} ${zt(r,Jt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Xs.fail} ${zt(r,Jt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?jn(r):r;return console.error(),console.error(`${Xs.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(`${Xs.warn} ${zt(r,Jt.WARN_MSG)}`),this},info(r){return this.stop(),At||console.log(`${Xs.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!At&&e&&console.log(`${Xs.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||Xs.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(`
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
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 or&&(clearInterval(or),or=null,wS()),this},step(r,e,t){if(At)return this;this.stop();let s=pe.dim(`[${r}/${e}]`);return process.stdout.isTTY?(or=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(ol++,`${s} ${zt(t,Jt.STEP_MSG)}`)}`)},rl),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?(or=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(ol++,`[${i}] ${s}%${a}`)}`)},rl),this):(process.stdout.write(`${es.cli.spin(0,`[${i}] ${s}%${a}`)}
505
- `),this)}},f=kS});var ym={};Se(ym,{default:()=>bS,sessionTracker:()=>Ys});var fm,hm,il,Ys,bS,Ei=S(()=>{"use strict";ro();ee();kn();X();fm=50,hm=200,il=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 Hs(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>fm&&(n.current.commands=n.current.commands.slice(-fm)),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>hm&&(n.current.files=n.current.files.slice(-hm)),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}},Ys=new il,bS=Ys});var km={};Se(km,{default:()=>Rn,performanceTracker:()=>wm});var vS,al,wm,Rn,Ci=S(()=>{"use strict";ee();vS=BigInt(300*1e9),al=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>vS&&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}},wm=new al,Rn=wm});import Pi from"node:fs/promises";var cl,TS,An,xi=S(()=>{"use strict";Te();ve();W();kn();B();cl=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 Pi.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([Pi.readFile(d,"utf-8"),Pi.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 Pi.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()}},TS=new cl,An=TS});function ji(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var et,So=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(ji,"calculateConfidence")});var Ri,Ai,Ii,ll=S(()=>{"use strict";ee();So();X();Ri=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}},Ai=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()}},Ii=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 Di,Sm=S(()=>{"use strict";ee();So();X();ll();Di=class r extends Ri{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=ji(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=ji(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:ji(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 Is(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 ar,ul=S(()=>{"use strict";Ht();ee();So();X();En();l(Is,"rowToMemory");ar=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 = ?,
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
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
507
507
  (id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
508
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 = ?,
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
- AND (${a}) ORDER BY updated_at DESC`,...c).map(Is)}async searchMemories(e,t,s=20,n=0){try{return N.query(e,`SELECT m.* FROM memories m
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
512
512
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
513
- ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(Is)}catch{let o=`%${t}%`;return N.query(e,`SELECT * FROM memories
513
+ ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(Ds)}catch{let o=`%${t}%`;return N.query(e,`SELECT * FROM memories
514
514
  WHERE project_id = ? AND deleted_at IS NULL
515
515
  AND (title LIKE ? OR content LIKE ?)
516
- ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(Is)}}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(Is);let o=n.join(" ");try{return N.query(e,`SELECT m.* FROM memories m
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(Is)}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(Is)}}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,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?`
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 != ?
523
- ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Is)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=N.query(e,`SELECT title, COUNT(*) as cnt FROM memories
523
+ ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Ds)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=N.query(e,`SELECT title, COUNT(*) as cnt FROM memories
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
@@ -528,15 +528,15 @@ Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async f
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?Is(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(Is)}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 dl,ES,bt,$i=S(()=>{"use strict";ll();Sm();ul();dl=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new ar,this._patternStore=new Di,this._historyStore=new Ii,this._sessionStore=new Ai}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()}},ES=new dl,bt=ES});import Kt from"node:fs/promises";import ts from"node:path";var pl,CS,pt,bm=S(()=>{"use strict";W();Je();B();pl=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(`
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
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[]}}},CS=new pl,pt=CS});import gl from"node:fs";import PS from"node:fs/promises";import Mi from"node:path";function fl(){if(vm)return ml;vm=!0;let r=Mi.join(jt,"dist","templates.json");try{let e=gl.readFileSync(r,"utf-8");return ml=JSON.parse(e),ml}catch{return null}}function jS(r){let e=In.indexOf(r);e>-1&&In.splice(e,1),In.push(r)}function RS(){for(;cr.size>=xS&&In.length>0;){let r=In.shift();r&&cr.delete(r)}}function Tm(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 Em(r){if(cr.has(r))return jS(r),cr.get(r);let e,t=fl();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=Mi.join(jt,"templates","commands",`${r}.md`);try{e=await PS.readFile(n,"utf-8")}catch{throw Zo.notFound(r)}}let s=Tm(e);return RS(),cr.set(r,s),In.push(r),s}async function AS(r){return(await Em(r)).frontmatter["allowed-tools"]||[]}function IS(){cr.clear(),In.length=0}function vt(r){let e=fl();if(e?.[r])return e[r];let t=Mi.join(jt,"templates",r);try{return gl.readFileSync(t,"utf-8")}catch{return null}}function Qs(r){let e=fl();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=Mi.join(jt,"templates",r);try{return gl.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var xS,cr,In,ml,vm,DS,Cm,Zs=S(()=>{"use strict";Ps();ut();xS=50,cr=new Map,In=[],ml=null,vm=!1;l(fl,"loadBundle");l(jS,"updateLruOrder");l(RS,"evictLru");l(Tm,"parseFrontmatter");l(Em,"load");l(AS,"getAllowedTools");l(IS,"clearCache");l(vt,"getTemplateContent");l(Qs,"listTemplates");DS={load:Em,parseFrontmatter:Tm,getAllowedTools:AS,clearCache:IS,getTemplateContent:vt,listTemplates:Qs},Cm=DS});function Oi(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
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}
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 hl=S(()=>{"use strict";Zs();W();B();As();ut();l(Oi,"mergeWithMarkers")});import ht from"node:fs/promises";import _i from"node:os";import Ie from"node:path";async function $S(){try{let r=Ie.join(_i.homedir(),".prjct-cli","docs");await ht.mkdir(r,{recursive:!0});let e=Qs("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=vt(n);if(o){let i=Ie.basename(n);await ht.writeFile(Ie.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(ut(),Ct(Xn)),s=Ie.join(t,"templates/global/docs");try{let n=await ht.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Ie.join(s,o),a=Ie.join(r,o),c=await ht.readFile(i,"utf-8");await ht.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:k(r)}}}async function MS(){let r=(lt(),Ct(Lt)),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 ht.mkdir(e.configDir,{recursive:!0});let n=Ie.join(e.configDir,e.contextFile),o=Pm;if(t!=="claude"){let g=vt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(ut(),Ct(Xn)),b=Ie.join(w,"templates","global",e.contextFile);try{o=await ht.readFile(b,"utf-8")}catch{t==="gemini"&&(o=Pm.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await ht.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 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,`
537
537
 
538
538
  `).trim()}
539
- `}let p=Oi(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await ht.writeFile(n,p.content,"utf-8"),{success:!0,action:p.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function xm(){let r=_i.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 Pm,Ds,OS,Ue,$s=S(()=>{"use strict";Zs();W();B();hl();Pm=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
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 -->
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(MS,"installGlobalConfig");Ds=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=_i.homedir()}async ensureInit(){if(this._initialized)return;let t=await(lt(),Ct(Lt)).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(),Ct(Lt)).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 ht.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 ht.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 ht.stat(e).catch(()=>null))?.isDirectory())return await ht.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return MS()}async cleanupAllLegacy(){let e=_i.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 ht.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 ht.stat(i).catch(()=>null))?.isDirectory()&&(await ht.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 ht.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return $S()}};l(xm,"getProviderPaths");OS=new Ds,Ue=OS});function jm(r,e){let t=[];bo("Languages",r.languages,e.languages,t),bo("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)"}),bo("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);bo("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);bo("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 yl(r){if(!r.hasChanges)return`## Analysis Diff
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
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 Rm(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 bo(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 wl=S(()=>{"use strict";l(jm,"generateAnalysisDiff");l(yl,"formatAnalysisDiffMd");l(Rm,"formatAnalysisDiffText");l(bo,"diffStringArray")});var kl,Sl,Am,vo=S(()=>{"use strict";kl=[1,2,3,5,8,13,21],Sl={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}},Am={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import _S from"node:fs/promises";import NS from"node:path";function lr(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 LS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...lr(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(...lr(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(...lr(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(...lr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...lr(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&&!$m.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function FS(r){return r.split(/\s+/).flatMap(e=>lr(e)).filter(e=>e.length>1&&!$m.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function US(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async a=>{try{let c=await _S.readFile(NS.join(r,a),"utf-8"),u=LS(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 HS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function WS(r,e){let t=FS(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=HS(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),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 GS(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,Mm,t)}function Ni(r){let e=N.getDoc(r,Mm);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 Om(r,e){let t=await US(r);return GS(e,t),t}function _m(r,e,t=15){let s=Ni(r);return s?WS(e,s).slice(0,t):[]}var $m,Mm,bl=S(()=>{"use strict";vo();ee();B();$m=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(lr,"splitIdentifier");l(LS,"tokenizeFile");l(FS,"tokenizeQuery");l(US,"buildIndex");l(HS,"idf");l(WS,"score");Mm="bm25-index";l(GS,"saveIndex");l(Ni,"loadIndex");l(Om,"indexProject");l(_m,"queryFiles")});import vl from"node:fs/promises";import en from"node:path";import{z as se}from"zod";async function zS(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 vl.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 KS(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 ZS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=JS[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 XS(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 YS(r,e){let t=Date.now();try{let s=await eb(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 QS(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 Nm(r,e){let t=Date.now(),s=await Promise.all([zS(r,e),KS(r,e),XS(r,e),YS(r,e),QS(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 ZS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await vl.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 eb(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await vl.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 qS,BS,VS,Tl,kD,JS,Lm=S(()=>{"use strict";W();B();zo();qS=se.enum(["draft","verified","sealed"]),BS=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()}),VS=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()}),Tl=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(BS),antiPatterns:se.array(VS),analyzedAt:se.string(),modelMetadata:qn.optional(),status:qS.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),kD={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},JS={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(zS,"verifyFrameworks");l(KS,"verifyLanguages");l(XS,"verifyPatternLocations");l(YS,"verifyFileCount");l(QS,"verifyAntiPatternFiles");l(Nm,"semanticVerify");l(ZS,"getProjectExtensions");l(eb,"countProjectFiles")});var El,mt,ur=S(()=>{"use strict";Lm();wl();X();En();Rs();El=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"};Tl.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 Tl.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:jm(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 Nm(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 mo(JSON.stringify(t))}},mt=new El});import Fm from"node:fs/promises";import Um from"node:path";async function Pl(r,e,t,s){let[n,o,i,a]=await Promise.all([nb(r,e,s),rb(r),ob(r),ib(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,tb).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 nb(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=_m(r,n,Cl*2);for(let a of o){if(s.length>=Cl)break;try{let c=Um.join(e,a.path),u=await Fm.readFile(c,"utf-8");u.length>Li*3?s.push({path:a.path,content:`${u.slice(0,Li)}
560
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Li),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>=Cl)break;if(!s.some(c=>c.path===a))try{let c=Um.join(e,a),u=await Fm.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Li),reason:"entry point"})}catch{}}return s}async function rb(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 ob(r){try{return(await L.getTaskHistory(r)).slice(0,sb).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function ib(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 Li,Cl,tb,sb,Hm=S(()=>{"use strict";bl();ur();er();St();As();Li=800,Cl=6,tb=8,sb=5;l(Pl,"buildAnalysisPayload");l(nb,"selectCodeSamples");l(rb,"getExistingPatterns");l(ob,"getTaskHistory");l(ib,"getPreviousAnalysisSummary")});var Fi=S(()=>{"use strict"});import Ms from"chalk";function Wm(r){return Math.ceil(r.length/4)}function Gm(r){let e=r.split(`
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(`
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 xl(r){return r.includes("<!-- prjct:preserve")}function qm(r,e){let t=Gm(r),s=Gm(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Wm(r),tokensAfter:Wm(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)xl(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()&&(xl(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 $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(`
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)&&!xl(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 Bm(r,e={}){let{colorize:t=!0}=e,s=[],n=t?Ms.green:p=>p,o=t?Ms.red:p=>p,i=t?Ms.yellow:p=>p,a=t?Ms.dim:p=>p,c=t?Ms.bold:p=>p;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
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
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 Vm(r,e={}){let{colorize:t=!0}=e,s=[],n=t?Ms.green:c=>c,o=t?Ms.red:c=>c,i=t?Ms.cyan:c=>c,a=t?Ms.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
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(`
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,19 +576,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function xl(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 Jm=S(()=>{"use strict";Fi();l(Wm,"estimateTokens");l(Gm,"parseMarkdownSections");l(xl,"isPreservedSection");l(qm,"generateSyncDiff");l(Bm,"formatDiffPreview");l(Vm,"formatFullDiff")});var ab,jl,Ui,Rl=S(()=>{"use strict";ee();W();Je();Ei();ab={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},jl=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...ab,...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 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(`
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 Ys.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),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(`
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}},Ui=l((r,e)=>new jl(r,e),"createStalenessChecker")});import zm from"node:fs/promises";import pr from"node:path";function cb(r){let e=[],t,s=new RegExp(np.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function lb(r,e,t){let s;if(r.startsWith("@/"))s=pr.join(t,"src",r.slice(2));else{let n=pr.dirname(pr.join(t,e));s=pr.resolve(n,r)}for(let n of sp){let o=s+n;try{if((await zm.stat(o)).isFile())return pr.relative(t,o)}catch{}}return null}async function ub(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async i=>{try{let a=await zm.readFile(pr.join(r,i),"utf-8"),c=cb(a),u=[];for(let d of c){let m=await lb(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 db(r,e){N.setDoc(r,Km,e)}function Hi(r){return N.getDoc(r,Km)}async function Xm(r,e){let t=await ub(r);return db(e,t),t}var Km,Al=S(()=>{"use strict";nc();ee();B();l(cb,"extractImportSources");l(lb,"resolveImport");l(ub,"buildGraph");Km="import-graph";l(db,"saveGraph");l(Hi,"loadGraph");l(Xm,"indexImports")});function Ym(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Hi(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 Qm(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 Zm=S(()=>{"use strict";Al();l(Ym,"propagateChanges");l(Qm,"affectedDomains")});import eg from"node:fs/promises";import pb from"node:path";function mb(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 gb(r){let e=await yn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await wn(e,100,async n=>{try{let o=pb.join(r,n),[i,a]=await Promise.all([eg.readFile(o,"utf-8"),eg.stat(o)]);return{path:n,hash:mb(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function fb(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 Il(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 hb(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 Dl(r,e){let[t,s]=await Promise.all([gb(r),Promise.resolve(hb(e))]);return{diff:fb(t,s),currentHashes:t}}function tg(r){return N.hasDoc(r,"file-hashes-meta")}var sg=S(()=>{"use strict";ee();B();l(mb,"hashContent");l(gb,"computeHashes");l(fb,"diffHashes");l(Il,"saveHashes");l(hb,"loadHashes");l(Dl,"detectChanges");l(tg,"hasHashRegistry")});async function wb(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&&kb(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function kb(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 Sb(r,e=100){let t=await wb(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=bb(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 bb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function vb(r,e){N.setDoc(r,og,e)}function ig(r){return N.getDoc(r,og)}async function ag(r,e,t=100){let s=await Sb(r,t);return vb(e,s),s}var og,cg=S(()=>{"use strict";vo();ee();Je();l(wb,"parseGitLog");l(kb,"isSourceFile");l(Sb,"buildMatrix");l(bb,"pairKey");og="cochange-index";l(vb,"saveMatrix");l(ig,"loadMatrix");l(ag,"indexCoChanges")});import pg from"node:fs/promises";import lg from"node:os";import $l from"node:path";function Eb(){let r=vt("mcp-config.json");if(!r)return{mcpServers:{context7:Ml}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Ml}}}}function mg(){return Eb().mcpServers?.context7||Ml}function ug(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?$l.join(lg.tmpdir(),"prjct-context7-test","mcp.json"):$l.join(lg.homedir(),".claude","mcp.json")}async function dg(r){try{let e=await pg.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e))return{};throw e}}async function Cb(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=mg(),e=[...r.args||[],"--help"];await hn(r.command||"npx",e,{timeout:15e3})}var Ml,mr,Ol,Pb,ss,gr=S(()=>{"use strict";Zs();ro();W();Je();B();Ml={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},mr=null;l(Eb,"parseTemplateConfig");l(mg,"getContext7Config");l(ug,"getConfigPath");l(dg,"readConfig");l(Cb,"runSmokeCheck");Ol=class{static{l(this,"Context7Service")}async install(){let e=ug(),t=$l.dirname(e);await pg.mkdir(t,{recursive:!0});let s=await dg(e),n=s.mcpServers||{};return n.context7=mg(),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=ug(),n=((await dg(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 Cb();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}},Pb=new Ol,ss=Pb});import{execFileSync as gg,execSync as xb}from"node:child_process";var Wi,_l,Gi,fg,hg=S(()=>{"use strict";kn();ko();Wi={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},_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=Wi[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=Wi[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Gi(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=Wi[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
585
- `);throw new Gi({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(Wi),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=xb(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:rr(`${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:rr(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return gg(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return gg(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:rr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Hs(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())}},Gi=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}},fg=new _l});var Bi={};Se(Bi,{installAntigravitySkill:()=>bg,installCodexSkill:()=>Nl,needsAntigravityInstallation:()=>Db,run:()=>Sg,verifyCodexPRouterReady:()=>fr});import{execFileSync as jb}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 Rb(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!fg.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(""),jb("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 Sg(){let r=await Cs(),e=await mc(),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 Rb(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 _b(),await ss.ensureReady()}}else if(a==="gemini"){await Ab()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await Ib();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await Vn()).installed&&(await bg()).success&&console.log(` ${Ee.green("\u2713")} Antigravity skill installed`),(await Sn()).installed){if(!(await Nl()).success)throw new Error("Codex skill installation failed");let c=await fr({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 co.saveConfig(we,await Ue.getInstallPath(),e.provider),await Ob();for(let a of s.providers)Nb(a,ze[a.provider]);return s}async function Ab(){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 Ib(){try{let r=ge.join(Dn.homedir(),".gemini"),e=ge.join(r,"GEMINI.md");await oe.mkdir(r,{recursive:!0});let t=vt("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=Oi(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 bg(){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=vt("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 Db(){let r=await Vn();return r.installed&&!r.skillInstalled}function Tg(){return ge.join(Dn.homedir(),".codex","skills","prjct","SKILL.md")}function $b(r){return`<!-- ${vg}: ${JSON.stringify({version:we,templateHash:r})} -->`}function yg(r){let e=r.match(new RegExp(`<!--\\s*${vg}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Mb(r){return mo(r)}async function Eg(){let r=vt("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 Cg(r){let e=r.trimEnd(),t=Mb(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}},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}
587
587
 
588
588
  ${s}
589
- `,templateHash:t}}async function Nl(){try{let r=Tg(),e=ge.dirname(r);await oe.mkdir(e,{recursive:!0});let t=await C(r),s=await Eg();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Cg(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 fr(r={}){let e=Tg();if(!(await Sn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Eg();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=Cg(s),o=l(async()=>r.autoRepair?(await Nl()).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=yg(i);if(!(a?.version===we&&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=yg(i),!(a?.version===we&&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 Ob(){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!==we&&(n.cliVersion=we,E.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${Ee.green("\u2713")} Updated ${t} project(s) to v${we}`)}catch(r){O(r)||V.warn(`Migration warning: ${k(r)}`)}}async function wg(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(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]!==we){let x=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${we}"`);await oe.writeFile(n,x,{mode:493})}await qi(p,i),await qi(g,a),await kg(t,n),await wg(e,t);return}}if(await C(d)){let b=await oe.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${we}"`),await oe.writeFile(n,b,{mode:493}),await qi(p,i),await qi(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 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
590
590
  # prjct Status Line for Claude Code
591
- CLI_VERSION="${we}"
591
+ CLI_VERSION="${ke}"
592
592
  input=$(cat)
593
593
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
594
594
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -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 kg(t,n),await wg(e,t)}catch(r){O(r)||V.warn(`Status line warning: ${k(r)}`)}}async function qi(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 kg(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 Nb(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 vg,Lb,hr=S(()=>{"use strict";Zs();gr();hg();ee();W();xn();B();En();As();ut();lt();$s();ii();hl();l(Rb,"installAICLI");l(Sg,"run");l(Ab,"installGeminiRouter");l(Ib,"installGeminiGlobalConfig");l(bg,"installAntigravitySkill");l(Db,"needsAntigravityInstallation");vg="prjct-codex-router";l(Tg,"getCodexSkillPath");l($b,"getCodexSkillMetadata");l(yg,"parseCodexSkillMetadata");l(Mb,"hashContent");l(Eg,"loadCodexSkillTemplate");l(Cg,"buildCodexSkillContent");l(Nl,"installCodexSkill");l(fr,"verifyCodexPRouterReady");l(Ob,"migrateProjectsCliVersion");l(wg,"ensureStatusLineSettings");l(_b,"installStatusLine");l(qi,"installStatusLineModules");l(kg,"ensureStatusLineSymlink");l(Nb,"showResults");Lb=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Lb&&Sg().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import ie from"node:fs/promises";import ne from"node:path";async function Vi(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 Fb(n,o,i),E.getDb(r);for(let{filename:c,key:u}of Ul){let d=ne.join(n,c),m=await ns(d);if(m===null){t.skippedFiles.push(c);continue}try{E.setDoc(r,u,m),Pg(r,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of Fl){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()),xg(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await Jb(r,o,t),await zb(r,o,t),await Kb(r,i,t),await Xb(r,i,t);let a=ne.join(s,"sessions");return await Yb(r,a,t),t.errors.length===0&&await Qb(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function Fb(r,e,t){let s=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 Ll(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Ll(e,ne.join(s,"index")),await Ll(t,ne.join(s,"memory")),s}async function Ll(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 Pg(r,e,t){switch(e){case"state":Ub(r,t);break;case"queue":Hb(r,t);break;case"ideas":Wb(r,t);break;case"shipped":Gb(r,t);break;case"metrics":qb(r,t);break;case"analysis":Bb(r,t);break}}function Ub(r,e){let t=E.getDb(r),s=t.prepare(`
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(`
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 Hb(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 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(`
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 Wb(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 Bb(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 Gb(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 Vb(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 qb(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 Jb(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 Bb(r,e){let s=E.getDb(r).prepare(`
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(`
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 xg(r,e,t){e==="categories-cache"&&Vb(r,t)}function Vb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=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 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(`
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 Jb(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 zb(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 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(`
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 Kb(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 Xb(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 Yb(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,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(`
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 Qb(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 Ul)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 Ji(r){let e=A.getGlobalProjectPath(r),t=ne.join(e,"storage"),s=0;E.getDb(r);for(let{filename:w,key:b}of Ul){let h=ne.join(t,w),x=await ns(h);if(x!==null){E.setDoc(r,b,x),Pg(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),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(`
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=[...Fl.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=Fl.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()),xg(r,x.key,h));try{await ie.unlink(b)}catch{}s++}return s}var Ul,Fl,Hl=S(()=>{"use strict";ve();W();ee();Ul=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],Fl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Vi,"migrateJsonToSqlite");l(Fb,"createBackup");l(Ll,"copyFiles");l(Pg,"populateNormalized");l(Ub,"populateTasksFromState");l(Hb,"populateQueueTasks");l(Wb,"populateIdeas");l(Gb,"populateShippedFeatures");l(qb,"populateMetricsDaily");l(Bb,"populateAnalysis");l(xg,"populateIndexTables");l(Vb,"populateCategoriesIndex");l(Jb,"migrateChecksums");l(zb,"migrateFileScores");l(Kb,"migrateEventsJsonl");l(Xb,"migrateLearningsJsonl");l(Yb,"migrateSessionFiles");l(Qb,"cleanupJsonFiles");l(_,"toStr");l(tn,"toNum");l(ns,"readJsonSafe");l(Ji,"sweepLegacyJson")});var To,Wl,Gl,jg=S(()=>{"use strict";So();X();To=3,Wl=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=To){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}/${To} 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>=To){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}/${To} 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>=To&&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
- `)}},Gl=new Wl});import{z as R}from"zod";var Rg,Zb,ev,Ag,tv,sv,nv,rv,ov,iv,av,Ig,cv,lv,lM,Dg,$g,Mg,Og,uv,zi,_g=S(()=>{"use strict";Rg=R.number().min(1).max(5),Zb=R.enum(["exceeded","met","partial","failed"]),ev=R.enum(["definitely","probably","maybe","no"]),Ag=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),tv=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:Ag.optional(),explanation:R.string().optional()})}),sv=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),nv=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),rv=R.object({metrics:R.array(sv),acceptanceCriteria:R.array(nv),overallSuccess:Zb,successScore:R.number().min(0).max(100)}),ov=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),iv=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(ov)}),av=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:ev,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),Ig=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:Rg,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),cv=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:tv,success:rv.optional(),learnings:iv,roi:av,rating:Rg,taskOutcomes:R.array(Ig).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),lv=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:Ag,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),lM=R.object({outcomes:R.array(cv),taskOutcomes:R.array(Ig).optional(),aggregates:lv.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),Dg={outcomes:[],taskOutcomes:[],lastUpdated:""},$g=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"),Mg=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Og=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),uv=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),zi=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=>uv(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 ql,Ng,Lg=S(()=>{"use strict";_g();Rs();X();ql=class extends dt{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Dg,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:zi([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?zi(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:zi(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&Ft(e.duration)||60,s=t/60,n=t/60,o=$g(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Mg(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:Og(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}}},Ng=new ql});import Bl from"node:fs/promises";import Ki from"node:path";var Vl,Jl,Fg,Ug=S(()=>{"use strict";W();B();Vl=".prjct/.prjct-state.md",Jl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Ki.join(e,Vl);await Bl.mkdir(Ki.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Bl.writeFile(s,n,"utf-8")}async remove(e){try{await Bl.unlink(Ki.join(e,Vl))}catch(t){if(!O(t))throw t}}async exists(e){let t=Ki.join(e,Vl);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
- `)}},Fg=new Jl});var zl,Wt,$n=S(()=>{"use strict";Te();qs();ee();zl=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<=js.MEMORY_MAX_ENTRIES)return 0;let n=s-js.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}}},Wt=new zl});import dv from"node:path";function pv(r){return Tn(dv.resolve(r))}function Eo(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function mv(r){return Mc(r,e=>`${Eo(e.name)}::${Eo(e.source)}`)}function gv(r){return Mc(r,e=>`${Eo(e.issue)}::${Eo(e.file)}::${Eo(e.source)}`)}var Kl,fv,Hg,Wg=S(()=>{"use strict";ee();di();En();l(pv,"repoHash");l(Eo,"normalizeKey");l(mv,"dedupePatterns");l(gv,"dedupeAntiPatterns");Kl=class{static{l(this,"PatternExtractor")}async extract(e){let t=pv(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=mv([...s,...n]),a=gv([...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}}},fv=new Kl,Hg=fv});import Co from"node:fs/promises";import hv from"node:os";import Po from"node:path";function yv(r){return`# ${r.projectName}
676
- ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function wv(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),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?"":`
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 kv(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
680
+ `}function vv(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 Sv(r){return r.knownGotchas.length===0?"":`
684
+ `}function Tv(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 bv(r){return r.recentShipped.length===0?"":`
688
+ `}function Ev(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 vv(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 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?"":`
693
693
  ## Velocity
694
694
  ${e.join(" | ")}
695
- `}function Tv(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
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?"":`
696
696
  ## Commands
697
697
  | Action | Command |
698
698
  |--------|---------|
699
699
  ${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
700
700
  `)}
701
- `}function Ev(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 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?"":`
702
702
  ## State
703
703
  ${e.join(`
704
704
  `)}
705
- `}function Cv(r){return r.userPatterns.length===0?"":`
705
+ `}function jv(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 Pv(r){return[wv(r),kv(r),Sv(r),bv(r),vv(r),Tv(r.commands),Ev(r),Cv(r)].filter(Boolean).join("")}function xv(r,e){let t=r.userInvocable!==!1;return`---
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`---
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 jv(r,e){return`${xv(r,e)}
713
+ ---`}function Iv(r,e){return`${Av(r,e)}
714
714
 
715
- ${r.body(e)}`}var Xl,Yl,Gg,qg=S(()=>{"use strict";Ps();As();l(yv,"formatProjectHeader");l(wv,"formatPatterns");l(kv,"formatAntiPatterns");l(Sv,"formatGotchas");l(bv,"formatRecentShipped");l(vv,"formatVelocity");l(Tv,"formatCommands");l(Ev,"formatState");l(Cv,"formatUserPatterns");l(Pv,"formatRichContext");Xl=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${yv(r)}
716
- ${Pv(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 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(`
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(xv,"buildFrontmatter");l(jv,"buildSkillContent");Yl=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=Po.join(hv.homedir(),".claude","skills");for(let c of Xl){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await Co.rm(Po.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=jv(c,o),d=Po.join(i,c.name),m=Po.join(d,"SKILL.md");await Co.mkdir(d,{recursive:!0}),await Co.writeFile(m,u,"utf-8"),n.generated.push({name:c.name,path:m})}catch(u){V.debug(`Failed to generate skill ${c.name}`,{error:ye(u)}),n.skipped.push({name:c.name,reason:ye(u)})}}let a=new Set(Xl.map(c=>c.name));try{let c=await Co.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await Co.rm(Po.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 Xl}},Gg=new Yl});var Bg=S(()=>{"use strict"});import Rv from"node:fs/promises";import Vg from"node:path";var Xi,Jg=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=Vg.join(this.projectPath,"package.json"),t=await Rv.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Vg.join(this.projectPath,e))}}});import Ql from"node:path";async function zg(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(`
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
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:ye(t)})}return e}async function rs(r,e){let t=await C(Ql.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Kg(r){let e={fileCount:0,version:"0.0.0",name:Ql.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:ye(t)}),e.fileCount=0}try{let t=Ql.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:ye(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 Xg(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 Yg(r){return new Xi(r).detect()}var Qg=S(()=>{"use strict";Ps();Bg();Je();B();As();Jg();l(zg,"analyzeGit");l(rs,"fileExistsInProject");l(Kg,"gatherStats");l(Xg,"detectCommands");l(Yg,"detectStack")});import Zg from"node:fs/promises";import Yi from"node:path";var Zl,eu,ef,tf=S(()=>{"use strict";St();W();Je();B();Zl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Yi.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=Yi.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=Yi.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 Zg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Zg.readFile(Yi.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}}},eu=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Zl.contextFilesExist(t),Zl.jsonFilesValid(t),Zl.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}}}},ef=new eu});import sf from"node:fs/promises";import tu from"node:path";var su,Os,Qi=S(()=>{"use strict";ul();bl();Zm();sg();cg();Al();Ps();lt();$s();Te();ve();hr();ur();qs();ee();Vs();er();go();Hl();Vt();Js();St();wi();X();B();As();jg();Lg();gr();Ug();$n();Wg();qg();Qg();tf();su=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 sf.rm(tu.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Sn()).installed){let y=await fr({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:ye(y)},error:`Context7 MCP is required but not ready: ${ye(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Vi(this.projectId);try{let y=await Ji(this.projectId);y>0&&V.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){V.debug("Legacy JSON sweep failed (non-critical)",{error:ye(y)})}let[a,c,u,d]=await Promise.all([zg(this.projectPath),Kg(this.projectPath),Xg(this.projectPath),Yg(this.projectPath)]),m=t.full===!0,p,g=!0,w=new Set;if(!m&&tg(this.projectId))try{let{diff:y,currentHashes:j}=await Dl(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=Ym(y,this.projectId);w=Qm(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)}}Il(this.projectId,j)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:ye(y)})}else try{let{currentHashes:y}=await Dl(this.projectPath,this.projectId);Il(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:ye(y)})}if(g)try{await Promise.all([Om(this.projectPath,this.projectId),Xm(this.projectPath,this.projectId),ag(this.projectPath,this.projectId)])}catch(y){V.debug("File ranking index build failed (non-critical)",{error:ye(y)})}let b;try{let[y,j,D,G,Q,Ve,he,Ne,us,Va,Ja]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),mt.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)]),za={backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,hasActiveTask:!!us},Ka=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})),Xa=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"})),Ya=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,Qa={version:c.version,fileCount:c.fileCount,patterns:Ka,antiPatterns:Xa,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:Va?.pending??0,shippedCount:Ja};b=await Gg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Ya,stack:d},za,Qa)}catch(y){V.debug("Native skill generation failed (non-critical)",{error:ye(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 ef.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){V.debug("Verification failed (non-critical)",{error:ye(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:ye(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>sf.mkdir(tu.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 Fg.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:ye(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=Ni(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:ye(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:ye(a)})}let i={};try{let a=Ni(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Hi(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=ig(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:ye(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 Hg.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:ye(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(()=>[]),Wt.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:ye(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new ar,s=await Gl.learnFromTaskHistory(this.projectId,e,t);try{let n=await Ng.getFeatureOutcomes(this.projectId);n.length>0&&await Gl.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:ye(e)})}}async getCliVersion(){try{let e=tu.join(__dirname,"..","..","package.json");return(await Ae(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:ye(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:[]}}},Os=new su});var af={};Se(af,{mdActionRequired:()=>It,mdBadge:()=>Zi,mdCallout:()=>os,mdCodeBlock:()=>nu,mdDone:()=>fe,mdError:()=>Av,mdFooter:()=>rf,mdFrontmatter:()=>of,mdHeader:()=>nf,mdJoin:()=>ea,mdList:()=>He,mdNextSteps:()=>le,mdObsidianNote:()=>_s,mdOutput:()=>U,mdRelevantFiles:()=>ou,mdSection:()=>te,mdStats:()=>Ye,mdSubtasks:()=>ru,mdTable:()=>sn,mdTaskHeader:()=>yr,mdWarn:()=>iu});function nf(){return"---"}function rf(){return`---
823
- prjct v${bn()}`}function U(...r){return ea(nf(),...r.filter(Boolean),rf())}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 nu(r,e=""){return`\`\`\`${e}
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}
825
825
  ${r}
826
- \`\`\``}function Zi(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 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}
827
827
  ${e}`}function He(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
828
- `)}function yr(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 ru(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 ou(r){return r.length===0?"":`### Relevant Files
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
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
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 iu(r){return`> **WARNING:** ${r}`}function Av(r){return`> **ERROR:** ${r}`}function of(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 _s(r,e,...t){return[of(r),`# ${e}`,...t.filter(Boolean)].join(`
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(`
836
836
 
837
- `)}function ea(...r){return r.filter(Boolean).join(`
837
+ `)}function sa(...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 fs=S(()=>{"use strict";ut();l(nf,"mdHeader");l(rf,"mdFooter");l(U,"mdOutput");l(sn,"mdTable");l(nu,"mdCodeBlock");l(Zi,"mdBadge");l(os,"mdCallout");l(te,"mdSection");l(He,"mdList");l(yr,"mdTaskHeader");l(ru,"mdSubtasks");l(ou,"mdRelevantFiles");l(le,"mdNextSteps");l(Ye,"mdStats");l(fe,"mdDone");l(iu,"mdWarn");l(Av,"mdError");l(of,"mdFrontmatter");l(_s,"mdObsidianNote");l(ea,"mdJoin");l(It,"mdActionRequired")});import xo from"chalk";function Gt(r,e={}){if(e.quiet)return;let t=lf[r]||"idle",s=vn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:cf[o]||o}));console.log(xo.dim(`
841
- Next:`));for(let o of n){let i=xo.cyan(o.cmd.padEnd(12));console.log(xo.dim(` ${i} \u2192 ${o.desc}`))}}function ta(r,e=!1){let t=lf[r]||"idle";return vn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:cf[n]||n}))}function jo(r){let e=vn.getStateInfo(r);console.log(xo.dim(`\u{1F4CD} State: ${xo.white(r.toUpperCase())} - ${e.description}`))}var cf,lf,wr=S(()=>{"use strict";Lc();cf={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"},lf={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(Gt,"showNextSteps");l(ta,"getNextSteps");l(jo,"showStateInfo")});import Iv from"node:path";async function au(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: ${kr(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 Gt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function uf(r){try{let e=await Wt.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 kr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function cu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function df(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 pf(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 | ${kr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${hi(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${cu(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: ${kr(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 mf(r,e){let t=[];t.push(`# Repository Analysis
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
844
844
  `),t.push(`Generated: ${new Date().toLocaleString()}
845
- `);let s=Iv.basename(e);if(t.push(`## Project: ${s}
845
+ `);let s=Mv.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=xo.cyan(o.cmd.padEnd(12));console.log(xo.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 gf=S(()=>{"use strict";$s();yi();$n();X();wr();Fe();l(au,"showSyncResult");l(uf,"getSessionActivity");l(kr,"formatTokens");l(cu,"formatDuration");l(df,"generateSparkline");l(pf,"generateStatsMarkdown");l(mf,"generateAnalysisSummary")});var ff,hf,yf=S(()=>{"use strict";ff=["task","done","ship","resume","bug","enrich"],hf=["init","sync","pause","next","dash","history","undo","redo"]});import hs from"chalk";function Dv(r){return wf[r.toLowerCase()]||wf.default}var wf,lu,kf,Sf=S(()=>{"use strict";wf={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(Dv,"getIcon");lu=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(hs.cyan(`
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(`
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=Dv(t);console.log(hs.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(hs.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(hs.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(hs.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?hs.green("\u2713"):hs.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${hs.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?` ${hs.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(hs.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},kf=new lu});import bf from"node:fs";import sa from"node:path";function $v(r){if(fn()){let{Database:n}=_t("bun:sqlite");return new n(r,{create:!0})}let e=_t("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var uu,na,vf=S(()=>{"use strict";so();l($v,"openDatabase");uu=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?sa.resolve(e):sa.join(_t("node:os").homedir(),".prjct-cli");this.dbPath=sa.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=sa.dirname(this.dbPath);bf.existsSync(e)||bf.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=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(`
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=xo.cyan(o.cmd.padEnd(12));console.log(xo.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)}},na=new uu});import is from"node:fs/promises";import Ro from"node:os";import gt from"node:path";function Mv(){try{let r=gt.dirname(_t.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 Tf(){return Ao.split("@")[1]}function ys(){return process.env.PRJCT_TEST_MODE==="1"?gt.join(Ro.tmpdir(),"prjct-context7-test","mcp.json"):gt.join(Ro.homedir(),".claude","mcp.json")}async function Ef(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:ys(),mergeIntoExisting:!1}];let r=Ro.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 Cf(r){let e=await Ef(),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 ra(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 Ov(){let r=Tf(),e=gt.join(Ro.homedir(),".mcp-auth"),t=gt.join(e,`mcp-remote-${r}`);if((await ra(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 ra(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 ra(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 Pf(r){let e=[],t=!1,s=await Ef();for(let n of s){let o=await pu(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=oa[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 jf(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function xf(r){let e=Tf(),t=gt.join(Ro.homedir(),".mcp-auth"),s=gt.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await ra(s);if(i.valid)return na.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 Ov();if(a.migrated)return n=!0,na.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: ${du[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${du[r]}`:`OAuth not completed. Run in a terminal: ${du[r]}`;return na.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function pu(r=ys()){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 jf(r,e=ys()){await de(e,r)}async function mu(r,e,t=ys()){let s=await pu(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await jf(s,t),{path:t,changed:i}}async function nn(r,e=ys()){return!!(await pu(e)).mcpServers?.[r]}var Ao,oa,du,Io=S(()=>{"use strict";vf();W();B();Ao="mcp-remote@0.1.38";l(Mv,"getPrjctMcpConfig");oa={prjct:Mv(),linear:{command:"npx",args:["-y",Ao,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Ao,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},du={linear:`npx -y ${Ao} https://mcp.linear.app/mcp`,jira:`npx -y ${Ao} https://mcp.atlassian.com/v1/mcp`};l(Tf,"getMcpRemoteVersion");l(ys,"getClaudeMcpConfigPath");l(Ef,"getActiveMcpConfigPaths");l(Cf,"hasMcpServerAny");l(ra,"validateTokenFiles");l(Ov,"migrateOAuthTokens");l(_v,"cleanCorruptedTokens");l(Pf,"validateMcpConfig");l(xf,"checkOAuthTokens");l(pu,"readMcpConfig");l(jf,"writeMcpConfig");l(mu,"upsertMcpServer");l(nn,"hasMcpServer")});import yt from"chalk";function Nv(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Rf.length;return Rf[t]}function Lv(r,e,t="\u25B6"){let s=yt.dim(String(r+1).padStart(2)),o=Nv(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=yt.green("\u2713 Complete");break;case"in_progress":a=yt.yellow(`${t} Working...`);break;case"pending":a=yt.gray("\u25CB Pending");break;case"failed":a=yt.red("\u2717 Failed");break;case"blocked":a=yt.gray("\u2298 Blocked");break;default:a=yt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function Fv(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${yt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${yt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Lv(t,r[t]));return e.push(""),e.join(`
886
- `)}function Af(r){console.log(Fv(r))}var Rf,If=S(()=>{"use strict";Rf=[yt.cyan,yt.magenta,yt.yellow,yt.blue,yt.green,yt.redBright,yt.magentaBright,yt.cyanBright];l(Nv,"getDomainColor");l(Lv,"formatSubtaskLine");l(Fv,"renderSubtaskProgress");l(Af,"printSubtaskProgress")});function Hv(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 Wv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Uv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Hv(t)};return{detected:!1}}function Gv(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 qv(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 Bv(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 Vv(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 Uv,gu,Jv,Sr,Df=S(()=>{"use strict";Uv=[{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(Hv,"getHallucinationSuggestion");l(Wv,"detectHallucination");l(Gv,"isSimilarError");l(qv,"analyzeErrorPattern");l(Bv,"generateEscalationMessage");l(Vv,"generateSuggestion");gu=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>Gv(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=qv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Bv(e,o,this.maxAttempts),suggestion:Vv(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 Wv(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}}},Jv=new gu,Sr=Jv});function fu(r,e){let t=Do(e),s=Am[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 zv(r,e){let t=Do(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Kv(r,e,t){let s=Do(t),n=fu(r,t),o=fu(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function ia(r,e=zs){let t=Do(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Xv(r,e),n=Yv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=eT(o),a=Qv(o),c=Zv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=tT(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Mf(r,e,t=zs){let s=Do(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 Xv(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=Kv(i,n,e);if(!t.has(a)){let c=fu(i,e),u=zv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Yv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+sT(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>hu(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 Qv(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 Zv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=hu(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function eT(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 tT(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=hu(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 hu(r){if(!r.variance)return 0;let e=Ft(r.estimatedDuration),t=Ft(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Of(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 sT(r){if(!r.estimatedDuration)return 0;let e=Ft(r.estimatedDuration);if(e<=0)return 0;let t=$f[0],s=Number.POSITIVE_INFINITY;for(let n of $f){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Do(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var $f,yu=S(()=>{"use strict";vo();fo();X();l(fu,"getSprintStart");l(zv,"getSprintEnd");l(Kv,"getSprintNumber");l(ia,"calculateVelocity");l(Mf,"projectCompletion");l(Xv,"bucketBySprint");l(Yv,"buildSprintVelocities");l(Qv,"detectTrend");l(Zv,"calculateOverallAccuracy");l(eT,"calculateAverageVelocity");l(tT,"detectEstimationPatterns");l(hu,"parseVariancePercent");l(Of,"formatVelocityContext");$f=[{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(sT,"derivePoints");l(Do,"resolveConfig")});import nT from"node:fs/promises";import aa from"node:path";async function Ns(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=wu(r),c=await aT(e),u=await cT(e),d=[];for(let p of c){if(!i&&uT(p))continue;let g=lT(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 wu(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 aT(r){let e=[];async function t(s,n=""){try{let o=await nT.readdir(s,{withFileTypes:!0});for(let i of o){let a=aa.join(s,i.name),c=aa.join(n,i.name);if(i.isDirectory()){if(iT.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=aa.extname(i.name).toLowerCase();oT.has(u)&&e.push(c)}}}catch(o){O(o)}}return l(t,"walk"),await t(r),e}async function cT(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)}},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 '
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 lT(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(rT))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=aa.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 uT(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 rT,oT,iT,$o=S(()=>{"use strict";W();Je();rT={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"]},oT=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),iT=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Ns,"findRelevantFiles");l(wu,"extractKeywords");l(aT,"getAllCodeFiles");l(cT,"getGitRecency");l(lT,"scoreFile");l(uT,"isTestFile")});async function Mo(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 mT(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await pT(r,t);return o=o.filter(c=>!gT(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 pT(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 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 '
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=xo.cyan(o.cmd.padEnd(12));console.log(xo.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 mT(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),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(`
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=xo.cyan(o.cmd.padEnd(12));console.log(xo.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 gT(r){let e=r.split("/").pop()||"";for(let t of dT)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var dT,ku=S(()=>{"use strict";Je();dT=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Mo,"getRecentFiles");l(pT,"getHotFilesFromCommits");l(mT,"getBranchOnlyFiles");l(gT,"shouldIgnore")});function Su(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function _f(r,e){let t=fT[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Nf(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ca(r,e){let t=Su(r),s=Su(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=_f(n,hT),a=bu.map(c=>({model:c,..._f(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Nf(i.total),byModel:a}}}function Mn(r){let e=Su(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:bu.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function vu(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=bu.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:Nf(i),byModel:o}}}var fT,hT,bu,la=S(()=>{"use strict";Fi();fT={"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}},hT="claude-sonnet-4.5";l(Su,"countTokens");bu=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(_f,"calculateModelCost");l(Nf,"formatCostSaved");l(ca,"measureCompression");l(Mn,"noCompression");l(vu,"combineMetrics")});import Uf 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 Uf.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=Hf[i]||"unknown",c=ST[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=bT(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:ca(o,d)}}async function Tu(r,e=process.cwd(),t={}){let s=as.isAbsolute(r)?r:as.join(e,r),n=[];async function o(i){let a=await Uf.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(Hf[m]){let p=await rn(d,e);n.push(p)}}}}return l(o,"processDir"),await o(s),n}function bT(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 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(`
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:vT(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function vT(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Hf,Lf,yT,wT,kT,Ff,ST,ua=S(()=>{"use strict";W();la();Hf={".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"},Lf=[{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}],yT=[{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}],wT=[{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}],kT=[{type:"function",pattern:/^pub\s+(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1},{type:"class",pattern:/^pub\s+struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1},{type:"interface",pattern:/^pub\s+trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1},{type:"enum",pattern:/^pub\s+enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1}],Ff=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],ST={typescript:Lf,javascript:Lf,python:yT,go:wT,rust:kT,java:Ff,csharp:Ff,php:[],ruby:[],unknown:[]};l(rn,"extractSignatures");l(Tu,"extractDirectorySignatures");l(bT,"extractFromContent");l(vT,"cleanSignature")});import Eu from"node:path";var TT,ET,Cu,CT,$t,br=S(()=>{"use strict";ve();Ht();X();B();TT="outcomes",ET="outcomes.jsonl",Cu=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Eu.join(t,TT)}getOutcomesPath(e){return Eu.join(this.getOutcomesDir(e),ET)}async record(e,t){let s={...t,id:Z()},n=this.getOutcomesPath(e);return await rt(Eu.dirname(n)),await oc(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,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(`
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=Ft(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},CT=new Cu,$t=CT});import{z as Qe}from"zod";var da,vr,PT,cN,Pu,Wf,pa=S(()=>{"use strict";da=Qe.string(),vr=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())}),PT=Qe.object({classification:vr,classifiedAt:Qe.string(),source:Qe.enum(["cache","history","llm","heuristic"]),descriptionHash:Qe.string(),projectId:Qe.string()}),cN=Qe.object({entries:Qe.record(Qe.string(),PT),confirmedPatterns:Qe.array(Qe.object({descriptionHash:Qe.string(),classification:vr,confirmedAt:Qe.string(),taskDescription:Qe.string()}))}),Pu={entries:{},confirmedPatterns:[]},Wf={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import jT from"node:fs/promises";import Bf from"node:path";function Gf(r){return Tn(r.toLowerCase().trim())}async function qf(r){try{let e=Bf.join(r,"storage","classification-cache.json"),t=await jT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e)?Pu:(console.warn("[classifier] Failed to load cache:",k(e)),Pu)}}async function RT(r,e){try{let t=Bf.join(r,"storage","classification-cache.json");await de(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function AT(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Hs(s.classifiedAt,36e5)?null:s.classification}function IT(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var xu,DT,Vf,Jf=S(()=>{"use strict";ro();pa();W();kn();B();En();l(Gf,"hashDescription");l(qf,"loadCache");l(RT,"saveCache");l(AT,"lookupCache");l(IT,"lookupPatterns");xu=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=Gf(e),o=await qf(s),i=AT(o,n,t);if(i)return{classification:i,source:"cache"};let a=IT(o,n);return a?{classification:a,source:"history"}:{classification:Wf,source:"heuristic"}}async confirmClassification(e,t,s){let n=Gf(e),o=await qf(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await RT(s,o))}},DT=new xu,Vf=DT});import $T from"node:fs/promises";import MT from"node:path";var ju,OT,ma,Ru=S(()=>{"use strict";yu();Te();ve();fo();ur();er();St();$o();ku();ua();W();Je();br();Jf();ju=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(),Ct(ci)),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),Ns(e,t,{maxFiles:10,minScore:.15}),Mo(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=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(`
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=ia(t,zs);return s.sprints.length===0?null:Of(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=MT.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 Vf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,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?"...":""}`}},OT=new ju,ma=OT});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 Au,NT,tt,zf=S(()=>{"use strict";Ht();X();xn();xn();l(_T,"generateApprovalPrompt");Au=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return tl.includes(e)}isDestructive(e){return sl.includes(e)}isToolAllowedInPlanning(e){return bi.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>bi.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 _T(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`}},NT=new Au,tt=NT});var Iu,LT,Kf,Xf=S(()=>{"use strict";X();br();Iu=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=Ft(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+Ft(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}},LT=new Iu,Kf=LT});var th={};Se(th,{AgentAssignmentSchema:()=>Yf,OUTPUT_SCHEMAS:()=>Zf,SubtaskBreakdownSchema:()=>Qf,TaskClassificationSchema:()=>vr,renderSchemaForPrompt:()=>FT});import{z as ft}from"zod";function FT(r){let e=Zf[r];return e?`## OUTPUT FORMAT
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
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
- ${UT(e.schema)}`:null}function UT(r){if(r instanceof ft.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${eh(s)}`).join(`
931
- `)}return"(see example above)"}function eh(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 ${eh(r.element)}`:r instanceof ft.ZodObject?"object":"any"}var Yf,Qf,Zf,sh=S(()=>{"use strict";pa();pa();Yf=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"])}),Zf={classification:{schema:vr,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Yf,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(FT,"renderSchemaForPrompt");l(UT,"describeSchema");l(eh,"describeField")});import nh from"node:fs/promises";import Tr 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 rh(r){return Math.ceil(r.length/4)}var Du,$u,Mu,HT,oh,ih=S(()=>{"use strict";Fi();Vt();St();W();B();ut();Xf();Zs();Du={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ga,"truncateToTokenBudget");l(rh,"estimateTokens");$u=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Du,...e}}addSection(e,t){let s=ga(e,t),n=rh(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+=rh(i),i}return this.used+=n,s}},Mu=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 nh.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=vt(`global/modules/${e}`);if(t)return t;let s=Tr.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=Qs("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=vt(n);if(o){let i=Tr.basename(n,".md");t[i]=o}}}else{let n=Tr.join(jt,"templates","checklists");if(await C(n)){let o=(await nh.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Tr.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 Kf.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,Du.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=Tr.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
+ ${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}
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: ${Tr.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: ${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(`
943
943
  <env>
944
944
  ${j.join(`
945
945
  `)}
@@ -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(()=>(sh(),th)),j=y(M);j&&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(`
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 $u({totalPrompt:Du.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 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}
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 ga(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},HT=new Mu,oh=HT});import Ou from"node:fs/promises";import WT from"node:os";import _u from"node:path";function ah(){let r=process.env.PRJCT_CLI_HOME?.trim()||_u.join(WT.homedir(),".prjct-cli");return _u.join(r,".running")}async function GT(r){try{let e=ah(),t=_u.dirname(e);await C(t)||await Ou.mkdir(t,{recursive:!0}),await Ou.writeFile(e,`/p:${r}`)}catch{}}async function qT(){try{let r=ah();await C(r)&&await Ou.unlink(r)}catch{}}var Nu,BT,fa,Lu=S(()=>{"use strict";yf();W();Sf();B();Io();If();xi();Df();$i();Ru();zf();ih();Zs();l(ah,"getRunningFilePath");l(GT,"signalStart");l(qT,"signalEnd");Nu=class{static{l(this,"CommandExecutor")}async signalStart(e){await GT(e)}async signalEnd(){await qT()}requiresOrchestration(e){return ff.includes(e)?!0:!hf.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Sr.shouldEscalate(e,n)){let o=Sr.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Cm.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 ma.execute(e,m,s),p.detectedDomains.length>0&&kf.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}));Af(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 bt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await bt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await bt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await bt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},b||(x=await bt.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(),Ct(Lt)).getActiveProvider()).name==="claude",j=await oh.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"),Sr.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=>bt.createMemory(i.projectId,D),"create"),autoRemember:l((D,G,Q)=>bt.autoRemember(i.projectId,D,G,Q),"autoRemember"),search:l(D=>bt.searchMemories(i.projectId,D),"search"),findByTags:l(D=>bt.findByTags(i.projectId,D),"findByTags"),getStats:l(()=>bt.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=Sr.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=Sr.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}}}},BT=new Nu,fa=BT});import VT from"node:https";import JT from"node:os";import Fu from"node:path";import cs from"chalk";var Uu,ha,Hu=S(()=>{"use strict";W();B();Uu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Fu.join(JT.homedir(),".prjct-cli","config"),this.cacheFile=Fu.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Fu.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=VT.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 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:`
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
- `}},ha=Uu});import ch from"node:path";async function XT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(ch.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(ch.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function YT(){return{...zT}}function QT(){return{...KT}}async function lh(){return ya||(ya=await XT()?YT():QT(),ya)}var ya,zT,KT,uh=S(()=>{"use strict";B();ya=null,zT={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}},KT={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(XT,"isClaudeEnvironment");l(YT,"getClaudeAgent");l(QT,"getTerminalAgent");l(lh,"detect")});import wa from"node:fs/promises";var Wu,dh,ph=S(()=>{"use strict";W();B();Wu=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:
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:
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}}},dh=Wu});function mh(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&eE.has(e.code))return!0;if(e.code&&fh.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 tE(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&fh.has(e.code))}function gh(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 Gu(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 sE(r){on.delete(r)}var eE,fh,on,ka,hh,qL,yh=S(()=>{"use strict";eE=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),fh=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(mh,"isTransientError");l(tE,"isPermanentError");on=new Map;l(gh,"isCircuitOpen");l(Gu,"recordFailure");l(sE,"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(gh(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 sE(t),o}catch(o){if(s=o,n++,tE(o))throw Gu(t,this.options.circuitBreakerThreshold),o;if(!(mh(o)&&n<this.options.maxAttempts))throw Gu(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 Gu(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return mh(e)}isCircuitOpen(e){return gh(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return on.get(e)}resetCircuit(e){on.delete(e)}resetAllCircuits(){on.clear()}},hh=new ka({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),qL=new ka({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var nE,qu,Sa,wh=S(()=>{"use strict";Ps();uh();ph();yh();nE=["claude"],qu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await hh.execute(async()=>{if(this.agentInfo=await lh(),!this.agentInfo?.isSupported)throw oo.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!nE.includes(e))throw oo.notSupported(this.agentInfo?.type??"unknown");return this.agent=new dh,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 qu});var Bu,Er,Vu=S(()=>{"use strict";Bu=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Er=new Bu});import Tt from"node:path";async function rE(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(Tt.join(r,"pnpm-lock.yaml"))?"pnpm":await C(Tt.join(r,"yarn.lock"))?"yarn":await C(Tt.join(r,"bun.lockb"))||await C(Tt.join(r,"bun.lock"))?"bun":(await C(Tt.join(r,"package-lock.json")),"npm")}function kh(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function oE(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Cr(r,e){for(let n of iE)if(await C(Tt.join(r,n)))return n;let s=(e??await Es(r)).find(n=>n.endsWith(aE));if(s)return s}async function Ls(r){for(let e of cE)if(await C(Tt.join(r,e)))return e}async function ba(r){let e=Tt.join(r,"package.json"),t=await Ae(e,null);if(t){let a=await rE(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:kh(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:kh(a,"typecheck")}),c.test&&(u.test={tool:a,command:oE(a)}),u.versionFile=await Cr(r),u.changelogFile=await Ls(r),u}if(await C(Tt.join(r,"pytest.ini"))){let a=await Cr(r),c=await Ls(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await _e(Tt.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Cr(r),c=await Ls(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(Tt.join(r,"Cargo.toml"))){let a=await Ls(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(Tt.join(r,"go.mod"))){let a=await Cr(r),c=await Ls(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await Es(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Cr(r,n),c=await Ls(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(Tt.join(r,"pom.xml"))){let a=await Ls(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(Tt.join(r,"gradlew"))&&(await C(Tt.join(r,"build.gradle"))||await C(Tt.join(r,"build.gradle.kts")))){let a=await Ls(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Cr(r),i=await Ls(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var iE,aE,cE,Ju=S(()=>{"use strict";B();l(rE,"detectPackageManager");l(kh,"pmRun");l(oE,"pmTest");iE=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],aE=".csproj",cE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Cr,"detectVersionFile");l(Ls,"detectChangelogFile");l(ba,"detectProjectCommands")});import*as ke from"@clack/prompts";import On from"chalk";var va,Sh,Oo,bh=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."}],Sh=[{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"}],Oo=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(){ke.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 ke.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=va.findIndex(s=>s.value===this.detectedType),t=await ke.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 ke.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ke.multiselect({message:"Which AI agents do you use?",options:Sh.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ke.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);ke.note(e,"Detected stack");let t=await ke.confirm({message:"Is this stack correct?",initialValue:!0});if(ke.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ke.group({language:l(()=>ke.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ke.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 ke.group({verbosity:l(()=>ke.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(()=>ke.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
- `);ke.note(e,"Configuration Summary");let t=await ke.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ke.isCancel(t)||!t?(ke.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(),ep));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,ke.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return va.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Sh.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 vh={};Se(vh,{PlanningCommands:()=>Nn});import Ta from"node:fs/promises";import _n from"node:path";async function lE(){if(!zu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ca(),Th));zu=new r}return zu}var zu,Nn,Ea=S(()=>{"use strict";ni();$s();Te();ve();Ht();Vs();Vt();ho();W();X();B();fs();wr();Fe();Ju();bh();Mt();zu=null;l(lE,"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 Oo(t).runNonInteractive());else if(a=await new Oo(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},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}}},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
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 Ta.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 lE();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 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
1187
1187
 
1188
1188
  ## Idea
1189
1189
  ${h}
@@ -1192,7 +1192,7 @@ ${h}
1192
1192
  Initialized - awaiting stack recommendation
1193
1193
 
1194
1194
  Generated: ${new Date().toLocaleString()}
1195
- `;return await Ta.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}]`),Gt("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
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
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.
1197
1197
 
1198
1198
  Create a plan first:
@@ -1229,9 +1229,9 @@ Initialized - awaiting architecture design
1229
1229
  4. Generate roadmap
1230
1230
 
1231
1231
  Generated: ${new Date().toLocaleString()}
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(`
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(`
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)}`),Gt("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),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(`
1235
1235
  \u{1F4A1} Create one with /p:spec "feature name"
1236
1236
  `),{success:!0,specs:[]}):(console.log(`
1237
1237
  \u{1F4CB} SPECIFICATIONS
@@ -1266,9 +1266,9 @@ Generated: ${new Date().toLocaleString()}
1266
1266
  ---
1267
1267
  Created: ${new Date().toLocaleString()}
1268
1268
  Status: Draft
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(`
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(`
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 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 Ku,Ln,Eh=S(()=>{"use strict";Ps();ni();Te();ve();W();B();Fe();Ku=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(),vh)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw Qo.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 Es(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 Es(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 Ku});var Ce,Mt=S(()=>{"use strict";Lu();Hu();wh();Vu();$n();Eh();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 Ln.getCurrentAuthor()}async initializeAgent(){return Sa.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 Wt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return Ln.isEmptyDirectory(e)}async _detectExistingCode(e){return Ln.hasExistingCode(e)}_breakdownFeatureTasks(e){return Er.breakdownFeature(e)}_detectBugSeverity(e){return Er.detectBugSeverity(e)}}});var Th={};Se(Th,{AnalysisCommands:()=>Un});import Pa from"node:fs/promises";import Ch from"node:path";import*as Fn from"@clack/prompts";var Ph,Un,Ca=S(()=>{"use strict";xi();$i();bm();$s();Te();ve();yi();wl();Hm();Jm();Rl();Qi();ur();ee();er();go();W();X();fs();wr();Fe();gf();Mt();Ph=`{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 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,
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}],
@@ -1276,27 +1276,27 @@ Status: Draft
1276
1276
  riskAreas:[{path, reason, risk, severity}], refactorSuggestions:[{description, files:[], benefit, effort}],
1277
1277
  projectInsights:[], conventions:[{category, rule, example}],
1278
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=mf(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(),Ct(Lt)).getActiveProvider(),d=await Ue.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
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!
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 Os.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=Ch.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 m=await Os.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 Pa.readFile(a,"utf-8")}catch{p=""}let g=qm(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 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(Bm(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
- ${Vm(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"),au(m,i)}t.md||f.spin("Syncing project...");let d=await Os.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=yl(j))}catch{}let w=d.git.recentCommits[0]?.hash??null,b=w&&Qt.isCurrent(n,w),h=null;if(!b)try{let j=await Pl(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Ph,"```","### 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=ta("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 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
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?iu("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 au(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 Os.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 Pl(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Ph,"```","### 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 uf(n),c=await bt.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: ${kr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${hi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${cu(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=df(i);if(console.log(` ${p} ${kr(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=pf(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=Ui(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=Ch.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(yl(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Rm(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 Xu,H,_o=S(()=>{"use strict";Te();ve();W();X();Xu=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 Xu});import uE from"node:fs/promises";import dE from"node:path";var Pr,Yu=S(()=>{"use strict";xi();Te();Rl();Wc();ee();Vs();Vt();Js();St();W();X();fs();Fe();Mt();_o();Pr=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=dE.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=Gs(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?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(`
1286
1286
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1287
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(`
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 uE.readFile(m.paths.roadmap,"utf-8")}catch{p=null}if(console.log(`
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(`
1290
1290
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1291
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
1292
  `);else{let g=p.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 ${xs(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=po.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
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
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(`
1296
1296
  \u{1F4CA} DASHBOARD - ${i}
1297
- `),console.log("\u2550".repeat(50));let m=Ui(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1297
+ `),console.log("\u2550".repeat(50));let m=Wi(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1298
1298
  ${g}`),console.log(`
1299
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=xs(new Date(a.startedAt));console.log(` Started: ${w} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
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(`
1301
1301
  \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(w=>{let b=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${w.name} ${b?`(${b})`:""}`)}),console.log(`
1302
1302
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
@@ -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 jh={};Se(jh,{ContextCommands:()=>an,contextCommands:()=>xh,default:()=>gE});import pE from"node:fs/promises";import mE from"node:path";var an,xh,gE,xa=S(()=>{"use strict";Ru();Te();ve();St();W();fs();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 ma.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",ea(Zi("ID",e.projectId),Zi("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(yr({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=mE.join(e,"analysis","repo-analysis.json"),s=await pE.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}}},xh=new an,gE=xh});import Qu from"node:fs";import Rh from"node:path";async function ja(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 Ra(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 Zu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await ja(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 Ra(e),await Wt.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 Ah(r){let e=A.getGlobalBasePath(),t=Rh.join(e,"projects");if(!Qu.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Qu.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=Rh.join(t,a);if(!fE.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),Qu.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 fE,ed=S(()=>{"use strict";Te();ve();$n();ee();Vs();Vt();W();X();Fe();l(ja,"cleanupMemory");l(Ra,"cleanupMemoryInternal");l(Zu,"cleanup");fE=[/^qa-/,/^nonexistent-/,/^test-/];l(Ah,"cleanupProjects")});import Ih from"node:path";async function td(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=Ih.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)),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}
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=Ih.join(a,u);return await Pt(d,c),await Wt.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 sd=S(()=>{"use strict";Te();ve();$n();W();X();B();Fe();l(td,"design")});var at,Dh=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 nd,Et,No,$h=S(()=>{"use strict";Ps();ee();Dh();xn();As();nd=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=pm.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:",ye(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())}},Et=new nd,No={sessionStarted:l(r=>Et.emit(at.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>Et.emit(at.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>Et.emit(at.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>Et.emit(at.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>Et.emit(at.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>Et.emit(at.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>Et.emit(at.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>Et.emit(at.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>Et.emit(at.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>Et.emit(at.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>Et.emit(at.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>Et.emit(at.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>Et.emit(at.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>Et.emit(at.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>Et.emit(at.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>Et.emit(at.ANALYSIS_COMPLETED,r),"analysisCompleted")}});function Aa(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 Oh(r){return xt(r*1e3)}var Mh,_h=S(()=>{"use strict";Ht();X();Mh=Z;l(Aa,"calculateDuration");l(Oh,"formatDuration")});function Nh(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}var Ia,Lh=S(()=>{"use strict";$h();Te();ee();W();Je();_h();l(Nh,"rowToSession");Ia=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await $.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 Mh()}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?Nh(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 No.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 No.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=Aa(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await No.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=Aa(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 No.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Aa(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=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(`
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(Nh)}async logEvent(e,t){try{E.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Oh(e)}}});import xr from"node:path";async function rd(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 Ia(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
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(`
1339
1339
  Found abandoned session:
1340
- `),console.log(` Task: ${n.task}`),n.startedAt){let o=xs(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
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 od(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=xr.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=xr.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 Wt.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 id(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=xr.join(A.getGlobalProjectPath(e),"snapshots"),s=xr.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 Wt.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 ad(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=xr.join(A.getGlobalProjectPath(e),"snapshots"),s=xr.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 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(`
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,17 +1348,17 @@ ${"\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 cd=S(()=>{"use strict";Te();ve();$n();Lh();W();X();B();Fe();l(rd,"recover");l(od,"undo");l(id,"redo");l(ad,"history")});var jr,ld=S(()=>{"use strict";$o();Mt();ed();sd();cd();ed();sd();cd();jr=class extends Ce{static{l(this,"MaintenanceCommands")}_cleanupMemory=ja;_cleanupMemoryInternal=Ra;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?Zu(e,t):s}async cleanupProjects(e={}){return Ah(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?td(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?rd(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?od(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?id(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ad(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 Ns(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 ud,Rr,Fh=S(()=>{"use strict";ee();Vt();Js();St();fs();ud=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=_s(m,c.description,p.length>0?`## Subtasks
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
1354
  ${p.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=_s(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=_s(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=_s(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()},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
1358
1358
  ${d.join(`
1359
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
1360
  ${m.join(`
1361
- `)}`)}let u=_s(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=_s(c,a.name,a.description||null,u.length>0?`## Tasks
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
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?`
@@ -1367,7 +1367,7 @@ Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120
1367
1367
  `+(m.branch?`Branch: \`${m.branch}\`
1368
1368
  `:"")+(p.length>0?`Progress: ${g}/${p.length}`:""))}else c.push(`## Active Task
1369
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=_s(a,`Daily: ${o}`,...c);return await st.writeFile(q.join(i,`${o}.md`),d,"utf-8"),!0}async exportIndex(e,t){let s=`# ${e}
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}
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(()=>(fs(),af));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(),df));c=`${u(o)}
1404
1404
 
1405
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}},Rr=new ud});import Ar from"node:path";var Ir,dd=S(()=>{"use strict";Te();ve();Fh();B();fs();Fe();Mt();Ir=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=Ar.basename(e),a={vaultPath:o,projectFolder:i,autoExport:t.autoExport??!0},c=A.getGlobalProjectPath(n),u=Ar.join(c,"project.json"),d=await Ae(u)||{},m=d.integrations||{};m.obsidian=a,d.integrations=m,await de(u,d);let p=Rr.getProjectPath(a,i);return await Rr.ensureStructure(p),await Rr.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=Ar.basename(e);t.md||f.info("Exporting to Obsidian vault...");let a=await Rr.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
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
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.warn("Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault"),{success:!0,message:t.md?U(os("info","Obsidian not configured"),le([{label:"Configure Obsidian vault",command:"prjct obsidian setup --vault-path /path/to/vault"}])):""};let i=Ar.basename(e),a=Rr.getProjectPath(o,i),c=await C(Ar.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=Ar.join(t,"project.json"),n=await Ae(s);if(!n)return null;let o=n.integrations;return o?.obsidian?o.obsidian:null}}});var pd,hE,Dr,Uh=S(()=>{"use strict";Vt();di();pd=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=ui(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=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(`
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
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)}},hE=new pd,Dr=hE});var $r,Hn,PH,md=S(()=>{"use strict";Te();Ht();Uh();ao();St();W();Fe();Mt();$r=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=Dr.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=Dr.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 Dr.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"}):($r=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(Dr.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!$r||$r.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 $r.items){let i=Dr.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:$r.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)}`)}}$r=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(`
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
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)}},PH=new Hn});import We from"chalk";function Da(r,e,t){return t==="below"?r<=e?We.green("\u2713"):We.yellow("\u26A0"):r>=e?We.green("\u2713"):We.yellow("\u26A0")}var cn,Mr,gd=S(()=>{"use strict";Te();Ci();W();Fe();Mt();cn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(Da,"statusIcon");Mr=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(`
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(`
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=Da(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=Da(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=Da(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=Da(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 yE from"node:fs/promises";import wE from"node:path";var Wh,Hh,fd,kE,Dt,$a=S(()=>{"use strict";ve();B();Wh="https://api.prjct.app",Hh={apiKey:null,apiUrl:Wh,userId:null,email:null,lastAuth:null},fd=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??{...Hh},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await rt(wE.dirname(this.configPath)),await de(this.configPath,s),await yE.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Wh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Hh},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}},kE=new fd,Dt=kE});function bE(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function vE(r){let e={};for(let[t,s]of Object.entries(r))e[bE(t)]=s;return e}function TE(r,e){let[t,s]=e.type.split("."),n=SE[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=vE(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 Gh(r,e){return e.map(t=>TE(r,t)).filter(t=>t!==null)}var SE,qh=S(()=>{"use strict";SE={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l(bE,"camelToSnake");l(vE,"snakeCaseKeys");l(TE,"mapCliEventToWebFormat");l(Gh,"mapCliEventsToWebFormat")});var hd,Or,yd=S(()=>{"use strict";xn();$a();qh();hd=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=Gh(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))}},Or=new hd});var wd,EE,Bh,Vh=S(()=>{"use strict";Rc();Vs();Vt();Js();St();$a();yd();wd=class{static{l(this,"SyncManager")}async hasAuth(){return await Dt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Or.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 Bs.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 Or.pushEvents(e,n);if(o.success)return await Bs.clearPending(e),await Bs.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 Bs.getLastSync(e))?.timestamp,n=await Or.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 Bs.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}}},EE=new wd,Bh=EE});import CE from"node:fs/promises";import PE from"node:http";import xE from"node:path";import ae from"chalk";var _r,kd=S(()=>{"use strict";$s();Te();ve();gr();$a();yd();Vh();W();Je();B();Io();Fe();ut();Mt();_r=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 Or.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=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
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=PE.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=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}
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.":""})},300*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 Bh.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
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>
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>
@@ -1492,7 +1492,7 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
1492
1492
  <h1>Authentication Failed</h1>
1493
1493
  <div class="msg">${e}</div>
1494
1494
  <p class="hint">Return to your terminal and try again.</p>
1495
- </div></body></html>`}async start(){let e=await Ue.checkInstallation(),t=(lt(),Ct(Lt)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1495
+ </div></body></html>`}async start(){let e=await Ue.checkInstallation(),t=(lt(),bt(Nt)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1496
1496
  `),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1497
1497
 
1498
1498
  Please install one first:
@@ -1501,22 +1501,22 @@ 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(()=>(hr(),Bi));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(()=>(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(`
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
- \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(),Ct(Lt)),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(()=>(hr(),Bi));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(`
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(`
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=ys();await nn("linear",e)?console.log("\u2705 Linear MCP already configured"):(await mu("linear",oa.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=ys();await nn("jira",e)?console.log("\u2705 Jira MCP already configured"):(await mu("jira",oa.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=xE.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 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
1515
1515
  # prjct Status Line for Claude Code
1516
1516
  # Shows version update notifications and current task
1517
1517
 
1518
1518
  # Current CLI version (embedded at install time)
1519
- CLI_VERSION="${we}"
1519
+ CLI_VERSION="${ke}"
1520
1520
 
1521
1521
  # Read JSON context from stdin (provided by Claude Code)
1522
1522
  read -r json
@@ -1567,14 +1567,14 @@ fi
1567
1567
 
1568
1568
  # Default: show prjct branding
1569
1569
  echo "\u26A1 prjct"
1570
- `;await CE.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${we} 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 Jh from"node:path";var jE,RE,Ma,zh=S(()=>{"use strict";X();B();jE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],RE=`# Changelog
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
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
- `,Ma=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of jE){let n=Jh.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=Jh.join(this.projectPath,e);return await Pt(t,`${RE}
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||kp(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
+ `,_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}
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 Nr from"node:path";function Kh(r){return/^\d+\.\d+\.\d+/.test(r)}function Lr(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function AE(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function IE(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}function DE(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Oa,Xh=S(()=>{"use strict";Je();B();Oa=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=Nr.join(this.projectPath,"package.json"),t=await Ae(e,null);return t?.version?{current:t.version,next:Lr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Nr.join(this.projectPath,"Cargo.toml"),t=await _e(e,"");if(!t)return null;let s=AE(t);return s?{current:s,next:Lr(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Nr.join(this.projectPath,"pyproject.toml"),t=await _e(e,"");if(!t)return null;let s=IE(t);return s?{current:s,next:Lr(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Es(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Nr.join(this.projectPath,e[0]),s=await _e(t,"");if(!s)return null;let n=DE(s);return n?{current:n,next:Lr(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Nr.join(this.projectPath,e),s=await _e(t,"");if(!s)return null;let n=s.trim();return Kh(n)?{current:n,next:Lr(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:Lr(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Nr.join(this.projectPath,"VERSION");return await Pt(e,`0.1.0
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
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(Kh,"isSemver");l(Lr,"bumpPatch");l(AE,"parseTomlVersion");l(IE,"parsePyprojectVersion");l(DE,"parseCsprojVersion")});import qt 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
- ${qt.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(`${qt.green("\u2713")} ${qt.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${qt.red("\u2717")} gate failed: ${p}`),n.gatesFailed.push(p),n.success=!1,n.output+=`Gate failed: ${p}
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}
1592
1592
  ${k(g)}
1593
1593
  `,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
1594
- ${qt.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
- ${qt.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(`${qt.green("\u2713")} ${qt.dim(`(${w})`)}`)}catch(p){console.log(`${qt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),n.hooksFailed.push(m.description||m.action),n.output+=`Hook failed: ${m.action}
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
1596
  ${k(p)}
1597
1597
  `}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
1598
- ${qt.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(`${qt.green("\u2713")} ${qt.dim(`step passed (${w})`)}`),n.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${qt.red("\u2717")} step failed: ${m.action}`),n.gatesFailed.push(m.description||m.action),n.success=!1,n.output+=`Step failed: ${m.action}
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
1599
  ${k(p)}
1600
- `,n}}return n}var Sd=S(()=>{"use strict";ho();W();Je();l(ls,"executeWorkflowRules")});var Fr,bd=S(()=>{"use strict";$i();Te();zh();Qi();Xh();Js();St();W();X();Je();fs();wr();Fe();Sd();Mt();Fr=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 Oa(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new Ma(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 bt.learnDecision(o,"commit_footer","prjct","ship"),await bt.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 Os.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=ta("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`),Gt("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}
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}
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 Fo}from"node:child_process";import _a from"node:fs/promises";import Lo from"node:path";import Ur from"chalk";function Yh(){try{return!!Fo("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function Qh(){try{let e=Fo("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 Hr,vd=S(()=>{"use strict";$s();ii();ve();Hu();Hl();W();Fe();ut();Mt();l(Yh,"isHomebrewInstall");l(Qh,"getCurrentVersion");Hr=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(),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 co.updateVersion(we)}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=Qh();if(e)return Yh()?(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(Yh()){try{Fo("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Fo("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Fo("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Qh();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 Vi(i),c=await Ji(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${k(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Ds().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 Ds().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${k(n)}`)}try{await new Ds().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(),Lt)),o=await n(),i=Lo.join(_t("node:os").homedir());if(o.gemini.installed){let a=Lo.join(i,".gemini","GEMINI.md");try{let c=await _a.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 m=Lo.join(Lo.dirname(_t.resolve("../../package.json")),"templates","global","GEMINI.md"),p=await _a.readFile(m,"utf-8"),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 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,`
1603
1603
 
1604
1604
  `).trim()}
1605
- `}await _a.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(()=>(vs(),bs));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?Ur.green("\u2713"):c?Ur.red("\u2717"):Ur.yellow("\u26A0");console.log(` ${u} ${Ur.bold(i)}`);for(let d of a.details)console.log(` ${Ur.dim(d)}`);for(let d of a.errors)console.log(` ${Ur.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"}}async getAllProjectIds(){let e=Lo.join(A.getGlobalBasePath(),"projects");try{return(await _a.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Ge from"chalk";var Wr,Td=S(()=>{"use strict";yu();Te();fo();wi();W();Fe();br();Mt();Wr=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 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(`
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=ia(i,o);await tr.saveMetrics(n,a),console.log(`
1608
+ `),{success:!0,message:"No data"};let a=ca(i,o);await sr.saveMetrics(n,a),console.log(`
1609
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=Mf(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{...zs,...s.velocity}}catch{}return zs}}});var ey,Wn,Zh,ty,sy,$E,Ed=S(()=>{"use strict";vo();X();br();ey=l(r=>kl.includes(r),"isValidPoint"),Wn=l(r=>Sl[r],"pointsToMinutes"),Zh=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"),ty=l(r=>{let e=Wn(r);return`${Zh(e.min)}\u2013${Zh(e.max)}`},"pointsToTimeRange"),sy=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+Ft(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 kl){let n=Math.abs(Sl[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import Cd from"node:fs/promises";import ME from"node:os";import Na from"node:path";var Pd,xd,ny=S(()=>{"use strict";W();B();Pd=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Na.join(ME.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Cd.mkdir(this.commandsPath,{recursive:!0});let s=Na.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await Cd.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=Na.join(this.commandsPath,`${e}.md`);return await Cd.unlink(t),{success:!0}}catch(t){return O(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=Na.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
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`---
1612
1612
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1613
1613
  ---
1614
1614
 
@@ -1644,59 +1644,59 @@ 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
- `}},xd=new Pd});function OE(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function _E(r,e){let t=Er.detectTaskType(e),s=await sy(r,t);if(s){let a=Wn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=Er.estimateComplexity(e),o=OE(n.level),i=Wn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var jd,ry=S(()=>{"use strict";Ed();Vu();l(OE,"complexityToPoints");l(_E,"estimateTaskForStart");jd=_E});async function La(r){try{let{stdout:e}=await F("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function oy(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 Rd=S(()=>{"use strict";Je();l(La,"getGitBranch");l(oy,"getModifiedFiles")});var Gr,NE,Ad,ln,iy=S(()=>{"use strict";ve();ee();X();Rd();Gr="session-snapshot",NE=30,Ad=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await La(t),o=await oy(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,Gr,u),u}getSnapshot(e){try{return E.getDoc(e,Gr)}catch{return null}}clearSnapshot(e){try{E.deleteDoc(e,Gr)}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,Gr);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=NE){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,Gr);i&&new Date(i.timestamp).getTime()<s&&(E.deleteDoc(o,Gr),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 Ad});var Id,Uo,ay=S(()=>{"use strict";ee();Id=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
+ `}},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)
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}},Uo=new Id});function cy(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 ly(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 Dd(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=cy(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),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)
1655
1655
 
1656
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(`
1657
1657
  `)}).join(`
1658
1658
 
1659
- `)}`}function $d(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 Md=S(()=>{"use strict";Bc();l(cy,"rankPatterns");l(ly,"detectDomainsFromTask");l(Dd,"buildPatternBriefing");l($d,"buildContextContract")});import LE from"node:fs/promises";import FE from"node:path";function HE(){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 WE(r){try{let{prjctDb:e}=(ee(),Ct(ci)),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 uy(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 GE(r){try{let e=FE.join(r,"analysis","repo-analysis.json"),t=await LE.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e),null}}function qE(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 BE(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 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(`
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 VE(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 UE,qr,Od=S(()=>{"use strict";Lu();Ed();Te();ve();ny();Ht();gr();ry();Rd();iy();ur();ay();mi();Vt();St();ho();$o();W();X();Io();fs();wr();Fe();Ju();Sd();br();Mt();Md();Md();UE=[{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}],qr=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 jd(o,c),g=await L.getCurrentTask(o),w=await L.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(ao(),ri)),h=await b.detect(t);if(h){let xe=w.find(kt=>kt.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 kt=await b.create(t,xe);await b.setup(kt.path,t),x=kt.path,os("info",`Parallel session created: \`${kt.branch}\` at \`${kt.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=wu(c),y;try{y=Uo.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([La(t),mt.getActive(o).catch(()=>null),GE(I),Ns(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),kt=Math.floor((Date.now()-xe.getTime())/(1e3*60*60*24));kt>7&&(Ne=os("warn",`Analysis is ${kt} 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(([,kt])=>kt>.3).sort((kt,Za)=>Za[1]-kt[1]).slice(0,5);xe.length>0&&(us=`### Previously Useful Files
1667
- ${xe.map(([Za])=>`\`${Za}\``).join(", ")}`)}let Va=ly(c,o),Ja=yr({description:c,branch:G,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes,estimateSource:p.source,domains:Va}),za=ou(Ve.files.map(xe=>({path:xe.path,description:xe.reasons.join(", ")}))),Ka=Ve.files.map(xe=>xe.path),Xa=Dd(Q,Ka),Ya=$d(Ve.files,Q),Qa=le([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ue=HE(),tw=WE(o);console.log(U(he,Ne,Ja,Ya,za,us,Xa,tw,ue,Qa));try{let xe=await L.getCurrentTask(o);xe&&Uo.recordSuggestions(o,xe.id,M,Ve.files.map(kt=>kt.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 m=await jd(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}`),jo("working"),Gt("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:ey,pointsToMinutes:Wn,pointsToTimeRange:ty,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?xs(new Date(i.startedAt)):void 0,c=yr({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?ru(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(()=>(ao(),ri)),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=xs(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?uy(g):"0m",actualDuration:m||"0m",variance:g?VE(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 (${uy(g)}) \u2192 ${Q}${G}%`}let T=[],I=null,M=null;try{if(T=await BE(e,a.startedAt),T.length>0){Uo.completeFeedback(n,a.id,T);let D=Uo.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",ys()).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 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})
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(),Ct(ci)),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}`),jo("completed"),Gt("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`),Gt("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=xs(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})`:""}`),jo("paused"),Gt("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)}`),jo("working"),Gt("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 UE){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(qE(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?nu(a.join(`
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(`
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 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(!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 xd.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(`
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
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(`
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 xd.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(HE,"buildEfficiencySection");l(WE,"buildRpiSection");l(uy,"formatMinutesToDuration");l(GE,"loadRepoAnalysis");l(qE,"buildFlowDiagram");l(BE,"getFilesModifiedSinceTaskStart");l(VE,"formatVariance")});var un,zq,_d=S(()=>{"use strict";Ca();Yu();xa();ld();dd();md();gd();Ea();kd();bd();vd();Td();Od();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 qr,this.planning=new Nn,this.shipping=new Fr,this.analytics=new Pr,this.performanceCmds=new Mr,this.maintenance=new jr,this.analysis=new Un,this.setupCmds=new _r,this.updateCmds=new Hr,this.velocityCmds=new Wr,this.contextCmds=new an,this.obsidianCmds=new Ir,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)}},zq=new un});var Ho,Br,Nd=S(()=>{"use strict";Ho={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}},Br=[{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 fy={};Se(fy,{UninstallCommands:()=>Go,uninstall:()=>gy});import{execSync as Fa}from"node:child_process";import Ot from"node:fs/promises";import JE from"node:os";import Fs from"node:path";import zE 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=Fs.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 dy(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 KE(r){try{return(await Ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function XE(){let r={homebrew:!1,npm:!1};try{Fa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Fa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function YE(){let r=[],e=xm(),t=A.getGlobalBasePath(),s=await C(t),n=s?await KE(Fs.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=Fs.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(Ua)&&T.includes(Wo)}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=Fs.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=Fs.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(Ua)&&T.includes(Wo)}catch{}return h&&x&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function QE(r){try{let e=await Ot.readFile(r,"utf-8");if(!e.includes(Ua)||!e.includes(Wo))return!1;let t=e.indexOf(Ua),s=e.indexOf(Wo)+Wo.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(!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,`
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 ZE(){let r=JE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Fs.join(r,`.prjct-backup-${e}`);try{await Ot.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await C(s)&&await my(s,Fs.join(t,".prjct-cli")),t}catch{return null}}async function my(r,e){await Ot.mkdir(e,{recursive:!0});let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Fs.join(r,s.name),o=Fs.join(e,s.name);s.isDirectory()?await my(n,o):await Ot.copyFile(n,o)}}async function eC(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await QE(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 Ds().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Fa(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||Fa("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${k(o)}`)}}return{deleted:s,errors:n}}async function tC(r){let e=zE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function gy(r={},e=process.cwd()){let t=await YE(),s=XE(),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(`(${dy(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: ${dy(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 ZE();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 tC("> ")))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 eC(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 Ua,Wo,Go,Ld=S(()=>{"use strict";$s();ve();W();B();Mt();Ua="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Wo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(py,"getDirectorySize");l(dy,"formatSize");l(KE,"countDirectoryItems");l(XE,"detectInstallation");l(YE,"gatherUninstallItems");l(QE,"removePrjctSection");l(ZE,"createBackup");l(my,"copyDirectory");l(eC,"performUninstall");l(tC,"promptConfirmation");l(gy,"uninstall");Go=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return gy(e,t)}}});function lC(){for(let[r,e]of Object.entries(Ho))H.registerCategory(r,e)}function uC(){if(H.has("work"))return;lC();let r=l(e=>Br.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",Ha,"init",r("init")),H.registerMethod("bug",Ha,"bug",r("bug")),H.registerMethod("idea",Ha,"idea",r("idea")),H.registerMethod("spec",Ha,"spec",r("spec")),H.registerMethod("ship",sC,"ship",r("ship")),H.registerMethod("dash",hy,"dash",r("dash")),H.registerMethod("help",hy,"help",r("help")),H.registerMethod("perf",nC,"perf",r("perf")),H.registerMethod("velocity",oC,"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",Vr,"analyze",r("analyze")),H.registerMethod("sync",Vr,"sync",r("sync")),H.registerMethod("stats",Vr,"stats",r("stats")),H.registerMethod("status",Vr,"status",r("status")),H.registerMethod("seal",Vr,"seal",r("seal")),H.registerMethod("verify",Vr,"verify",r("verify")),H.registerMethod("start",qo,"start",r("start")),H.registerMethod("setup",qo,"setup",r("setup")),H.registerMethod("login",qo,"login",r("login")),H.registerMethod("logout",qo,"logout",r("logout")),H.registerMethod("auth",qo,"auth",r("auth")),H.registerMethod("uninstall",aC,"uninstall",r("uninstall")),H.registerMethod("update",cC,"update",r("update")),H.registerMethod("context",rC,"context",r("context")),H.registerMethod("obsidian",iC,"obsidian",r("obsidian")),H.registerMethod("parallel",Fd,"parallel",r("parallel")),H.registerMethod("worktree",Fd,"parallel",r("worktree")),H.registerMethod("conductor",Fd,"parallel",r("conductor"))}var dn,Ha,sC,hy,nC,pn,Vr,qo,rC,oC,iC,Fd,aC,cC,Ud=S(()=>{"use strict";Ca();Yu();Nd();xa();ld();dd();md();gd();Ea();_o();kd();bd();Ld();vd();Td();Od();dn=new qr,Ha=new Nn,sC=new Fr,hy=new Pr,nC=new Mr,pn=new jr,Vr=new Un,qo=new _r,rC=new an,oC=new Wr,iC=new Ir,Fd=new Hn,aC=new Go,cC=new Hr;l(lC,"registerCategories");l(uC,"registerAllCommands");uC()});var ky={};Se(ky,{shutdown:()=>Gn,startDaemon:()=>mC});import Ze from"node:fs";import{createServer as dC}from"node:net";async function mC(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);wC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ze.unlinkSync(t)}Ze.existsSync(e)&&Ze.unlinkSync(e),bC();let n=kC(),o=null;if(n)try{o=Ze.statSync(n).mtimeMs}catch{}if(Oe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:ec,idleTimer:null,entryPath:n,entryMtime:o},Pe=new un,Jr=dC(i=>gC(i)),Jr.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}`),yy()}),Jr.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||Si;Bo=ki({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Bo.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 gC(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>tc){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 fC(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 fC(r){if(!Oe||!Pe)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(yy(),Oe.commandsServed++,Oe.lastActivity=Date.now(),Oe.commandsServed%pC===0&&N.checkpointAll(),wy()&&(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 yC(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 hC(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 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(`
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 hC(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 yC(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:wy()}};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 yy(){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),Bo&&(Bo.stop(),Bo=null),Jr&&(Jr.close(),Jr=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 wC(r){try{return process.kill(r,0),!0}catch{return!1}}function kC(){let r=_t("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 bC(){let r=Le.log();try{if(Ze.statSync(r).size>SC){let t=`${r}.1`;try{Ze.unlinkSync(t)}catch{}Ze.renameSync(r,t)}}catch{}}function wy(){if(!Oe?.entryPath||Oe.entryMtime===null)return!1;try{return Ze.statSync(Oe.entryPath).mtimeMs!==Oe.entryMtime}catch{return!1}}var pC,Jr,Bo,Pe,Oe,SC,Sy=S(()=>{"use strict";_d();_o();Ud();Te();el();ee();Vo();pC=50,Jr=null,Bo=null,Pe=null,Oe=null;l(mC,"startDaemon");l(gC,"handleConnection");l(fC,"handleRequest");l(hC,"executeCommand");l(yC,"handleDaemonCommand");l(yy,"resetIdleTimer");l(Gn,"shutdown");l(wC,"isProcessRunning");l(kC,"resolveEntryPath");SC=1024*1024;l(bC,"rotateLog");l(wy,"isCodeStale")});var Ty={};Se(Ty,{runStart:()=>IC});import ws from"node:fs/promises";import by from"node:os";import ks from"node:path";import K from"chalk";function EC(){console.clear(),console.log(vC),console.log(TC)}function vy(r,e){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 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
1690
  ${K.bold(" Select AI providers to configure:")}
1691
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 CC(){let r=await Cs(),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"),vy(e,s)},"render");vy(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(`
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(`
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
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 PC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=ks.join(e.configDir,"commands");await ws.mkdir(t,{recursive:!0});let{getPackageRoot:s}=await Promise.resolve().then(()=>(ut(),Xn)),n=s(),o=r==="claude"?"p.md":"p.toml",i=ks.join(n,"templates","commands",o),a=ks.join(t,o);return await C(i)?(await ws.copyFile(i,a),!0):!1}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function xC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=r==="gemini"?ks.join(e.configDir,"commands"):ks.join(e.configDir,"commands","p");await ws.mkdir(t,{recursive:!0});let s=new Set(["p.md","p.toml"]),o=Qs("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!s.has(i));for(let i of o){let a=vt(`commands/${i}`);a&&await ws.writeFile(ks.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 jC(r){let e=ze[r];if(!e.configDir)return!1;try{await ws.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(ut(),Xn)),s=t(),n=r==="claude"?"CLAUDE.md":"GEMINI.md",o=ks.join(s,"templates","global",n),i=ks.join(e.configDir,n);if(await C(o)){let a=await ws.readFile(o,"utf-8");if(await C(i)){let c=await ws.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 ws.writeFile(i,m+g+p)}else await ws.writeFile(i,`${c}
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
1698
 
1699
- ${a}`)}else await ws.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 RC(r){let e=ks.join(by.homedir(),".prjct-cli","config","installed-editors.json"),t={version:we,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:ks.join(by.homedir(),`.${r[0]}`,"commands")};await de(e,t)}function AC(r){console.log(`
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
1700
  ${K.green.bold(" \u2713 Setup complete!")}
1701
1701
  `),console.log(` ${K.dim("Configured providers:")}`),r.forEach(e=>{let t=ze[e];console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(`
1702
1702
  ${K.bold("Next steps:")}
@@ -1711,30 +1711,30 @@ ${K.green.bold(" \u2713 Setup complete!")}
1711
1711
  ${K.dim("\u2022")} Use ${K.bold("p. ship")} to create PRs
1712
1712
 
1713
1713
  ${K.dim("Learn more: https://prjct.app/docs")}
1714
- `)}async function IC(){EC();let r=await CC();console.log(`
1714
+ `)}async function MC(){xC();let r=await jC();console.log(`
1715
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 PC(e),n=await xC(e),o=await jC(e);console.log(s&&n&&o?K.green("\u2713"):s||o?K.yellow("partial"):K.yellow("skipped"))}await RC(r),AC(r)}var zr,Kr,Xr,Yr,Qr,vC,TC,Ey=S(()=>{"use strict";Zs();lt();W();B();ut();zr=K.rgb(180,180,175),Kr=K.rgb(200,200,195),Xr=K.rgb(220,220,215),Yr=K.rgb(235,235,230),Qr=K.rgb(250,250,245),vC=`
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
1717
 
1718
- ${zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Kr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Xr(" \u2588\u2588\u2557")}${Yr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Qr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1719
- ${zr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Kr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Xr(" \u2588\u2588\u2551")}${Yr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${Qr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1720
- ${zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Kr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Xr(" \u2588\u2588\u2551")}${Yr("\u2588\u2588\u2551 ")}${Qr(" \u2588\u2588\u2551 ")}
1721
- ${zr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${Kr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Xr("\u2588\u2588 \u2588\u2588\u2551")}${Yr("\u2588\u2588\u2551 ")}${Qr(" \u2588\u2588\u2551 ")}
1722
- ${zr(" \u2588\u2588\u2551 ")}${Kr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Xr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Yr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Qr(" \u2588\u2588\u2551 ")}
1723
- ${zr(" \u255A\u2550\u255D ")}${Kr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Xr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Yr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${Qr(" \u255A\u2550\u255D ")}
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
1724
 
1725
- `,TC=` ${K.white("Context Layer for AI Agents")} ${K.dim(`v${we}`)}
1725
+ `,PC=` ${K.white("Context Layer for AI Agents")} ${K.dim(`v${ke}`)}
1726
1726
 
1727
1727
  ${K.dim(`Project context layer for AI coding agents.
1728
1728
  Works with Claude Code, Gemini CLI, Codex, and more.`)}
1729
1729
  ${K.cyan("https://prjct.app")}
1730
- `;l(EC,"showBanner");l(vy,"showProviderSelection");l(CC,"selectProviders");l(PC,"installRouter");l(xC,"installSubcommands");l(jC,"installGlobalConfig");l(RC,"saveSetupConfig");l(AC,"showCompletion");l(IC,"runStart")});import xy from"node:fs/promises";import Us from"node:path";async function Zr(r,e=process.cwd(),t={}){let s=Us.isAbsolute(r)?r:Us.join(e,r),n;try{n=await xy.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=Us.extname(r).toLowerCase(),i=OC[o]||"unknown",a=MC[i]||[],c=await _C(n,a,s,e),u=[];t.reverse&&(u=await LC(r,e));let d;t.depth&&t.depth>0&&(d=await jy(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 _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 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 NC(c,t,s)),n.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function NC(r,e,t){let s=Us.dirname(e);if(r.startsWith("@/")){let o=Us.join(t,"src",r.slice(2));return Py(o,t)}let n=Us.resolve(s,r);return Py(n,t)}async function Py(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await xy.stat(n)).isFile())return Us.relative(e,n)}catch{}}return null}async function LC(r,e){let t=[],s=Us.basename(r,Us.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 jy(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 Zr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await jy(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var Cy,DC,$C,MC,OC,Hd=S(()=>{"use strict";W();Je();Cy=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],DC=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],$C=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],MC={typescript:Cy,javascript:Cy,python:DC,go:$C},OC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Zr,"analyzeImports");l(_C,"extractImports");l(NC,"resolveImport");l(Py,"tryResolve");l(LC,"findImportedBy");l(jy,"buildDependencyTree")});import Ry from"node:fs/promises";import Ss from"node:path";async function Wa(r,e=process.cwd()){let t=Ss.isAbsolute(r)?r:Ss.join(e,r),s;try{s=await Ry.readFile(t,"utf-8")}catch(p){if(O(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Mn("")};throw p}let n=Ss.extname(r).toLowerCase(),o=Ay[n]||"unknown",i=await rn(r,e),a=await Zr(r,e),c=UC(s,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?HC(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=WC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:ca(s,m)}}async function Wd(r,e=process.cwd(),t={}){let s=Ss.isAbsolute(r)?r:Ss.join(e,r),n=[];async function o(i){let a=await Ry.readdir(i,{withFileTypes:!0});for(let c of a){let u=Ss.join(i,c.name),d=Ss.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=Ss.extname(c.name).toLowerCase();if(Ay[m]){let p=await Wa(d,e);n.push(p)}}}}return l(o,"processDir"),await o(s),n}function UC(r,e){let t=FC[e]||[],s=r.split(`
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(`
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
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: ${Ss.basename(n,Ss.extname(n))}`}function HC(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1736
- `)[0].trim()}function WC(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 FC,Ay,Iy=S(()=>{"use strict";W();Hd();ua();la();FC={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}]},Ay={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Wa,"summarizeFile");l(Wd,"summarizeDirectory");l(UC,"extractFilePurpose");l(HC,"extractDescriptionFromDocstring");l(WC,"buildSummaryText")});var Dy={};Se(Dy,{analyzeImports:()=>Zr,extractDirectorySignatures:()=>Tu,extractSignatures:()=>rn,findRelevantFiles:()=>Ns,getRecentFiles:()=>Mo,runContextTool:()=>GC,summarizeDirectory:()=>Wd,summarizeFile:()=>Wa});async function GC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await qC(o,t);break;case"signatures":i=await BC(o,t);break;case"imports":i=await VC(o,t);break;case"recent":i=await JC(o,t);break;case"summary":i=await zC(o,t);break;case"help":return{tool:"error",result:{error:QC(),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=KC(i),u=XC(i);return await YC(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 qC(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 Ns(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function BC(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 Tu(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=vu(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 VC(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 Zr(t,e,s)}}async function JC(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 Mo(e,t)}}async function zC(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 Wd(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:vu(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Wa(t,e)}}function KC(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 XC(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 YC(r,e){try{await Zt.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function QC(){return`
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`
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 $y=S(()=>{"use strict";go();W();X();$o();Hd();ku();ua();Iy();la();l(GC,"runContextTool");l(qC,"runFilesTool");l(BC,"runSignaturesTool");l(VC,"runImportsTool");l(JC,"runRecentTool");l(zC,"runSummaryTool");l(KC,"getTokensSaved");l(XC,"getCompressionRate");l(YC,"recordToolUsage");l(QC,"getHelpText")});var Ny={};Se(Ny,{hooksService:()=>oP});import nt from"node:fs/promises";import qe from"node:path";import Bt from"chalk";function Oy(){return`#!/bin/sh
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
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 _y(){return`#!/bin/sh
1819
+ `}function Uy(){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 Gd(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 My(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function ZC(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 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=`
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 eP(r,e){let t=qe.join(r,".husky");for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Oy():_y();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 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,`
1863
1863
  # prjct auto-sync
1864
1864
  prjct sync --quiet --yes &
1865
- `)}else await nt.writeFile(n,o,{mode:493})}return!0}async function tP(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"?Oy():_y();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 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,`
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 sP(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 nP(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 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(`
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 rP(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 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(`
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 qd,oP,Ly=S(()=>{"use strict";Te();ee();W();B();Fe();l(Oy,"getPostCommitScript");l(_y,"getPostCheckoutScript");l(Gd,"detectHookManagers");l(My,"selectStrategy");l(ZC,"installLefthook");l(eP,"installHusky");l(tP,"installDirect");l(sP,"uninstallLefthook");l(nP,"uninstallHusky");l(rP,"uninstallDirect");qd=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await Gd(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||My(n);try{let i=!1;switch(o){case"lefthook":i=await ZC(e,s);break;case"husky":i=await eP(e,s);break;case"direct":i=await tP(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 sP(e);break;case"husky":n=await nP(e);break;case"direct":n=await rP(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 Gd(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 Gd(e),s=My(t);console.log(` Strategy: ${Bt.cyan(s)}`),console.log(` Hooks: ${Bt.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(` ${Bt.green("\u2713")} ${o}`);console.log(""),console.log(Bt.dim(" Context will auto-sync on commit and branch switch.")),console.log(Bt.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: ${Bt.green("Active")}`),console.log(` Strategy: ${Bt.cyan(t.strategy)}`)):console.log(` Status: ${Bt.dim("Not installed")}`),console.log("");for(let s of t.hooks){let n=s.installed?Bt.green("\u2713"):Bt.dim("\u25CB"),o=s.installed?s.name:Bt.dim(s.name);console.log(` ${n} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Bt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Bt.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{}}},oP=new qd});var Uy={};Se(Uy,{DoctorService:()=>Ga,doctorService:()=>aP});import{execSync as Bd}from"node:child_process";import iP from"node:fs/promises";import Fy from"node:path";import mn from"chalk";var Ga,aP,Hy=S(()=>{"use strict";Te();ve();hr();St();B();Io();Fe();ut();gr();Ga=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=Bd(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=Fy.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=Fy.join(this.globalPath,"context","CLAUDE.md");try{let t=await iP.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{Bd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=Bd("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 fr({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 Cf(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await Pf(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 xf(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${we}`)}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")}}},aP=new Ga});var Wy={};Se(Wy,{WatchService:()=>qa,watchService:()=>pP});import cP from"node:path";import wt from"chalk";import lP from"chokidar";var uP,dP,qa,pP,Gy=S(()=>{"use strict";Te();W();X();Qi();uP=["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"],dP=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],qa=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=lP.watch(uP,{cwd:this.projectPath,ignored:dP,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(wt.dim(`
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(wt.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(wt.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
- ${wt.dim(`[${t}]`)} ${wt.cyan("\u27F3")} ${s} changed \u2192 syncing...`)}try{let s=await Os.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,s.success?this.options.quiet||console.log(`${wt.dim(`[${t}]`)} ${wt.green("\u2713")} Synced`):console.error(`${wt.dim(`[${t}]`)} ${wt.red("\u2717")} Sync failed: ${s.error}`)}catch(s){console.error(`${wt.dim(`[${t}]`)} ${wt.red("\u2717")} Error: ${k(s)}`)}}handleError(e){console.error(wt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(wt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(wt.dim(` Project: ${cP.basename(this.projectPath)}`)),console.log(wt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(wt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(wt.dim(" Press Ctrl+C to stop")),console.log("")}},pP=new qa});var Xy={};Se(Xy,{formatAgentCommandHelp:()=>Jy,formatCommandHelp:()=>zy,formatCommandList:()=>Ky,formatMainHelp:()=>By,formatTerminalCommandHelp:()=>Vy,getHelp:()=>gP});import Y from"chalk";function By(){let r=[];r.push(""),r.push(`${Y.cyan.bold("prjct")} v${we} - 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 qy){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=Br.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 mP)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 Vy(r){let e=qy.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 Jy(r){let e=Br.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=Ho[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 zy(r){let e=Vy(r);if(e)return e;let t=Jy(r);return t||`
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(`
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||`
1881
1881
  ${Y.yellow(`Command '${r}' not found.`)}
1882
1882
 
1883
1883
  Run 'prjct help' to see all available commands.
1884
- `}function Ky(){let r=[];r.push(""),r.push(Y.cyan.bold("All Commands")),r.push("");let e=Object.entries(Ho).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=Br.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 gP(r){return r?r==="commands"||r==="all"?Ky():zy(r):By()}var qy,mP,Yy=S(()=>{"use strict";Nd();ut();qy=[{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"]}],mP=[{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(By,"formatMainHelp");l(Vy,"formatTerminalCommandHelp");l(Jy,"formatAgentCommandHelp");l(zy,"formatCommandHelp");l(Ky,"formatCommandList");l(gP,"getHelp")});var Qy=aw((QV,fP)=>{fP.exports={name:"prjct-cli",version:"1.56.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@modelcontextprotocol/sdk":"^1.28.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=18.0.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var TP={};import Zy from"node:os";import Ba from"node:path";import Be from"chalk";async function hP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>cw(Qy()));await bP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(vP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let p=wP(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}=SP(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=yP(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 Ys.expireIfStale(c),await Ys.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 Ys.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(rc(s)),t||f.end(),process.exit(1)}}function yP(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 wP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=kP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function kP(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 SP(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 bP(r){let e=await Cs(),t=Ba.join(Zy.homedir(),".claude","commands","p.md"),s=Ba.join(Zy.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Ba.join(process.cwd(),".cursor","commands","sync.md")),C(Ba.join(process.cwd(),".cursor"))]),c=await Vn();if(console.log(`
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(`
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 vP(){console.log(`
1892
+ `)}function CP(){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 ew=S(()=>{"use strict";_d();_o();Ud();lt();Te();Ci();Ei();W();ko();B();Fe();l(hP,"main");l(yP,"validateCommandParams");l(wP,"findClosestCommand");l(kP,"editDistance");l(SP,"parseCommandArgs");l(bP,"displayVersion");l(vP,"displayHelp");hP().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(rc(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var eo=process.argv.slice(2),Vd=eo.find(r=>!r.startsWith("--")&&!r.startsWith("-")),EP=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(Vd&&!EP.has(Vd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Vo(),zd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:s}=await Promise.resolve().then(()=>(vs(),bs)),n=await import("node:crypto"),o=[],i={};for(let a=0;a<eo.length;a++){let c=eo[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<eo.length&&!eo[a+1].startsWith("--")?i[u]=eo[++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:Vd,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 CP(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:s}=await Promise.resolve().then(()=>(lt(),Lt)),n=(await Promise.resolve().then(()=>(Te(),Cp))).default,o=(await Promise.resolve().then(()=>(ii(),xp))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(el(),lm)),{fileExists:c}=await Promise.resolve().then(()=>(B(),Nt)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(lc(),dp)),{VERSION:d}=await Promise.resolve().then(()=>(ut(),Xn));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(),gm));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(()=>(Ei(),ym));return await y.expireIfStale(M),await y.touch(M),()=>{let j=Date.now()-I;y.trackCommand(M,T,j).catch(()=>{}),Promise.resolve().then(()=>(Ci(),km)).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(()=>(vs(),bs));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(()=>(Sy(),ky)),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(()=>(vs(),bs));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(()=>(vs(),bs)),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(()=>(vs(),bs));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(()=>(vs(),bs));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(()=>(Ey(),Ty));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(()=>(xa(),jh)),Q=await new D().context(null,T,{md:j});process.exitCode=Q.success?0:1}else{let{runContextTool:D}=await Promise.resolve().then(()=>($y(),Dy)),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(()=>(Ly(),Ny)),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(()=>(Hy(),Uy)),M=await I.run(process.cwd());process.exitCode=M,T()}else if(p[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(Ld(),fy)),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(()=>(Gy(),Wy)),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(()=>(Yy(),Xy)),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 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(`
1952
1952
  ${t.cyan("p/")} prjct v${d}
1953
1953
  ${t.dim("Context layer for AI coding agents")}
1954
1954
 
@@ -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(()=>(hr(),Bi));await j.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(vs(),bs)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>(ew(),TP))}}}l(CP,"main");CP().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
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)});