prjct-cli 1.51.1 → 1.52.3

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.
@@ -5,11 +5,9 @@ import { dirname as __pathDirname } from 'path';
5
5
  var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
- var zr=Object.defineProperty;var If=Object.getOwnPropertyDescriptor;var $f=Object.getOwnPropertyNames;var Mf=Object.prototype.hasOwnProperty;var l=(r,e)=>zr(r,"name",{value:e,configurable:!0}),bt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ot=(r,e)=>{for(var t in e)zr(r,t,{get:e[t],enumerable:!0})},_f=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of $f(e))!Mf.call(r,n)&&n!==t&&zr(r,n,{get:()=>e[n],enumerable:!(s=If(e,n))||s.enumerable});return r};var ot=r=>_f(zr({},"__esModule",{value:!0}),r);var J={};Ot(J,{calculateDuration:()=>Vf,formatDate:()=>ln,formatDuration:()=>ht,formatMonth:()=>Nf,getDateKey:()=>Lf,getDateRange:()=>Hf,getDaysAgo:()=>gs,getDaysFromNow:()=>Uf,getEndOfDay:()=>zf,getStartOfDay:()=>Bf,getTimestamp:()=>T,getTodayKey:()=>Zl,getYearMonthDay:()=>Oi,isToday:()=>Gf,isWithinLastDays:()=>Wf,parseDate:()=>Ff,parseDurationMinutes:()=>yt,parseVarianceMinutes:()=>js,toRelative:()=>Jf});import{formatDistanceToNowStrict as Of}from"date-fns";function ln(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 Nf(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Zl(){return ln(new Date)}function Lf(r){return ln(r)}function Oi(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Ff(r){return new Date(r)}function T(){return new Date().toISOString()}function gs(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Uf(r){let e=new Date;return e.setDate(e.getDate()+r),e}function Hf(r,e){let t=[],s=new Date(r);for(;s<=e;)t.push(new Date(s)),s=new Date(s.getFullYear(),s.getMonth(),s.getDate()+1);return t}function Gf(r){return ln(r)===Zl()}function Wf(r,e){let t=gs(e);return r>=t}function ht(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 Vf(r,e=new Date){let t=e.getTime()-r.getTime();return ht(t)}function Bf(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function zf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Jf(r){let e=typeof r=="string"?new Date(r):r;return Of(e,{addSuffix:!0})}function js(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 yt(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 ie=S(()=>{"use strict";l(ln,"formatDate");l(Nf,"formatMonth");l(Zl,"getTodayKey");l(Lf,"getDateKey");l(Oi,"getYearMonthDay");l(Ff,"parseDate");l(T,"getTimestamp");l(gs,"getDaysAgo");l(Uf,"getDaysFromNow");l(Hf,"getDateRange");l(Gf,"isToday");l(Wf,"isWithinLastDays");l(ht,"formatDuration");l(Vf,"calculateDuration");l(Bf,"getStartOfDay");l(zf,"getEndOfDay");l(Jf,"toRelative");l(js,"parseVarianceMinutes");l(yt,"parseDurationMinutes")});var eu,tu,su,Ni=S(()=>{"use strict";eu=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"]),tu=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],su=/(?:import|from)\s+['"]([^'"]+)['"]/g});function qf(r){return r instanceof Error&&"code"in r}function R(r){return qf(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var W=S(()=>{"use strict";l(qf,"isNodeError");l(R,"isNotFoundError");l(w,"getErrorMessage")});import ou from"node:fs/promises";async function iu(r,e){let t;try{t=await ou.readFile(r,"utf-8")}catch(o){if(R(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await nu(r,t),ru(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await nu(r,t),ru(r,Kf(n.error)),null)}async function nu(r,e){let t=`${r}.backup`;try{await ou.writeFile(t,e,"utf-8")}catch{}}function ru(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 Kf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var au=S(()=>{"use strict";W();l(iu,"safeRead");l(nu,"createBackup");l(ru,"logCorruption");l(Kf,"formatZodError")});var Re={};Ot(Re,{appendLine:()=>Li,appendToFile:()=>Yf,atomicWrite:()=>Xf,batchProcess:()=>$s,copyFile:()=>nh,deleteDir:()=>eh,deleteFile:()=>Zf,dirExists:()=>es,ensureDir:()=>Tt,fileExists:()=>P,getFileExtension:()=>ah,getFileModifiedTime:()=>sh,getFileNameWithoutExtension:()=>ch,getFileSize:()=>th,listFiles:()=>ts,moveFile:()=>rh,prependToFile:()=>Qf,readFile:()=>it,readJson:()=>xe,readLines:()=>oh,walkDir:()=>Is,writeFile:()=>Jt,writeJson:()=>le,writeLines:()=>ih});import we from"node:fs/promises";import Zt from"node:path";async function Is(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 we.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(eu.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let p=Zt.join(i,u);c.isDirectory()?await o(p):c.isFile()&&t.push(Zt.relative(r,p))}}return l(o,"walk"),await o(r),t}async function $s(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 xe(r,e=null,t){if(t)return await iu(r,t)??e;try{let s=await we.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(R(s))return e;throw s}}async function le(r,e,t=2){let s=Zt.dirname(r);await we.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await we.writeFile(r,n,"utf-8")}async function it(r,e=""){try{return await we.readFile(r,"utf-8")}catch(t){if(R(t))return e;throw t}}async function Jt(r,e){let t=Zt.dirname(r);await we.mkdir(t,{recursive:!0}),await we.writeFile(r,e,"utf-8")}async function Xf(r,e){let t=Zt.dirname(r);await we.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await we.writeFile(s,e,"utf-8"),await we.rename(s,r)}async function Yf(r,e){await we.appendFile(r,e,"utf-8")}async function Li(r,e){let t=Zt.dirname(r);await we.mkdir(t,{recursive:!0}),await we.appendFile(r,`${e}
9
- `,"utf-8")}async function Qf(r,e){try{let t=await we.readFile(r,"utf-8");await we.writeFile(r,e+t,"utf-8")}catch(t){if(R(t))await we.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await we.access(r),!0}catch(e){if(R(e))return!1;throw e}}async function es(r){try{return(await we.stat(r)).isDirectory()}catch(e){if(R(e))return!1;throw e}}async function Tt(r){await we.mkdir(r,{recursive:!0})}async function Zf(r){try{return await we.unlink(r),!0}catch(e){if(R(e))return!1;throw e}}async function eh(r){try{return await we.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(R(e))return!1;throw e}}async function ts(r,e={}){try{let s=await we.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(R(t))return[];throw t}}async function th(r){return(await we.stat(r)).size}async function sh(r){return(await we.stat(r)).mtime}async function nh(r,e){await we.copyFile(r,e)}async function rh(r,e){await we.rename(r,e)}async function oh(r){return(await it(r,"")).split(`
10
- `)}async function ih(r,e){let t=e.join(`
11
- `);await Jt(r,t)}function ah(r){return Zt.extname(r)}function ch(r){return Zt.basename(r,Zt.extname(r))}var K=S(()=>{"use strict";Ni();au();W();l(Is,"walkDir");l($s,"batchProcess");l(xe,"readJson");l(le,"writeJson");l(it,"readFile");l(Jt,"writeFile");l(Xf,"atomicWrite");l(Yf,"appendToFile");l(Li,"appendLine");l(Qf,"prependToFile");l(P,"fileExists");l(es,"dirExists");l(Tt,"ensureDir");l(Zf,"deleteFile");l(eh,"deleteDir");l(ts,"listFiles");l(th,"getFileSize");l(sh,"getFileModifiedTime");l(nh,"copyFile");l(rh,"moveFile");l(oh,"readLines");l(ih,"writeLines");l(ah,"getFileExtension");l(ch,"getFileNameWithoutExtension")});var or=S(()=>{"use strict"});import{z as qt}from"zod";function cu(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 Uv,Hv,Gv,un,Wv,Jr=S(()=>{"use strict";Uv=qt.enum(["opus","sonnet","haiku"]),Hv=qt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Gv=qt.string().min(1),un=qt.object({provider:qt.string(),model:qt.string(),cliVersion:qt.string().optional(),recordedAt:qt.string()}),Wv=qt.object({preferredModel:qt.string().optional(),lastAnalysisModel:un.optional()});l(cu,"compareSemver")});var uu={};Ot(uu,{execAsync:()=>O,execFileAsync:()=>Fi});import{exec as lh,execFile as uh}from"node:child_process";import{promisify as lu}from"node:util";var O,Fi,He=S(()=>{"use strict";O=lu(lh),Fi=lu(uh)});function fs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var dn,Ms=S(()=>{"use strict";l(fs,"isExpired");dn=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}}});import dh from"node:fs/promises";import ph from"node:os";import du from"node:path";async function mu(){try{let r=await dh.readFile(pu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||fs(e.timestamp,gh)?null:e.detection}catch{return null}}async function gu(r){let e={timestamp:new Date().toISOString(),detection:r};await le(pu,e)}var mh,pu,gh,fu=S(()=>{"use strict";Ms();K();mh=du.join(ph.homedir(),".prjct-cli","cache"),pu=du.join(mh,"providers.json"),gh=600*1e3;l(mu,"readProviderCache");l(gu,"writeProviderCache")});var vt={};Ot(vt,{AntigravityProvider:()=>Hi,ClaudeProvider:()=>qr,CodexProvider:()=>Gi,CursorProvider:()=>yu,GeminiProvider:()=>Ui,Providers:()=>gt,WindsurfProvider:()=>wu,detectAllProviders:()=>ir,detectAntigravity:()=>Yr,detectCodex:()=>_s,detectCursorProject:()=>bu,detectProvider:()=>Kr,detectWindsurfProject:()=>Tu,getActiveProvider:()=>wh,getCapabilities:()=>hh,getCommandsDir:()=>Ph,getGlobalContextPath:()=>Th,getGlobalSettingsPath:()=>vh,getProjectCommandsPath:()=>Eh,getProviderBranding:()=>Xr,getSkillsPath:()=>Ch,hasProviderConfig:()=>kh,needsCursorRouterRegeneration:()=>Sh,needsWindsurfRouterRegeneration:()=>bh,selectProvider:()=>Wi,validateCliVersion:()=>Su});import hs from"node:os";import Ve from"node:path";function hh(r,e){return{...fh[r],...e}}async function ku(r){try{let{stdout:e}=await O(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function yh(r){try{let{stdout:e}=await O(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Kr(r){let e=gt[r];if(!e.cliCommand)return{installed:!1};let t=await ku(e.cliCommand);if(!t)return{installed:!1};let s=await yh(e.cliCommand),n=Su(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Su(r,e){let t=gt[r];return!t.minCliVersion||!e?null:cu(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 ir(r=!1){if(!r){let i=await mu();if(i)return i}let[e,t,s]=await Promise.all([Kr("claude"),Kr("gemini"),_s()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await gu(o).catch(()=>{}),o}async function wh(r){if(r&&gt[r])return gt[r];let e=await ir();return e.claude.installed&&!e.gemini.installed?qr:e.gemini.installed&&!e.claude.installed?Ui:qr}async function kh(r){let e=gt[r];return e.configDir?P(e.configDir):!1}function Xr(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 bu(r){let e=Ve.join(r,".cursor"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.mdc"),[n,o]=await Promise.all([P(e),P(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Sh(r){let e=await bu(r);return e.detected&&!e.routerInstalled}async function Tu(r){let e=Ve.join(r,".windsurf"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.md"),[n,o]=await Promise.all([P(e),P(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function bh(r){let e=await Tu(r);return e.detected&&!e.routerInstalled}async function Yr(){let r=Hi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ve.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function _s(){let r=Gi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await ku("codex"),t=Ve.join(r,"skills","prjct","SKILL.md"),s=await P(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Th(r){let e=gt[r];return e.configDir?Ve.join(e.configDir,e.contextFile):null}function vh(r){let e=gt[r];return!e.configDir||!e.settingsFile?null:Ve.join(e.configDir,e.settingsFile)}function Ch(r){return gt[r].skillsDir}function Ph(r){return gt[r].commandsDir}function Eh(r,e){let t=gt[r];return Ve.join(e,t.commandsDir)}async function Wi(){let r=await ir(),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 fh,qr,Ui,Hi,yu,wu,Gi,gt,at=S(()=>{"use strict";or();Jr();He();K();fu();fh={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(hh,"getCapabilities");qr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ve.join(hs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ve.join(hs.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"},Ui={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ve.join(hs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ve.join(hs.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"},Hi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ve.join(hs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ve.join(hs.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"},yu={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"},wu={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"},Gi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ve.join(hs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ve.join(hs.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"},gt={claude:qr,gemini:Ui,cursor:yu,antigravity:Hi,windsurf:wu,codex:Gi};l(ku,"whichCommand");l(yh,"getCliVersion");l(Kr,"detectProvider");l(Su,"validateCliVersion");l(ir,"detectAllProviders");l(wh,"getActiveProvider");l(kh,"hasProviderConfig");l(Xr,"getProviderBranding");l(bu,"detectCursorProject");l(Sh,"needsCursorRouterRegeneration");l(Tu,"detectWindsurfProject");l(bh,"needsWindsurfRouterRegeneration");l(Yr,"detectAntigravity");l(_s,"detectCodex");l(Th,"getGlobalContextPath");l(vh,"getGlobalSettingsPath");l(Ch,"getSkillsPath");l(Ph,"getCommandsDir");l(Eh,"getProjectCommandsPath");l(Wi,"selectProvider")});import xh from"node:crypto";import Kt from"node:fs/promises";import Vi from"node:os";import z from"node:path";import{globSync as Rh}from"glob";var Bi,Ah,A,Te=S(()=>{"use strict";ie();K();Bi=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(Vi.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 xh.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 es(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Tt(this.globalBaseDir),await Tt(this.globalProjectsDir),await Tt(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 Tt(z.join(t,n));return await Tt(z.join(t,"planning","tasks")),await Tt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Oi(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 Tt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Kt.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 Kt.readdir(c,{withFileTypes:!0});for(let p of u){if(!p.isDirectory()||s&&p.name!==s.toString().padStart(2,"0"))continue;let m=z.join(c,p.name),d=await Kt.readdir(m,{withFileTypes:!0});for(let g of d)g.isDirectory()&&o.push({year:a.name,month:p.name,day:g.name,path:z.join(m,g.name),date:new Date(`${a.name}-${p.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 Kt.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 es(t)}getDisplayPath(e){let t=Vi.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(at(),ot(vt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(at(),ot(vt)).getActiveProvider();return(at(),ot(vt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(Vi.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 P(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await P(n))try{let o=await Kt.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 Kt.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
12
- `).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 Kt.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 P(c)){let u=await Kt.readFile(c,"utf-8"),p=JSON.parse(u);p.packages&&(n=p.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=z.join(e,"package.json"),i=await Kt.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=Rh(o,{cwd:e,absolute:!1});for(let a of i){let c=z.join(e,a),u=z.join(c,"package.json");if(await P(u))try{let p=await Kt.readFile(u,"utf-8"),m=JSON.parse(p),d=z.join(c,"PRJCT.md");s.push({name:m.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await P(d)})}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}},Ah=new Bi,A=Ah});function vu(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function zi(){if(vu()==="bun")return!0;try{let{execSync:r}=bt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Os(){return vu()==="bun"}var ar=S(()=>{"use strict";l(vu,"detectRuntime");l(zi,"isBunAvailable");l(Os,"isBun")});var Zr={};Ot(Zr,{PrjctDatabase:()=>Qr,default:()=>N,prjctDb:()=>C});import Ji from"node:fs";import Cu from"node:path";function Dh(r){if(Os()){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 jh,Ih,Qr,C,N,re=S(()=>{"use strict";Te();ar();l(Dh,"openDatabase");jh=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
8
+ var $r=Object.defineProperty;var Og=Object.getOwnPropertyDescriptor;var Ng=Object.getOwnPropertyNames;var Lg=Object.prototype.hasOwnProperty;var l=(r,e)=>$r(r,"name",{value:e,configurable:!0}),gt=(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 v=(r,e)=>()=>(r&&(e=r(r=0)),e);var Bt=(r,e)=>{for(var t in e)$r(r,t,{get:e[t],enumerable:!0})},Fg=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ng(e))!Lg.call(r,n)&&n!==t&&$r(r,n,{get:()=>e[n],enumerable:!(s=Og(e,n))||s.enumerable});return r};var ot=r=>Fg($r({},"__esModule",{value:!0}),r);import{z as ke}from"zod";function Ug(r){return r instanceof Zs}function oe(r){return Ug(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var en,Wb,Vb,Bb,Jb,zb,qb,Zs,Mr,_r,er,Jt=v(()=>{"use strict";en={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}},Wb=en.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),Vb=en.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),Bb=en.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),Jb=en.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),zb=en.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),qb=en.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),Zs=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)}},Mr=class r extends Zs{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")}},_r=class r extends Zs{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")}},er=class r extends Zs{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(Ug,"isPrjctError");l(oe,"getErrorMessage")});function Hg(r){return r instanceof Error&&"code"in r}function A(r){return Hg(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var H=v(()=>{"use strict";l(Hg,"isNodeError");l(A,"isNotFoundError");l(y,"getErrorMessage")});import{formatDistanceToNowStrict as eT}from"date-fns";function Rl(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 Al(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function b(){return new Date().toISOString()}function is(r){let e=new Date;return e.setDate(e.getDate()-r),e}function it(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 zt(r,e=new Date){let t=e.getTime()-r.getTime();return it(t)}function tn(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 z=v(()=>{"use strict";l(Rl,"formatDate");l(Al,"getYearMonthDay");l(b,"getTimestamp");l(is,"getDaysAgo");l(it,"formatDuration");l(zt,"calculateDuration");l(tn,"parseVarianceMinutes");l(ft,"parseDurationMinutes")});var Dl,jl,Il,Ei=v(()=>{"use strict";Dl=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"]),jl=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Il=/(?:import|from)\s+['"]([^'"]+)['"]/g});import _l from"node:fs/promises";async function Ol(r,e){let t;try{t=await _l.readFile(r,"utf-8")}catch(o){if(A(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await $l(r,t),Ml(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await $l(r,t),Ml(r,Gg(n.error)),null)}async function $l(r,e){let t=`${r}.backup`;try{await _l.writeFile(t,e,"utf-8")}catch{}}function Ml(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 Gg(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Nl=v(()=>{"use strict";H();l(Ol,"safeRead");l($l,"createBackup");l(Ml,"logCorruption");l(Gg,"formatZodError")});import ht from"node:fs/promises";import tr from"node:path";async function sn(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 ht.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Dl.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=tr.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(tr.relative(r,d))}}return l(o,"walk"),await o(r),t}async function nn(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 Ee(r,e=null,t){if(t)return await Ol(r,t)??e;try{let s=await ht.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(A(s))return e;throw s}}async function ce(r,e,t=2){let s=tr.dirname(r);await ht.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await ht.writeFile(r,n,"utf-8")}async function Ae(r,e=""){try{return await ht.readFile(r,"utf-8")}catch(t){if(A(t))return e;throw t}}async function yt(r,e){let t=tr.dirname(r);await ht.mkdir(t,{recursive:!0}),await ht.writeFile(r,e,"utf-8")}async function Ll(r,e){let t=tr.dirname(r);await ht.mkdir(t,{recursive:!0}),await ht.appendFile(r,`${e}
9
+ `,"utf-8")}async function x(r){try{return await ht.access(r),!0}catch(e){if(A(e))return!1;throw e}}async function as(r){try{return(await ht.stat(r)).isDirectory()}catch(e){if(A(e))return!1;throw e}}async function We(r){await ht.mkdir(r,{recursive:!0})}async function cs(r,e={}){try{let s=await ht.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(A(t))return[];throw t}}var J=v(()=>{"use strict";Ei();Nl();H();l(sn,"walkDir");l(nn,"batchProcess");l(Ee,"readJson");l(ce,"writeJson");l(Ae,"readFile");l(yt,"writeFile");l(Ll,"appendLine");l(x,"fileExists");l(as,"dirExists");l(We,"ensureDir");l(cs,"listFiles")});var Ri={};Bt(Ri,{PACKAGE_ROOT:()=>at,VERSION:()=>ve,compareVersions:()=>Fl,getPackageInfo:()=>Wg,getPackageRoot:()=>xi,getVersion:()=>vs,isCompatible:()=>Vg,needsMigration:()=>Bg});import Pi from"node:fs";import Nr from"node:path";function xi(){if(sr)return sr;let r=__dirname;for(let e=0;e<5;e++){let t=Nr.join(r,"package.json");if(Pi.existsSync(t))try{if(JSON.parse(Pi.readFileSync(t,"utf-8")).name==="prjct-cli")return sr=r,r}catch{}r=Nr.dirname(r)}return sr=Nr.join(__dirname,"..","..",".."),sr}function vs(){if(Or)return Or;try{let r=Nr.join(xi(),"package.json"),e=JSON.parse(Pi.readFileSync(r,"utf-8"));return Or=e.version,Ci=e,Or}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}function Wg(){return Ci||vs(),Ci}function Fl(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 Vg(r){let e=vs(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function Bg(r,e=null){let t=e||vs();return Fl(r,t)<0}var Or,Ci,sr,ve,at,Pt=v(()=>{"use strict";H();Or=null,Ci=null,sr=null;l(xi,"getPackageRoot");l(vs,"getVersion");l(Wg,"getPackageInfo");l(Fl,"compareVersions");l(Vg,"isCompatible");l(Bg,"needsMigration");ve=vs(),at=xi()});var Hl={};Bt(Hl,{execAsync:()=>N,execFileAsync:()=>Es});import{exec as Jg,execFile as zg}from"node:child_process";import{promisify as Ul}from"node:util";var N,Es,Ue=v(()=>{"use strict";N=Ul(Jg),Es=Ul(zg)});async function Lr(r){try{let{stdout:e}=await N(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function qg(){let r=await Lr("gh api user --jq .login");return r.success&&r.output||(r=await Lr("git config --global github.user"),r.success&&r.output)?r.output:null}async function Kg(){let r=await Lr("git config user.name");return r.success&&r.output?r.output:null}async function Xg(){let r=await Lr("git config user.email");return r.success&&r.output?r.output:null}async function rn(){let[r,e,t]=await Promise.all([qg(),Kg(),Xg()]);return{github:r,email:t,name:e||r||"Unknown"}}var Fr=v(()=>{"use strict";Ue();l(Lr,"execCommand");l(qg,"detectGitHubUsername");l(Kg,"detectGitName");l(Xg,"detectGitEmail");l(rn,"detect")});var nr=v(()=>{"use strict"});import{z as Ht}from"zod";function Gl(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 vT,ET,PT,on,CT,Ur=v(()=>{"use strict";vT=Ht.enum(["opus","sonnet","haiku"]),ET=Ht.enum(["2.5-pro","2.5-flash","2.0-flash"]),PT=Ht.string().min(1),on=Ht.object({provider:Ht.string(),model:Ht.string(),cliVersion:Ht.string().optional(),recordedAt:Ht.string()}),CT=Ht.object({preferredModel:Ht.string().optional(),lastAnalysisModel:on.optional()});l(Gl,"compareSemver")});function ls(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var an,Ps=v(()=>{"use strict";l(ls,"isExpired");an=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}}});import Yg from"node:fs/promises";import Qg from"node:os";import Wl from"node:path";async function Bl(){try{let r=await Yg.readFile(Vl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||ls(e.timestamp,ef)?null:e.detection}catch{return null}}async function Jl(r){let e={timestamp:new Date().toISOString(),detection:r};await ce(Vl,e)}var Zg,Vl,ef,zl=v(()=>{"use strict";Ps();J();Zg=Wl.join(Qg.homedir(),".prjct-cli","cache"),Vl=Wl.join(Zg,"providers.json"),ef=600*1e3;l(Bl,"readProviderCache");l(Jl,"writeProviderCache")});var Ct={};Bt(Ct,{AntigravityProvider:()=>ji,ClaudeProvider:()=>Hr,CodexProvider:()=>Ii,CursorProvider:()=>Kl,GeminiProvider:()=>Di,Providers:()=>ct,WindsurfProvider:()=>Xl,detectAllProviders:()=>rr,detectAntigravity:()=>Vr,detectCodex:()=>Cs,detectCursorProject:()=>Zl,detectProvider:()=>Gr,detectWindsurfProject:()=>eu,getActiveProvider:()=>rf,getCapabilities:()=>sf,getCommandsDir:()=>mf,getGlobalContextPath:()=>lf,getGlobalSettingsPath:()=>uf,getProjectCommandsPath:()=>pf,getProviderBranding:()=>Wr,getSkillsPath:()=>df,hasProviderConfig:()=>of,needsCursorRouterRegeneration:()=>af,needsWindsurfRouterRegeneration:()=>cf,selectProvider:()=>$i,validateCliVersion:()=>Ql});import us from"node:os";import He from"node:path";function sf(r,e){return{...tf[r],...e}}async function Yl(r){try{let{stdout:e}=await N(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function nf(r){try{let{stdout:e}=await N(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Gr(r){let e=ct[r];if(!e.cliCommand)return{installed:!1};let t=await Yl(e.cliCommand);if(!t)return{installed:!1};let s=await nf(e.cliCommand),n=Ql(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Ql(r,e){let t=ct[r];return!t.minCliVersion||!e?null:Gl(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 rr(r=!1){if(!r){let i=await Bl();if(i)return i}let[e,t,s]=await Promise.all([Gr("claude"),Gr("gemini"),Cs()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await Jl(o).catch(()=>{}),o}async function rf(r){if(r&&ct[r])return ct[r];let e=await rr();return e.claude.installed&&!e.gemini.installed?Hr:e.gemini.installed&&!e.claude.installed?Di:Hr}async function of(r){let e=ct[r];return e.configDir?x(e.configDir):!1}function Wr(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 Zl(r){let e=He.join(r,".cursor"),t=He.join(e,"rules"),s=He.join(t,"prjct.mdc"),[n,o]=await Promise.all([x(e),x(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function af(r){let e=await Zl(r);return e.detected&&!e.routerInstalled}async function eu(r){let e=He.join(r,".windsurf"),t=He.join(e,"rules"),s=He.join(t,"prjct.md"),[n,o]=await Promise.all([x(e),x(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function cf(r){let e=await eu(r);return e.detected&&!e.routerInstalled}async function Vr(){let r=ji.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=He.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([x(r),x(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Cs(){let r=Ii.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Yl("codex"),t=He.join(r,"skills","prjct","SKILL.md"),s=await x(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function lf(r){let e=ct[r];return e.configDir?He.join(e.configDir,e.contextFile):null}function uf(r){let e=ct[r];return!e.configDir||!e.settingsFile?null:He.join(e.configDir,e.settingsFile)}function df(r){return ct[r].skillsDir}function mf(r){return ct[r].commandsDir}function pf(r,e){let t=ct[r];return He.join(e,t.commandsDir)}async function $i(){let r=await rr(),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 tf,Hr,Di,ji,Kl,Xl,Ii,ct,lt=v(()=>{"use strict";nr();Ur();Ue();J();zl();tf={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(sf,"getCapabilities");Hr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:He.join(us.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:He.join(us.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"},Di={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:He.join(us.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:He.join(us.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"},ji={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:He.join(us.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:He.join(us.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"},Kl={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"},Xl={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"},Ii={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:He.join(us.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:He.join(us.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"},ct={claude:Hr,gemini:Di,cursor:Kl,antigravity:ji,windsurf:Xl,codex:Ii};l(Yl,"whichCommand");l(nf,"getCliVersion");l(Gr,"detectProvider");l(Ql,"validateCliVersion");l(rr,"detectAllProviders");l(rf,"getActiveProvider");l(of,"hasProviderConfig");l(Wr,"getProviderBranding");l(Zl,"detectCursorProject");l(af,"needsCursorRouterRegeneration");l(eu,"detectWindsurfProject");l(cf,"needsWindsurfRouterRegeneration");l(Vr,"detectAntigravity");l(Cs,"detectCodex");l(lf,"getGlobalContextPath");l(uf,"getGlobalSettingsPath");l(df,"getSkillsPath");l(mf,"getCommandsDir");l(pf,"getProjectCommandsPath");l($i,"selectProvider")});import gf from"node:crypto";import Gt from"node:fs/promises";import Mi from"node:os";import B from"node:path";import{globSync as ff}from"glob";var _i,hf,R,fe=v(()=>{"use strict";z();J();_i=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?B.resolve(e):B.join(Mi.homedir(),".prjct-cli"),this.globalProjectsDir=B.join(this.globalBaseDir,"projects"),this.globalConfigDir=B.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=B.resolve(e),this.globalProjectsDir=B.join(this.globalBaseDir,"projects"),this.globalConfigDir=B.join(this.globalBaseDir,"config")}generateProjectId(e){return gf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return B.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return B.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return B.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return B.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await as(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await x(t)}async ensureGlobalStructure(){await We(this.globalBaseDir),await We(this.globalProjectsDir),await We(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 We(B.join(t,n));return await We(B.join(t,"planning","tasks")),await We(B.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Al(t);return B.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 We(s),s}async listSessions(e,t=null,s=null){let n=B.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Gt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=B.join(n,a.name),u=await Gt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=B.join(c,d.name),m=await Gt.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:B.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return B.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Gt.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 as(t)}getDisplayPath(e){let t=Mi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return B.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return B.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return B.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return B.join(this.globalBaseDir,".running")}getDocsPath(){return B.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),ot(Ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),ot(Ct)).getActiveProvider();return(lt(),ot(Ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return B.join(Mi.homedir(),".claude")}getClaudeSettingsPath(){return B.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return B.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return B.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=B.join(e,n.file);if(await x(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=B.join(e,"package.json");if(await x(n))try{let o=await Gt.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 Gt.readFile(B.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
10
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=B.join(e,"package.json"),i=await Gt.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=B.join(e,"lerna.json");if(await x(c)){let u=await Gt.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=B.join(e,"package.json"),i=await Gt.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=ff(o,{cwd:e,absolute:!1});for(let a of i){let c=B.join(e,a),u=B.join(c,"package.json");if(await x(u))try{let d=await Gt.readFile(u,"utf-8"),p=JSON.parse(d),m=B.join(c,"PRJCT.md");s.push({name:p.name||B.basename(a),path:c,relativePath:a,hasPrjctMd:await x(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=B.resolve(e);for(let n of t.packages){let o=B.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=B.resolve(e),s=B.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=B.dirname(t)}return null}},hf=new _i,R=hf});import Oi from"node:fs/promises";import yf from"node:path";import*as Br from"jsonc-parser";function tu(r){let e=[],t=Br.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}: ${Br.printParseErrorCode(s.error)}`)}return t}var Ni,wf,M,De=v(()=>{"use strict";Jt();H();z();J();Pt();Fr();fe();l(tu,"parseJsonc");Ni=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=R.getLocalConfigPath(e),s=await Oi.readFile(t,"utf-8");return tu(s)}catch(t){return A(t)||console.warn(`Warning: Could not read config at ${e}: ${oe(t)}`),null}}async writeConfig(e,t){let s=R.getLocalConfigPath(e);await ce(s,t)}async readGlobalConfig(e){try{let t=R.getGlobalProjectConfigPath(e),s=await Oi.readFile(t,"utf-8");return tu(s)}catch(t){return A(t)||console.warn(`Warning: Could not read global config for ${e}: ${oe(t)}`),null}}async writeGlobalConfig(e,t){let s=R.getGlobalProjectConfigPath(e);await ce(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=b();t={projectId:e,authors:[],version:ve,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=R.generateProjectId(e),n=R.getGlobalProjectPath(s),o=R.getDisplayPath(n),i=b(),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:ve,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=b(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await R.hasLegacyStructure(e))return!1;if(!await R.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=R.getGlobalProjectPath(n.projectId);try{return(await Oi.readdir(yf.join(o,"core"))).length===0}catch(i){return A(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:R.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=b();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=b(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await rn(),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=R.generateProjectId(e);return{projectId:s,dataPath:R.getDisplayPath(R.getGlobalProjectPath(s))}}},wf=new Ni,M=wf});import Jr from"node:fs/promises";var Li,kf,xs,zr=v(()=>{"use strict";De();fe();H();Ps();J();Li=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new an({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await M.getProjectId(e),n=R.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:R.getFilePath(s,"core","now.md"),next:R.getFilePath(s,"core","next.md"),context:R.getFilePath(s,"core","context.md"),shipped:R.getFilePath(s,"progress","shipped.md"),metrics:R.getFilePath(s,"progress","metrics.md"),ideas:R.getFilePath(s,"planning","ideas.md"),roadmap:R.getFilePath(s,"planning","roadmap.md"),specs:R.getFilePath(s,"planning","specs"),memory:R.getFilePath(s,"memory","context.jsonl"),patterns:R.getFilePath(s,"memory","patterns.json"),analysis:R.getFilePath(s,"analysis","repo-summary.md"),codePatterns:R.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 Jr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(A(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[p,m]=await Promise.all([Jr.readFile(d,"utf-8"),Jr.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(A(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Jr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(A(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 x(e)}getCacheStats(){return this._cache.stats()}},kf=new Li,xs=kf});function su(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Fi(){if(su()==="bun")return!0;try{let{execSync:r}=gt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Rs(){return su()==="bun"}var or=v(()=>{"use strict";l(su,"detectRuntime");l(Fi,"isBunAvailable");l(Rs,"isBun")});var Kr={};Bt(Kr,{PrjctDatabase:()=>qr,default:()=>I,prjctDb:()=>P});import Ui from"node:fs";import nu from"node:path";function Sf(r){if(Rs()){let{Database:n}=gt("bun:sqlite");return new n(r,{create:!0})}let e=gt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var bf,Tf,qr,P,I,ee=v(()=>{"use strict";fe();or();l(Sf,"openDatabase");bf=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
13
11
  -- =======================================================================
14
12
  -- Document storage (backward-compatible with JSON file pattern)
15
13
  -- =======================================================================
@@ -373,22 +371,133 @@ var zr=Object.defineProperty;var If=Object.getOwnPropertyDescriptor;var $f=Objec
373
371
  );
374
372
 
375
373
  CREATE INDEX idx_cc_project ON context_compactions(project_id);
376
- `)},"up")}],Ih=3,Qr=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Cu.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Ih&&this.evictLru();let s=this.getDbPath(e),n=Cu.dirname(s);Ji.existsSync(n)||Ji.mkdirSync(n,{recursive:!0});let o=Dh(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 Ji.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(`
374
+ `)},"up")},{version:10,name:"fts5-memories",up:l(r=>{r.run(`
375
+ -- =======================================================================
376
+ -- Memories: Tagged, searchable memory store (replaces memories.json)
377
+ -- =======================================================================
378
+ CREATE TABLE IF NOT EXISTS memories (
379
+ id TEXT PRIMARY KEY,
380
+ project_id TEXT NOT NULL,
381
+ title TEXT NOT NULL,
382
+ content TEXT NOT NULL,
383
+ tags TEXT,
384
+ topic_key TEXT,
385
+ content_hash TEXT,
386
+ user_triggered INTEGER NOT NULL DEFAULT 0,
387
+ revision_count INTEGER NOT NULL DEFAULT 1,
388
+ confidence TEXT,
389
+ observation_count INTEGER DEFAULT 0,
390
+ created_at TEXT NOT NULL,
391
+ updated_at TEXT NOT NULL,
392
+ deleted_at TEXT
393
+ );
394
+
395
+ CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_id);
396
+ CREATE INDEX IF NOT EXISTS idx_memories_topic ON memories(topic_key);
397
+ CREATE INDEX IF NOT EXISTS idx_memories_hash ON memories(content_hash);
398
+ CREATE INDEX IF NOT EXISTS idx_memories_deleted ON memories(deleted_at);
399
+
400
+ -- FTS5 virtual table for full-text search with BM25 ranking
401
+ CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
402
+ title, content, tags,
403
+ content='memories', content_rowid='rowid'
404
+ );
405
+
406
+ -- Triggers to keep FTS index in sync
407
+ CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
408
+ INSERT INTO memories_fts(rowid, title, content, tags)
409
+ VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
410
+ END;
411
+
412
+ CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
413
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
414
+ VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
415
+ END;
416
+
417
+ CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
418
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
419
+ VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
420
+ INSERT INTO memories_fts(rowid, title, content, tags)
421
+ VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
422
+ END;
423
+ `);try{let e=r.prepare("SELECT data FROM kv_store WHERE key = 'memory:memories'").get();if(e){let t=JSON.parse(e.data);if(t.memories&&t.memories.length>0){let s=r.prepare(`
424
+ INSERT OR IGNORE INTO memories
425
+ (id, project_id, title, content, tags, content_hash, user_triggered, confidence, observation_count, created_at, updated_at)
426
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
427
+ `);for(let n of t.memories)s.run(n.id,"_migrated",n.title,n.content,(n.tags||[]).join(","),null,n.userTriggered?1:0,n.confidence??null,n.observationCount??0,n.createdAt,n.updatedAt)}}}catch{}},"up")},{version:11,name:"agent-sessions",up:l(r=>{r.run(`
428
+ -- =======================================================================
429
+ -- Agent Sessions: Track AI agent work sessions across compactions
430
+ -- =======================================================================
431
+ CREATE TABLE IF NOT EXISTS agent_sessions (
432
+ id TEXT PRIMARY KEY,
433
+ project_id TEXT NOT NULL,
434
+ directory TEXT,
435
+ task_id TEXT,
436
+ goal TEXT,
437
+ started_at TEXT NOT NULL,
438
+ ended_at TEXT,
439
+ summary TEXT,
440
+ files_touched TEXT,
441
+ created_at TEXT NOT NULL
442
+ );
443
+
444
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_project ON agent_sessions(project_id);
445
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_task ON agent_sessions(task_id);
446
+
447
+ -- =======================================================================
448
+ -- User Prompts: Capture what the user asked (intent tracking)
449
+ -- =======================================================================
450
+ CREATE TABLE IF NOT EXISTS user_prompts (
451
+ id TEXT PRIMARY KEY,
452
+ project_id TEXT NOT NULL,
453
+ session_id TEXT,
454
+ content TEXT NOT NULL,
455
+ created_at TEXT NOT NULL
456
+ );
457
+
458
+ CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
459
+ CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
460
+ `);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],Tf=3,qr=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return nu.join(R.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Tf&&this.evictLru();let s=this.getDbPath(e),n=nu.dirname(s);Ui.existsSync(n)||Ui.mkdirSync(n,{recursive:!0});let o=Sf(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 Ui.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(`
377
461
  CREATE TABLE IF NOT EXISTS _migrations (
378
462
  version INTEGER PRIMARY KEY,
379
463
  name TEXT NOT NULL,
380
464
  applied_at TEXT NOT NULL
381
465
  )
382
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of jh)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}},C=new Qr,N=C});function eo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var H,cr=S(()=>{"use strict";H={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(eo,"calculateConfidence")});var Ns,lr,ur,dr=S(()=>{"use strict";re();cr();ie();Ns=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}},lr=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()}},ur=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:T(),...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 pr,qi=S(()=>{"use strict";re();cr();ie();dr();pr=class r extends Ns{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=T();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=eo(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=T(),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=T();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=eo(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=T(),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:T(),confidence:eo(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=T(),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 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}}});import $h from"node:crypto";import{homedir as Mh}from"node:os";import{join as _h}from"node:path";function ye(){return $h.randomUUID()}var GC,It=S(()=>{"use strict";l(ye,"generateUUID");GC=_h(Mh(),".prjct-cli","projects")});var Ls,Ki=S(()=>{"use strict";It();cr();ie();dr();Ls=class extends Ns{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(H),t={};for(let s of e)t[s]=[];return t}_normalizeIndex(e){let t=Object.values(H);for(let s of t)e.index[s]||(e.index[s]=[])}_coerceTags(e){let t=new Set(Object.values(H));return e.filter(s=>t.has(s))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(n),c=T(),u={id:ye(),title:t,content:s,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let p of a)i.index[p].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,s){let n=await this.load(e),o=n.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=n.memories[o],a=i.tags||[];if(s.title&&(i.title=s.title),s.content&&(i.content=s.content),s.tags){let c=this._coerceTags(s.tags);for(let u of a)n.index[u]=n.index[u].filter(p=>p!==t);for(let u of c)n.index[u].push(t);i.tags=c}return i.updatedAt=T(),await this.save(e),!0}async deleteMemory(e,t){let s=await this.load(e),n=s.memories.findIndex(i=>i.id===t);if(n===-1)return!1;let o=s.memories[n];for(let i of o.tags||[])s.index[i]&&(s.index[i]=s.index[i].filter(a=>a!==t));return s.memories.splice(n,1),await this.save(e),!0}async findByTags(e,t,s=!1){let n=await this.load(e),o=this._coerceTags(t);if(s)return n.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=n.index[a];for(let u of c)i.add(u)}return n.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let s=await this.load(e),n=t.toLowerCase();return s.memories.filter(o=>o.title.toLowerCase().includes(n)||o.content.toLowerCase().includes(n))}async getRelevantMemories(e,t,s=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let d of i.tags||[])c.includes(d)&&(a+=10);let p=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-p),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let d of m)i.content.toLowerCase().includes(d)&&(a+=2),i.title.toLowerCase().includes(d)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,s).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let s=await this.load(e),n=s.memories.length;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=s.memories.map(d=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,d.tags||[])),t.commandName){let v=this._getCommandTags(t.commandName),D=(d.tags||[]).filter(U=>v.includes(U));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(d.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),d.confidence?g.confidence=d.confidence==="high"?20:d.confidence==="medium"?12:5:d.observationCount&&(g.confidence=Math.min(20,d.observationCount*3)),t.taskDescription){let v=this._extractKeywordsFromText(t.taskDescription),D=0;for(let U of v)d.content.toLowerCase().includes(U)&&(D+=2),d.title.toLowerCase().includes(U)&&(D+=3);g.keywords=Math.min(15,D)}d.userTriggered&&(g.userTriggered=5);let y=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...d,relevanceScore:y,scoreBreakdown:g}}).filter(d=>d.relevanceScore>=i),p=c.sort((d,g)=>g.relevanceScore-d.relevanceScore).slice(0,o),m=p.length>0?Math.round(p.reduce((d,g)=>d+g.relevanceScore,0)/p.length):0;return{memories:p,metrics:{totalMemories:n,memoriesConsidered:c.length,memoriesReturned:p.length,filteringRatio:n>0?p.length/n:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){return 0}_getCommandTags(e){return{ship:[H.COMMIT_STYLE,H.SHIP_WORKFLOW,H.TEST_BEHAVIOR],feature:[H.ARCHITECTURE,H.CODE_STYLE],done:[H.SHIP_WORKFLOW],analyze:[H.TECH_STACK,H.ARCHITECTURE],spec:[H.ARCHITECTURE,H.CODE_STYLE],task:[H.BRANCH_NAMING,H.CODE_STYLE],sync:[H.TECH_STACK,H.ARCHITECTURE,H.DEPENDENCIES],test:[H.TEST_BEHAVIOR],bug:[H.CODE_STYLE,H.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),s=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(n=>n.length>2&&!s.has(n))}_extractContextTags(e){let t=[],s={ship:[H.COMMIT_STYLE,H.SHIP_WORKFLOW,H.TEST_BEHAVIOR],feature:[H.ARCHITECTURE,H.CODE_STYLE],done:[H.SHIP_WORKFLOW],analyze:[H.TECH_STACK,H.ARCHITECTURE],spec:[H.ARCHITECTURE,H.CODE_STYLE]};return e.commandName&&s[e.commandName]&&t.push(...s[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let s=["the","a","an","is","are","to","for","and","or","in"];return t.filter(n=>n.length>2&&!s.includes(n))}async autoRemember(e,t,s,n=""){let i={commit_footer:[H.COMMIT_STYLE],branch_naming:[H.BRANCH_NAMING],test_before_ship:[H.TEST_BEHAVIOR,H.SHIP_WORKFLOW],preferred_agent:[H.AGENT_PREFERENCE],code_style:[H.CODE_STYLE],verbosity:[H.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${s}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
383
- Context: ${n}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),s={};for(let[n,o]of Object.entries(t.index))s[n]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(n=>n.userTriggered).length,tagCounts:s,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Xi,Oh,ct,mr=S(()=>{"use strict";dr();qi();Ki();dr();qi();Ki();Xi=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Ls,this._patternStore=new pr,this._historyStore=new ur,this._sessionStore=new lr}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)}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)}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()}},Oh=new Xi,ct=Oh});import $t from"node:fs/promises";import Nt from"node:path";var Yi,Nh,Je,Pu=S(()=>{"use strict";W();He();K();Yi=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Nt.join(this.projectPath,"package.json"),t=await $t.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(R(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Nt.join(this.projectPath,"Cargo.toml");return await $t.readFile(e,"utf-8")}catch(e){if(R(e))return null;throw e}}async readRequirements(){try{let e=Nt.join(this.projectPath,"requirements.txt");return await $t.readFile(e,"utf-8")}catch(e){if(R(e))return null;throw e}}async readGoMod(){try{let e=Nt.join(this.projectPath,"go.mod");return await $t.readFile(e,"utf-8")}catch(e){if(R(e))return null;throw e}}async readGemfile(){try{let e=Nt.join(this.projectPath,"Gemfile");return await $t.readFile(e,"utf-8")}catch(e){if(R(e))return null;throw e}}async readMixExs(){try{let e=Nt.join(this.projectPath,"mix.exs");return await $t.readFile(e,"utf-8")}catch(e){if(R(e))return null;throw e}}async readPomXml(){try{let e=Nt.join(this.projectPath,"pom.xml");return await $t.readFile(e,"utf-8")}catch(e){if(R(e))return null;throw e}}async readComposerJson(){try{let e=Nt.join(this.projectPath,"composer.json"),t=await $t.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(R(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Nt.join(this.projectPath,"pyproject.toml");return await $t.readFile(e,"utf-8")}catch(e){if(R(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await O('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(`
384
- `).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 $t.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(R(e))return[];throw e}}async listDirectories(){try{return(await $t.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(R(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await O(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await O("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await O('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await O('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 O('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 P(Nt.join(this.projectPath,e))}async readFile(e){try{let t=Nt.join(this.projectPath,e);return await $t.readFile(t,"utf-8")}catch(t){if(R(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await O(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
385
- `).filter(Boolean)}catch{return[]}}},Nh=new Yi,Je=Nh});import{z as ve}from"zod";function Lh(r){return r instanceof pn}function ue(r){return Lh(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var mn,gP,fP,hP,yP,wP,kP,pn,to,so,gr,ss=S(()=>{"use strict";mn={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}},gP=mn.create("FileError",ve.object({path:ve.string(),operation:ve.enum(["read","write","delete","create","copy"]),reason:ve.string().optional()})),fP=mn.create("ValidationError",ve.object({field:ve.string(),expected:ve.string(),received:ve.string().optional(),message:ve.string().optional()})),hP=mn.create("PermissionError",ve.object({action:ve.string(),resource:ve.string(),reason:ve.string().optional()})),yP=mn.create("TaskError",ve.object({taskId:ve.string().optional(),operation:ve.enum(["create","update","complete","pause","resume","delete"]),reason:ve.string()})),wP=mn.create("SessionError",ve.object({sessionId:ve.string().optional(),reason:ve.string()})),kP=mn.create("SyncError",ve.object({projectId:ve.string().optional(),operation:ve.enum(["push","pull","auth","connect"]),reason:ve.string()})),pn=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)}},to=class r extends pn{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")}},so=class r extends pn{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")}},gr=class r extends pn{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(Lh,"isPrjctError");l(ue,"getErrorMessage")});var ta={};Ot(ta,{PACKAGE_ROOT:()=>Ze,VERSION:()=>Ae,compareVersions:()=>Eu,getPackageInfo:()=>Fh,getPackageRoot:()=>ea,getVersion:()=>Fs,isCompatible:()=>Uh,needsMigration:()=>Hh});import Qi from"node:fs";import ro from"node:path";function ea(){if(fr)return fr;let r=__dirname;for(let e=0;e<5;e++){let t=ro.join(r,"package.json");if(Qi.existsSync(t))try{if(JSON.parse(Qi.readFileSync(t,"utf-8")).name==="prjct-cli")return fr=r,r}catch{}r=ro.dirname(r)}return fr=ro.join(__dirname,"..","..",".."),fr}function Fs(){if(no)return no;try{let r=ro.join(ea(),"package.json"),e=JSON.parse(Qi.readFileSync(r,"utf-8"));return no=e.version,Zi=e,no}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Fh(){return Zi||Fs(),Zi}function Eu(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 Uh(r){let e=Fs(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function Hh(r,e=null){let t=e||Fs();return Eu(r,t)<0}var no,Zi,fr,Ae,Ze,Ct=S(()=>{"use strict";W();no=null,Zi=null,fr=null;l(ea,"getPackageRoot");l(Fs,"getVersion");l(Fh,"getPackageInfo");l(Eu,"compareVersions");l(Uh,"isCompatible");l(Hh,"needsMigration");Ae=Fs(),Ze=ea()});import na from"node:fs";import Gh from"node:fs/promises";import oo from"node:path";function ra(){if(xu)return sa;xu=!0;let r=oo.join(Ze,"dist","templates.json");try{let e=na.readFileSync(r,"utf-8");return sa=JSON.parse(e),sa}catch{return null}}function Vh(r){let e=Us.indexOf(r);e>-1&&Us.splice(e,1),Us.push(r)}function Bh(){for(;gn.size>=Wh&&Us.length>0;){let r=Us.shift();r&&gn.delete(r)}}function Ru(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(`
386
- `).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(p=>p.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function Au(r){if(gn.has(r))return Vh(r),gn.get(r);let e,t=ra();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=oo.join(Ze,"templates","commands",`${r}.md`);try{e=await Gh.readFile(n,"utf-8")}catch{throw so.notFound(r)}}let s=Ru(e);return Bh(),gn.set(r,s),Us.push(r),s}async function zh(r){return(await Au(r)).frontmatter["allowed-tools"]||[]}function Jh(){gn.clear(),Us.length=0}function wt(r){let e=ra();if(e?.[r])return e[r];let t=oo.join(Ze,"templates",r);try{return na.readFileSync(t,"utf-8")}catch{return null}}function fn(r){let e=ra();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=oo.join(Ze,"templates",r);try{return na.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var Wh,gn,Us,sa,xu,qh,oa,Hs=S(()=>{"use strict";ss();Ct();Wh=50,gn=new Map,Us=[],sa=null,xu=!1;l(ra,"loadBundle");l(Vh,"updateLruOrder");l(Bh,"evictLru");l(Ru,"parseFrontmatter");l(Au,"load");l(zh,"getAllowedTools");l(Jh,"clearCache");l(wt,"getTemplateContent");l(fn,"listTemplates");qh={load:Au,parseFrontmatter:Ru,getAllowedTools:zh,clearCache:Jh,getTemplateContent:wt,listTemplates:fn},oa=qh});function Xh(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Kh.has(r)||r.includes("prjct"))return{level:hn.debug,name:"debug"};let e=hn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function io(r,e,t){return Du>=r?(...s)=>console[t](e,...s):Qh}var hn,Kh,Du,Yh,Qh,Zh,V,ns=S(()=>{"use strict";hn={error:0,warn:1,info:2,debug:3},Kh=new Set(["1","true","*"]);l(Xh,"getLogLevel");({level:Du,name:Yh}=Xh()),Qh=l(()=>{},"noop");l(io,"createLogMethod");Zh={error:io(hn.error,"[prjct:error]","error"),warn:io(hn.warn,"[prjct:warn]","warn"),info:io(hn.info,"[prjct:info]","log"),debug:io(hn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Du>=0,"isEnabled"),level:l(()=>Yh,"level")},V=Zh});function ao(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
466
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of bf)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}},P=new qr,I=P});function Xr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Ne,ir=v(()=>{"use strict";Ne={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(Xr,"calculateConfidence")});var Yr,Qr,Zr,Hi=v(()=>{"use strict";ee();ir();z();Yr=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=I.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();I.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}},Qr=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()}},Zr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:b(),...t,type:t.type};I.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return I.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 eo,ru=v(()=>{"use strict";ee();ir();z();Hi();eo=class r extends Yr{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=b();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=Xr(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=b(),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=b();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=Xr(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=b(),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:b(),confidence:Xr(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=b(),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=I.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return I.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import vf from"node:crypto";import{homedir as Ef}from"node:os";import{join as Pf}from"node:path";function pe(){return vf.randomUUID()}var Hv,xt=v(()=>{"use strict";l(pe,"generateUUID");Hv=Pf(Ef(),".prjct-cli","projects")});import{createHash as ou}from"node:crypto";function ar(r){return ou("sha256").update(r).digest("hex")}function As(r){return ar(r).slice(0,16)}function iu(r){return ou("md5").update(r).digest("hex")}var Ds=v(()=>{"use strict";l(ar,"sha256");l(As,"sha256Short");l(iu,"md5")});function qt(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 cn,Gi=v(()=>{"use strict";xt();ee();ir();z();Ds();l(qt,"rowToMemory");cn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Ne));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=b(),d=As(s),p=I.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=I.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return I.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
467
+ revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=pe();return I.run(e,`INSERT INTO memories
468
+ (id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
469
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=I.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?As(i):n.content_hash;return I.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
470
+ revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,b(),t),!0}async deleteMemory(e,t){return I.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(I.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",b(),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 I.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
471
+ AND (${a}) ORDER BY updated_at DESC`,...c).map(qt)}async searchMemories(e,t,s=20,n=0){try{return I.query(e,`SELECT m.* FROM memories m
472
+ JOIN memories_fts fts ON m.rowid = fts.rowid
473
+ WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
474
+ ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(qt)}catch{let o=`%${t}%`;return I.query(e,`SELECT * FROM memories
475
+ WHERE project_id = ? AND deleted_at IS NULL
476
+ AND (title LIKE ? OR content LIKE ?)
477
+ ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(qt)}}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 I.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(qt);let o=n.join(" ");try{return I.query(e,`SELECT m.* FROM memories m
478
+ JOIN memories_fts fts ON m.rowid = fts.rowid
479
+ WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
480
+ ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(qt)}catch{return I.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(qt)}}async getRelevantMemoriesWithMetrics(e,t){let n=I.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,p)=>d+p.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[Ne.COMMIT_STYLE],branch_naming:[Ne.BRANCH_NAMING],test_before_ship:[Ne.TEST_BEHAVIOR,Ne.SHIP_WORKFLOW],preferred_agent:[Ne.AGENT_PREFERENCE],code_style:[Ne.CODE_STYLE],verbosity:[Ne.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
481
+ 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 I.query(e,`SELECT m.* FROM memories m
482
+ JOIN memories_fts fts ON m.rowid = fts.rowid
483
+ WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
484
+ ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(qt)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=I.query(e,`SELECT title, COUNT(*) as cnt FROM memories
485
+ WHERE project_id = ? AND deleted_at IS NULL
486
+ GROUP BY title HAVING cnt > 1`,e),n=b();for(let o of s){let i=I.query(e,`SELECT * FROM memories
487
+ WHERE project_id = ? AND title = ? AND deleted_at IS NULL
488
+ ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(m=>m.content!==a.content).map(m=>m.content)].filter((m,g,h)=>h.indexOf(m)===g).join(`
489
+
490
+ ---
387
491
 
388
- ${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 ia=S(()=>{"use strict";Hs();W();K();ns();Ct();l(ao,"mergeWithMarkers")});import et from"node:fs/promises";import co from"node:os";import Se from"node:path";async function ey(){try{let r=Se.join(co.homedir(),".prjct-cli","docs");await et.mkdir(r,{recursive:!0});let e=fn("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=wt(n);if(o){let i=Se.basename(n);await et.writeFile(Se.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(Ct(),ot(ta)),s=Se.join(t,"templates/global/docs");try{let n=await et.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Se.join(s,o),a=Se.join(r,o),c=await et.readFile(i,"utf-8");await et.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function ty(){let r=(at(),ot(vt)),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 et.mkdir(e.configDir,{recursive:!0});let n=Se.join(e.configDir,e.contextFile),o=ju;if(t!=="claude"){let g=wt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:h}=(Ct(),ot(ta)),k=Se.join(h,"templates","global",e.contextFile);try{o=await et.readFile(k,"utf-8")}catch{t==="gemini"&&(o=ju.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await et.readFile(n,"utf-8"),a=!0}catch(g){if(R(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)),h=i.substring(i.indexOf(u)+u.length);i=`${(g+h).replace(/\n{3,}/g,`
492
+ `),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&I.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)I.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=I.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?qt(s):null}async getAllMemories(e){return I.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(qt)}async getMemoryStats(e){let t=I.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 Wi,Cf,Ze,to=v(()=>{"use strict";Hi();ru();Gi();Wi=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new cn,this._patternStore=new eo,this._historyStore=new Zr,this._sessionStore=new Qr}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()}},Cf=new Wi,Ze=Cf});import Rt from"node:fs/promises";import $t from"node:path";var Vi,xf,Ve,au=v(()=>{"use strict";H();Ue();J();Vi=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=$t.join(this.projectPath,"package.json"),t=await Rt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(A(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=$t.join(this.projectPath,"Cargo.toml");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readRequirements(){try{let e=$t.join(this.projectPath,"requirements.txt");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readGoMod(){try{let e=$t.join(this.projectPath,"go.mod");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readGemfile(){try{let e=$t.join(this.projectPath,"Gemfile");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readMixExs(){try{let e=$t.join(this.projectPath,"mix.exs");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readPomXml(){try{let e=$t.join(this.projectPath,"pom.xml");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readComposerJson(){try{let e=$t.join(this.projectPath,"composer.json"),t=await Rt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(A(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=$t.join(this.projectPath,"pyproject.toml");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await N('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(`
493
+ `).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 Rt.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(A(e))return[];throw e}}async listDirectories(){try{return(await Rt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(A(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await N(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await N("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await N('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await N('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 N('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 x($t.join(this.projectPath,e))}async readFile(e){try{let t=$t.join(this.projectPath,e);return await Rt.readFile(t,"utf-8")}catch(t){if(A(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await N(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
494
+ `).filter(Boolean)}catch{return[]}}},xf=new Vi,Ve=xf});import Ji from"node:fs";import Rf from"node:fs/promises";import so from"node:path";function zi(){if(cu)return Bi;cu=!0;let r=so.join(at,"dist","templates.json");try{let e=Ji.readFileSync(r,"utf-8");return Bi=JSON.parse(e),Bi}catch{return null}}function Df(r){let e=js.indexOf(r);e>-1&&js.splice(e,1),js.push(r)}function jf(){for(;ln.size>=Af&&js.length>0;){let r=js.shift();r&&ln.delete(r)}}function lu(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(`
495
+ `).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 uu(r){if(ln.has(r))return Df(r),ln.get(r);let e,t=zi();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=so.join(at,"templates","commands",`${r}.md`);try{e=await Rf.readFile(n,"utf-8")}catch{throw _r.notFound(r)}}let s=lu(e);return jf(),ln.set(r,s),js.push(r),s}async function If(r){return(await uu(r)).frontmatter["allowed-tools"]||[]}function $f(){ln.clear(),js.length=0}function dt(r){let e=zi();if(e?.[r])return e[r];let t=so.join(at,"templates",r);try{return Ji.readFileSync(t,"utf-8")}catch{return null}}function un(r){let e=zi();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=so.join(at,"templates",r);try{return Ji.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var Af,ln,js,Bi,cu,Mf,du,Is=v(()=>{"use strict";Jt();Pt();Af=50,ln=new Map,js=[],Bi=null,cu=!1;l(zi,"loadBundle");l(Df,"updateLruOrder");l(jf,"evictLru");l(lu,"parseFrontmatter");l(uu,"load");l(If,"getAllowedTools");l($f,"clearCache");l(dt,"getTemplateContent");l(un,"listTemplates");Mf={load:uu,parseFrontmatter:lu,getAllowedTools:If,clearCache:$f,getTemplateContent:dt,listTemplates:un},du=Mf});function Of(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(_f.has(r)||r.includes("prjct"))return{level:dn.debug,name:"debug"};let e=dn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function no(r,e,t){return mu>=r?(...s)=>console[t](e,...s):Lf}var dn,_f,mu,Nf,Lf,Ff,G,Kt=v(()=>{"use strict";dn={error:0,warn:1,info:2,debug:3},_f=new Set(["1","true","*"]);l(Of,"getLogLevel");({level:mu,name:Nf}=Of()),Lf=l(()=>{},"noop");l(no,"createLogMethod");Ff={error:no(dn.error,"[prjct:error]","error"),warn:no(dn.warn,"[prjct:warn]","warn"),info:no(dn.info,"[prjct:info]","log"),debug:no(dn.debug,"[prjct:debug]","log"),isEnabled:l(()=>mu>=0,"isEnabled"),level:l(()=>Nf,"level")},G=Ff});function ro(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
496
+
497
+ ${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 qi=v(()=>{"use strict";Is();H();J();Kt();Pt();l(ro,"mergeWithMarkers")});import Ke from"node:fs/promises";import oo from"node:os";import ye from"node:path";async function Uf(){try{let r=ye.join(oo.homedir(),".prjct-cli","docs");await Ke.mkdir(r,{recursive:!0});let e=un("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=dt(n);if(o){let i=ye.basename(n);await Ke.writeFile(ye.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(Pt(),ot(Ri)),s=ye.join(t,"templates/global/docs");try{let n=await Ke.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=ye.join(s,o),a=ye.join(r,o),c=await Ke.readFile(i,"utf-8");await Ke.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Hf(){let r=(lt(),ot(Ct)),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 Ke.mkdir(e.configDir,{recursive:!0});let n=ye.join(e.configDir,e.contextFile),o=pu;if(t!=="claude"){let g=dt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:h}=(Pt(),ot(Ri)),S=ye.join(h,"templates","global",e.contextFile);try{o=await Ke.readFile(S,"utf-8")}catch{t==="gemini"&&(o=pu.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Ke.readFile(n,"utf-8"),a=!0}catch(g){if(A(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)),h=i.substring(i.indexOf(u)+u.length);i=`${(g+h).replace(/\n{3,}/g,`
389
498
 
390
499
  `).trim()}
391
- `}let d=ao(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await et.writeFile(n,d.content,"utf-8"),{success:!0,action:d.action,path:n}}catch(n){return{success:!1,error:w(n),action:"failed"}}}function Iu(){let r=co.homedir();return{claude:{commands:Se.join(r,".claude","commands"),config:Se.join(r,".claude"),router:Se.join(r,".claude","commands","p.md")},gemini:{commands:Se.join(r,".gemini","commands"),config:Se.join(r,".gemini"),router:Se.join(r,".gemini","commands","p.toml")}}}var ju,rs,sy,De,os=S(()=>{"use strict";Hs();W();K();ia();ju=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
500
+ `}let m=ro(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Ke.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:y(n),action:"failed"}}}function gu(){let r=oo.homedir();return{claude:{commands:ye.join(r,".claude","commands"),config:ye.join(r,".claude"),router:ye.join(r,".claude","commands","p.md")},gemini:{commands:ye.join(r,".gemini","commands"),config:ye.join(r,".gemini"),router:ye.join(r,".gemini","commands","p.toml")}}}var pu,Xt,Gf,Pe,Yt=v(()=>{"use strict";Is();H();J();qi();pu=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
392
501
  # p/ \u2014 Context layer for AI agents
393
502
 
394
503
  Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
@@ -404,22 +513,22 @@ Data:
404
513
 
405
514
  **Auto-managed by prjct-cli** | https://prjct.app
406
515
  <!-- prjct:end - DO NOT REMOVE THIS MARKER -->
407
- `;l(ey,"installDocs");l(ty,"installGlobalConfig");rs=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=co.homedir()}async ensureInit(){if(this._initialized)return;let t=await(at(),ot(vt)).getActiveProvider();this.commandsPath=Se.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),P(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(at(),ot(vt)).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=Se.join(this.commandsPath,t);try{await et.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:w(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:w(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:w(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=Se.join(this.commandsPath,t);try{await et.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Se.join(this.commandsPath,"p");try{if((await et.stat(e).catch(()=>null))?.isDirectory())return await et.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return ty()}async cleanupAllLegacy(){let e=co.homedir(),t=[],s=[Se.join(e,".claude","commands","p.md"),Se.join(e,".claude","commands","p.toml"),Se.join(e,".gemini","commands","p.md"),Se.join(e,".gemini","commands","p.toml")];for(let i of s)try{await et.unlink(i),t.push(i)}catch{}let n=[Se.join(e,".claude","commands","p"),Se.join(e,".gemini","commands","p")];for(let i of n)try{(await et.stat(i).catch(()=>null))?.isDirectory()&&(await et.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Se.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await et.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return ey()}};l(Iu,"getProviderPaths");sy=new rs,De=sy});import{z as _e}from"zod";function Ou(r,e="default"){let t=$u[e]||$u.default;return r/1e3*t}function lo(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var ny,ry,Mu,_u,$u,uo=S(()=>{"use strict";ny=_e.object({date:_e.string(),tokensSaved:_e.number(),syncs:_e.number(),avgCompressionRate:_e.number(),totalDuration:_e.number()}),ry=_e.object({agentName:_e.string(),usageCount:_e.number(),tokensSaved:_e.number()}),Mu=_e.object({totalTokensSaved:_e.number(),avgCompressionRate:_e.number(),syncCount:_e.number(),watchTriggers:_e.number(),avgSyncDuration:_e.number(),totalSyncDuration:_e.number(),agentUsage:_e.array(ry),dailyStats:_e.array(ny),firstSync:_e.string(),lastUpdated:_e.string()}),_u={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},$u={"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(Ou,"estimateCostSaved");l(lo,"formatCost")});function Nu(r,e){let t=[];hr("Languages",r.languages,e.languages,t),hr("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)"}),hr("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(p=>p.name),n=e.patterns.map(p=>p.name);hr("Patterns",s,n,t);let o=r.antiPatterns.map(p=>p.issue),i=e.antiPatterns.map(p=>p.issue);hr("Anti-patterns",o,i,t);let a=t.filter(p=>p.type==="added").length,c=t.filter(p=>p.type==="removed").length,u=t.filter(p=>p.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 aa(r){if(!r.hasChanges)return`## Analysis Diff
516
+ `;l(Uf,"installDocs");l(Hf,"installGlobalConfig");Xt=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=oo.homedir()}async ensureInit(){if(this._initialized)return;let t=await(lt(),ot(Ct)).getActiveProvider();this.commandsPath=ye.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),x(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(lt(),ot(Ct)).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=ye.join(this.commandsPath,t);try{await Ke.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:y(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:y(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:y(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=ye.join(this.commandsPath,t);try{await Ke.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=ye.join(this.commandsPath,"p");try{if((await Ke.stat(e).catch(()=>null))?.isDirectory())return await Ke.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Hf()}async cleanupAllLegacy(){let e=oo.homedir(),t=[],s=[ye.join(e,".claude","commands","p.md"),ye.join(e,".claude","commands","p.toml"),ye.join(e,".gemini","commands","p.md"),ye.join(e,".gemini","commands","p.toml")];for(let i of s)try{await Ke.unlink(i),t.push(i)}catch{}let n=[ye.join(e,".claude","commands","p"),ye.join(e,".gemini","commands","p")];for(let i of n)try{(await Ke.stat(i).catch(()=>null))?.isDirectory()&&(await Ke.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[ye.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Ke.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Uf()}};l(gu,"getProviderPaths");Gf=new Xt,Pe=Gf});import{z as je}from"zod";function wu(r,e="default"){let t=fu[e]||fu.default;return r/1e3*t}function io(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Wf,Vf,hu,yu,fu,ao=v(()=>{"use strict";Wf=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),Vf=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),hu=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(Vf),dailyStats:je.array(Wf),firstSync:je.string(),lastUpdated:je.string()}),yu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},fu={"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(wu,"estimateCostSaved");l(io,"formatCost")});function ku(r,e){let t=[];cr("Languages",r.languages,e.languages,t),cr("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)"}),cr("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);cr("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);cr("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 Ki(r){if(!r.hasChanges)return`## Analysis Diff
408
517
 
409
518
  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(`
410
- `)}function Lu(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(`
411
- `)}function hr(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 ca=S(()=>{"use strict";l(Nu,"generateAnalysisDiff");l(aa,"formatAnalysisDiffMd");l(Lu,"formatAnalysisDiffText");l(hr,"diffStringArray")});var la,ua,Fu,yr=S(()=>{"use strict";la=[1,2,3,5,8,13,21],ua={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}},Fu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import oy from"node:fs/promises";import iy from"node:path";function yn(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 ay(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let d of s)t.push(...yn(d));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 d of n){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...yn(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 d of o){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...yn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let d=a[1];if(d.startsWith(".")||d.startsWith("@/"))t.push(...yn(d));else{let g=d.startsWith("@")?d.split("/").slice(0,2).join("/"):d.split("/")[0];t.push(...yn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let d=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...d)}let p=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=p.exec(r))!==null;){let d=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...d)}return t.filter(d=>d.length>1&&!Gu.has(d)&&/^[a-z][a-z0-9]*$/.test(d))}function cy(r){return r.split(/\s+/).flatMap(e=>yn(e)).filter(e=>e.length>1&&!Gu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function ly(r){let e=await Is(r),t={},s={},n=0,o=await $s(e,50,async a=>{try{let c=await oy.readFile(iy.join(r,a),"utf-8"),u=ay(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 p of c)u.set(p,(u.get(p)||0)+1);for(let[p,m]of u)s[p]||(s[p]=[]),s[p].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 uy(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function dy(r,e){let t=cy(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=uy(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let p=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),d=i*(p/m);s.set(a,(s.get(a)||0)+d)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function py(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,Wu,t)}function po(r){let e=N.getDoc(r,Wu);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 Vu(r,e){let t=await ly(r);return py(e,t),t}function Bu(r,e,t=15){let s=po(r);return s?dy(e,s).slice(0,t):[]}var Gu,Wu,da=S(()=>{"use strict";yr();re();K();Gu=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(yn,"splitIdentifier");l(ay,"tokenizeFile");l(cy,"tokenizeQuery");l(ly,"buildIndex");l(uy,"idf");l(dy,"score");Wu="bm25-index";l(py,"saveIndex");l(po,"loadIndex");l(Vu,"indexProject");l(Bu,"queryFiles")});import pa from"node:fs/promises";import ys from"node:path";import{z as X}from"zod";async function yy(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=ys.join(e,"package.json"),n=await pa.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let p=u.toLowerCase();Object.keys(i).some(d=>d.toLowerCase().includes(p))?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 R(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 wy(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 Ty(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=hy[a];if(!c)continue;c.some(p=>n.has(p))?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 ky(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=ys.join(e,a);await P(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 Sy(r,e){let t=Date.now();try{let s=await vy(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 by(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=ys.join(e,o.file);await P(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 zu(r,e){let t=Date.now(),s=await Promise.all([yy(r,e),wy(r,e),ky(r,e),Sy(r,e),by(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 Ty(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await pa.readdir(n,{withFileTypes:!0});for(let i of o){let a=ys.join(n,i.name),c=ys.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=ys.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function vy(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await pa.readdir(n,{withFileTypes:!0});for(let i of o){let a=ys.join(n,i.name),c=ys.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 my,gy,fy,ma,hE,hy,Ju=S(()=>{"use strict";W();K();Jr();my=X.enum(["draft","verified","sealed"]),gy=X.object({name:X.string(),description:X.string(),location:X.string().optional(),severity:X.enum(["low","medium","high"]).optional(),language:X.string().optional(),framework:X.string().optional(),source:X.enum(["baseline","repo","context7","feedback"]).optional(),confidence:X.number().min(0).max(1).optional()}),fy=X.object({issue:X.string(),file:X.string(),suggestion:X.string(),severity:X.enum(["low","medium","high"]).optional(),language:X.string().optional(),framework:X.string().optional(),source:X.enum(["baseline","repo","context7","feedback"]).optional(),confidence:X.number().min(0).max(1).optional()}),ma=X.object({projectId:X.string(),languages:X.array(X.string()),frameworks:X.array(X.string()),packageManager:X.string().optional(),sourceDir:X.string().optional(),testDir:X.string().optional(),configFiles:X.array(X.string()),fileCount:X.number(),patterns:X.array(gy),antiPatterns:X.array(fy),analyzedAt:X.string(),modelMetadata:un.optional(),status:my.default("draft"),commitHash:X.string().optional(),signature:X.string().optional(),sealedAt:X.string().optional(),verifiedAt:X.string().optional()}),hE={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},hy={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(yy,"verifyFrameworks");l(wy,"verifyLanguages");l(ky,"verifyPatternLocations");l(Sy,"verifyFileCount");l(by,"verifyAntiPatternFiles");l(zu,"semanticVerify");l(Ty,"getProjectExtensions");l(vy,"countProjectFiles")});import{createHash as qu}from"node:crypto";function wr(r){return qu("sha256").update(r).digest("hex")}function mo(r){return wr(r).slice(0,16)}function Ku(r){return qu("md5").update(r).digest("hex")}var wn=S(()=>{"use strict";l(wr,"sha256");l(mo,"sha256Short");l(Ku,"md5")});var ga,ws,fa=S(()=>{"use strict";Te();ie();K();ga=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await xe(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await xe(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:T(),success:!0};await le(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await xe(t,null)}},ws=new ga});var qe,is=S(()=>{"use strict";fa();Ms();ie();re();qe=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new dn({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=C.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){C.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:T(),projectId:e};await ws.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:T()};await this.publishEvent(e,o,i)}async exists(e){try{return C.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var ha,Ke,kn=S(()=>{"use strict";Ju();ca();ie();wn();is();ha=class extends qe{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"};ma.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:T()})),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=T(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ma.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=T();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:Nu(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 zu(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 wr(JSON.stringify(t))}},Ke=new ha});var ya,Cy,Lt,kr=S(()=>{"use strict";ie();re();ya=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=C.getDb(e),n=T();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=C.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?C.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return C.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}})}},Cy=new ya,Lt=Cy});import{z as b}from"zod";var Py,go,Ey,xy,Ry,wa,Yu,Qu,Zu,ed,Xu,Ay,Dy,td,sd,nd,jy,Iy,BE,ka=S(()=>{"use strict";Jr();Py=b.enum(["low","medium","high","critical"]),go=b.enum(["feature","bug","improvement","chore"]),Ey=b.enum(["active","backlog","previously_active"]),xy=b.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ry=b.enum(["task_completed","feature_shipped","idea_captured","session_started"]),wa=b.object({title:b.string(),description:b.string(),filesChanged:b.array(b.object({path:b.string(),action:b.enum(["created","modified","deleted"])})),whatWasDone:b.array(b.string()).min(1),outputForNextAgent:b.string().min(1),notes:b.string().optional()}),Yu=b.object({output:b.string().min(1,"Subtask output is required"),summary:wa}),Qu=b.object({id:b.string(),description:b.string(),domain:b.string(),agent:b.string(),status:xy,dependsOn:b.array(b.string()),startedAt:b.string().optional(),completedAt:b.string().optional(),output:b.string().optional(),summary:wa.optional(),skipReason:b.string().optional(),blockReason:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional()}),Zu=b.object({completed:b.number(),total:b.number(),percentage:b.number()}),ed=b.object({id:b.string(),description:b.string(),type:go.optional(),startedAt:b.string(),sessionId:b.string(),featureId:b.string().optional(),subtasks:b.array(Qu).optional(),currentSubtaskIndex:b.number().optional(),subtaskProgress:Zu.optional(),linearId:b.string().optional(),linearUuid:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional(),modelMetadata:un.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional(),parentDescription:b.string().optional(),branch:b.string().optional(),prUrl:b.string().optional()}),Xu=b.object({id:b.string(),description:b.string(),status:b.literal("paused"),startedAt:b.string(),pausedAt:b.string(),pauseReason:b.string().optional(),type:go.optional(),sessionId:b.string().optional(),featureId:b.string().optional(),subtasks:b.array(Qu).optional(),currentSubtaskIndex:b.number().optional(),subtaskProgress:Zu.optional(),linearId:b.string().optional(),linearUuid:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional(),modelMetadata:un.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional()}),Ay=b.object({stackConfirmed:b.array(b.string()).optional(),patternsDiscovered:b.array(b.string()).optional(),agentAccuracy:b.array(b.object({agent:b.string(),rating:b.enum(["helpful","neutral","inaccurate"]),note:b.string().optional()})).optional(),issuesEncountered:b.array(b.string()).optional()}),Dy=b.object({taskId:b.string(),title:b.string(),classification:go,startedAt:b.string(),completedAt:b.string(),subtaskCount:b.number(),subtaskSummaries:b.array(wa),outcome:b.string(),branchName:b.string(),linearId:b.string().optional(),linearUuid:b.string().optional(),prUrl:b.string().optional(),feedback:Ay.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional()}),td=b.object({currentTask:ed.nullable(),previousTask:Xu.nullable().optional(),pausedTasks:b.array(Xu).optional(),taskHistory:b.array(Dy).optional(),lastUpdated:b.string()}),sd=b.object({id:b.string(),description:b.string(),priority:Py,type:go,featureId:b.string().optional(),originFeature:b.string().optional(),completed:b.boolean(),completedAt:b.string().optional(),createdAt:b.string(),section:Ey,agent:b.string().optional(),groupName:b.string().optional(),groupId:b.string().optional()}),nd=b.object({tasks:b.array(sd),lastUpdated:b.string()}),jy=b.object({tasksToday:b.number(),tasksThisWeek:b.number(),streak:b.number(),velocity:b.string(),avgDuration:b.string()}),Iy=b.object({type:Ry,description:b.string(),timestamp:b.string(),duration:b.string().optional()}),BE=b.object({projectId:b.string(),currentTask:ed.nullable(),queue:b.array(sd),stats:jy,recentActivity:b.array(Iy),lastSync:b.string()})});var Sr,Sa,Gs,ba=S(()=>{"use strict";Sr={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"}},Sa=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let s=Sr[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 Sr[e]}getPrompt(e){return Sr[e].prompt}getValidCommands(e){return Sr[e].transitions}formatNextSteps(e){return Sr[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}`}})}},Gs=new Sa});var as,Ta,Mt,Ws=S(()=>{"use strict";It();ie();re();as={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ta=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=ye(),n=T();return C.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=T();return C.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(ye(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?C.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):C.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=C.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=C.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(C.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);C.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return C.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Mt=new Ta});var va,_,Pt=S(()=>{"use strict";It();ka();ie();ba();Ws();is();va=class extends qe{static{l(this,"StateStorage")}constructor(){super("state.json",td)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Gs.getCurrentState(e),n=Gs.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:T()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:T()})),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:T()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=T(),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:T(),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:T()})),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,h)=>h!==o),{status:c,pausedAt:u,pauseReason:p,...m}=i,d={...m,startedAt:T(),sessionId:i.sessionId??ye()};return await this.update(e,g=>({...g,currentTask:d,previousTask:null,pausedTasks:a,lastUpdated:T()})),await this.publishEvent(e,"task.resumed",{taskId:d.id,description:d.description,resumedAt:d.startedAt,remainingPaused:a.length}),d}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[];Mt.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:T()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:T()}))}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(d=>d.feedback),n=[],o=[],i=[],a=[];for(let d of s){let g=d.feedback;g.stackConfirmed&&n.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],p=new Map;for(let d of a)p.set(d,(p.get(d)||0)+1);let m=[...p.entries()].filter(([d,g])=>g>=2).map(([d])=>d);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}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:T()})),{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?T():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:T()})),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=Yu.safeParse(t);if(!s.success){let h=s.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
519
+ `)}function Su(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(`
520
+ `)}function cr(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 Xi=v(()=>{"use strict";l(ku,"generateAnalysisDiff");l(Ki,"formatAnalysisDiffMd");l(Su,"formatAnalysisDiffText");l(cr,"diffStringArray")});var Yi,Qi,bu,lr=v(()=>{"use strict";Yi=[1,2,3,5,8,13,21],Qi={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}},bu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Bf from"node:fs/promises";import Jf from"node:path";function mn(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 zf(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...mn(m));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...mn(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...mn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...mn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...mn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Eu.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function qf(r){return r.split(/\s+/).flatMap(e=>mn(e)).filter(e=>e.length>1&&!Eu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Kf(r){let e=await sn(r),t={},s={},n=0,o=await nn(e,50,async a=>{try{let c=await Bf.readFile(Jf.join(r,a),"utf-8"),u=zf(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Xf(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function Yf(r,e){let t=qf(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=Xf(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function Qf(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]))};I.setDoc(r,Pu,t)}function co(r){let e=I.getDoc(r,Pu);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 Cu(r,e){let t=await Kf(r);return Qf(e,t),t}function xu(r,e,t=15){let s=co(r);return s?Yf(e,s).slice(0,t):[]}var Eu,Pu,Zi=v(()=>{"use strict";lr();ee();J();Eu=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(mn,"splitIdentifier");l(zf,"tokenizeFile");l(qf,"tokenizeQuery");l(Kf,"buildIndex");l(Xf,"idf");l(Yf,"score");Pu="bm25-index";l(Qf,"saveIndex");l(co,"loadIndex");l(Cu,"indexProject");l(xu,"queryFiles")});import ea from"node:fs/promises";import ds from"node:path";import{z as q}from"zod";async function nh(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=ds.join(e,"package.json"),n=await ea.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return A(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 rh(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 ch(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=sh[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 oh(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=ds.join(e,a);await x(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 ih(r,e){let t=Date.now();try{let s=await lh(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 ah(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=ds.join(e,o.file);await x(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 Ru(r,e){let t=Date.now(),s=await Promise.all([nh(r,e),rh(r,e),oh(r,e),ih(r,e),ah(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 ch(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await ea.readdir(n,{withFileTypes:!0});for(let i of o){let a=ds.join(n,i.name),c=ds.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=ds.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function lh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await ea.readdir(n,{withFileTypes:!0});for(let i of o){let a=ds.join(n,i.name),c=ds.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 Zf,eh,th,ta,sP,sh,Au=v(()=>{"use strict";H();J();Ur();Zf=q.enum(["draft","verified","sealed"]),eh=q.object({name:q.string(),description:q.string(),location:q.string().optional(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),th=q.object({issue:q.string(),file:q.string(),suggestion:q.string(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),ta=q.object({projectId:q.string(),languages:q.array(q.string()),frameworks:q.array(q.string()),packageManager:q.string().optional(),sourceDir:q.string().optional(),testDir:q.string().optional(),configFiles:q.array(q.string()),fileCount:q.number(),patterns:q.array(eh),antiPatterns:q.array(th),analyzedAt:q.string(),modelMetadata:on.optional(),status:Zf.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),sP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},sh={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(nh,"verifyFrameworks");l(rh,"verifyLanguages");l(oh,"verifyPatternLocations");l(ih,"verifyFileCount");l(ah,"verifyAntiPatternFiles");l(Ru,"semanticVerify");l(ch,"getProjectExtensions");l(lh,"countProjectFiles")});var sa,ms,na=v(()=>{"use strict";fe();z();J();sa=class{static{l(this,"SyncEventBus")}async publish(e){let t=R.getSyncPendingPath(e.projectId),s=await Ee(t,[])??[];s.push(e),await ce(t,s)}async getPending(e){let t=R.getSyncPendingPath(e);return await Ee(t,[])??[]}async clearPending(e){let t=R.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=R.getLastSyncPath(e),s={timestamp:b(),success:!0};await ce(t,s)}async getLastSync(e){let t=R.getLastSyncPath(e);return await Ee(t,null)}},ms=new sa});var Be,Qt=v(()=>{"use strict";na();Ps();z();ee();Be=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new an({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=P.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){P.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:b(),projectId:e};await ms.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return P.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var ra,Je,pn=v(()=>{"use strict";Au();Xi();z();Ds();Qt();ra=class extends Be{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"};ta.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:b()})),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=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ta.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=b();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:ku(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 Ru(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 ar(JSON.stringify(t))}},Je=new ra});var oa,uh,Mt,ur=v(()=>{"use strict";z();ee();oa=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=P.getDb(e),n=b();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=P.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?P.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return P.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}})}},uh=new oa,Mt=uh});import{z as T}from"zod";var dh,lo,mh,ph,gh,ia,ju,Iu,$u,Mu,Du,fh,hh,_u,Ou,Nu,yh,wh,RP,aa=v(()=>{"use strict";Ur();dh=T.enum(["low","medium","high","critical"]),lo=T.enum(["feature","bug","improvement","chore"]),mh=T.enum(["active","backlog","previously_active"]),ph=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),gh=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ia=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),ju=T.object({output:T.string().min(1,"Subtask output is required"),summary:ia}),Iu=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:ph,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:ia.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),$u=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Mu=T.object({id:T.string(),description:T.string(),type:lo.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Iu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:$u.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:on.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),Du=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:lo.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(Iu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:$u.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:on.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),fh=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),hh=T.object({taskId:T.string(),title:T.string(),classification:lo,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(ia),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:fh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),_u=T.object({currentTask:Mu.nullable(),previousTask:Du.nullable().optional(),pausedTasks:T.array(Du).optional(),taskHistory:T.array(hh).optional(),lastUpdated:T.string()}),Ou=T.object({id:T.string(),description:T.string(),priority:dh,type:lo,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:mh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Nu=T.object({tasks:T.array(Ou),lastUpdated:T.string()}),yh=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),wh=T.object({type:gh,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),RP=T.object({projectId:T.string(),currentTask:Mu.nullable(),queue:T.array(Ou),stats:yh,recentActivity:T.array(wh),lastSync:T.string()})});var dr,ca,$s,la=v(()=>{"use strict";dr={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"}},ca=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let s=dr[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 dr[e]}getPrompt(e){return dr[e].prompt}getValidCommands(e){return dr[e].transitions}formatNextSteps(e){return dr[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}`}})}},$s=new ca});var Zt,ua,At,Ms=v(()=>{"use strict";xt();z();ee();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ua=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=pe(),n=b();return P.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=b();return P.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(pe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?P.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):P.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=P.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=P.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(P.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);P.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return P.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},At=new ua});var da,_,wt=v(()=>{"use strict";xt();aa();z();la();Ms();Qt();da=class extends Be{static{l(this,"StateStorage")}constructor(){super("state.json",_u)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=$s.getCurrentState(e),n=$s.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:b()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),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:b()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=b(),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:b(),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:b()})),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,h)=>h!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:b(),sessionId:i.sessionId??pe()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];At.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:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;g.stackConfirmed&&n.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async 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:b()})),{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?b():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:b()})),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=ju.safeParse(t);if(!s.success){let h=s.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
412
521
  ${h.join(`
413
- `)}`)}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:T(),output:n,summary:o};let p=u.filter(h=>h.status==="completed").length,m=u.length,d=Math.round(p/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:T()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:p,total:m,percentage:d}},lastUpdated:T()})),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:p,total:m,percentage:d}}),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:T(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:T()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,p=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:p}},lastUpdated:T()})),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:T(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:T()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,p=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:p}},lastUpdated:T()})),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:T()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:T()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new va});import rd from"node:fs/promises";import od from"node:path";async function id(r,e,t,s){let[n,o,i,a]=await Promise.all([_y(r,e,s),Oy(r),Ny(r),Ly(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,$y).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 _y(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Bu(r,n,Ca*2);for(let a of o){if(s.length>=Ca)break;try{let c=od.join(e,a.path),u=await rd.readFile(c,"utf-8");u.length>fo*3?s.push({path:a.path,content:`${u.slice(0,fo)}
414
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,fo),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>=Ca)break;if(!s.some(c=>c.path===a))try{let c=od.join(e,a),u=await rd.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,fo),reason:"entry point"})}catch{}}return s}async function Oy(r){try{let e=await Ke.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 Ny(r){try{return(await _.getTaskHistory(r)).slice(0,My).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Ly(r){try{let e=Lt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return V.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var fo,Ca,$y,My,ad=S(()=>{"use strict";da();kn();kr();Pt();ns();fo=3e3,Ca=15,$y=15,My=10;l(id,"buildAnalysisPayload");l(_y,"selectCodeSamples");l(Oy,"getExistingPatterns");l(Ny,"getTaskHistory");l(Ly,"getPreviousAnalysisSummary")});var ho=S(()=>{"use strict"});import cs from"chalk";function cd(r){return Math.ceil(r.length/4)}function ld(r){let e=r.split(`
522
+ `)}`)}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:b(),output:n,summary:o};let d=u.filter(h=>h.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),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:b(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),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:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new da});import Lu from"node:fs/promises";import Fu from"node:path";async function pa(r,e,t,s){let[n,o,i,a]=await Promise.all([bh(r,e,s),Th(r),vh(r),Eh(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,kh).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 bh(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=xu(r,n,ma*2);for(let a of o){if(s.length>=ma)break;try{let c=Fu.join(e,a.path),u=await Lu.readFile(c,"utf-8");u.length>uo*3?s.push({path:a.path,content:`${u.slice(0,uo)}
523
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,uo),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>=ma)break;if(!s.some(c=>c.path===a))try{let c=Fu.join(e,a),u=await Lu.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,uo),reason:"entry point"})}catch{}}return s}async function Th(r){try{let e=await Je.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 vh(r){try{return(await _.getTaskHistory(r)).slice(0,Sh).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Eh(r){try{let e=Mt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return G.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var uo,ma,kh,Sh,Uu=v(()=>{"use strict";Zi();pn();ur();wt();Kt();uo=3e3,ma=15,kh=15,Sh=10;l(pa,"buildAnalysisPayload");l(bh,"selectCodeSamples");l(Th,"getExistingPatterns");l(vh,"getTaskHistory");l(Eh,"getPreviousAnalysisSummary")});var mo=v(()=>{"use strict"});import es from"chalk";function Hu(r){return Math.ceil(r.length/4)}function Gu(r){let e=r.split(`
415
524
  `),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+=`
416
- ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Pa(r){return r.includes("<!-- prjct:preserve")}function ud(r,e){let t=ld(r),s=ld(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:cd(r),tokensAfter:cd(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)Pa(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
417
- `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Pa(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
525
+ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function ga(r){return r.includes("<!-- prjct:preserve")}function Wu(r,e){let t=Gu(r),s=Gu(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Hu(r),tokensAfter:Hu(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)ga(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
526
+ `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(ga(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
418
527
  `).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
419
- `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Pa(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
420
- `).length}),n.hasChanges=!0)}return n}function dd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?cs.green:d=>d,o=t?cs.red:d=>d,i=t?cs.yellow:d=>d,a=t?cs.dim:d=>d,c=t?cs.bold:d=>d;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
421
- `);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let d of r.added)s.push(n(`+ \u2502 + ${d.name} (new)`));if(r.modified.length>0)for(let d of r.modified)s.push(i(`~ \u2502 ${d.name} (modified)`));if(r.removed.length>0)for(let d of r.removed)s.push(o(`- \u2502 - ${d.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let d of r.preserved)s.push(a(` \u2502 \u2713 ${d.name} (${d.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 p=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(p+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
422
- `)}function pd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?cs.green:c=>c,o=t?cs.red:c=>c,i=t?cs.cyan:c=>c,a=t?cs.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
528
+ `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!ga(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
529
+ `).length}),n.hasChanges=!0)}return n}function Vu(r,e={}){let{colorize:t=!0}=e,s=[],n=t?es.green:m=>m,o=t?es.red:m=>m,i=t?es.yellow:m=>m,a=t?es.dim:m=>m,c=t?es.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
530
+ `);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let m of r.added)s.push(n(`+ \u2502 + ${m.name} (new)`));if(r.modified.length>0)for(let m of r.modified)s.push(i(`~ \u2502 ${m.name} (modified)`));if(r.removed.length>0)for(let m of r.removed)s.push(o(`- \u2502 - ${m.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let m of r.preserved)s.push(a(` \u2502 \u2713 ${m.name} (${m.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",p=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${p(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
531
+ `)}function Bu(r,e={}){let{colorize:t=!0}=e,s=[],n=t?es.green:c=>c,o=t?es.red:c=>c,i=t?es.cyan:c=>c,a=t?es.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
423
532
  `))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(`
424
533
  `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
425
534
  `).length>5&&s.push(a(` ... ${c.before.split(`
@@ -430,19 +539,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Pa(r){return r.incl
430
539
  `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
431
540
  `).length>5&&s.push(a(` ... ${c.before.split(`
432
541
  `).length-5} more lines`))}s.push("")}return s.join(`
433
- `)}var md=S(()=>{"use strict";ho();l(cd,"estimateTokens");l(ld,"parseMarkdownSections");l(Pa,"isPreservedSection");l(ud,"generateSyncDiff");l(dd,"formatDiffPreview");l(pd,"formatFullDiff")});var gd,fd,Ea,hd,yd=S(()=>{"use strict";or();re();Ms();ie();gd=50,fd=200,Ea=class{static{l(this,"SessionTracker")}async read(e){try{return C.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){C.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return fs(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=T();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=T();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>gd&&(n.current.commands=n.current.commands.slice(-gd)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=T();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>fd&&(n.current.files=n.current.files.slice(-fd)),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),p=s.commands.map(g=>g.command),m=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,d=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:ht(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:ht(u),commandCount:s.commands.length,commands:p,filesRead:m,filesWritten:d}}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}},hd=new Ea});var Uy,xa,yo,Ra=S(()=>{"use strict";re();W();He();yd();Uy={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},xa=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Uy,...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=C.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 O("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([O(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),O(`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(`
434
- `).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: ${w(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(`
435
- `)}async getSessionInfo(e){return hd.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
542
+ `)}var Ju=v(()=>{"use strict";mo();l(Hu,"estimateTokens");l(Gu,"parseMarkdownSections");l(ga,"isPreservedSection");l(Wu,"generateSyncDiff");l(Vu,"formatDiffPreview");l(Bu,"formatFullDiff")});var zu,qu,fa,Ku,Xu=v(()=>{"use strict";nr();ee();Ps();z();zu=50,qu=200,fa=class{static{l(this,"SessionTracker")}async read(e){try{return P.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){P.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return ls(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=b();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=b();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>zu&&(n.current.commands=n.current.commands.slice(-zu)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=b();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>qu&&(n.current.files=n.current.files.slice(-qu)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:it(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:it(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Ku=new fa});var Ch,ha,po,ya=v(()=>{"use strict";ee();H();Ue();Xu();Ch={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ha=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Ch,...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=P.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 N("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([N(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),N(`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(`
543
+ `).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: ${y(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(`
544
+ `)}async getSessionInfo(e){return Ku.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
436
545
  `);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(`
437
- `)}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}},yo=l((r,e)=>new xa(r,e),"createStalenessChecker")});import wd from"node:fs/promises";import bn from"node:path";function Hy(r){let e=[],t,s=new RegExp(su.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function Gy(r,e,t){let s;if(r.startsWith("@/"))s=bn.join(t,"src",r.slice(2));else{let n=bn.dirname(bn.join(t,e));s=bn.resolve(n,r)}for(let n of tu){let o=s+n;try{if((await wd.stat(o)).isFile())return bn.relative(t,o)}catch{}}return null}async function Wy(r){let e=await Is(r),t={},s={},n=0,o=await $s(e,50,async i=>{try{let a=await wd.readFile(bn.join(r,i),"utf-8"),c=Hy(a),u=[];for(let p of c){let m=await Gy(p,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 Vy(r,e){N.setDoc(r,kd,e)}function wo(r){return N.getDoc(r,kd)}async function Sd(r,e){let t=await Wy(r);return Vy(e,t),t}var kd,Aa=S(()=>{"use strict";Ni();re();K();l(Hy,"extractImportSources");l(Gy,"resolveImport");l(Wy,"buildGraph");kd="import-graph";l(Vy,"saveGraph");l(wo,"loadGraph");l(Sd,"indexImports")});function bd(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=wo(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let p of u)s.has(p)||n.add(p)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Td(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 vd=S(()=>{"use strict";Aa();l(bd,"propagateChanges");l(Td,"affectedDomains")});import Cd from"node:fs/promises";import By from"node:path";function zy(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 Jy(r){let e=await Is(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await $s(e,100,async n=>{try{let o=By.join(r,n),[i,a]=await Promise.all([Cd.readFile(o,"utf-8"),Cd.stat(o)]);return{path:n,hash:zy(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function qy(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 Da(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 Ky(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 ja(r,e){let[t,s]=await Promise.all([Jy(r),Promise.resolve(Ky(e))]);return{diff:qy(t,s),currentHashes:t}}function Pd(r){return N.hasDoc(r,"file-hashes-meta")}var Ed=S(()=>{"use strict";re();K();l(zy,"hashContent");l(Jy,"computeHashes");l(qy,"diffHashes");l(Da,"saveHashes");l(Ky,"loadHashes");l(ja,"detectChanges");l(Pd,"hasHashRegistry")});async function Yy(r,e=100){try{let{stdout:t}=await O(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
438
- `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&Qy(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function Qy(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 Zy(r,e=100){let t=await Yy(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 p=ew(a[c],a[u]);n.set(p,(n.get(p)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),p=s.get(c)||0,m=s.get(u)||0;if(p<2||m<2)continue;let d=p+m-a,g=d>0?a/d: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 ew(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function tw(r,e){N.setDoc(r,Ad,e)}function Dd(r){return N.getDoc(r,Ad)}async function jd(r,e,t=100){let s=await Zy(r,t);return tw(e,s),s}var Ad,Id=S(()=>{"use strict";yr();re();He();l(Yy,"parseGitLog");l(Qy,"isSourceFile");l(Zy,"buildMatrix");l(ew,"pairKey");Ad="cochange-index";l(tw,"saveMatrix");l(Dd,"loadMatrix");l(jd,"indexCoChanges")});async function ko(r){try{let{stdout:e}=await O(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function sw(){let r=await ko("gh api user --jq .login");return r.success&&r.output||(r=await ko("git config --global github.user"),r.success&&r.output)?r.output:null}async function nw(){let r=await ko("git config user.name");return r.success&&r.output?r.output:null}async function rw(){let r=await ko("git config user.email");return r.success&&r.output?r.output:null}async function Tn(){let[r,e,t]=await Promise.all([sw(),nw(),rw()]);return{github:r,email:t,name:e||r||"Unknown"}}var So=S(()=>{"use strict";He();l(ko,"execCommand");l(sw,"detectGitHubUsername");l(nw,"detectGitName");l(rw,"detectGitEmail");l(Tn,"detect")});import $a from"node:fs/promises";import ow from"node:path";import*as bo from"jsonc-parser";function $d(r){let e=[],t=bo.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}: ${bo.printParseErrorCode(s.error)}`)}return t}var Ma,iw,$,Et=S(()=>{"use strict";ss();W();ie();K();Ct();So();Te();l($d,"parseJsonc");Ma=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await $a.readFile(t,"utf-8");return $d(s)}catch(t){return R(t)||console.warn(`Warning: Could not read config at ${e}: ${ue(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e);await le(s,t)}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await $a.readFile(t,"utf-8");return $d(s)}catch(t){return R(t)||console.warn(`Warning: Could not read global config for ${e}: ${ue(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e);await le(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=T();t={projectId:e,authors:[],version:Ae,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=T(),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:Ae,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=T(),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 $a.readdir(ow.join(o,"core"))).length===0}catch(i){return R(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId: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=T();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=T(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Tn(),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))}}},iw=new Ma,$=iw});import Nd from"node:fs/promises";import Md from"node:os";import _a from"node:path";function cw(){let r=wt("mcp-config.json");if(!r)return{mcpServers:{context7:Oa}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Oa}}}}function Ld(){return cw().mcpServers?.context7||Oa}function _d(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?_a.join(Md.tmpdir(),"prjct-context7-test","mcp.json"):_a.join(Md.homedir(),".claude","mcp.json")}async function Od(r){try{let e=await Nd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(R(e))return{};throw e}}async function lw(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Ld(),e=[...r.args||[],"--help"];await Fi(r.command||"npx",e,{timeout:15e3})}var Oa,vn,Na,uw,ls,br=S(()=>{"use strict";Hs();or();W();He();K();Oa={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},vn=null;l(cw,"parseTemplateConfig");l(Ld,"getContext7Config");l(_d,"getConfigPath");l(Od,"readConfig");l(lw,"runSmokeCheck");Na=class{static{l(this,"Context7Service")}async install(){let e=_d(),t=_a.dirname(e);await Nd.mkdir(t,{recursive:!0});let s=await Od(e),n=s.mcpServers||{};return n.context7=Ld(),s.mcpServers=n,await le(e,s),vn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(vn&&Date.now()-vn.at<3e5)return vn.status;let e=_d(),n=((await Od(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 lw();let o={installed:!0,verified:!0,configPath:e};return vn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${w(o)}`};return vn={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}},uw=new Na,ls=uw});var To,La=S(()=>{"use strict";To={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 Fa(r,e){return{...To[r],...e}}function vo(r,e,t){return{message:r,hint:e,...t}}var Co=S(()=>{"use strict";La();La();l(Fa,"getError");l(vo,"createError")});import{execSync as Ua}from"node:child_process";var Po,Ha,Eo,Fd,Ud=S(()=>{"use strict";Ms();Co();Po={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"}},Ha=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=Po[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=Po[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Eo(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=Po[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
439
- `);throw new Eo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
440
- ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Po),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=Ua(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:vo(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Ua(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Ua(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:vo(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?fs(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())}},Eo=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}},Fd=new Ha});function Cn(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 dw[r]}var ae,Ga,Wa,xo,dw,Ft,Hd,Vs=S(()=>{"use strict";ae={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Ga=["feature","spec","design","refactor","migrate"],Wa=["ship","cleanup","git","migrate"],xo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],dw={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Cn,"getTimeout");Ft={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},Hd={HISTORY_MAX:100}});import Va from"node:fs/promises";import pw from"node:os";import Gd from"node:path";var Ba,mw,Ro,za=S(()=>{"use strict";W();K();Ba=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=pw.homedir(),this.configDir=Gd.join(this.homeDir,".prjct-cli","config"),this.configFile=Gd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Va.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await Va.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await le(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",w(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 le(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){return P(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Va.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},mw=new Ba,Ro=mw});var qa={};Ot(qa,{installAntigravitySkill:()=>Jd,installCodexSkill:()=>Ja,needsAntigravityInstallation:()=>ww,run:()=>zd,verifyCodexPRouterReady:()=>Do});import{execSync as gw}from"node:child_process";import Z from"node:fs/promises";import Bs from"node:os";import ce from"node:path";import fe from"chalk";async function fw(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Fd.isAvailable("npm"))return console.log(`${fe.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${fe.dim(`Install ${r.displayName} using one of:`)}`),console.log(fe.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(fe.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(fe.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(fe.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),gw(`npm install -g ${e}`,{stdio:"inherit",timeout:Cn("NPM_INSTALL")}),console.log(""),console.log(`${fe.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(fe.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(fe.dim("The npm install took too long. Try:")),console.log(fe.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(fe.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(fe.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(fe.dim("Alternative installation methods:")),console.log(fe.dim(` \u2022 npm: npm install -g ${e}`)),console.log(fe.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(fe.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(fe.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function zd(){let r=await ir(),e=await Wi(),t=gt[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=gt[a],u=r[a],p={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await fw(c))p.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await De.detectActiveProvider()){let d=await De.syncCommands();d.success&&(p.commandsAdded=d.added,p.commandsUpdated=d.updated,s.commandsAdded+=d.added,s.commandsUpdated+=d.updated);let g=await De.installGlobalConfig();g.success&&(p.configAction=g.action,s.configAction||(s.configAction=g.action)),await De.installDocs(),await Tw(),await ls.ensureReady()}}else if(a==="gemini"){await hw()&&(p.commandsAdded=1,s.commandsAdded+=1);let d=await yw();d.success&&(p.configAction=d.action)}s.providers.push(p)}if((await Yr()).installed&&(await Jd()).success&&console.log(` ${fe.green("\u2713")} Antigravity skill installed`),(await _s()).installed){if(!(await Ja()).success)throw new Error("Codex skill installation failed");let c=await Do({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${fe.green("\u2713")} Codex skill installed`),console.log(` ${fe.green("\u2713")} Codex p. router ready`)}await Ro.saveConfig(Ae,await De.getInstallPath(),e.provider),await bw();for(let a of s.providers)vw(a,gt[a.provider]);return s}async function hw(){try{let r=ce.join(Bs.homedir(),".gemini","commands"),e=ce.join(r,"p.toml");try{return await Z.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return V.warn(`Gemini router cleanup warning: ${w(r)}`),!1}}async function yw(){try{let r=ce.join(Bs.homedir(),".gemini"),e=ce.join(r,"GEMINI.md");await Z.mkdir(r,{recursive:!0});let t=wt("global/GEMINI.md");if(!t){let c=ce.join(Ze,"templates","global","GEMINI.md");t=await Z.readFile(c,"utf-8")}let s="",n=!1;try{s=await Z.readFile(e,"utf-8"),n=!0}catch(c){if(R(c))n=!1;else throw c}let a=ao(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Z.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return V.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function Jd(){try{let r=ce.join(Bs.homedir(),".gemini","antigravity","skills"),e=ce.join(r,"prjct"),t=ce.join(e,"SKILL.md");await Z.mkdir(e,{recursive:!0});let s=await P(t),n=wt("antigravity/SKILL.md");if(!n){let o=ce.join(Ze,"templates","antigravity","SKILL.md");if(!await P(o))return V.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await Z.readFile(o,"utf-8")}return await Z.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return V.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function ww(){let r=await Yr();return r.installed&&!r.skillInstalled}function Kd(){return ce.join(Bs.homedir(),".codex","skills","prjct","SKILL.md")}function kw(r){return`<!-- ${qd}: ${JSON.stringify({version:Ae,templateHash:r})} -->`}function Wd(r){let e=r.match(new RegExp(`<!--\\s*${qd}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Sw(r){return wr(r)}async function Xd(){let r=wt("codex/SKILL.md");if(r)return r;let e=ce.join(Ze,"templates","codex","SKILL.md");return await P(e)?Z.readFile(e,"utf-8"):null}function Yd(r){let e=r.trimEnd(),t=Sw(e),s=kw(t);return{content:`${e}
546
+ `)}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}},po=l((r,e)=>new ha(r,e),"createStalenessChecker")});import Yu from"node:fs/promises";import fn from"node:path";function xh(r){let e=[],t,s=new RegExp(Il.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function Rh(r,e,t){let s;if(r.startsWith("@/"))s=fn.join(t,"src",r.slice(2));else{let n=fn.dirname(fn.join(t,e));s=fn.resolve(n,r)}for(let n of jl){let o=s+n;try{if((await Yu.stat(o)).isFile())return fn.relative(t,o)}catch{}}return null}async function Ah(r){let e=await sn(r),t={},s={},n=0,o=await nn(e,50,async i=>{try{let a=await Yu.readFile(fn.join(r,i),"utf-8"),c=xh(a),u=[];for(let d of c){let p=await Rh(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function Dh(r,e){I.setDoc(r,Qu,e)}function go(r){return I.getDoc(r,Qu)}async function Zu(r,e){let t=await Ah(r);return Dh(e,t),t}var Qu,wa=v(()=>{"use strict";Ei();ee();J();l(xh,"extractImportSources");l(Rh,"resolveImport");l(Ah,"buildGraph");Qu="import-graph";l(Dh,"saveGraph");l(go,"loadGraph");l(Zu,"indexImports")});function ed(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=go(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 td(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 sd=v(()=>{"use strict";wa();l(ed,"propagateChanges");l(td,"affectedDomains")});import nd from"node:fs/promises";import jh from"node:path";function Ih(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 $h(r){let e=await sn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await nn(e,100,async n=>{try{let o=jh.join(r,n),[i,a]=await Promise.all([nd.readFile(o,"utf-8"),nd.stat(o)]);return{path:n,hash:Ih(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function Mh(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 ka(r,e){let t=I.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)})(),I.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function _h(r){let e=new Map;try{let t=I.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 Sa(r,e){let[t,s]=await Promise.all([$h(r),Promise.resolve(_h(e))]);return{diff:Mh(t,s),currentHashes:t}}function rd(r){return I.hasDoc(r,"file-hashes-meta")}var od=v(()=>{"use strict";ee();J();l(Ih,"hashContent");l($h,"computeHashes");l(Mh,"diffHashes");l(ka,"saveHashes");l(_h,"loadHashes");l(Sa,"detectChanges");l(rd,"hasHashRegistry")});async function Nh(r,e=100){try{let{stdout:t}=await N(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
547
+ `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&Lh(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function Lh(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 Fh(r,e=100){let t=await Nh(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=Uh(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,p=s.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function Uh(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Hh(r,e){I.setDoc(r,cd,e)}function ld(r){return I.getDoc(r,cd)}async function ud(r,e,t=100){let s=await Fh(r,t);return Hh(e,s),s}var cd,dd=v(()=>{"use strict";lr();ee();Ue();l(Nh,"parseGitLog");l(Lh,"isSourceFile");l(Fh,"buildMatrix");l(Uh,"pairKey");cd="cochange-index";l(Hh,"saveMatrix");l(ld,"loadMatrix");l(ud,"indexCoChanges")});import fd from"node:fs/promises";import md from"node:os";import ba from"node:path";function Wh(){let r=dt("mcp-config.json");if(!r)return{mcpServers:{context7:Ta}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Ta}}}}function hd(){return Wh().mcpServers?.context7||Ta}function pd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?ba.join(md.tmpdir(),"prjct-context7-test","mcp.json"):ba.join(md.homedir(),".claude","mcp.json")}async function gd(r){try{let e=await fd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(A(e))return{};throw e}}async function Vh(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=hd(),e=[...r.args||[],"--help"];await Es(r.command||"npx",e,{timeout:15e3})}var Ta,hn,va,Bh,ts,mr=v(()=>{"use strict";Is();nr();H();Ue();J();Ta={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},hn=null;l(Wh,"parseTemplateConfig");l(hd,"getContext7Config");l(pd,"getConfigPath");l(gd,"readConfig");l(Vh,"runSmokeCheck");va=class{static{l(this,"Context7Service")}async install(){let e=pd(),t=ba.dirname(e);await fd.mkdir(t,{recursive:!0});let s=await gd(e),n=s.mcpServers||{};return n.context7=hd(),s.mcpServers=n,await ce(e,s),hn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(hn&&Date.now()-hn.at<3e5)return hn.status;let e=pd(),n=((await gd(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 Vh();let o={installed:!0,verified:!0,configPath:e};return hn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return hn={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}},Bh=new va,ts=Bh});var fo,Ea=v(()=>{"use strict";fo={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 Pa(r,e){return{...fo[r],...e}}function pr(r,e,t){return{message:r,hint:e,...t}}var ho=v(()=>{"use strict";Ea();Ea();l(Pa,"getError");l(pr,"createError")});import{execFileSync as yd,execSync as Jh}from"node:child_process";var yo,Ca,wo,wd,kd=v(()=>{"use strict";Ps();ho();yo={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"}},Ca=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=yo[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=yo[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new wo(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=yo[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
548
+ `);throw new wo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
549
+ ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(yo),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=Jh(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:pr(`${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:pr(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return yd(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return yd(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:pr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?ls(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())}},wo=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}},wd=new Ca});function yn(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 zh[r]}var ne,xa,Ra,ko,zh,_t,Sd,_s=v(()=>{"use strict";ne={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},xa=["feature","spec","design","refactor","migrate"],Ra=["ship","cleanup","git","migrate"],ko=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],zh={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(yn,"getTimeout");_t={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},Sd={HISTORY_MAX:100}});import Aa from"node:fs/promises";import qh from"node:os";import bd from"node:path";var Da,Kh,So,ja=v(()=>{"use strict";H();J();Da=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=qh.homedir(),this.configDir=bd.join(this.homeDir,".prjct-cli","config"),this.configFile=bd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Aa.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Aa.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(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 ce(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",y(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 ce(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){return x(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Aa.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Kh=new Da,So=Kh});var $a={};Bt($a,{installAntigravitySkill:()=>Cd,installCodexSkill:()=>Ia,needsAntigravityInstallation:()=>ey,run:()=>Pd,verifyCodexPRouterReady:()=>To});import{execFileSync as Xh}from"node:child_process";import Y from"node:fs/promises";import Os from"node:os";import re from"node:path";import de from"chalk";async function Yh(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!wd.isAvailable("npm"))return console.log(`${de.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${de.dim(`Install ${r.displayName} using one of:`)}`),console.log(de.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(de.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(de.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(de.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Xh("npm",["install","-g",e],{stdio:"inherit",timeout:yn("NPM_INSTALL")}),console.log(""),console.log(`${de.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(de.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(de.dim("The npm install took too long. Try:")),console.log(de.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(de.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(de.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(de.dim("Alternative installation methods:")),console.log(de.dim(` \u2022 npm: npm install -g ${e}`)),console.log(de.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(de.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(de.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Pd(){let r=await rr(),e=await $i(),t=ct[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=ct[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await Yh(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Pe.detectActiveProvider()){let m=await Pe.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await Pe.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Pe.installDocs(),await ry(),await ts.ensureReady()}}else if(a==="gemini"){await Qh()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await Zh();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await Vr()).installed&&(await Cd()).success&&console.log(` ${de.green("\u2713")} Antigravity skill installed`),(await Cs()).installed){if(!(await Ia()).success)throw new Error("Codex skill installation failed");let c=await To({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${de.green("\u2713")} Codex skill installed`),console.log(` ${de.green("\u2713")} Codex p. router ready`)}await So.saveConfig(ve,await Pe.getInstallPath(),e.provider),await ny();for(let a of s.providers)oy(a,ct[a.provider]);return s}async function Qh(){try{let r=re.join(Os.homedir(),".gemini","commands"),e=re.join(r,"p.toml");try{return await Y.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return G.warn(`Gemini router cleanup warning: ${y(r)}`),!1}}async function Zh(){try{let r=re.join(Os.homedir(),".gemini"),e=re.join(r,"GEMINI.md");await Y.mkdir(r,{recursive:!0});let t=dt("global/GEMINI.md");if(!t){let c=re.join(at,"templates","global","GEMINI.md");t=await Y.readFile(c,"utf-8")}let s="",n=!1;try{s=await Y.readFile(e,"utf-8"),n=!0}catch(c){if(A(c))n=!1;else throw c}let a=ro(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Y.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return G.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function Cd(){try{let r=re.join(Os.homedir(),".gemini","antigravity","skills"),e=re.join(r,"prjct"),t=re.join(e,"SKILL.md");await Y.mkdir(e,{recursive:!0});let s=await x(t),n=dt("antigravity/SKILL.md");if(!n){let o=re.join(at,"templates","antigravity","SKILL.md");if(!await x(o))return G.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await Y.readFile(o,"utf-8")}return await Y.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return G.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function ey(){let r=await Vr();return r.installed&&!r.skillInstalled}function Rd(){return re.join(Os.homedir(),".codex","skills","prjct","SKILL.md")}function ty(r){return`<!-- ${xd}: ${JSON.stringify({version:ve,templateHash:r})} -->`}function Td(r){let e=r.match(new RegExp(`<!--\\s*${xd}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function sy(r){return ar(r)}async function Ad(){let r=dt("codex/SKILL.md");if(r)return r;let e=re.join(at,"templates","codex","SKILL.md");return await x(e)?Y.readFile(e,"utf-8"):null}function Dd(r){let e=r.trimEnd(),t=sy(e),s=ty(t);return{content:`${e}
441
550
 
442
551
  ${s}
443
- `,templateHash:t}}async function Ja(){try{let r=Kd(),e=ce.dirname(r);await Z.mkdir(e,{recursive:!0});let t=await P(r),s=await Xd();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Yd(s);return t&&await Z.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await Z.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return V.warn(`Codex skill warning: ${w(r)}`),{success:!1,action:null}}}async function Do(r={}){let e=Kd();if(!(await _s()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Xd();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=Yd(s),o=l(async()=>r.autoRepair?(await Ja()).success:!1,"maybeRepair"),i="";if(!await P(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 Z.readFile(e,"utf-8").catch(()=>"");let a=Wd(i);if(!(a?.version===Ae&&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 Z.readFile(e,"utf-8").catch(()=>""),a=Wd(i),!(a?.version===Ae&&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 bw(){try{let r=ce.join(Bs.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await Z.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=C.getDoc(s,"project");if(!n)continue;n.cliVersion!==Ae&&(n.cliVersion=Ae,C.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${fe.green("\u2713")} Updated ${t} project(s) to v${Ae}`)}catch(r){R(r)||V.warn(`Migration warning: ${w(r)}`)}}async function Vd(r,e){let t={};if(await P(r))try{t=await xe(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await le(r,t)}async function Tw(){try{let r=ce.join(Bs.homedir(),".claude"),e=ce.join(r,"settings.json"),t=ce.join(r,"prjct-statusline.sh"),s=ce.join(Bs.homedir(),".prjct-cli","statusline"),n=ce.join(s,"statusline.sh"),o=ce.join(s,"themes"),i=ce.join(s,"lib"),a=ce.join(s,"components"),c=ce.join(s,"config.json"),u=ce.join(Ze,"assets","statusline"),p=ce.join(u,"statusline.sh"),m=ce.join(u,"themes"),d=ce.join(u,"lib"),g=ce.join(u,"components"),h=ce.join(u,"default-config.json");if(await P(r)||await Z.mkdir(r,{recursive:!0}),await P(s)||await Z.mkdir(s,{recursive:!0}),await P(o)||await Z.mkdir(o,{recursive:!0}),await P(i)||await Z.mkdir(i,{recursive:!0}),await P(a)||await Z.mkdir(a,{recursive:!0}),await P(n)){let k=await Z.readFile(n,"utf8");if(k.includes("CLI_VERSION=")){let y=k.match(/CLI_VERSION="([^"]*)"/);if(y&&y[1]!==Ae){let v=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ae}"`);await Z.writeFile(n,v,{mode:493})}await Ao(d,i),await Ao(g,a),await Bd(t,n),await Vd(e,t);return}}if(await P(p)){let k=await Z.readFile(p,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ae}"`),await Z.writeFile(n,k,{mode:493}),await Ao(d,i),await Ao(g,a),await P(m)){let y=await Z.readdir(m);for(let v of y){let D=ce.join(m,v),U=ce.join(o,v);await Z.copyFile(D,U)}}!await P(c)&&await P(h)&&await Z.copyFile(h,c)}else{let k=`#!/bin/bash
552
+ `,templateHash:t}}async function Ia(){try{let r=Rd(),e=re.dirname(r);await Y.mkdir(e,{recursive:!0});let t=await x(r),s=await Ad();if(!s)return G.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Dd(s);return t&&await Y.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await Y.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return G.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function To(r={}){let e=Rd();if(!(await Cs()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Ad();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=Dd(s),o=l(async()=>r.autoRepair?(await Ia()).success:!1,"maybeRepair"),i="";if(!await x(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 Y.readFile(e,"utf-8").catch(()=>"");let a=Td(i);if(!(a?.version===ve&&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 Y.readFile(e,"utf-8").catch(()=>""),a=Td(i),!(a?.version===ve&&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 ny(){try{let r=re.join(Os.homedir(),".prjct-cli","projects");if(!await x(r))return;let e=(await Y.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=P.getDoc(s,"project");if(!n)continue;n.cliVersion!==ve&&(n.cliVersion=ve,P.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${ve}`)}catch(r){A(r)||G.warn(`Migration warning: ${y(r)}`)}}async function vd(r,e){let t={};if(await x(r))try{t=await Ee(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await ce(r,t)}async function ry(){try{let r=re.join(Os.homedir(),".claude"),e=re.join(r,"settings.json"),t=re.join(r,"prjct-statusline.sh"),s=re.join(Os.homedir(),".prjct-cli","statusline"),n=re.join(s,"statusline.sh"),o=re.join(s,"themes"),i=re.join(s,"lib"),a=re.join(s,"components"),c=re.join(s,"config.json"),u=re.join(at,"assets","statusline"),d=re.join(u,"statusline.sh"),p=re.join(u,"themes"),m=re.join(u,"lib"),g=re.join(u,"components"),h=re.join(u,"default-config.json");if(await x(r)||await Y.mkdir(r,{recursive:!0}),await x(s)||await Y.mkdir(s,{recursive:!0}),await x(o)||await Y.mkdir(o,{recursive:!0}),await x(i)||await Y.mkdir(i,{recursive:!0}),await x(a)||await Y.mkdir(a,{recursive:!0}),await x(n)){let S=await Y.readFile(n,"utf8");if(S.includes("CLI_VERSION=")){let w=S.match(/CLI_VERSION="([^"]*)"/);if(w&&w[1]!==ve){let E=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`);await Y.writeFile(n,E,{mode:493})}await bo(m,i),await bo(g,a),await Ed(t,n),await vd(e,t);return}}if(await x(d)){let S=await Y.readFile(d,"utf8");if(S=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`),await Y.writeFile(n,S,{mode:493}),await bo(m,i),await bo(g,a),await x(p)){let w=await Y.readdir(p);for(let E of w){let D=re.join(p,E),V=re.join(o,E);await Y.copyFile(D,V)}}!await x(c)&&await x(h)&&await Y.copyFile(h,c)}else{let S=`#!/bin/bash
444
553
  # prjct Status Line for Claude Code
445
- CLI_VERSION="${Ae}"
554
+ CLI_VERSION="${ve}"
446
555
  input=$(cat)
447
556
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
448
557
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -471,7 +580,7 @@ if [ -f "$CONFIG" ]; then
471
580
  fi
472
581
  fi
473
582
  echo "prjct"
474
- `;await Z.writeFile(n,k,{mode:493})}await Bd(t,n),await Vd(e,t)}catch(r){R(r)||V.warn(`Status line warning: ${w(r)}`)}}async function Ao(r,e){if(!await P(r))return;let t=await Z.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ce.join(r,s),o=ce.join(e,s);await Z.copyFile(n,o),await Z.chmod(o,493)}}async function Bd(r,e){try{if(await P(r)){if((await Z.lstat(r)).isSymbolicLink()&&await Z.readlink(r)===e)return;await Z.unlink(r)}await Z.symlink(e,r)}catch{try{await P(e)&&(await Z.copyFile(e,r),await Z.chmod(r,493))}catch(s){R(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function vw(r,e){if(console.log(""),r.cliInstalled?console.log(` ${fe.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${fe.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(` ${fe.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${fe.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${fe.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${fe.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${fe.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var qd,Cw,jo=S(()=>{"use strict";Hs();br();Ud();re();W();Vs();K();wn();ns();Ct();at();os();za();ia();l(fw,"installAICLI");l(zd,"run");l(hw,"installGeminiRouter");l(yw,"installGeminiGlobalConfig");l(Jd,"installAntigravitySkill");l(ww,"needsAntigravityInstallation");qd="prjct-codex-router";l(Kd,"getCodexSkillPath");l(kw,"getCodexSkillMetadata");l(Wd,"parseCodexSkillMetadata");l(Sw,"hashContent");l(Xd,"loadCodexSkillTemplate");l(Yd,"buildCodexSkillContent");l(Ja,"installCodexSkill");l(Do,"verifyCodexPRouterReady");l(bw,"migrateProjectsCliVersion");l(Vd,"ensureStatusLineSettings");l(Tw,"installStatusLine");l(Ao,"installStatusLineModules");l(Bd,"ensureStatusLineSymlink");l(vw,"showResults");Cw=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Cw&&zd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as B}from"zod";var Pw,Ew,Qd,xw,Rw,Aw,Dw,jw,Zd,uA,ep=S(()=>{"use strict";Pw=B.enum(["low","medium","high"]),Ew=B.enum(["pending","converted","completed","archived","dormant"]),Qd=B.enum(["high","medium","low"]),xw=B.object({impact:Qd,effort:Qd}),Rw=B.object({frontend:B.string().optional(),backend:B.string().optional(),payments:B.string().optional(),ai:B.string().optional(),deploy:B.string().optional(),other:B.array(B.string()).optional()}),Aw=B.object({name:B.string(),description:B.string()}),Dw=B.object({name:B.string(),description:B.string().optional()}),jw=B.object({id:B.string(),text:B.string(),details:B.string().optional(),priority:Pw,status:Ew,tags:B.array(B.string()),addedAt:B.string(),completedAt:B.string().optional(),convertedTo:B.string().optional(),source:B.string().optional(),sourceFiles:B.array(B.string()).optional(),painPoints:B.array(B.string()).optional(),solutions:B.array(B.string()).optional(),filesAffected:B.array(B.string()).optional(),impactEffort:xw.optional(),implementationNotes:B.string().optional(),stack:Rw.optional(),modules:B.array(Aw).optional(),roles:B.array(Dw).optional(),risks:B.array(B.string()).optional(),risksCount:B.number().optional()}),Zd=B.object({ideas:B.array(jw),lastUpdated:B.string()}),uA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Ka,Ge,ks=S(()=>{"use strict";ep();It();ie();Ws();is();Ka=class extends qe{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Zd)}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:ye(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:T()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:T()})),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:T()})),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:T()})),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:T()}))}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:T()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:T()}))}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:T()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=gs(as.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Mt.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:T()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Ge=new Ka});var Xa,Pn,Ya=S(()=>{"use strict";uo();ie();is();Xa=class extends qe{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Mu)}getDefault(){return{..._u}}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,p=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],d=m.findIndex(v=>v.date===o);if(d>=0){let v=m[d];m[d]={...v,tokensSaved:v.tokensSaved+s,syncs:v.syncs+1,avgCompressionRate:(v.avgCompressionRate*v.syncs+n)/(v.syncs+1),totalDuration:v.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 h=g.toISOString().split("T")[0],k=m.filter(v=>v.date>=h),y=[...i.agentUsage];if(t.agents)for(let v of t.agents){let D=y.findIndex(U=>U.agentName===v);D>=0?y[D]={...y[D],usageCount:y[D].usageCount+1,tokensSaved:y[D].tokensSaved+Math.floor(s/t.agents.length)}:y.push({agentName:v,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:p,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:y,dailyStats:k,firstSync:i.firstSync||T(),lastUpdated:T()}})}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:Ou(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)}},Pn=new Xa});import ee from"node:fs/promises";import Y from"node:path";async function Io(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(C.exists(r)&&C.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(r),n=Y.join(s,"storage"),o=Y.join(s,"index"),i=Y.join(s,"memory");t.backupDir=await Iw(n,o,i),C.getDb(r);for(let{filename:c,key:u}of ec){let p=Y.join(n,c),m=await Ut(p);if(m===null){t.skippedFiles.push(c);continue}try{C.setDoc(r,u,m),tp(r,u,m),t.migratedFiles.push(c)}catch(d){t.errors.push({file:c,error:String(d)})}}for(let{filename:c,key:u}of Za){let p=Y.join(o,c),m=await Ut(p);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{C.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),sp(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(d){t.errors.push({file:`index/${c}`,error:String(d)})}}await Uw(r,o,t),await Hw(r,o,t),await Gw(r,i,t),await Ww(r,i,t);let a=Y.join(s,"sessions");return await Vw(r,a,t),t.errors.length===0&&await Bw(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 Iw(r,e,t){let s=Y.join(r,"backup");return await ee.mkdir(s,{recursive:!0}),await ee.mkdir(Y.join(s,"index"),{recursive:!0}),await ee.mkdir(Y.join(s,"memory"),{recursive:!0}),await Qa(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Qa(e,Y.join(s,"index")),await Qa(t,Y.join(s,"memory")),s}async function Qa(r,e,t){try{let s=await ee.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=Y.join(r,n.name),i=Y.join(e,n.name);await ee.copyFile(o,i)}}catch(s){if(!R(s))throw s}}function tp(r,e,t){switch(e){case"state":$w(r,t);break;case"queue":Mw(r,t);break;case"ideas":_w(r,t);break;case"shipped":Ow(r,t);break;case"metrics":Nw(r,t);break;case"analysis":Lw(r,t);break}}function $w(r,e){let t=C.getDb(r),s=t.prepare(`
583
+ `;await Y.writeFile(n,S,{mode:493})}await Ed(t,n),await vd(e,t)}catch(r){A(r)||G.warn(`Status line warning: ${y(r)}`)}}async function bo(r,e){if(!await x(r))return;let t=await Y.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=re.join(r,s),o=re.join(e,s);await Y.copyFile(n,o),await Y.chmod(o,493)}}async function Ed(r,e){try{if(await x(r)){if((await Y.lstat(r)).isSymbolicLink()&&await Y.readlink(r)===e)return;await Y.unlink(r)}await Y.symlink(e,r)}catch{try{await x(e)&&(await Y.copyFile(e,r),await Y.chmod(r,493))}catch(s){A(s)||G.warn(`Symlink fallback warning: ${s.message}`)}}}function oy(r,e){if(console.log(""),r.cliInstalled?console.log(` ${de.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${de.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(` ${de.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${de.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${de.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${de.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${de.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var xd,iy,vo=v(()=>{"use strict";Is();mr();kd();ee();H();_s();J();Ds();Kt();Pt();lt();Yt();ja();qi();l(Yh,"installAICLI");l(Pd,"run");l(Qh,"installGeminiRouter");l(Zh,"installGeminiGlobalConfig");l(Cd,"installAntigravitySkill");l(ey,"needsAntigravityInstallation");xd="prjct-codex-router";l(Rd,"getCodexSkillPath");l(ty,"getCodexSkillMetadata");l(Td,"parseCodexSkillMetadata");l(sy,"hashContent");l(Ad,"loadCodexSkillTemplate");l(Dd,"buildCodexSkillContent");l(Ia,"installCodexSkill");l(To,"verifyCodexPRouterReady");l(ny,"migrateProjectsCliVersion");l(vd,"ensureStatusLineSettings");l(ry,"installStatusLine");l(bo,"installStatusLineModules");l(Ed,"ensureStatusLineSymlink");l(oy,"showResults");iy=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");iy&&Pd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as W}from"zod";var ay,cy,jd,ly,uy,dy,my,py,Id,_x,$d=v(()=>{"use strict";ay=W.enum(["low","medium","high"]),cy=W.enum(["pending","converted","completed","archived","dormant"]),jd=W.enum(["high","medium","low"]),ly=W.object({impact:jd,effort:jd}),uy=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),dy=W.object({name:W.string(),description:W.string()}),my=W.object({name:W.string(),description:W.string().optional()}),py=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:ay,status:cy,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:ly.optional(),implementationNotes:W.string().optional(),stack:uy.optional(),modules:W.array(dy).optional(),roles:W.array(my).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),Id=W.object({ideas:W.array(py),lastUpdated:W.string()}),_x={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Ma,Le,ps=v(()=>{"use strict";$d();xt();z();Ms();Qt();Ma=class extends Be{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Id)}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:pe(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:b()})),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:b()})),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:b()})),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:b()}))}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:b()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:b()}))}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:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=is(Zt.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;At.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:b()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Le=new Ma});var _a,wn,Oa=v(()=>{"use strict";ao();z();Qt();_a=class extends Be{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",hu)}getDefault(){return{...yu}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,p=[...i.dailyStats],m=p.findIndex(E=>E.date===o);if(m>=0){let E=p[m];p[m]={...E,tokensSaved:E.tokensSaved+s,syncs:E.syncs+1,avgCompressionRate:(E.avgCompressionRate*E.syncs+n)/(E.syncs+1),totalDuration:E.totalDuration+t.duration}}else p.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let h=g.toISOString().split("T")[0],S=p.filter(E=>E.date>=h),w=[...i.agentUsage];if(t.agents)for(let E of t.agents){let D=w.findIndex(V=>V.agentName===E);D>=0?w[D]={...w[D],usageCount:w[D].usageCount+1,tokensSaved:w[D].tokensSaved+Math.floor(s/t.agents.length)}:w.push({agentName:E,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:w,dailyStats:S,firstSync:i.firstSync||b(),lastUpdated:b()}})}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:wu(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)}},wn=new _a});import Q from"node:fs/promises";import K from"node:path";async function Eo(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(P.exists(r)&&P.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=R.getGlobalProjectPath(r),n=K.join(s,"storage"),o=K.join(s,"index"),i=K.join(s,"memory");t.backupDir=await gy(n,o,i),P.getDb(r);for(let{filename:c,key:u}of Fa){let d=K.join(n,c),p=await Ot(d);if(p===null){t.skippedFiles.push(c);continue}try{P.setDoc(r,u,p),Md(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of La){let d=K.join(o,c),p=await Ot(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),_d(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await Ty(r,o,t),await vy(r,o,t),await Ey(r,i,t),await Py(r,i,t);let a=K.join(s,"sessions");return await Cy(r,a,t),t.errors.length===0&&await xy(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 gy(r,e,t){let s=K.join(r,"backup");return await Q.mkdir(s,{recursive:!0}),await Q.mkdir(K.join(s,"index"),{recursive:!0}),await Q.mkdir(K.join(s,"memory"),{recursive:!0}),await Na(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Na(e,K.join(s,"index")),await Na(t,K.join(s,"memory")),s}async function Na(r,e,t){try{let s=await Q.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=K.join(r,n.name),i=K.join(e,n.name);await Q.copyFile(o,i)}}catch(s){if(!A(s))throw s}}function Md(r,e,t){switch(e){case"state":fy(r,t);break;case"queue":hy(r,t);break;case"ideas":yy(r,t);break;case"shipped":wy(r,t);break;case"metrics":ky(r,t);break;case"analysis":Sy(r,t);break}}function fy(r,e){let t=P.getDb(r),s=t.prepare(`
475
584
  INSERT OR REPLACE INTO tasks
476
585
  (id, description, type, status, parent_description, branch, linear_id,
477
586
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -482,92 +591,92 @@ echo "prjct"
482
591
  (id, task_id, description, status, domain, agent, sort_order,
483
592
  depends_on, started_at, completed_at, output, summary)
484
593
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
485
- `),o=l((a,c)=>{if(!a||!a.id)return;s.run(I(a.id)??`task-${Date.now()}`,I(a.description??a.parentDescription)??"",I(a.type),I(c??a.status)??"unknown",I(a.parentDescription),I(a.branch),I(a.linearId),I(a.linearUuid),I(a.sessionId),I(a.featureId),I(a.startedAt)??new Date().toISOString(),I(a.completedAt),I(a.shippedAt),I(a.pausedAt),I(a.pauseReason),I(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let p=0;p<u.length;p++){let m=u[p];n.run(I(m.id)??`subtask-${p}`,I(a.id),I(m.description)??"",I(m.status)??"pending",I(m.domain),I(m.agent),p,m.dependsOn?JSON.stringify(m.dependsOn):null,I(m.startedAt),I(m.completedAt),I(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 Mw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=C.getDb(r).prepare(`
594
+ `),o=l((a,c)=>{if(!a||!a.id)return;s.run(j(a.id)??`task-${Date.now()}`,j(a.description??a.parentDescription)??"",j(a.type),j(c??a.status)??"unknown",j(a.parentDescription),j(a.branch),j(a.linearId),j(a.linearUuid),j(a.sessionId),j(a.featureId),j(a.startedAt)??new Date().toISOString(),j(a.completedAt),j(a.shippedAt),j(a.pausedAt),j(a.pauseReason),j(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let p=u[d];n.run(j(p.id)??`subtask-${d}`,j(a.id),j(p.description)??"",j(p.status)??"pending",j(p.domain),j(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,j(p.startedAt),j(p.completedAt),j(p.output),p.summary?JSON.stringify(p.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function hy(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
486
595
  INSERT OR REPLACE INTO queue_tasks
487
596
  (id, description, type, priority, section, created_at, completed, completed_at,
488
597
  feature_id, feature_name)
489
598
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
490
- `);for(let o of t)n.run(I(o.id)??`queue-${Date.now()}`,I(o.description)??"",I(o.type),I(o.priority),I(o.section),I(o.createdAt)??new Date().toISOString(),o.completed?1:0,I(o.completedAt),I(o.featureId),I(o.featureName))}function _w(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=C.getDb(r).prepare(`
599
+ `);for(let o of t)n.run(j(o.id)??`queue-${Date.now()}`,j(o.description)??"",j(o.type),j(o.priority),j(o.section),j(o.createdAt)??new Date().toISOString(),o.completed?1:0,j(o.completedAt),j(o.featureId),j(o.featureName))}function yy(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
491
600
  INSERT OR REPLACE INTO ideas
492
601
  (id, text, status, priority, tags, added_at, converted_to, details, data)
493
602
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
494
- `);for(let o of t)n.run(I(o.id)??`idea-${Date.now()}`,I(o.text)??"",I(o.status)??"pending",I(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,I(o.addedAt)??new Date().toISOString(),I(o.convertedTo),I(o.details),JSON.stringify(o))}function Ow(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=C.getDb(r).prepare(`
603
+ `);for(let o of t)n.run(j(o.id)??`idea-${Date.now()}`,j(o.text)??"",j(o.status)??"pending",j(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,j(o.addedAt)??new Date().toISOString(),j(o.convertedTo),j(o.details),JSON.stringify(o))}function wy(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
495
604
  INSERT OR REPLACE INTO shipped_features
496
605
  (id, name, shipped_at, version, description, type, duration, data)
497
606
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
498
- `);for(let o of t)n.run(I(o.id)??`ship-${Date.now()}`,I(o.name)??"",I(o.shippedAt)??new Date().toISOString(),I(o.version)??"0.0.0",I(o.description),I(o.type),I(o.duration),JSON.stringify(o))}function Nw(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=C.getDb(r).prepare(`
607
+ `);for(let o of t)n.run(j(o.id)??`ship-${Date.now()}`,j(o.name)??"",j(o.shippedAt)??new Date().toISOString(),j(o.version)??"0.0.0",j(o.description),j(o.type),j(o.duration),JSON.stringify(o))}function ky(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
499
608
  INSERT OR REPLACE INTO metrics_daily
500
609
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
501
610
  VALUES (?, ?, ?, ?, ?)
502
- `);for(let o of t)n.run(I(o.date)??new Date().toISOString().slice(0,10),Ss(o.tokensSaved)??0,Ss(o.syncs)??0,Ss(o.avgCompressionRate)??0,Ss(o.totalDuration)??0)}function Lw(r,e){let s=C.getDb(r).prepare(`
611
+ `);for(let o of t)n.run(j(o.date)??new Date().toISOString().slice(0,10),gs(o.tokensSaved)??0,gs(o.syncs)??0,gs(o.avgCompressionRate)??0,gs(o.totalDuration)??0)}function Sy(r,e){let s=P.getDb(r).prepare(`
503
612
  INSERT OR REPLACE INTO analysis
504
613
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
505
614
  VALUES (?, ?, ?, ?, ?, ?, ?)
506
- `),n=l((o,i)=>{o&&s.run(i,I(o.status)??"unknown",I(o.commitHash),I(o.signature),I(o.sealedAt),I(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function sp(r,e,t){e==="categories-cache"&&Fw(r,t)}function Fw(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=C.getDb(r).prepare(`
615
+ `),n=l((o,i)=>{o&&s.run(i,j(o.status)??"unknown",j(o.commitHash),j(o.signature),j(o.sealedAt),j(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function _d(r,e,t){e==="categories-cache"&&by(r,t)}function by(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
507
616
  INSERT OR REPLACE INTO index_files
508
617
  (path, categories, domain, score, size, mtime, language)
509
618
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
510
- `);for(let o of t){let i=I(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,I(o.primaryDomain),i)}}async function Uw(r,e,t){let s=Y.join(e,"checksums.json"),n=await Ut(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=C.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 Hw(r,e,t){let s=Y.join(e,"file-scores.json"),n=await Ut(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=C.getDb(r),a=i.prepare(`
619
+ `);for(let o of t){let i=j(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,j(o.primaryDomain),i)}}async function Ty(r,e,t){let s=K.join(e,"checksums.json"),n=await Ot(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=P.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 vy(r,e,t){let s=K.join(e,"file-scores.json"),n=await Ot(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=P.getDb(r),a=i.prepare(`
511
620
  INSERT OR REPLACE INTO index_files
512
621
  (path, score, size, mtime, language, categories, domain)
513
622
  VALUES (?, ?, ?, ?, NULL,
514
623
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
515
624
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
516
- `);i.transaction(()=>{for(let c of o){let u=I(c.path);u&&a.run(u,Ss(c.score)??0,Ss(c.size),I(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 Gw(r,e,t){let s=Y.join(e,"events.jsonl");try{let o=(await ee.readFile(s,"utf-8")).split(`
517
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=C.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),p=I(u.type??u.action)??"unknown",m=I(u.taskId??u.task_id),d=I(u.timestamp??u.ts)??new Date().toISOString();a.run(p,m,c,d)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){R(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Ww(r,e,t){let s=Y.join(e,"learnings.jsonl");try{let o=(await ee.readFile(s,"utf-8")).split(`
518
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=C.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),p=`learning:${I(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,d=m&&m.length>0?I(m[0]):null;a.run(p,d,c,1,I(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){R(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function Vw(r,e,t){let n=C.getDb(r).prepare(`
625
+ `);i.transaction(()=>{for(let c of o){let u=j(c.path);u&&a.run(u,gs(c.score)??0,gs(c.size),j(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 Ey(r,e,t){let s=K.join(e,"events.jsonl");try{let o=(await Q.readFile(s,"utf-8")).split(`
626
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=P.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=j(u.type??u.action)??"unknown",p=j(u.taskId??u.task_id),m=j(u.timestamp??u.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){A(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Py(r,e,t){let s=K.join(e,"learnings.jsonl");try{let o=(await Q.readFile(s,"utf-8")).split(`
627
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=P.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:${j(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?j(p[0]):null;a.run(d,m,c,1,j(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){A(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function Cy(r,e,t){let n=P.getDb(r).prepare(`
519
628
  INSERT OR IGNORE INTO sessions
520
629
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
521
630
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
522
- `),o=l(u=>{!u||!u.id||n.run(I(u.id),I(u.projectId)??r,I(u.task)??"",I(u.status)??"completed",I(u.startedAt)??new Date().toISOString(),I(u.pausedAt),I(u.completedAt),Ss(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=Y.join(e,"current.json"),a=await Ut(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await ee.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=Y.join(e,"archive");try{let u=await ee.readdir(c);for(let m of u){let d=Y.join(c,m);try{if(!(await ee.stat(d)).isDirectory())continue;let h=await ee.readdir(d);for(let y of h){if(!y.endsWith(".json"))continue;let v=Y.join(d,y),D=await Ut(v);if(D!==null)try{o(D),t.migratedFiles.push(`sessions/archive/${m}/${y}`),await ee.unlink(v).catch(()=>{})}catch(U){t.errors.push({file:`sessions/archive/${m}/${y}`,error:String(U)})}}(await ee.readdir(d)).length===0&&await ee.rmdir(d).catch(()=>{})}catch{}}(await ee.readdir(c).catch(()=>[])).length===0&&await ee.rmdir(c).catch(()=>{})}catch{}try{(await ee.readdir(e)).length===0&&await ee.rmdir(e).catch(()=>{})}catch{}}async function Bw(r,e,t,s){let n=l(async(i,a)=>{try{await ee.unlink(i)}catch(c){R(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of ec)await n(Y.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(Y.join(e,i),`cleanup:index/${i}`);await n(Y.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(Y.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function I(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function Ss(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 Ut(r){try{let e=await ee.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(R(e)||e instanceof SyntaxError)return null;throw e}}async function $o(r){let e=A.getGlobalProjectPath(r),t=Y.join(e,"storage"),s=0;C.getDb(r);for(let{filename:h,key:k}of ec){let y=Y.join(t,h),v=await Ut(y);if(v!==null){C.setDoc(r,k,v),tp(r,k,v);try{await ee.unlink(y)}catch{}s++}}let n=Y.join(e,"project.json"),o=await Ut(n);if(o!==null){C.setDoc(r,"project",o);try{await ee.unlink(n)}catch{}s++}let i=Y.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let k=Y.join(i,h);try{let v=(await ee.readFile(k,"utf-8")).split(`
523
- `).filter(U=>U.trim());if(v.length===0){await ee.unlink(k),s++;continue}let D=C.getDb(r);if(h==="events.jsonl"){let U=D.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");D.transaction(()=>{for(let F of v)try{let j=JSON.parse(F);U.run(I(j.type??j.action)??"unknown",I(j.taskId??j.task_id),F,I(j.timestamp??j.ts)??new Date().toISOString())}catch{}})()}else{let U=D.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");D.transaction(()=>{for(let F of v)try{let j=JSON.parse(F),E=`learning:${I(j.taskId??j.timestamp)??Date.now()}`,M=j.tags;U.run(E,I(M?.[0]),F,1,I(j.timestamp)??new Date().toISOString())}catch{}})()}await ee.unlink(k),s++}catch{}}let a=Y.join(e,"sessions"),c=l(h=>{if(!h||!h.id)return;C.getDb(r).prepare(`
631
+ `),o=l(u=>{!u||!u.id||n.run(j(u.id),j(u.projectId)??r,j(u.task)??"",j(u.status)??"completed",j(u.startedAt)??new Date().toISOString(),j(u.pausedAt),j(u.completedAt),gs(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=K.join(e,"current.json"),a=await Ot(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await Q.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=K.join(e,"archive");try{let u=await Q.readdir(c);for(let p of u){let m=K.join(c,p);try{if(!(await Q.stat(m)).isDirectory())continue;let h=await Q.readdir(m);for(let w of h){if(!w.endsWith(".json"))continue;let E=K.join(m,w),D=await Ot(E);if(D!==null)try{o(D),t.migratedFiles.push(`sessions/archive/${p}/${w}`),await Q.unlink(E).catch(()=>{})}catch(V){t.errors.push({file:`sessions/archive/${p}/${w}`,error:String(V)})}}(await Q.readdir(m)).length===0&&await Q.rmdir(m).catch(()=>{})}catch{}}(await Q.readdir(c).catch(()=>[])).length===0&&await Q.rmdir(c).catch(()=>{})}catch{}try{(await Q.readdir(e)).length===0&&await Q.rmdir(e).catch(()=>{})}catch{}}async function xy(r,e,t,s){let n=l(async(i,a)=>{try{await Q.unlink(i)}catch(c){A(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Fa)await n(K.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(K.join(e,i),`cleanup:index/${i}`);await n(K.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(K.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function j(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function gs(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 Ot(r){try{let e=await Q.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(A(e)||e instanceof SyntaxError)return null;throw e}}async function Po(r){let e=R.getGlobalProjectPath(r),t=K.join(e,"storage"),s=0;P.getDb(r);for(let{filename:h,key:S}of Fa){let w=K.join(t,h),E=await Ot(w);if(E!==null){P.setDoc(r,S,E),Md(r,S,E);try{await Q.unlink(w)}catch{}s++}}let n=K.join(e,"project.json"),o=await Ot(n);if(o!==null){P.setDoc(r,"project",o);try{await Q.unlink(n)}catch{}s++}let i=K.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let S=K.join(i,h);try{let E=(await Q.readFile(S,"utf-8")).split(`
632
+ `).filter(V=>V.trim());if(E.length===0){await Q.unlink(S),s++;continue}let D=P.getDb(r);if(h==="events.jsonl"){let V=D.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");D.transaction(()=>{for(let F of E)try{let k=JSON.parse(F);V.run(j(k.type??k.action)??"unknown",j(k.taskId??k.task_id),F,j(k.timestamp??k.ts)??new Date().toISOString())}catch{}})()}else{let V=D.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");D.transaction(()=>{for(let F of E)try{let k=JSON.parse(F),$=`learning:${j(k.taskId??k.timestamp)??Date.now()}`,O=k.tags;V.run($,j(O?.[0]),F,1,j(k.timestamp)??new Date().toISOString())}catch{}})()}await Q.unlink(S),s++}catch{}}let a=K.join(e,"sessions"),c=l(h=>{if(!h||!h.id)return;P.getDb(r).prepare(`
524
633
  INSERT OR IGNORE INTO sessions
525
634
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
526
635
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
527
- `).run(I(h.id),I(h.projectId)??r,I(h.task)??"",I(h.status)??"completed",I(h.startedAt)??new Date().toISOString(),I(h.pausedAt),I(h.completedAt),Ss(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=Y.join(a,"current.json"),p=await Ut(u);p!==null&&(c(p),await ee.unlink(u).catch(()=>{}),s++);let m=Y.join(a,"archive");try{let h=await ee.readdir(m);for(let y of h){let v=Y.join(m,y);try{if(!(await ee.stat(v)).isDirectory())continue;let U=await ee.readdir(v);for(let j of U){if(!j.endsWith(".json"))continue;let E=await Ut(Y.join(v,j));E!==null&&(c(E),await ee.unlink(Y.join(v,j)).catch(()=>{}),s++)}(await ee.readdir(v)).length===0&&await ee.rmdir(v).catch(()=>{})}catch{}}(await ee.readdir(m).catch(()=>[])).length===0&&await ee.rmdir(m).catch(()=>{})}catch{}try{(await ee.readdir(a)).length===0&&await ee.rmdir(a).catch(()=>{})}catch{}let d=Y.join(e,"index"),g=[...Za.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let k=Y.join(d,h),y=await Ut(k);if(y===null)continue;let v=Za.find(D=>D.filename===h);v&&(C.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",v.key,JSON.stringify(y),new Date().toISOString()),sp(r,v.key,y));try{await ee.unlink(k)}catch{}s++}return s}var ec,Za,tc=S(()=>{"use strict";Te();W();re();ec=[{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"}],Za=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Io,"migrateJsonToSqlite");l(Iw,"createBackup");l(Qa,"copyFiles");l(tp,"populateNormalized");l($w,"populateTasksFromState");l(Mw,"populateQueueTasks");l(_w,"populateIdeas");l(Ow,"populateShippedFeatures");l(Nw,"populateMetricsDaily");l(Lw,"populateAnalysis");l(sp,"populateIndexTables");l(Fw,"populateCategoriesIndex");l(Uw,"migrateChecksums");l(Hw,"migrateFileScores");l(Gw,"migrateEventsJsonl");l(Ww,"migrateLearningsJsonl");l(Vw,"migrateSessionFiles");l(Bw,"cleanupJsonFiles");l(I,"toStr");l(Ss,"toNum");l(Ut,"readJsonSafe");l($o,"sweepLegacyJson")});function op(r){return[...r].sort((e,t)=>{let s=rp[e.section]-rp[t.section];return s!==0?s:np[e.priority]-np[t.priority]})}function Tr(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var np,rp,Mo=S(()=>{"use strict";np={critical:0,high:1,medium:2,low:3},rp={active:0,previously_active:1,backlog:2};l(op,"sortBySectionAndPriority");l(Tr,"uniqueBy")});var sc,be,Xt=S(()=>{"use strict";It();ka();Mo();ie();Ws();is();sc=class extends qe{static{l(this,"QueueStorage")}constructor(){super("queue.json",nd)}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 op(t)[0]||null}async addTask(e,t){let s={...t,id:ye(),createdAt:T(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:T()})),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=T(),n=t.map(o=>({...o,id:ye(),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:T()})),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:T()},s):i),lastUpdated:T()})),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:T()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:T()}))}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:T()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=gs(as.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Mt.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:T()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},be=new sc});import{z as te}from"zod";var zw,ip,Jw,qw,Kw,Xw,Yw,Qw,Zw,ap,cp=S(()=>{"use strict";zw=te.enum(["feature","fix","improvement","refactor"]),ip=te.enum(["pass","warning","fail","skipped"]),Jw=te.enum(["added","changed","fixed","removed"]),qw=te.object({hours:te.number(),minutes:te.number(),totalMinutes:te.number()}),Kw=te.object({filesChanged:te.number().nullable().optional(),linesAdded:te.number().nullable().optional(),linesRemoved:te.number().nullable().optional(),commits:te.number().nullable().optional()}),Xw=te.object({description:te.string(),type:Jw.optional()}),Yw=te.object({lintStatus:ip.nullable().optional(),lintDetails:te.string().optional(),testStatus:ip.nullable().optional(),testDetails:te.string().optional()}),Qw=te.object({hash:te.string().optional(),message:te.string().optional(),branch:te.string().optional()}),Zw=te.object({id:te.string(),name:te.string(),version:te.string().nullable().optional(),type:zw,agent:te.string().optional(),description:te.string().optional(),changes:te.array(Xw).optional(),codeSnippets:te.array(te.string()).optional(),commit:Qw.optional(),codeMetrics:Kw.optional(),qualityMetrics:Yw.optional(),quantitativeImpact:te.string().optional(),duration:qw.optional(),tasksCompleted:te.number().nullable().optional(),shippedAt:te.string(),featureId:te.string().optional()}),ap=te.object({shipped:te.array(Zw),lastUpdated:te.string()})});var nc,tt,zs=S(()=>{"use strict";It();cp();ie();Ws();is();nc=class extends qe{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",ap)}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:ye(),shippedAt:T()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:T()})),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(as.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Mt.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:T()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},tt=new nc});import{z as me}from"zod";var ek,tk,lp,ZA,eD,tD,bs,up,vr=S(()=>{"use strict";ek=me.enum(["improving","stable","declining"]),tk=me.object({sprintNumber:me.number(),startDate:me.string(),endDate:me.string(),pointsCompleted:me.number(),tasksCompleted:me.number(),avgVariance:me.number(),estimationAccuracy:me.number()}),lp=me.object({category:me.string(),avgVariance:me.number(),taskCount:me.number()}),ZA=me.object({totalPoints:me.number(),sprints:me.number(),estimatedDate:me.string()}),eD=me.object({sprints:me.array(tk),averageVelocity:me.number(),velocityTrend:ek,estimationAccuracy:me.number(),overEstimated:me.array(lp),underEstimated:me.array(lp),lastUpdated:me.string()}),tD=me.object({sprintLengthDays:me.number().min(1).max(90).default(7),startDay:me.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:me.number().min(1).max(52).default(6),accuracyTolerance:me.number().min(0).max(100).default(20)}),bs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},up={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var rc,_o,oc=S(()=>{"use strict";vr();is();rc=class extends qe{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:up,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}},_o=new rc});var Cr,ic,ac,dp=S(()=>{"use strict";cr();ie();Cr=3,ic=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>=Cr){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}/${Cr} 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>=Cr){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}/${Cr} 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]}`,p=t.get(u)||{count:0,tasks:[]};p.count++,p.tasks.push(n.taskId),t.set(u,p)}}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>=Cr&&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:[H.FILE_STRUCTURE,H.ARCHITECTURE],tech_stack:[H.TECH_STACK],architecture:[H.ARCHITECTURE,H.CODE_STYLE],estimation:[H.SHIP_WORKFLOW],workflow:[H.SHIP_WORKFLOW,H.CODE_STYLE],gotcha:[H.TEST_BEHAVIOR,H.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: ${T()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
528
- `)}},ac=new ic});import{z as x}from"zod";var pp,sk,nk,mp,rk,ok,ik,ak,ck,lk,uk,gp,dk,pk,mD,fp,hp,yp,wp,mk,Oo,kp=S(()=>{"use strict";pp=x.number().min(1).max(5),sk=x.enum(["exceeded","met","partial","failed"]),nk=x.enum(["definitely","probably","maybe","no"]),mp=x.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),rk=x.object({estimated:x.object({hours:x.number(),confidence:x.enum(["low","medium","high"]).optional(),source:x.enum(["prd","manual","historical"]).optional()}),actual:x.object({hours:x.number(),commits:x.number().optional(),linesAdded:x.number().optional(),linesRemoved:x.number().optional(),sessions:x.number().optional()}),variance:x.object({hours:x.number(),percentage:x.number(),reason:mp.optional(),explanation:x.string().optional()})}),ok=x.object({name:x.string(),baseline:x.number().nullable(),target:x.number(),actual:x.number(),unit:x.string(),achieved:x.boolean(),percentOfTarget:x.number()}),ik=x.object({criteria:x.string(),met:x.boolean(),notes:x.string().optional()}),ak=x.object({metrics:x.array(ok),acceptanceCriteria:x.array(ik),overallSuccess:sk,successScore:x.number().min(0).max(100)}),ck=x.object({category:x.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:x.string(),actionable:x.boolean(),action:x.string().optional()}),lk=x.object({whatWorked:x.array(x.string()),whatDidnt:x.array(x.string()),surprises:x.array(x.string()),recommendations:x.array(ck)}),uk=x.object({valueDelivered:x.number().min(1).max(10),userImpact:x.enum(["none","low","medium","high","critical"]),businessImpact:x.enum(["none","low","medium","high","critical"]),roiScore:x.number(),worthIt:nk,worthItReason:x.string().optional(),alternativeConsidered:x.string().optional(),betterAlternativeExists:x.boolean().optional()}),gp=x.object({id:x.string(),taskId:x.string(),description:x.string(),estimatedMinutes:x.number().optional(),actualMinutes:x.number(),completedAsPlanned:x.boolean(),qualityScore:pp,blockers:x.array(x.string()),agentUsed:x.string().optional(),skillsUsed:x.array(x.string()).optional(),startedAt:x.string(),completedAt:x.string()}),dk=x.object({id:x.string(),featureId:x.string(),featureName:x.string(),prdId:x.string().nullable(),version:x.string().optional(),branch:x.string().optional(),prUrl:x.string().optional(),effort:rk,success:ak.optional(),learnings:lk,roi:uk,rating:pp,taskOutcomes:x.array(gp).optional(),startedAt:x.string(),shippedAt:x.string(),reviewedAt:x.string().optional(),reviewedBy:x.string().optional(),legacy:x.boolean().optional()}),pk=x.object({totalFeatures:x.number(),averageEstimationAccuracy:x.number(),averageSuccessRate:x.number(),averageROI:x.number(),bySuccessLevel:x.object({exceeded:x.number(),met:x.number(),partial:x.number(),failed:x.number()}),variancePatterns:x.array(x.object({reason:mp,count:x.number(),averageVariance:x.number()})),topLearnings:x.array(x.object({insight:x.string(),frequency:x.number()}))}),mD=x.object({outcomes:x.array(dk),taskOutcomes:x.array(gp).optional(),aggregates:pk.optional(),lastUpdated:x.string(),lastAggregated:x.string().optional()}),fp={outcomes:[],taskOutcomes:[],lastUpdated:""},hp=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"),yp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),wp=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),mk=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Oo=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(p=>mk(p.effort.variance.percentage)),t=r.filter(p=>p.success).map(p=>p.success.successScore),s=r.map(p=>p.roi.roiScore),n={exceeded:r.filter(p=>p.success?.overallSuccess==="exceeded").length,met:r.filter(p=>p.success?.overallSuccess==="met").length,partial:r.filter(p=>p.success?.overallSuccess==="partial").length,failed:r.filter(p=>p.success?.overallSuccess==="failed").length},o=r.filter(p=>p.effort.variance.reason).reduce((p,m)=>{let d=m.effort.variance.reason;return p[d]||(p[d]={count:0,totalVariance:0}),p[d].count++,p[d].totalVariance+=m.effort.variance.percentage,p},{}),i=Object.entries(o).map(([p,m])=>({reason:p,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(p=>[...p.learnings.whatWorked,...p.learnings.whatDidnt]).reduce((p,m)=>(p[m]=(p[m]||0)+1,p),{}),u=Object.entries(c).sort((p,m)=>m[1]-p[1]).slice(0,10).map(([p,m])=>({insight:p,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((p,m)=>p+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((p,m)=>p+m,0)/t.length):0,averageROI:Math.round(s.reduce((p,m)=>p+m,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var cc,Sp,bp=S(()=>{"use strict";kp();is();ie();cc=class extends qe{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...fp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Oo([t,...s.outcomes]),lastUpdated:T()})),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:T()}))}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?Oo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Oo(t.outcomes),lastAggregated:T(),lastUpdated:T()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&yt(e.duration)||60,s=t/60,n=t/60,o=hp(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=yp(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:wp(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}}},Sp=new cc});import lc from"node:fs/promises";import No from"node:path";var uc,dc,Tp,vp=S(()=>{"use strict";W();K();uc=".prjct/.prjct-state.md",dc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=No.join(e,uc);await lc.mkdir(No.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await lc.writeFile(s,n,"utf-8")}async remove(e){try{await lc.unlink(No.join(e,uc))}catch(t){if(!R(t))throw t}}async exists(e){let t=No.join(e,uc);return P(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",p=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${p}`)}),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(`
529
- `)}},Tp=new dc});var pc,xt,Js=S(()=>{"use strict";Et();Ws();re();pc=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<=as.MEMORY_MAX_ENTRIES)return 0;let n=s-as.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Mt.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}}},xt=new pc});import gk from"node:path";function fk(r){return mo(gk.resolve(r))}function Pr(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function hk(r){return Tr(r,e=>`${Pr(e.name)}::${Pr(e.source)}`)}function yk(r){return Tr(r,e=>`${Pr(e.issue)}::${Pr(e.file)}::${Pr(e.source)}`)}var mc,wk,Cp,Pp=S(()=>{"use strict";re();Mo();wn();l(fk,"repoHash");l(Pr,"normalizeKey");l(hk,"dedupePatterns");l(yk,"dedupeAntiPatterns");mc=class{static{l(this,"PatternExtractor")}async extract(e){let t=fk(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=hk([...s,...n]),a=yk([...o]),c=`analysis:derived-rules:${t}`;return C.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}}},wk=new mc,Cp=wk});import Er from"node:fs/promises";import kk from"node:os";import xr from"node:path";function Sk(r){return`# ${r.projectName}
530
- ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function bk(r){return r.patterns.length===0?"":`
636
+ `).run(j(h.id),j(h.projectId)??r,j(h.task)??"",j(h.status)??"completed",j(h.startedAt)??new Date().toISOString(),j(h.pausedAt),j(h.completedAt),gs(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=K.join(a,"current.json"),d=await Ot(u);d!==null&&(c(d),await Q.unlink(u).catch(()=>{}),s++);let p=K.join(a,"archive");try{let h=await Q.readdir(p);for(let w of h){let E=K.join(p,w);try{if(!(await Q.stat(E)).isDirectory())continue;let V=await Q.readdir(E);for(let k of V){if(!k.endsWith(".json"))continue;let $=await Ot(K.join(E,k));$!==null&&(c($),await Q.unlink(K.join(E,k)).catch(()=>{}),s++)}(await Q.readdir(E)).length===0&&await Q.rmdir(E).catch(()=>{})}catch{}}(await Q.readdir(p).catch(()=>[])).length===0&&await Q.rmdir(p).catch(()=>{})}catch{}try{(await Q.readdir(a)).length===0&&await Q.rmdir(a).catch(()=>{})}catch{}let m=K.join(e,"index"),g=[...La.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let S=K.join(m,h),w=await Ot(S);if(w===null)continue;let E=La.find(D=>D.filename===h);E&&(P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(w),new Date().toISOString()),_d(r,E.key,w));try{await Q.unlink(S)}catch{}s++}return s}var Fa,La,Ua=v(()=>{"use strict";fe();H();ee();Fa=[{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"}],La=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Eo,"migrateJsonToSqlite");l(gy,"createBackup");l(Na,"copyFiles");l(Md,"populateNormalized");l(fy,"populateTasksFromState");l(hy,"populateQueueTasks");l(yy,"populateIdeas");l(wy,"populateShippedFeatures");l(ky,"populateMetricsDaily");l(Sy,"populateAnalysis");l(_d,"populateIndexTables");l(by,"populateCategoriesIndex");l(Ty,"migrateChecksums");l(vy,"migrateFileScores");l(Ey,"migrateEventsJsonl");l(Py,"migrateLearningsJsonl");l(Cy,"migrateSessionFiles");l(xy,"cleanupJsonFiles");l(j,"toStr");l(gs,"toNum");l(Ot,"readJsonSafe");l(Po,"sweepLegacyJson")});function Ld(r){return[...r].sort((e,t)=>{let s=Nd[e.section]-Nd[t.section];return s!==0?s:Od[e.priority]-Od[t.priority]})}function Ha(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Od,Nd,Ga=v(()=>{"use strict";Od={critical:0,high:1,medium:2,low:3},Nd={active:0,previously_active:1,backlog:2};l(Ld,"sortBySectionAndPriority");l(Ha,"uniqueBy")});var Wa,we,Wt=v(()=>{"use strict";xt();aa();Ga();z();Ms();Qt();Wa=class extends Be{static{l(this,"QueueStorage")}constructor(){super("queue.json",Nu)}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 Ld(t)[0]||null}async addTask(e,t){let s={...t,id:pe(),createdAt:b(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:b()})),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=b(),n=t.map(o=>({...o,id:pe(),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:b()})),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:b()},s):i),lastUpdated:b()})),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:b()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}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:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=is(Zt.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;At.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:b()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},we=new Wa});import{z as Z}from"zod";var Ry,Fd,Ay,Dy,jy,Iy,$y,My,_y,Ud,Hd=v(()=>{"use strict";Ry=Z.enum(["feature","fix","improvement","refactor"]),Fd=Z.enum(["pass","warning","fail","skipped"]),Ay=Z.enum(["added","changed","fixed","removed"]),Dy=Z.object({hours:Z.number(),minutes:Z.number(),totalMinutes:Z.number()}),jy=Z.object({filesChanged:Z.number().nullable().optional(),linesAdded:Z.number().nullable().optional(),linesRemoved:Z.number().nullable().optional(),commits:Z.number().nullable().optional()}),Iy=Z.object({description:Z.string(),type:Ay.optional()}),$y=Z.object({lintStatus:Fd.nullable().optional(),lintDetails:Z.string().optional(),testStatus:Fd.nullable().optional(),testDetails:Z.string().optional()}),My=Z.object({hash:Z.string().optional(),message:Z.string().optional(),branch:Z.string().optional()}),_y=Z.object({id:Z.string(),name:Z.string(),version:Z.string().nullable().optional(),type:Ry,agent:Z.string().optional(),description:Z.string().optional(),changes:Z.array(Iy).optional(),codeSnippets:Z.array(Z.string()).optional(),commit:My.optional(),codeMetrics:jy.optional(),qualityMetrics:$y.optional(),quantitativeImpact:Z.string().optional(),duration:Dy.optional(),tasksCompleted:Z.number().nullable().optional(),shippedAt:Z.string(),featureId:Z.string().optional()}),Ud=Z.object({shipped:Z.array(_y),lastUpdated:Z.string()})});var Va,Xe,Ns=v(()=>{"use strict";xt();Hd();z();Ms();Qt();Va=class extends Be{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Ud)}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:pe(),shippedAt:b()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:b()})),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=is(Zt.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;At.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:b()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},Xe=new Va});import{z as le}from"zod";var Oy,Ny,Gd,ER,PR,CR,fs,Wd,gr=v(()=>{"use strict";Oy=le.enum(["improving","stable","declining"]),Ny=le.object({sprintNumber:le.number(),startDate:le.string(),endDate:le.string(),pointsCompleted:le.number(),tasksCompleted:le.number(),avgVariance:le.number(),estimationAccuracy:le.number()}),Gd=le.object({category:le.string(),avgVariance:le.number(),taskCount:le.number()}),ER=le.object({totalPoints:le.number(),sprints:le.number(),estimatedDate:le.string()}),PR=le.object({sprints:le.array(Ny),averageVelocity:le.number(),velocityTrend:Oy,estimationAccuracy:le.number(),overEstimated:le.array(Gd),underEstimated:le.array(Gd),lastUpdated:le.string()}),CR=le.object({sprintLengthDays:le.number().min(1).max(90).default(7),startDay:le.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:le.number().min(1).max(52).default(6),accuracyTolerance:le.number().min(0).max(100).default(20)}),fs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Wd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ba,Co,Ja=v(()=>{"use strict";gr();Qt();Ba=class extends Be{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Wd,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}},Co=new Ba});var fr,za,qa,Vd=v(()=>{"use strict";ir();z();fr=3,za=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>=fr){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}/${fr} 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>=fr){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}/${fr} 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>=fr&&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:[Ne.FILE_STRUCTURE,Ne.ARCHITECTURE],tech_stack:[Ne.TECH_STACK],architecture:[Ne.ARCHITECTURE,Ne.CODE_STYLE],estimation:[Ne.SHIP_WORKFLOW],workflow:[Ne.SHIP_WORKFLOW,Ne.CODE_STYLE],gotcha:[Ne.TEST_BEHAVIOR,Ne.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: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
637
+ `)}},qa=new za});import{z as C}from"zod";var Bd,Ly,Fy,Jd,Uy,Hy,Gy,Wy,Vy,By,Jy,zd,zy,qy,LR,qd,Kd,Xd,Yd,Ky,xo,Qd=v(()=>{"use strict";Bd=C.number().min(1).max(5),Ly=C.enum(["exceeded","met","partial","failed"]),Fy=C.enum(["definitely","probably","maybe","no"]),Jd=C.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Uy=C.object({estimated:C.object({hours:C.number(),confidence:C.enum(["low","medium","high"]).optional(),source:C.enum(["prd","manual","historical"]).optional()}),actual:C.object({hours:C.number(),commits:C.number().optional(),linesAdded:C.number().optional(),linesRemoved:C.number().optional(),sessions:C.number().optional()}),variance:C.object({hours:C.number(),percentage:C.number(),reason:Jd.optional(),explanation:C.string().optional()})}),Hy=C.object({name:C.string(),baseline:C.number().nullable(),target:C.number(),actual:C.number(),unit:C.string(),achieved:C.boolean(),percentOfTarget:C.number()}),Gy=C.object({criteria:C.string(),met:C.boolean(),notes:C.string().optional()}),Wy=C.object({metrics:C.array(Hy),acceptanceCriteria:C.array(Gy),overallSuccess:Ly,successScore:C.number().min(0).max(100)}),Vy=C.object({category:C.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:C.string(),actionable:C.boolean(),action:C.string().optional()}),By=C.object({whatWorked:C.array(C.string()),whatDidnt:C.array(C.string()),surprises:C.array(C.string()),recommendations:C.array(Vy)}),Jy=C.object({valueDelivered:C.number().min(1).max(10),userImpact:C.enum(["none","low","medium","high","critical"]),businessImpact:C.enum(["none","low","medium","high","critical"]),roiScore:C.number(),worthIt:Fy,worthItReason:C.string().optional(),alternativeConsidered:C.string().optional(),betterAlternativeExists:C.boolean().optional()}),zd=C.object({id:C.string(),taskId:C.string(),description:C.string(),estimatedMinutes:C.number().optional(),actualMinutes:C.number(),completedAsPlanned:C.boolean(),qualityScore:Bd,blockers:C.array(C.string()),agentUsed:C.string().optional(),skillsUsed:C.array(C.string()).optional(),startedAt:C.string(),completedAt:C.string()}),zy=C.object({id:C.string(),featureId:C.string(),featureName:C.string(),prdId:C.string().nullable(),version:C.string().optional(),branch:C.string().optional(),prUrl:C.string().optional(),effort:Uy,success:Wy.optional(),learnings:By,roi:Jy,rating:Bd,taskOutcomes:C.array(zd).optional(),startedAt:C.string(),shippedAt:C.string(),reviewedAt:C.string().optional(),reviewedBy:C.string().optional(),legacy:C.boolean().optional()}),qy=C.object({totalFeatures:C.number(),averageEstimationAccuracy:C.number(),averageSuccessRate:C.number(),averageROI:C.number(),bySuccessLevel:C.object({exceeded:C.number(),met:C.number(),partial:C.number(),failed:C.number()}),variancePatterns:C.array(C.object({reason:Jd,count:C.number(),averageVariance:C.number()})),topLearnings:C.array(C.object({insight:C.string(),frequency:C.number()}))}),LR=C.object({outcomes:C.array(zy),taskOutcomes:C.array(zd).optional(),aggregates:qy.optional(),lastUpdated:C.string(),lastAggregated:C.string().optional()}),qd={outcomes:[],taskOutcomes:[],lastUpdated:""},Kd=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"),Xd=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Yd=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Ky=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),xo=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=>Ky(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,p)=>{let m=p.effort.variance.reason;return d[m]||(d[m]={count:0,totalVariance:0}),d[m].count++,d[m].totalVariance+=p.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,p])=>({reason:d,count:p.count,averageVariance:Math.round(p.totalVariance/p.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,p)=>(d[p]=(d[p]||0)+1,d),{}),u=Object.entries(c).sort((d,p)=>p[1]-d[1]).slice(0,10).map(([d,p])=>({insight:d,frequency:p}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,p)=>d+p,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,p)=>d+p,0)/t.length):0,averageROI:Math.round(s.reduce((d,p)=>d+p,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Ka,Zd,em=v(()=>{"use strict";Qd();Qt();z();Ka=class extends Be{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...qd,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:xo([t,...s.outcomes]),lastUpdated:b()})),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:b()}))}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?xo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:xo(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}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=Kd(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Xd(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:Yd(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}}},Zd=new Ka});import Xa from"node:fs/promises";import Ro from"node:path";var Ya,Qa,tm,sm=v(()=>{"use strict";H();J();Ya=".prjct/.prjct-state.md",Qa=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Ro.join(e,Ya);await Xa.mkdir(Ro.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Xa.writeFile(s,n,"utf-8")}async remove(e){try{await Xa.unlink(Ro.join(e,Ya))}catch(t){if(!A(t))throw t}}async exists(e){let t=Ro.join(e,Ya);return x(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(`
638
+ `)}},tm=new Qa});var Za,kt,Ls=v(()=>{"use strict";De();Ms();ee();Za=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await M.getProjectId(e);if(!o)return;I.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 M.getProjectId(e);return s?I.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 M.getProjectId(e);return n?I.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 M.getProjectId(e);if(!t)return;I.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 I.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=I.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=Zt.MEMORY_MAX_ENTRIES)return 0;let n=s-Zt.MEMORY_MAX_ENTRIES,o=I.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);At.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&&I.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}}},kt=new Za});import Xy from"node:path";function Yy(r){return As(Xy.resolve(r))}function hr(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Qy(r){return Ha(r,e=>`${hr(e.name)}::${hr(e.source)}`)}function Zy(r){return Ha(r,e=>`${hr(e.issue)}::${hr(e.file)}::${hr(e.source)}`)}var ec,ew,nm,rm=v(()=>{"use strict";ee();Ga();Ds();l(Yy,"repoHash");l(hr,"normalizeKey");l(Qy,"dedupePatterns");l(Zy,"dedupeAntiPatterns");ec=class{static{l(this,"PatternExtractor")}async extract(e){let t=Yy(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=Qy([...s,...n]),a=Zy([...o]),c=`analysis:derived-rules:${t}`;return P.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}}},ew=new ec,nm=ew});import yr from"node:fs/promises";import tw from"node:os";import wr from"node:path";function sw(r){return`# ${r.projectName}
639
+ ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function nw(r){return r.patterns.length===0?"":`
531
640
  ## Patterns
532
641
  ${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
533
642
  `)}
534
- `}function Tk(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
643
+ `}function rw(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
535
644
  ## Anti-Patterns
536
645
  ${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
537
646
  `)}
538
- `}function vk(r){return r.knownGotchas.length===0?"":`
647
+ `}function ow(r){return r.knownGotchas.length===0?"":`
539
648
  ## Known Gotchas
540
649
  ${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
541
650
  `)}
542
- `}function Ck(r){return r.recentShipped.length===0?"":`
651
+ `}function iw(r){return r.recentShipped.length===0?"":`
543
652
  ## Recent Deliveries
544
653
  ${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(`
545
654
  `)}
546
- `}function Pk(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?"":`
655
+ `}function aw(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?"":`
547
656
  ## Velocity
548
657
  ${e.join(" | ")}
549
- `}function Ek(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?"":`
658
+ `}function cw(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?"":`
550
659
  ## Commands
551
660
  | Action | Command |
552
661
  |--------|---------|
553
662
  ${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
554
663
  `)}
555
- `}function xk(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?"":`
664
+ `}function lw(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?"":`
556
665
  ## State
557
666
  ${e.join(`
558
667
  `)}
559
- `}function Rk(r){return r.userPatterns.length===0?"":`
668
+ `}function uw(r){return r.userPatterns.length===0?"":`
560
669
  ## User Patterns
561
670
  ${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
562
671
  `)}
563
- `}function Ak(r){return[bk(r),Tk(r),vk(r),Ck(r),Pk(r),Ek(r.commands),xk(r),Rk(r)].filter(Boolean).join("")}function Dk(r,e){let t=r.userInvocable!==!1;return`---
672
+ `}function dw(r){return[nw(r),rw(r),ow(r),iw(r),aw(r),cw(r.commands),lw(r),uw(r)].filter(Boolean).join("")}function mw(r,e){let t=r.userInvocable!==!1;return`---
564
673
  description: "${r.description} (${e.projectName}, ${e.stack})"
565
674
  allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
566
675
  user-invocable: ${t}
567
- ---`}function jk(r,e){return`${Dk(r,e)}
676
+ ---`}function pw(r,e){return`${mw(r,e)}
568
677
 
569
- ${r.body(e)}`}var gc,fc,Ep,xp=S(()=>{"use strict";ss();ns();l(Sk,"formatProjectHeader");l(bk,"formatPatterns");l(Tk,"formatAntiPatterns");l(vk,"formatGotchas");l(Ck,"formatRecentShipped");l(Pk,"formatVelocity");l(Ek,"formatCommands");l(xk,"formatState");l(Rk,"formatUserPatterns");l(Ak,"formatRichContext");gc=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Sk(r)}
570
- ${Ak(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(`
678
+ ${r.body(e)}`}var tc,sc,om,im=v(()=>{"use strict";Jt();Kt();l(sw,"formatProjectHeader");l(nw,"formatPatterns");l(rw,"formatAntiPatterns");l(ow,"formatGotchas");l(iw,"formatRecentShipped");l(aw,"formatVelocity");l(cw,"formatCommands");l(lw,"formatState");l(uw,"formatUserPatterns");l(dw,"formatRichContext");tc=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${sw(r)}
679
+ ${dw(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(`
571
680
  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(`
572
681
  `)},"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
573
682
 
@@ -650,47 +759,81 @@ prjct tokens <input_tokens> <output_tokens>
650
759
 
651
760
  Tokens accumulate \u2014 call multiple times during a task and they add up.
652
761
  Token totals are saved to task history on completion for cost comparison across tasks.
653
- `,"body")}];l(Dk,"buildFrontmatter");l(jk,"buildSkillContent");fc=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=xr.join(kk.homedir(),".claude","skills");for(let c of gc){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await Er.rm(xr.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=jk(c,o),p=xr.join(i,c.name),m=xr.join(p,"SKILL.md");await Er.mkdir(p,{recursive:!0}),await Er.writeFile(m,u,"utf-8"),n.generated.push({name:c.name,path:m})}catch(u){V.debug(`Failed to generate skill ${c.name}`,{error:ue(u)}),n.skipped.push({name:c.name,reason:ue(u)})}}let a=new Set(gc.map(c=>c.name));try{let c=await Er.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await Er.rm(xr.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 gc}},Ep=new fc});var Rp=S(()=>{"use strict"});import Ik from"node:fs/promises";import Ap from"node:path";var Lo,Dp=S(()=>{"use strict";K();Lo=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=Ap.join(this.projectPath,"package.json"),t=await Ik.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return P(Ap.join(this.projectPath,e))}}});import hc from"node:path";async function jp(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await O("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await O("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await O("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await O("git status --porcelain",{cwd:r}),i=o.trim().split(`
654
- `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let p=u.substring(0,2),m=u.substring(3);p.startsWith("A")||p.startsWith("M ")?e.stagedFiles.push(m):p.includes("M")?e.modifiedFiles.push(m):p.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await O('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
655
- `).filter(Boolean).map(u=>{let[p,m,d]=u.split("|");return{hash:p,message:m,date:d}});let{stdout:c}=await O('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:ue(t)})}return e}async function Ht(r,e){let t=await P(hc.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Ip(r){let e={fileCount:0,version:"0.0.0",name:hc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await O('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:ue(t)}),e.fileCount=0}try{let t=hc.join(r,"package.json"),s=await xe(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 Ht(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:ue(t)})}return await Ht(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Ht(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Ht(r,"requirements.txt")||await Ht(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 $p(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 Ht(r,"bun.lockb")||await Ht(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 Ht(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 Ht(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 Ht(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 Ht(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 Mp(r){return new Lo(r).detect()}var _p=S(()=>{"use strict";ss();Rp();He();K();ns();Dp();l(jp,"analyzeGit");l(Ht,"fileExistsInProject");l(Ip,"gatherStats");l($p,"detectCommands");l(Mp,"detectStack")});import Op from"node:fs/promises";import Fo from"node:path";var yc,wc,Np,Lp=S(()=>{"use strict";Pt();W();He();K();yc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Fo.join(r,n);await P(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=Fo.basename(r);try{await _.read(s)}catch(n){R(n)||t.push(`state: ${w(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=Fo.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 Op.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Op.readFile(Fo.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(!R(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(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}}},wc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[yc.contextFilesExist(t),yc.jsonFilesValid(t),yc.noSensitiveData(t)];for(let d of c){let g=await d;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(d=>d.passed))&&s?.checks)for(let d of s.checks){if(d.enabled===!1){a++;continue}let g=await this.runCustomCheck(d,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(d)+1);a+=h.filter(k=>k.enabled!==!1).length;break}}let p=o.filter(d=>!d.passed).length,m=o.filter(d=>d.passed).length;return{passed:p===0,checks:o,totalMs:Date.now()-n,failedCount:p,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 O(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}}}},Np=new wc});import Fp from"node:fs/promises";import kc from"node:path";var Sc,qs,bc=S(()=>{"use strict";mr();da();vd();Ed();Id();Aa();ss();at();os();Et();Te();jo();kn();Ws();re();ks();kr();Ya();tc();Xt();zs();Pt();oc();ie();K();ns();dp();bp();br();vp();Js();Pp();xp();_p();Lp();Sc=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 Fp.rm(kc.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await _s()).installed){let j=await Do({autoRepair:!0});j.verified||V.warn(`Codex p. router not ready: ${j.message||"verification failed"}`)}try{n=await ls.ensureReady()}catch(j){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:ue(j)},error:`Context7 MCP is required but not ready: ${ue(j)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Io(this.projectId);try{let j=await $o(this.projectId);j>0&&V.info("Swept legacy JSON files into SQLite",{swept:j})}catch(j){V.debug("Legacy JSON sweep failed (non-critical)",{error:ue(j)})}let[a,c,u,p]=await Promise.all([jp(this.projectPath),Ip(this.projectPath),$p(this.projectPath),Mp(this.projectPath)]),m=t.full===!0,d,g=!0,h=new Set;if(!m&&Pd(this.projectId))try{let{diff:j,currentHashes:E}=await ja(this.projectPath,this.projectId),M=j.added.length+j.modified.length+j.deleted.length;if(M===0&&!t.changedFiles?.length)g=!1,d={isIncremental:!0,filesChanged:0,filesUnchanged:j.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let se=bd(j,this.projectId);h=Td(se.allAffected);let Me=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=se.allAffected.some(mt=>{let ms=mt.substring(mt.lastIndexOf("."));return Me.has(ms)}),d={isIncremental:!0,filesChanged:M,filesUnchanged:j.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}Da(this.projectId,E)}catch(j){V.debug("Incremental detection failed, falling back to full sync",{error:ue(j)})}else try{let{currentHashes:j}=await ja(this.projectPath,this.projectId);Da(this.projectId,j)}catch(j){V.debug("Hash computation failed (non-critical)",{error:ue(j)})}if(g)try{await Promise.all([Vu(this.projectPath,this.projectId),Sd(this.projectPath,this.projectId),jd(this.projectPath,this.projectId)])}catch(j){V.debug("File ranking index build failed (non-critical)",{error:ue(j)})}let k;try{let[j,E,M,se,Me,q,mt,ms,nr,Ii,$i]=await Promise.all([Promise.resolve(Lt.getActive(this.projectId)).catch(()=>null),Ke.getActive(this.projectId).catch(()=>null),tt.getRecent(this.projectId,3).catch(()=>[]),_o.getMetrics(this.projectId).catch(()=>null),be.getBacklog(this.projectId).catch(()=>[]),_.getTaskHistory(this.projectId).catch(()=>[]),_.getAllPausedTasks(this.projectId).catch(()=>[]),_.getAggregatedFeedback(this.projectId).catch(()=>null),_.getCurrentTask(this.projectId).catch(()=>null),Ge.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),tt.getCount(this.projectId).catch(()=>0)]),Mi={backlogCount:Me.length,completedTaskCount:q.length,pausedTaskCount:mt.length,hasActiveTask:!!nr},_i=j?j.patterns.map(oe=>({name:oe.name,description:oe.description,location:oe.locations?.[0]})):(E?.patterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({name:oe.name,description:oe.description,location:oe.location})),Ue=j?j.antiPatterns.map(oe=>({issue:oe.issue,file:oe.files?.[0]??"multiple",suggestion:oe.suggestion,severity:oe.severity??"medium"})):(E?.antiPatterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({issue:oe.issue,file:oe.file,suggestion:oe.suggestion,severity:oe.severity??"medium"})),_t=j?.commands?{install:j.commands.install??u.install,run:u.run,test:j.commands.test??u.test,build:j.commands.build??u.build,dev:j.commands.dev??u.dev,lint:j.commands.lint??u.lint,format:j.commands.format??u.format}:u,rr={version:c.version,fileCount:c.fileCount,patterns:_i,antiPatterns:Ue,recentShipped:M.map(oe=>({name:oe.name,type:oe.type??"feature",duration:oe.duration,filesChanged:oe.changes?.length})),velocity:se?{avgPoints:se.averageVelocity,trend:se.velocityTrend,accuracy:se.estimationAccuracy}:null,backlogCount:Me.length,completedTaskCount:q.length,pausedTaskCount:mt.length,knownGotchas:ms?.knownGotchas??[],userPatterns:ms?.patternsDiscovered??[],hasActiveTask:!!nr,activeTaskDescription:nr?.description??"",pausedTasks:mt.map(oe=>({description:oe.description,pausedAt:oe.pausedAt??""})),topBacklog:Me.slice(0,3).map(oe=>({description:oe.description,priority:oe.priority??"medium"})),ideasCount:Ii?.pending??0,shippedCount:$i};k=await Ep.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:_t,stack:p},Mi,rr)}catch(j){V.debug("Native skill generation failed (non-critical)",{error:ue(j)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,p),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,p,n.verified)]);let y=await Ke.getActive(this.projectId),v={patterns:y?.patterns?.length||0,antiPatterns:y?.antiPatterns?.length||0,criticalAntiPatterns:y?.antiPatterns?.filter(j=>j.severity==="high").length||0},D=Date.now()-s,U=await this.recordSyncMetrics(c,D);await this.archiveStaleData(),await this.autoLearnFromHistory(),await De.installGlobalConfig(),await De.syncCommands();let F;try{let j=await $.readConfig(this.projectPath);F=await Np.verify(this.projectPath,this.globalPath,j?.verification)}catch(j){V.debug("Verification failed (non-critical)",{error:ue(j)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:p,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:v,syncMetrics:U,verification:F,incremental:d,generatedSkills:k}}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:ue(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Fp.mkdir(kc.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=C.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||T(),lastSync:T(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};C.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await _.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=T(),n.lastUpdated=T(),n.context={...n.context||{},lastSession:T(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,n);try{await Tp.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:ue(o)})}}async logToMemory(e,t){C.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=po(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:ue(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Pn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:ue(a)})}let i={};try{let a=po(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=wo(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Dd(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:ue(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 _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Cp.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 Ke.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:T(),status:"draft",commitHash:o??void 0})}catch(o){V.debug("Failed to save draft analysis (non-critical)",{error:ue(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([tt.archiveOldShipped(this.projectId).catch(()=>0),Ge.markDormantIdeas(this.projectId).catch(()=>0),be.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),xt.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=Mt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:ue(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Ls,s=await ac.learnFromTaskHistory(this.projectId,e,t);try{let n=await Sp.getFeatureOutcomes(this.projectId);n.length>0&&await ac.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:ue(e)})}}async getCliVersion(){try{let e=kc.join(__dirname,"..","..","package.json");return(await xe(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:ue(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:[]}}},qs=new Sc});function $k(){return"---"}function Mk(){return`---
656
- prjct v${Fs()}`}function L(...r){return Cc($k(),...r.filter(Boolean),Mk())}function Rr(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
657
- `)}function Up(r,e=""){return`\`\`\`${e}
762
+ `,"body")}];l(mw,"buildFrontmatter");l(pw,"buildSkillContent");sc=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=wr.join(tw.homedir(),".claude","skills");for(let c of tc){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await yr.rm(wr.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=pw(c,o),d=wr.join(i,c.name),p=wr.join(d,"SKILL.md");await yr.mkdir(d,{recursive:!0}),await yr.writeFile(p,u,"utf-8"),n.generated.push({name:c.name,path:p})}catch(u){G.debug(`Failed to generate skill ${c.name}`,{error:oe(u)}),n.skipped.push({name:c.name,reason:oe(u)})}}let a=new Set(tc.map(c=>c.name));try{let c=await yr.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await yr.rm(wr.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&G.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return tc}},om=new sc});var am=v(()=>{"use strict"});import gw from"node:fs/promises";import cm from"node:path";var Ao,lm=v(()=>{"use strict";J();Ao=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=cm.join(this.projectPath,"package.json"),t=await gw.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return x(cm.join(this.projectPath,e))}}});import nc from"node:path";async function um(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await N("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await N("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await N("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await N("git status --porcelain",{cwd:r}),i=o.trim().split(`
763
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await N('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
764
+ `).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await N('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){G.debug("Git analysis failed (not a git repo?)",{error:oe(t)})}return e}async function Nt(r,e){let t=await x(nc.join(r,e));return t||G.debug("File not found",{filename:e}),t}async function dm(r){let e={fileCount:0,version:"0.0.0",name:nc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await N('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){G.debug("File count failed",{path:r,error:oe(t)}),e.fileCount=0}try{let t=nc.join(r,"package.json"),s=await Ee(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 Nt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){G.debug("No package.json found",{path:r,error:oe(t)})}return await Nt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Nt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Nt(r,"requirements.txt")||await Nt(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 mm(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 Nt(r,"bun.lockb")||await Nt(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 Nt(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 Nt(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 Nt(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 Nt(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 pm(r){return new Ao(r).detect()}var gm=v(()=>{"use strict";Jt();am();Ue();J();Kt();lm();l(um,"analyzeGit");l(Nt,"fileExistsInProject");l(dm,"gatherStats");l(mm,"detectCommands");l(pm,"detectStack")});import fm from"node:fs/promises";import Do from"node:path";var rc,oc,hm,ym=v(()=>{"use strict";wt();H();Ue();J();rc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Do.join(r,n);await x(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=Do.basename(r);try{await _.read(s)}catch(n){A(n)||t.push(`state: ${y(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=Do.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 fm.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await fm.readFile(Do.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(!A(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(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}}},oc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[rc.contextFilesExist(t),rc.jsonFilesValid(t),rc.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(m)+1);a+=h.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await N(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}}}},hm=new oc});import wm from"node:fs/promises";import ic from"node:path";var ac,Fs,cc=v(()=>{"use strict";Gi();Zi();sd();od();dd();wa();Jt();lt();Yt();De();fe();vo();pn();Ms();ee();ps();ur();Oa();Ua();Wt();Ns();wt();Ja();z();J();Kt();Vd();em();mr();sm();Ls();rm();im();gm();ym();ac=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 M.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=R.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await wm.rm(ic.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Cs()).installed){let k=await To({autoRepair:!0});k.verified||G.warn(`Codex p. router not ready: ${k.message||"verification failed"}`)}try{n=await ts.ensureReady()}catch(k){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:oe(k)},error:`Context7 MCP is required but not ready: ${oe(k)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Eo(this.projectId);try{let k=await Po(this.projectId);k>0&&G.info("Swept legacy JSON files into SQLite",{swept:k})}catch(k){G.debug("Legacy JSON sweep failed (non-critical)",{error:oe(k)})}let[a,c,u,d]=await Promise.all([um(this.projectPath),dm(this.projectPath),mm(this.projectPath),pm(this.projectPath)]),p=t.full===!0,m,g=!0,h=new Set;if(!p&&rd(this.projectId))try{let{diff:k,currentHashes:$}=await Sa(this.projectPath,this.projectId),O=k.added.length+k.modified.length+k.deleted.length;if(O===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:k.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let ge=ed(k,this.projectId);h=td(ge.allAffected);let rt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=ge.allAffected.some(os=>{let Qs=os.substring(os.lastIndexOf("."));return rt.has(Qs)}),m={isIncremental:!0,filesChanged:O,filesUnchanged:k.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}ka(this.projectId,$)}catch(k){G.debug("Incremental detection failed, falling back to full sync",{error:oe(k)})}else try{let{currentHashes:k}=await Sa(this.projectPath,this.projectId);ka(this.projectId,k)}catch(k){G.debug("Hash computation failed (non-critical)",{error:oe(k)})}if(g)try{await Promise.all([Cu(this.projectPath,this.projectId),Zu(this.projectPath,this.projectId),ud(this.projectPath,this.projectId)])}catch(k){G.debug("File ranking index build failed (non-critical)",{error:oe(k)})}let S;try{let[k,$,O,ge,rt,Ts,os,Qs,Qn,Si,bi]=await Promise.all([Promise.resolve(Mt.getActive(this.projectId)).catch(()=>null),Je.getActive(this.projectId).catch(()=>null),Xe.getRecent(this.projectId,3).catch(()=>[]),Co.getMetrics(this.projectId).catch(()=>null),we.getBacklog(this.projectId).catch(()=>[]),_.getTaskHistory(this.projectId).catch(()=>[]),_.getAllPausedTasks(this.projectId).catch(()=>[]),_.getAggregatedFeedback(this.projectId).catch(()=>null),_.getCurrentTask(this.projectId).catch(()=>null),Le.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Xe.getCount(this.projectId).catch(()=>0)]),Ti={backlogCount:rt.length,completedTaskCount:Ts.length,pausedTaskCount:os.length,hasActiveTask:!!Qn},vi=k?k.patterns.map(se=>({name:se.name,description:se.description,location:se.locations?.[0]})):($?.patterns??[]).filter(se=>se.source!=="repo").map(se=>({name:se.name,description:se.description,location:se.location})),Oe=k?k.antiPatterns.map(se=>({issue:se.issue,file:se.files?.[0]??"multiple",suggestion:se.suggestion,severity:se.severity??"medium"})):($?.antiPatterns??[]).filter(se=>se.source!=="repo").map(se=>({issue:se.issue,file:se.file,suggestion:se.suggestion,severity:se.severity??"medium"})),jt=k?.commands?{install:k.commands.install??u.install,run:u.run,test:k.commands.test??u.test,build:k.commands.build??u.build,dev:k.commands.dev??u.dev,lint:k.commands.lint??u.lint,format:k.commands.format??u.format}:u,Zn={version:c.version,fileCount:c.fileCount,patterns:vi,antiPatterns:Oe,recentShipped:O.map(se=>({name:se.name,type:se.type??"feature",duration:se.duration,filesChanged:se.changes?.length})),velocity:ge?{avgPoints:ge.averageVelocity,trend:ge.velocityTrend,accuracy:ge.estimationAccuracy}:null,backlogCount:rt.length,completedTaskCount:Ts.length,pausedTaskCount:os.length,knownGotchas:Qs?.knownGotchas??[],userPatterns:Qs?.patternsDiscovered??[],hasActiveTask:!!Qn,activeTaskDescription:Qn?.description??"",pausedTasks:os.map(se=>({description:se.description,pausedAt:se.pausedAt??""})),topBacklog:rt.slice(0,3).map(se=>({description:se.description,priority:se.priority??"medium"})),ideasCount:Si?.pending??0,shippedCount:bi};S=await om.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:jt,stack:d},Ti,Zn)}catch(k){G.debug("Native skill generation failed (non-critical)",{error:oe(k)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let w=await Je.getActive(this.projectId),E={patterns:w?.patterns?.length||0,antiPatterns:w?.antiPatterns?.length||0,criticalAntiPatterns:w?.antiPatterns?.filter(k=>k.severity==="high").length||0},D=Date.now()-s,V=await this.recordSyncMetrics(c,D);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Pe.installGlobalConfig(),await Pe.syncCommands();let F;try{let k=await M.readConfig(this.projectPath);F=await hm.verify(this.projectPath,this.globalPath,k?.verification)}catch(k){G.debug("Verification failed (non-critical)",{error:oe(k)})}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:E,syncMetrics:V,verification:F,incremental:m,generatedSkills:S}}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:oe(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>wm.mkdir(ic.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=P.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||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};P.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await _.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=b(),n.lastUpdated=b(),n.context={...n.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,n);try{await tm.generate(this.projectPath,n)}catch(o){G.debug("Local state generation failed (optional)",{error:oe(o)})}}async logToMemory(e,t){P.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=co(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){G.debug("Could not load BM25 index for metrics",{error:oe(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await wn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){G.debug("Failed to record sync metrics",{error:oe(a)})}let i={};try{let a=co(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=go(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=ld(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){G.debug("Could not load index stats",{error:oe(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 _.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 nm.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 Je.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){G.debug("Failed to save draft analysis (non-critical)",{error:oe(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([Xe.archiveOldShipped(this.projectId).catch(()=>0),Le.markDormantIdeas(this.projectId).catch(()=>0),we.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),kt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){G.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=At.getStats(this.projectId);G.debug("Archive stats",a)}}catch(e){G.debug("Archival failed (non-critical)",{error:oe(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new cn,s=await qa.learnFromTaskHistory(this.projectId,e,t);try{let n=await Zd.getFeatureOutcomes(this.projectId);n.length>0&&await qa.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&G.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){G.debug("Auto-learning failed (non-critical)",{error:oe(e)})}}async getCliVersion(){try{let e=ic.join(__dirname,"..","..","package.json");return(await Ee(e))?.version||"0.0.0"}catch(e){return G.debug("Failed to read CLI version",{error:oe(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:[]}}},Fs=new ac});function fw(){return"---"}function hw(){return`---
765
+ prjct v${vs()}`}function L(...r){return dc(fw(),...r.filter(Boolean),hw())}function kr(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
766
+ `)}function km(r,e=""){return`\`\`\`${e}
658
767
  ${r}
659
- \`\`\``}function Tc(r,e){return`**${r}**: \`${e}\``}function vc(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function Q(r,e,t=3){return`### ${r}
660
- ${e}`}function Oe(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
661
- `)}function Ar(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?`
662
- > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Hp(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
663
- ${Rr(t,s)}`}function Gp(r){return r.length===0?"":`### Relevant Files
768
+ \`\`\``}function lc(r,e){return`**${r}**: \`${e}\``}function uc(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function X(r,e,t=3){return`### ${r}
769
+ ${e}`}function Ie(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
770
+ `)}function Sr(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?`
771
+ > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Sm(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
772
+ ${kr(t,s)}`}function bm(r){return r.length===0?"":`### Relevant Files
664
773
  ${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
665
- `)}`}function ge(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
666
- ${Rr(e,t)}`}function lt(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 Rr(t,s)}function ke(r,e){return e?`## ${r}
667
- > ${e}`:`## ${r}`}function Wp(r){return`> **WARNING:** ${r}`}function Cc(...r){return r.filter(Boolean).join(`
668
-
669
- `)}function Rt(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(`
670
- `))}var Ks=S(()=>{"use strict";Ct();l($k,"mdHeader");l(Mk,"mdFooter");l(L,"mdOutput");l(Rr,"mdTable");l(Up,"mdCodeBlock");l(Tc,"mdBadge");l(vc,"mdCallout");l(Q,"mdSection");l(Oe,"mdList");l(Ar,"mdTaskHeader");l(Hp,"mdSubtasks");l(Gp,"mdRelevantFiles");l(ge,"mdNextSteps");l(lt,"mdStats");l(ke,"mdDone");l(Wp,"mdWarn");l(Cc,"mdJoin");l(Rt,"mdActionRequired")});import Dr from"chalk";function At(r,e={}){if(e.quiet)return;let t=Bp[r]||"idle",s=Gs.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Vp[o]||o}));console.log(Dr.dim(`
671
- Next:`));for(let o of n){let i=Dr.cyan(o.cmd.padEnd(12));console.log(Dr.dim(` ${i} \u2192 ${o.desc}`))}}function Uo(r,e=!1){let t=Bp[r]||"idle";return Gs.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Vp[n]||n}))}function jr(r){let e=Gs.getStateInfo(r);console.log(Dr.dim(`\u{1F4CD} State: ${Dr.white(r.toUpperCase())} - ${e.description}`))}var Vp,Bp,En=S(()=>{"use strict";ba();Vp={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"},Bp={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(At,"showNextSteps");l(Uo,"getNextSteps");l(jr,"showStateInfo")});import Xs from"chalk";var zp,_k,Ok,Gt,Jp=S(()=>{"use strict";at();zp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],_k=80,Ok={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:zp,speed:_k},cli:{header:l(()=>`${Xs.cyan.bold("\u26A1")} ${Xs.cyan("prjct")}`,"header"),footer:l(()=>Xs.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Xs.cyan("\u26A1")} ${Xs.cyan("prjct")} ${Xs.cyan(zp[r%10])} ${Xs.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")=>Xr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Xr(r).signature,"getSignature")},Gt=Ok});import de from"chalk";function Fk(){return Nk[Lk]}var f0,Pc,Nk,Lk,Ys,xn,Ec,Dt,Ts,Uk,Hk,f,vs=S(()=>{"use strict";Jp();Vs();Co();Co();f0=Gt.spinner.frames,Pc=Gt.spinner.speed,Nk={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}},Lk="compact";l(Fk,"getTierConfig");Ys={success:de.green("\u2713"),fail:de.red("\u2717"),warn:de.yellow("\u26A0"),info:de.blue("\u2139"),debug:de.dim("\u{1F527}"),bullet:de.dim("\u2022"),arrow:de.dim("\u2192"),check:de.green("\u2713"),cross:de.red("\u2717"),spinner:de.cyan("\u25D0")},xn=null,Ec=0,Dt=!1,Ts=l((r,e)=>{let t=e??(Fk().maxCharsPerLine||Ft.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Uk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ft.CLEAR_WIDTH)}\r`):!0,"clear"),Hk={start(){return Dt||console.log(Gt.cli.header()),this},end(){return Dt||console.log(Gt.cli.footer()),this},spin(r){return Dt?this:(this.stop(),process.stdout.isTTY?(xn=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Ec++,Ts(r,Ft.SPINNER_MSG))}`)},Pc),this):(process.stdout.write(`${Gt.cli.spin(0,Ts(r,Ft.SPINNER_MSG))}
672
- `),this))},done(r,e){if(this.stop(),!Dt){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=de.dim(` [${s.join(" | ")}]`))}console.log(`${Ys.success} ${Ts(r,Ft.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Ys.fail} ${Ts(r,Ft.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Fa(r):r;return console.error(),console.error(`${Ys.fail} ${e.message}`),e.file&&console.error(de.dim(` File: ${e.file}`)),e.hint&&console.error(de.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(de.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),Dt||console.log(`${Ys.warn} ${Ts(r,Ft.WARN_MSG)}`),this},info(r){return this.stop(),Dt||console.log(`${Ys.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!Dt&&e&&console.log(`${Ys.debug} ${de.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),Dt)return this;let t=e.bullet||Ys.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),Dt||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(de.dim(n)),console.log(de.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(),Dt)return this;let t=e.split(`
673
- `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(de.dim(`\u250C${n}\u2510`)),console.log(`${de.dim("\u2502")} ${de.bold(r.padEnd(s))} ${de.dim("\u2502")}`),console.log(de.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${de.dim("\u2502")} ${o.padEnd(s)} ${de.dim("\u2502")}`);return console.log(de.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),Dt?this:(console.log(`
674
- ${de.bold(r)}`),console.log(de.dim("\u2500".repeat(r.length))),this)},stop(){return xn&&(clearInterval(xn),xn=null,Uk()),this},step(r,e,t){if(Dt)return this;this.stop();let s=de.dim(`[${r}/${e}]`);return process.stdout.isTTY?(xn=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Ec++,`${s} ${Ts(t,Ft.STEP_MSG)}`)}`)},Pc),this):(process.stdout.write(`${Gt.cli.spin(0,`${s} ${Ts(t,Ft.STEP_MSG)}`)}
675
- `),this)},progress(r,e,t){if(Dt)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=de.cyan("\u2588".repeat(n))+de.dim("\u2591".repeat(o)),a=t?` ${Ts(t,Ft.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(xn=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Ec++,`[${i}] ${s}%${a}`)}`)},Pc),this):(process.stdout.write(`${Gt.cli.spin(0,`[${i}] ${s}%${a}`)}
676
- `),this)}},f=Hk});import Yt from"chalk";function Gk(r){return qp[r.toLowerCase()]||qp.default}var qp,xc,Kp,Xp=S(()=>{"use strict";qp={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(Gk,"getIcon");xc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Yt.cyan(`
774
+ `)}`}function ue(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
775
+ ${kr(e,t)}`}function et(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 kr(t,s)}function he(r,e){return e?`## ${r}
776
+ > ${e}`:`## ${r}`}function Tm(r){return`> **WARNING:** ${r}`}function dc(...r){return r.filter(Boolean).join(`
777
+
778
+ `)}function St(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(`
779
+ `))}var Us=v(()=>{"use strict";Pt();l(fw,"mdHeader");l(hw,"mdFooter");l(L,"mdOutput");l(kr,"mdTable");l(km,"mdCodeBlock");l(lc,"mdBadge");l(uc,"mdCallout");l(X,"mdSection");l(Ie,"mdList");l(Sr,"mdTaskHeader");l(Sm,"mdSubtasks");l(bm,"mdRelevantFiles");l(ue,"mdNextSteps");l(et,"mdStats");l(he,"mdDone");l(Tm,"mdWarn");l(dc,"mdJoin");l(St,"mdActionRequired")});import br from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Em[r]||"idle",s=$s.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:vm[o]||o}));console.log(br.dim(`
780
+ Next:`));for(let o of n){let i=br.cyan(o.cmd.padEnd(12));console.log(br.dim(` ${i} \u2192 ${o.desc}`))}}function jo(r,e=!1){let t=Em[r]||"idle";return $s.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:vm[n]||n}))}function Tr(r){let e=$s.getStateInfo(r);console.log(br.dim(`\u{1F4CD} State: ${br.white(r.toUpperCase())} - ${e.description}`))}var vm,Em,kn=v(()=>{"use strict";la();vm={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Em={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(jo,"getNextSteps");l(Tr,"showStateInfo")});import Hs from"chalk";var Pm,yw,ww,Lt,Cm=v(()=>{"use strict";lt();Pm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],yw=80,ww={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Pm,speed:yw},cli:{header:l(()=>`${Hs.cyan.bold("\u26A1")} ${Hs.cyan("prjct")}`,"header"),footer:l(()=>Hs.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Hs.cyan("\u26A1")} ${Hs.cyan("prjct")} ${Hs.cyan(Pm[r%10])} ${Hs.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")=>Wr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Wr(r).signature,"getSignature")},Lt=ww});import ie from"chalk";function bw(){return kw[Sw]}var UD,mc,kw,Sw,Gs,Sn,pc,Tt,hs,Tw,vw,f,tt=v(()=>{"use strict";Cm();_s();ho();ho();UD=Lt.spinner.frames,mc=Lt.spinner.speed,kw={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}},Sw="compact";l(bw,"getTierConfig");Gs={success:ie.green("\u2713"),fail:ie.red("\u2717"),warn:ie.yellow("\u26A0"),info:ie.blue("\u2139"),debug:ie.dim("\u{1F527}"),bullet:ie.dim("\u2022"),arrow:ie.dim("\u2192"),check:ie.green("\u2713"),cross:ie.red("\u2717"),spinner:ie.cyan("\u25D0")},Sn=null,pc=0,Tt=!1,hs=l((r,e)=>{let t=e??(bw().maxCharsPerLine||_t.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Tw=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(_t.CLEAR_WIDTH)}\r`):!0,"clear"),vw={start(){return Tt||console.log(Lt.cli.header()),this},end(){return Tt||console.log(Lt.cli.footer()),this},spin(r){return Tt?this:(this.stop(),process.stdout.isTTY?(Sn=setInterval(()=>{process.stdout.write(`\r${Lt.cli.spin(pc++,hs(r,_t.SPINNER_MSG))}`)},mc),this):(process.stdout.write(`${Lt.cli.spin(0,hs(r,_t.SPINNER_MSG))}
781
+ `),this))},done(r,e){if(this.stop(),!Tt){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=ie.dim(` [${s.join(" | ")}]`))}console.log(`${Gs.success} ${hs(r,_t.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Gs.fail} ${hs(r,_t.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Pa(r):r;return console.error(),console.error(`${Gs.fail} ${e.message}`),e.file&&console.error(ie.dim(` File: ${e.file}`)),e.hint&&console.error(ie.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ie.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),Tt||console.log(`${Gs.warn} ${hs(r,_t.WARN_MSG)}`),this},info(r){return this.stop(),Tt||console.log(`${Gs.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!Tt&&e&&console.log(`${Gs.debug} ${ie.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),Tt)return this;let t=e.bullet||Gs.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),Tt||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(ie.dim(n)),console.log(ie.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(),Tt)return this;let t=e.split(`
782
+ `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(ie.dim(`\u250C${n}\u2510`)),console.log(`${ie.dim("\u2502")} ${ie.bold(r.padEnd(s))} ${ie.dim("\u2502")}`),console.log(ie.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${ie.dim("\u2502")} ${o.padEnd(s)} ${ie.dim("\u2502")}`);return console.log(ie.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),Tt?this:(console.log(`
783
+ ${ie.bold(r)}`),console.log(ie.dim("\u2500".repeat(r.length))),this)},stop(){return Sn&&(clearInterval(Sn),Sn=null,Tw()),this},step(r,e,t){if(Tt)return this;this.stop();let s=ie.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Sn=setInterval(()=>{process.stdout.write(`\r${Lt.cli.spin(pc++,`${s} ${hs(t,_t.STEP_MSG)}`)}`)},mc),this):(process.stdout.write(`${Lt.cli.spin(0,`${s} ${hs(t,_t.STEP_MSG)}`)}
784
+ `),this)},progress(r,e,t){if(Tt)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=ie.cyan("\u2588".repeat(n))+ie.dim("\u2591".repeat(o)),a=t?` ${hs(t,_t.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Sn=setInterval(()=>{process.stdout.write(`\r${Lt.cli.spin(pc++,`[${i}] ${s}%${a}`)}`)},mc),this):(process.stdout.write(`${Lt.cli.spin(0,`[${i}] ${s}%${a}`)}
785
+ `),this)}},f=vw});import Ew from"node:path";async function gc(r,e){let t=Date.now()-e;await Pe.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: ${bn(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
786
+ `));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 bt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function xm(r){try{let e=await kt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];n=it(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 bn(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function fc(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Rm(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 Am(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 | ${bn(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${io(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${fc(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: ${bn(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(`
787
+ `)}function Dm(r,e){let t=[];t.push(`# Repository Analysis
788
+ `),t.push(`Generated: ${new Date().toLocaleString()}
789
+ `);let s=Ew.basename(e);if(t.push(`## Project: ${s}
790
+ `),t.push(`## Stack Detected
791
+ `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
792
+ `),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
793
+ `),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
794
+ `)),r.goMod&&(t.push(`### Go
795
+ `),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
796
+ `)),r.requirements&&(t.push(`### Python
797
+ `),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
798
+ `));let n=r.directories;t.push(`## Structure
799
+ `),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${n?.slice(0,15).join(", ")||"none"}${(n?.length||0)>15?` (+${(n?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
800
+ `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
801
+ `),r.gitLog.split(`
802
+ `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
803
+ `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
804
+ `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
805
+ `)}var jm=v(()=>{"use strict";Yt();ao();Ls();z();kn();tt();l(gc,"showSyncResult");l(xm,"getSessionActivity");l(bn,"formatTokens");l(fc,"formatDuration");l(Rm,"generateSparkline");l(Am,"generateStatsMarkdown");l(Dm,"generateAnalysisSummary")});var Im,$m,Mm=v(()=>{"use strict";Im=["task","done","ship","resume","bug","enrich"],$m=["init","sync","pause","next","dash","history","undo","redo"]});import Vt from"chalk";function Pw(r){return _m[r.toLowerCase()]||_m.default}var _m,hc,Om,Nm=v(()=>{"use strict";_m={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(Pw,"getIcon");hc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Vt.cyan(`
677
806
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
678
- `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Gk(t);console.log(Yt.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(Yt.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(Yt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Yt.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?Yt.green("\u2713"):Yt.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${Yt.dim(`(${s})`)}
679
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${Yt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Yt.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Kp=new xc});import st from"chalk";function Wk(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Yp.length;return Yp[t]}function Vk(r,e,t="\u25B6"){let s=st.dim(String(r+1).padStart(2)),o=Wk(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=st.green("\u2713 Complete");break;case"in_progress":a=st.yellow(`${t} Working...`);break;case"pending":a=st.gray("\u25CB Pending");break;case"failed":a=st.red("\u2717 Failed");break;case"blocked":a=st.gray("\u2298 Blocked");break;default:a=st.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function Bk(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${st.bold.white("SUBTASK PROGRESS")}`),e.push(` ${st.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Vk(t,r[t]));return e.push(""),e.join(`
680
- `)}function Qp(r){console.log(Bk(r))}var Yp,Zp=S(()=>{"use strict";Yp=[st.cyan,st.magenta,st.yellow,st.blue,st.green,st.redBright,st.magentaBright,st.cyanBright];l(Wk,"getDomainColor");l(Vk,"formatSubtaskLine");l(Bk,"renderSubtaskProgress");l(Qp,"printSubtaskProgress")});var em,tm,Rc,Ac=S(()=>{"use strict";em=["task","done","ship","resume","bug","enrich"],tm=["init","sync","pause","next","dash","history","undo","redo"],Rc=["ship","feature","spec","cleanup","migrate"]});function zk(r){return Rc.includes(r)}async function Jk(r,e,t){let s=[],n=[],o=[];switch(r){case"ship":t.now&&!t.now.includes("No current task")?s.push({step:"Has active task",passed:!0}):(s.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?s.push({step:"Shipped log accessible",passed:!0}):s.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),n.push("Read current task from now.md"),n.push("Calculate duration"),n.push("Append to shipped.md"),n.push("Clear now.md"),n.push("Update metrics");break;case"feature":e.params.description||e.params.feature?s.push({step:"Has feature description",passed:!0}):(s.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?s.push({step:"Project analyzed",passed:!0}):s.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),n.push("Parse feature description"),n.push("Generate tasks breakdown"),n.push("Add to roadmap.md"),n.push("Add tasks to next.md"),n.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?s.push({step:"Has spec name",passed:!0}):(s.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),n.push("Generate spec template"),n.push("Analyze requirements"),n.push("Create spec file"),n.push("Link to roadmap");break;case"cleanup":t.analysis?s.push({step:"Has code analysis",passed:!0}):s.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),n.push("Scan for unused code"),n.push("Identify dead imports"),n.push("List files to clean"),n.push("Show preview"),n.push("Wait for approval"),n.push("Execute cleanup");break;case"migrate":s.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),n.push("Analyze current state"),n.push("Generate migration plan"),n.push("Show affected files"),n.push("Request approval"),n.push("Execute migration"),n.push("Verify results");break;default:n.push("Execute command");break}let i=s.filter(u=>u.passed).length,a=s.length,c=a>0?i/a:1;return{commandName:r,reasoning:s.length>0?{steps:s,allPassed:o.length===0,criticalIssues:o}:null,plan:n,confidence:c}}function qk(r){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${r.commandName}`),e.push(""),r.reasoning&&(e.push("Steps:"),r.reasoning.steps.forEach(t=>{let s=t.passed?"\u2705":"\u274C";e.push(` ${s} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),r.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),r.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),r.plan.length>0&&(e.push("Plan:"),r.plan.forEach((t,s)=>{e.push(` ${s+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(r.confidence*100)}%`),e.join(`
681
- `)}var Kk,Ho,sm=S(()=>{"use strict";Ac();l(zk,"requiresReasoning");l(Jk,"reason");l(qk,"formatPlan");Kk={requiresReasoning:zk,reason:Jk,formatPlan:qk,REASONING_REQUIRED_COMMANDS:Rc},Ho=Kk});import Go from"node:fs/promises";var Dc,Xk,Wt,jc=S(()=>{"use strict";Et();Te();W();Ms();K();Dc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new dn({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 Go.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(R(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,p])=>{try{let[m,d]=await Promise.all([Go.readFile(p,"utf-8"),Go.stat(p)]);return{key:u,filePath:p,content:m,mtime:d.mtimeMs}}catch(m){if(R(m))return{key:u,filePath:p,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:p,content:m,mtime:d}of c)s[u]=m,this._cache.set(p,{content:m,mtime:d})}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 Go.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(R(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 P(e)}getCacheStats(){return this._cache.stats()}},Xk=new Dc,Wt=Xk});import Be from"node:fs/promises";import nm from"node:os";import Cs from"node:path";function Ic(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Yk(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
682
- `;return r.warnings.forEach(t=>{e+=` - ${t}
683
- `}),r.recommendations.length>0&&(e+=`
684
- Recommendations:
685
- `,r.recommendations.forEach(t=>{e+=` -> ${t}
686
- `})),e}async function rm(r){let e=[],t=[],s={},n=r.paths.now;try{let a=await Be.readFile(n,"utf-8");s.nowExists=!0,s.nowContent=a.trim(),s.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){s.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(s.durationMs=Date.now()-u.getTime(),s.durationFormatted=ht(s.durationMs))}}catch(a){if(R(a))s.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await Be.readFile(o,"utf-8");s.nextExists=!0;let c=a.match(/- \[ \]/g)||[];s.pendingTasks=c.length}catch(a){if(R(a))s.nextExists=!1,s.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await Be.access(Cs.dirname(i),Be.constants.W_OK),s.metricsWritable=!0}catch(a){if(R(a))s.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function om(r){let e=[],t=[],s={};try{let{stdout:i}=await O("git status --porcelain",{cwd:r.projectPath});s.hasUncommittedChanges=i.trim().length>0,s.uncommittedFiles=i.trim().split(`
687
- `).filter(Boolean).length,s.hasUncommittedChanges&&(e.push(`${s.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{s.gitAvailable=!1}let n=Cs.join(r.projectPath,"package.json");try{let i=await Be.readFile(n,"utf-8"),a=JSON.parse(i);s.currentVersion=a.version,s.hasPackageJson=!0}catch(i){if(R(i))s.hasPackageJson=!1;else if(i instanceof SyntaxError)s.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Be.readFile(o,"utf-8");s.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${Ic(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(R(i))s.shippedExists=!1;else throw i}if(s.hasPackageJson)try{let i=await Be.readFile(n,"utf-8"),a=JSON.parse(i);s.hasTestScript=!!a.scripts?.test}catch(i){if(R(i)||i instanceof SyntaxError)s.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function im(r){let e=[],t=[],s={},n=r.paths.next;try{let a=await Be.readFile(n,"utf-8");s.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];s.taskCount=c.length,s.pendingTasks=(a.match(/- \[ \]/g)||[]).length,s.taskCount>=90&&(e.push(`Queue nearly full (${s.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(R(a))s.nextExists=!1,s.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Be.readFile(o,"utf-8");s.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Ic(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(R(a))s.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Be.readFile(i,"utf-8");s.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),s.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(R(a))s.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function am(r){let e=[],t=[],s={},n=r.paths.now;try{let i=await Be.readFile(n,"utf-8");s.nowExists=!0,s.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(s.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(R(i))s.nowExists=!1,s.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Be.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;s.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(R(i))s.pendingTasks=0;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function cm(r){let e=[],t=[],s={},n=Cs.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Be.readFile(n,"utf-8");s.alreadyInitialized=!0,s.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(R(i))s.alreadyInitialized=!1;else if(i instanceof SyntaxError)s.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Cs.join(nm.homedir(),".prjct-cli");try{await Be.access(o,Be.constants.W_OK),s.globalPathWritable=!0}catch(i){if(R(i))try{await Be.mkdir(o,{recursive:!0}),s.globalPathWritable=!0,s.globalPathCreated=!0}catch{s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function lm(r){let e=[],t=[],s={},n=Cs.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Be.readFile(n,"utf-8");s.hasConfig=!0,s.config=JSON.parse(a)}catch(a){if(R(a))return s.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:s,warnings:e,recommendations:t};if(a instanceof SyntaxError)return s.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:s,warnings:e,recommendations:t};throw a}let o=s.config?.projectId,i=Cs.join(nm.homedir(),".prjct-cli/projects",o||"");return await P(i)?s.globalStorageExists=!0:(s.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate")),{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function um(r){let e=[],t=[],s={},n=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];s.detectedFiles=[];for(let i of n)await P(Cs.join(r.projectPath,i))&&s.detectedFiles.push(i);s.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];s.detectedSrcDirs=[];for(let i of o)try{(await Be.stat(Cs.join(r.projectPath,i))).isDirectory()&&s.detectedSrcDirs.push(i)}catch(a){if(!R(a))throw a}return{verified:!0,actual:s,warnings:e,recommendations:t}}async function dm(r){let e=[],t=[],s={},n=r.paths.specs;if(await P(n)){s.specsExists=!0;let i=await Be.readdir(n);s.existingSpecs=i.filter(a=>a.endsWith(".md")),s.specCount=s.existingSpecs.length}else s.specsExists=!1,s.specCount=0;let o=r.params.feature||r.params.name||r.params.description;if(o&&s.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");s.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function mm(r,e,t){let s=pm[r];if(!s)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await s(e,t)}catch(n){return{verified:!1,actual:{},warnings:[`Verification error: ${w(n)}`],recommendations:["Check file permissions and project configuration"]}}}async function Qk(r,e,t){let s=await mm(r,e,t);return{...e,groundTruth:{...s,verifiedAt:new Date().toISOString(),command:r}}}function Zk(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var pm,eS,Wo,gm=S(()=>{"use strict";W();He();K();ie();l(Ic,"escapeRegex");l(Yk,"formatWarnings");l(rm,"verifyDone");l(om,"verifyShip");l(im,"verifyFeature");l(am,"verifyNow");l(cm,"verifyInit");l(lm,"verifySync");l(um,"verifyAnalyze");l(dm,"verifySpec");pm={done:rm,ship:om,feature:im,now:am,init:cm,sync:lm,analyze:um,spec:dm};l(mm,"verify");l(Qk,"prepareCommand");l(Zk,"requiresVerification");eS={verify:mm,prepareCommand:Qk,requiresVerification:Zk,verifiers:pm,formatWarnings:Yk,formatDuration:ht,escapeRegex:Ic,verifyDone:rm,verifyShip:om,verifyFeature:im,verifyNow:am,verifyInit:cm,verifySync:lm,verifyAnalyze:um,verifySpec:dm},Wo=eS});function sS(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 nS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of tS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:sS(t)};return{detected:!1}}function rS(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 oS(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 iS(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 aS(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 tS,$c,cS,Rn,fm=S(()=>{"use strict";tS=[{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(sS,"getHallucinationSuggestion");l(nS,"detectHallucination");l(rS,"isSimilarError");l(oS,"analyzeErrorPattern");l(iS,"generateEscalationMessage");l(aS,"generateSuggestion");$c=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=>rS(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=oS(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:iS(e,o,this.maxAttempts),suggestion:aS(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 nS(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}}},cS=new $c,Rn=cS});function Mc(r,e){let t=Ir(e),s=Fu[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 lS(r,e){let t=Ir(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function uS(r,e,t){let s=Ir(t),n=Mc(r,t),o=Mc(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Vo(r,e=bs){let t=Ir(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=dS(r,e),n=pS(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=fS(o),a=mS(o),c=gS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:p}=hS(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:p,lastUpdated:new Date().toISOString()}}function ym(r,e,t=bs){let s=Ir(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 dS(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=uS(i,n,e);if(!t.has(a)){let c=Mc(i,e),u=lS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function pS(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,p)=>u+yS(p),0),o=s.outcomes.filter(u=>u.variance).map(u=>_c(u)),i=o.length>0?Math.round(o.reduce((u,p)=>u+p,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 mS(r){if(r.length<3)return"stable";let e=r.map(p=>p.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let p=0;p<t;p++)s+=p,n+=e[p],o+=p*e[p],i+=p*p;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 gS(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=_c(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function fS(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 hS(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=_c(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 _c(r){if(!r.variance)return 0;let e=yt(r.estimatedDuration),t=yt(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function wm(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(`
688
- `)}function yS(r){if(!r.estimatedDuration)return 0;let e=yt(r.estimatedDuration);if(e<=0)return 0;let t=hm[0],s=Number.POSITIVE_INFINITY;for(let n of hm){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Ir(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var hm,Oc=S(()=>{"use strict";yr();vr();ie();l(Mc,"getSprintStart");l(lS,"getSprintEnd");l(uS,"getSprintNumber");l(Vo,"calculateVelocity");l(ym,"projectCompletion");l(dS,"bucketBySprint");l(pS,"buildSprintVelocities");l(mS,"detectTrend");l(gS,"calculateOverallAccuracy");l(fS,"calculateAverageVelocity");l(hS,"detectEstimationPatterns");l(_c,"parseVariancePercent");l(wm,"formatVelocityContext");hm=[{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(yS,"derivePoints");l(Ir,"resolveConfig")});import wS from"node:fs/promises";import Bo from"node:path";async function An(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Nc(r),c=await TS(e),u=await vS(e),p=[];for(let d of c){if(!i&&PS(d))continue;let g=CS(d,a,u,t.historicalBoosts);g.score>=o&&p.push(g)}p.sort((d,g)=>g.score-d.score);let m=p.slice(0,n);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-s}}}function Nc(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 TS(r){let e=[];async function t(s,n=""){try{let o=await wS.readdir(s,{withFileTypes:!0});for(let i of o){let a=Bo.join(s,i.name),c=Bo.join(n,i.name);if(i.isDirectory()){if(bS.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Bo.extname(i.name).toLowerCase();SS.has(u)&&e.push(c)}}}catch(o){R(o)}}return l(t,"walk"),await t(r),e}async function vS(r){let e=new Map;try{let{stdout:t}=await O(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
807
+ `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Pw(t);console.log(Vt.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(Vt.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(Vt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Vt.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?Vt.green("\u2713"):Vt.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${Vt.dim(`(${s})`)}
808
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${Vt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Vt.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Om=new hc});import Lm from"node:fs";import Io from"node:path";function Cw(r){if(Rs()){let{Database:n}=gt("bun:sqlite");return new n(r,{create:!0})}let e=gt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var yc,xw,Fm=v(()=>{"use strict";or();l(Cw,"openDatabase");yc=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Io.resolve(e):Io.join(gt("node:os").homedir(),".prjct-cli");this.dbPath=Io.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Io.dirname(this.dbPath);Lm.existsSync(e)||Lm.mkdirSync(e,{recursive:!0});let t=Cw(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(`
809
+ CREATE TABLE IF NOT EXISTS _system_migrations (
810
+ version INTEGER PRIMARY KEY,
811
+ name TEXT NOT NULL,
812
+ applied_at TEXT NOT NULL
813
+ )
814
+ `);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(n=>n.version)),s=[{version:1,name:"mcp-health-table",up:l(n=>{n.run(`
815
+ CREATE TABLE mcp_health (
816
+ provider TEXT PRIMARY KEY,
817
+ status TEXT NOT NULL,
818
+ last_checked TEXT NOT NULL,
819
+ last_error TEXT,
820
+ token_version TEXT,
821
+ config_valid INTEGER NOT NULL DEFAULT 0,
822
+ oauth_valid INTEGER NOT NULL DEFAULT 0,
823
+ updated_at TEXT NOT NULL
824
+ )
825
+ `)},"up")}];for(let n of s)t.has(n.version)||(n.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let s=this.getDb(),n=new Date().toISOString();s.prepare(`
826
+ INSERT OR REPLACE INTO mcp_health
827
+ (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
828
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
829
+ `).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)}},xw=new yc});import Rw from"node:fs/promises";import Um from"node:os";import $o from"node:path";function Aw(){try{let r=$o.dirname(gt.resolve("prjct-cli/package.json"));return{command:"node",args:[$o.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 ss(){return process.env.PRJCT_TEST_MODE==="1"?$o.join(Um.tmpdir(),"prjct-context7-test","mcp.json"):$o.join(Um.homedir(),".claude","mcp.json")}async function Hm(r=ss()){try{let e=await Rw.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=y(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${y(e)}`)}}async function Dw(r,e=ss()){await ce(e,r)}async function kc(r,e,t=ss()){let s=await Hm(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await Dw(s,t),{path:t,changed:i}}async function Ws(r,e=ss()){return!!(await Hm(e)).mcpServers?.[r]}var Mo,wc,p0,_o=v(()=>{"use strict";Fm();H();J();Mo="mcp-remote@0.1.38";l(Aw,"getPrjctMcpConfig");wc={prjct:Aw(),linear:{command:"npx",args:["-y",Mo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Mo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},p0={linear:`npx -y ${Mo} https://mcp.linear.app/mcp`,jira:`npx -y ${Mo} https://mcp.atlassian.com/v1/mcp`};l(ss,"getClaudeMcpConfigPath");l(Hm,"readMcpConfig");l(Dw,"writeMcpConfig");l(kc,"upsertMcpServer");l(Ws,"hasMcpServer")});import Ye from"chalk";function jw(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Gm.length;return Gm[t]}function Iw(r,e,t="\u25B6"){let s=Ye.dim(String(r+1).padStart(2)),o=jw(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=Ye.green("\u2713 Complete");break;case"in_progress":a=Ye.yellow(`${t} Working...`);break;case"pending":a=Ye.gray("\u25CB Pending");break;case"failed":a=Ye.red("\u2717 Failed");break;case"blocked":a=Ye.gray("\u2298 Blocked");break;default:a=Ye.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function $w(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ye.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ye.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Iw(t,r[t]));return e.push(""),e.join(`
830
+ `)}function Wm(r){console.log($w(r))}var Gm,Vm=v(()=>{"use strict";Gm=[Ye.cyan,Ye.magenta,Ye.yellow,Ye.blue,Ye.green,Ye.redBright,Ye.magentaBright,Ye.cyanBright];l(jw,"getDomainColor");l(Iw,"formatSubtaskLine");l($w,"renderSubtaskProgress");l(Wm,"printSubtaskProgress")});function _w(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 Ow(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Mw)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:_w(t)};return{detected:!1}}function Nw(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 Lw(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 Fw(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 Uw(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 Mw,Sc,Hw,Tn,Bm=v(()=>{"use strict";Mw=[{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(_w,"getHallucinationSuggestion");l(Ow,"detectHallucination");l(Nw,"isSimilarError");l(Lw,"analyzeErrorPattern");l(Fw,"generateEscalationMessage");l(Uw,"generateSuggestion");Sc=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=>Nw(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=Lw(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Fw(e,o,this.maxAttempts),suggestion:Uw(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 Ow(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}}},Hw=new Sc,Tn=Hw});function bc(r,e){let t=vr(e),s=bu[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 Gw(r,e){let t=vr(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Ww(r,e,t){let s=vr(t),n=bc(r,t),o=bc(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Oo(r,e=fs){let t=vr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Vw(r,e),n=Bw(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=qw(o),a=Jw(o),c=zw(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Kw(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function zm(r,e,t=fs){let s=vr(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 Vw(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=Ww(i,n,e);if(!t.has(a)){let c=bc(i,e),u=Gw(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Bw(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+Xw(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Tc(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 Jw(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 zw(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Tc(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function qw(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 Kw(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Tc(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 Tc(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 qm(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(`
831
+ `)}function Xw(r){if(!r.estimatedDuration)return 0;let e=ft(r.estimatedDuration);if(e<=0)return 0;let t=Jm[0],s=Number.POSITIVE_INFINITY;for(let n of Jm){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function vr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Jm,vc=v(()=>{"use strict";lr();gr();z();l(bc,"getSprintStart");l(Gw,"getSprintEnd");l(Ww,"getSprintNumber");l(Oo,"calculateVelocity");l(zm,"projectCompletion");l(Vw,"bucketBySprint");l(Bw,"buildSprintVelocities");l(Jw,"detectTrend");l(zw,"calculateOverallAccuracy");l(qw,"calculateAverageVelocity");l(Kw,"detectEstimationPatterns");l(Tc,"parseVariancePercent");l(qm,"formatVelocityContext");Jm=[{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(Xw,"derivePoints");l(vr,"resolveConfig")});import Yw from"node:fs/promises";import No from"node:path";async function vn(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Ec(r),c=await tk(e),u=await sk(e),d=[];for(let m of c){if(!i&&rk(m))continue;let g=nk(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,n);return{files:p,metrics:{filesScanned:c.length,filesReturned:p.length,scanDuration:Date.now()-s}}}function Ec(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 tk(r){let e=[];async function t(s,n=""){try{let o=await Yw.readdir(s,{withFileTypes:!0});for(let i of o){let a=No.join(s,i.name),c=No.join(n,i.name);if(i.isDirectory()){if(ek.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=No.extname(i.name).toLowerCase();Zw.has(u)&&e.push(c)}}}catch(o){A(o)}}return l(t,"walk"),await t(r),e}async function sk(r){let e=new Map;try{let{stdout:t}=await N(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
689
832
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
690
833
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
691
834
  END { for (f in files) print files[f], lastmod[f], f }
692
835
  '`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
693
- `).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],p=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:p})}}}catch{}return e}function CS(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,p=r.toLowerCase(),m=p.split("/").join(" ").split(/[^a-z0-9]+/);for(let y of e){p.includes(y)&&(o+=.3,n.push(`keyword:${y}`));for(let v of m)if(v.includes(y)||y.includes(v)){o+=.15;break}}o=Math.min(1,o);for(let[y,v]of Object.entries(kS))for(let D of v)if(p.includes(D)&&e.some(F=>v.includes(F)||F.includes(y)||y.includes(F))){i+=.4,n.push(`domain:${y}`);break}i=Math.min(1,i);let d=t.get(r);d&&(d.daysAgo<=1?(a=1,n.push("recent:1d")):d.daysAgo<=3?(a=.8,n.push("recent:3d")):d.daysAgo<=7?(a=.6,n.push("recent:1w")):d.daysAgo<=30&&(a=.3,n.push("recent:1m")),d.commits>=5&&(a=Math.min(1,a+.2)));let g=Bo.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(p.includes("/core/")||p.includes("/shared/")||p.includes("/lib/"))&&(c=Math.max(c,.3),n.some(y=>y.startsWith("import:"))||n.push("import:1")),s){let y=s.get(r);y!==void 0&&(u=(y+1)/2,y>0?n.push("history:boosted"):y<0&&n.push("history:penalized"))}let k=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,k),reasons:[...new Set(n)]}}function PS(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 kS,SS,bS,zo=S(()=>{"use strict";W();He();kS={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"]},SS=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),bS=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(An,"findRelevantFiles");l(Nc,"extractKeywords");l(TS,"getAllCodeFiles");l(vS,"getGitRecency");l(CS,"scoreFile");l(PS,"isTestFile")});async function km(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 RS(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await xS(r,t);return o=o.filter(c=>!AS(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 xS(r,e){let{stdout:t}=await O(`git log -${e} --pretty=format:"%ct" --name-only | awk '
836
+ `).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 nk(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let w of e){d.includes(w)&&(o+=.3,n.push(`keyword:${w}`));for(let E of p)if(E.includes(w)||w.includes(E)){o+=.15;break}}o=Math.min(1,o);for(let[w,E]of Object.entries(Qw))for(let D of E)if(d.includes(D)&&e.some(F=>E.includes(F)||F.includes(w)||w.includes(F))){i+=.4,n.push(`domain:${w}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,n.push("recent:1d")):m.daysAgo<=3?(a=.8,n.push("recent:3d")):m.daysAgo<=7?(a=.6,n.push("recent:1w")):m.daysAgo<=30&&(a=.3,n.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=No.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(w=>w.startsWith("import:"))||n.push("import:1")),s){let w=s.get(r);w!==void 0&&(u=(w+1)/2,w>0?n.push("history:boosted"):w<0&&n.push("history:penalized"))}let S=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,S),reasons:[...new Set(n)]}}function rk(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 Qw,Zw,ek,Lo=v(()=>{"use strict";H();Ue();Qw={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"]},Zw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),ek=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(vn,"findRelevantFiles");l(Ec,"extractKeywords");l(tk,"getAllCodeFiles");l(sk,"getGitRecency");l(nk,"scoreFile");l(rk,"isTestFile")});async function Km(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 ak(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await ik(r,t);return o=o.filter(c=>!ck(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 ik(r,e){let{stdout:t}=await N(`git log -${e} --pretty=format:"%ct" --name-only | awk '
694
837
  /^[0-9]+$/ { timestamp=$1; next }
695
838
  NF {
696
839
  count[$0]++
@@ -700,8 +843,8 @@ Recommendations:
700
843
  for (f in count) print count[f], lastmod[f], f
701
844
  }
702
845
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
703
- `).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),p=parseInt(c[2],10),m=c[3],d=o-p,g=Math.floor(d/86400),h=Math.floor(d/3600),k=Math.max(0,1-g/30),y=u/i,v=k*.6+y*.4,D;h<1?D="just now":h<24?D=`${h}h ago`:g<7?D=`${g}d ago`:g<30?D=`${Math.floor(g/7)}w ago`:D=`${Math.floor(g/30)}mo ago`,s.push({path:m,changes:u,heatScore:Math.round(v*100)/100,lastChanged:D,lastChangedAt:new Date(p*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function RS(r){let e="main";try{await O("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await O(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
704
- `).filter(Boolean),{stdout:n}=await O(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
846
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),h=Math.floor(m/3600),S=Math.max(0,1-g/30),w=u/i,E=S*.6+w*.4,D;h<1?D="just now":h<24?D=`${h}h ago`:g<7?D=`${g}d ago`:g<30?D=`${Math.floor(g/7)}w ago`:D=`${Math.floor(g/30)}mo ago`,s.push({path:p,changes:u,heatScore:Math.round(E*100)/100,lastChanged:D,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function ak(r){let e="main";try{await N("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await N(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
847
+ `).filter(Boolean),{stdout:n}=await N(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
705
848
  /^[0-9]+$/ { timestamp=$1; next }
706
849
  NF {
707
850
  count[$0]++
@@ -711,22 +854,15 @@ Recommendations:
711
854
  for (f in count) print count[f], lastmod[f], f
712
855
  }
713
856
  '`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
714
- `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let p=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let m=parseInt(p[1],10);m>c&&(c=m)}}for(let u of i){let p=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let m=parseInt(p[1],10),d=parseInt(p[2],10),g=p[3],h=a-d,k=Math.floor(h/86400),y=Math.floor(h/3600),v=Math.max(0,1-k/14),D=m/c,U=v*.5+D*.5,F;y<1?F="just now":y<24?F=`${y}h ago`:F=`${k}d ago`,o.push({path:g,changes:m,heatScore:Math.round(U*100)/100,lastChanged:F,lastChangedAt:new Date(d*1e3).toISOString()})}return{hotFiles:o.sort((u,p)=>p.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function AS(r){let e=r.split("/").pop()||"";for(let t of ES)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var ES,Sm=S(()=>{"use strict";He();ES=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(km,"getRecentFiles");l(xS,"getHotFilesFromCommits");l(RS,"getBranchOnlyFiles");l(AS,"shouldIgnore")});function Lc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function bm(r,e){let t=DS[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function IS(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function vm(r,e){let t=Lc(r),s=Lc(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=bm(n,jS),a=Tm.map(c=>({model:c,...bm(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:IS(i.total),byModel:a}}}function Fc(r){let e=Lc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Tm.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var DS,jS,Tm,Cm=S(()=>{"use strict";ho();DS={"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}},jS="claude-sonnet-4.5";l(Lc,"countTokens");Tm=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(bm,"calculateModelCost");l(IS,"formatCostSaved");l(vm,"measureCompression");l(Fc,"noCompression")});import $S from"node:fs/promises";import Uc from"node:path";async function xm(r,e=process.cwd()){let t=Uc.isAbsolute(r)?r:Uc.join(e,r),s;try{s=await $S.readFile(t,"utf-8")}catch(u){if(R(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Fc("")};throw u}let n=Uc.extname(r).toLowerCase(),o=MS[n]||"unknown",i=LS[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:Fc(s)};let a=FS(s,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
715
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:vm(s,c)}}function FS(r,e){let t=[],s=r.split(`
716
- `),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,p=r.substring(0,u).split(`
717
- `).length,m=i[0].trim(),d;if(p>1){let g=s[p-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(d=g)}t.push({type:o.type,name:a,signature:US(m),exported:o.exported||!1,line:p,docstring:d})}}return t.sort((o,i)=>o.line-i.line)}function US(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var MS,Pm,_S,OS,NS,Em,LS,Rm=S(()=>{"use strict";W();Cm();MS={".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"},Pm=[{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}],_S=[{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}],OS=[{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}],NS=[{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}],Em=[{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}],LS={typescript:Pm,javascript:Pm,python:_S,go:OS,rust:NS,java:Em,csharp:Em,php:[],ruby:[],unknown:[]};l(xm,"extractSignatures");l(FS,"extractFromContent");l(US,"cleanSignature")});import Hc from"node:path";var HS,GS,Gc,WS,kt,Dn=S(()=>{"use strict";Te();It();ie();K();HS="outcomes",GS="outcomes.jsonl",Gc=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Hc.join(t,HS)}getOutcomesPath(e){return Hc.join(this.getOutcomesDir(e),GS)}async record(e,t){let s={...t,id:ye()},n=this.getOutcomesPath(e);return await Tt(Hc.dirname(n)),await Li(n,JSON.stringify(s)),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let s=await it(t);return s.trim()?s.trim().split(`
718
- `).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=js(n.variance),i=yt(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},WS=new Gc,kt=WS});import{z as Ne}from"zod";var Jo,jn,VS,CI,Wc,Am,qo=S(()=>{"use strict";Jo=Ne.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),jn=Ne.object({primaryDomain:Jo,secondaryDomains:Ne.array(Jo),confidence:Ne.number().min(0).max(1),filePatterns:Ne.array(Ne.string()),relevantAgents:Ne.array(Ne.string())}),VS=Ne.object({classification:jn,classifiedAt:Ne.string(),source:Ne.enum(["cache","history","llm","heuristic"]),descriptionHash:Ne.string(),projectId:Ne.string()}),CI=Ne.object({entries:Ne.record(Ne.string(),VS),confirmedPatterns:Ne.array(Ne.object({descriptionHash:Ne.string(),classification:jn,confirmedAt:Ne.string(),taskDescription:Ne.string()}))}),Wc={entries:{},confirmedPatterns:[]},Am={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import zS from"node:fs/promises";import Im from"node:path";function Dm(r){return mo(r.toLowerCase().trim())}async function jm(r){try{let e=Im.join(r,"storage","classification-cache.json"),t=await zS.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return R(e)?Wc:(console.warn("[classifier] Failed to load cache:",w(e)),Wc)}}async function JS(r,e){try{let t=Im.join(r,"storage","classification-cache.json");await le(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function qS(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||fs(s.classifiedAt,36e5)?null:s.classification}function KS(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Vc,XS,$m,Mm=S(()=>{"use strict";or();qo();W();Ms();K();wn();l(Dm,"hashDescription");l(jm,"loadCache");l(JS,"saveCache");l(qS,"lookupCache");l(KS,"lookupPatterns");Vc=class{static{l(this,"DomainClassifier")}async classify(e,t,s,n){let o=Dm(e),i=await jm(s),a=qS(i,o,t);if(a)return{classification:a,source:"cache"};let c=KS(i,o);return c?{classification:c,source:"history"}:{classification:Am,source:"heuristic"}}async confirmClassification(e,t,s){let n=Dm(e),o=await jm(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await JS(s,o))}},XS=new Vc,$m=XS});import YS from"node:fs/promises";import QS from"node:path";var _m,Bc,ZS,Ko,zc=S(()=>{"use strict";Oc();Et();Te();vr();kn();kr();Pt();zo();Sm();Rm();W();He();Dn();Mm();_m=["database","backend","frontend","testing","devops"],Bc=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)]),p=["realContext","sealedAnalysis","velocity"],m=[],d=u.map((F,j)=>{if(F.status==="fulfilled")return F.value;m.push(p[j]),console.warn(`Context tool "${p[j]}" failed: ${w(F.reason)}`)}),[g,h,k]=d,y={level:m.length===0?"full":m.length>=2?"minimal":"partial",failedTools:m},v=this.shouldFragment(a,t),D=null;v&&e==="task"&&(D=await this.createSubtasks(t,a,[],n));let U=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:v,subtasks:D,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:h??null,velocityContext:k??null,contextDegradation:y,rpiContext:U}}resolveRpiPhase(e){try{let{prjctDb:t}=(re(),ot(Zr)),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),An(e,t,{maxFiles:10,minScore:.15}),km(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await xm(c.path,t);if(u.signatures.length===0)return null;let p=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
719
- `);return{path:c.path,content:p}}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([O("git branch --show-current",{cwd:e}),O("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
720
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let d=m.substring(0,2);d.startsWith("??")?a++:d[0]!==" "&&d[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let p=u.length>0?u.join(", "):"clean";return{branch:n,status:p}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Lt.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 Ke.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 kt.getAll(e);if(t.length===0)return null;let s=Vo(t,bs);return s.sprints.length===0?null:wm(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=QS.join(e,"analysis","repo-analysis.json"),s=await YS.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return R(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,s){let n=A.getGlobalProjectPath(t),o={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let u=await _.read(t);u.domains&&(o=u.domains)}catch{}let i={domains:o,stack:s?{language:s.ecosystem}:void 0},{classification:a}=await $m.classify(e,t,n,i),c=[a.primaryDomain,...a.secondaryDomains||[]];return c.length===0?{domains:["general"],primary:"general"}:{domains:c,primary:c[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].sort((a,c)=>{let u=_m.indexOf(a),p=_m.indexOf(c);return(u===-1?99:u)-(p===-1?99:p)}),i=o.map((a,c)=>{let u=`${a}.md`,p=o.slice(0,c).map((m,d)=>`subtask-${d+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:u,status:c===0?"in_progress":"pending",dependsOn:p,order:c+1}});return await _.createSubtasks(n,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let n={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${n} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},ZS=new Bc,Ko=ZS});function eb(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 Jc,tb,We,Om=S(()=>{"use strict";It();ie();Vs();Vs();l(eb,"generateApprovalPrompt");Jc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Ga.includes(e)}isDestructive(e){return Wa.includes(e)}isToolAllowedInPlanning(e){return xo.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>xo.includes(s)):t}startPlanning(e,t,s){let n={id:ye(),projectId:e,command:t,params:s,status:ae.GATHERING,startedAt:T(),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?[ae.GATHERING,ae.ANALYZING,ae.PROPOSING,ae.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:T()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===ae.APPROVED?s.approvedAt=T():t===ae.EXECUTING?s.executionStartedAt=T():(t===ae.COMPLETED||t===ae.ABORTED)&&(s.completedAt=T()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=ae.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=ae.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!==ae.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=ae.APPROVED,s.approvedAt=T(),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=ae.REJECTED,s.userFeedback=t,s.completedAt=T(),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!==ae.APPROVED?null:(t.status=ae.EXECUTING,t.executionStartedAt=T(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==ae.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!==ae.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=T(),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=ae.COMPLETED,t.completedAt=T();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=ae.ABORTED,s.completedAt=T(),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 eb(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[ae.GATHERING]:"\u{1F50D}",[ae.ANALYZING]:"\u{1F9E0}",[ae.PROPOSING]:"\u{1F4DD}",[ae.PENDING_APPROVAL]:"\u23F3",[ae.APPROVED]:"\u2705",[ae.EXECUTING]:"\u26A1",[ae.COMPLETED]:"\u{1F389}",[ae.REJECTED]:"\u274C",[ae.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===ae.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
721
- `)}_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`}},tb=new Jc,We=tb});var qc,sb,Nm,Lm=S(()=>{"use strict";ie();Dn();qc=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await kt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((m,d)=>m+d.qualityScore,0)/t.length,n=await kt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let d of m.blockers||[])o.set(d,(o.get(d)||0)+1);let i=[...o.entries()].sort((m,d)=>d[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,d)=>d.successRate-m.successRate).slice(0,3).map(m=>m.agent),p=(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:p}}async getAgentMetrics(e){let t=await kt.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(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),p=i.reduce((k,y)=>k+y.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let y=js(k.variance),v=yt(k.estimatedDuration);return v===0?!1:Math.abs(y)/v<=.2}),d=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(y=>y.completedAsPlanned))for(let y of k.tags||[])g.set(y,(g.get(y)||0)+1);let h=[...g.entries()].sort((k,y)=>y[1]-k[1]).slice(0,3).map(([k])=>k);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(p*10)/10,estimateAccuracy:d,bestFor:h})}return n}async detectPatterns(e){let t=await kt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>js(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=>js(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 kt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+yt(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}},sb=new qc,Nm=sb});function nb(r){return r.trim().toLowerCase()}function Xo(r){return Tr(r,nb)}var Kc=S(()=>{"use strict";Mo();l(nb,"normalizeFrameworkName");l(Xo,"deduplicateTechStack")});import{z as Xe}from"zod";function Fm(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
722
- `);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let s=r.techStack??[];t.push(...s);let n=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...n,...o);let i=Xo(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let a=Object.entries(r.domains).filter(([,c])=>!c).map(([c])=>c.replace(/^has/,"").toLowerCase());a.length>0&&e.push(`NOT PRESENT: ${a.join(", ")}`)}return e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),r.fileCount&&e.push(`
723
- Context: ${r.fileCount} files in project.`),e.join(`
724
- `)}var f$,Um=S(()=>{"use strict";Kc();f$=Xe.object({projectPath:Xe.string(),language:Xe.string().optional(),framework:Xe.string().optional(),techStack:Xe.array(Xe.string()).default([]),domains:Xe.object({hasFrontend:Xe.boolean().default(!1),hasBackend:Xe.boolean().default(!1),hasDatabase:Xe.boolean().default(!1),hasTesting:Xe.boolean().default(!1),hasDocker:Xe.boolean().default(!1)}).optional(),fileCount:Xe.number().optional(),analysisLanguages:Xe.array(Xe.string()).default([]),analysisFrameworks:Xe.array(Xe.string()).default([]),analysisPackageManager:Xe.string().optional()});l(Fm,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var rb,Hm,Gm=S(()=>{"use strict";rb=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),Hm=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),rb).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Wm(r,e){return{agents:!0,patterns:!0,checklist:!1,modules:[]}}var Vm=S(()=>{"use strict";l(Wm,"classifyCommand")});import Xc from"node:fs/promises";import ob from"node:path";async function zm(){if($r)return $r;let r=await Xc.readFile(Yc,"utf-8"),e=JSON.parse(r);return $r=Hm.parse(e),$r}function ib(r){return Jm.get(r)}function ab(r,e){Jm.set(r,e)}function lb(r,e){let t=r,s=Bm.get(t);return s&&db(s.entry,e)?(s.count++,s.count>=cb):(Bm.set(t,{entry:e,count:1}),!1)}async function ub(r,e){let t=await Xc.readFile(Yc,"utf-8"),s=JSON.parse(t);s.commands[r]=e,await Xc.writeFile(Yc,`${JSON.stringify(s,null,2)}
725
- `,"utf-8"),$r=null}function db(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,s)=>t===e.modules[s])}function qm(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let s=ib(e);if(s)return{entry:s,source:"cache"};if(t){let n=Wm(e,t);return ab(e,n),lb(e,n)&&ub(e,n).catch(()=>{}),{entry:n,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Yc,$r,Jm,Bm,cb,Km=S(()=>{"use strict";Gm();Ct();Vm();Yc=ob.join(Ze,"core/config/command-context.config.json"),$r=null;l(zm,"loadCommandContextConfig");Jm=new Map;l(ib,"getCachedClassification");l(ab,"cacheClassification");Bm=new Map,cb=3;l(lb,"trackClassification");l(ub,"persistClassification");l(db,"isSameEntry");l(qm,"resolveCommandContextFull")});import pb from"node:os";import{z as Qt}from"zod";function mb(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function gb(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Xm(r){let e=r.platform??pb.platform(),t=r.runtime??mb(),s=r.date??new Date().toISOString().split("T")[0];return`<env>
726
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",gb(e)],["runtime",t],["date",s],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
727
- `)}
728
- </env>`}var j$,Ym=S(()=>{"use strict";j$=Qt.object({projectName:Qt.string(),projectPath:Qt.string(),isGitRepo:Qt.boolean().default(!0),gitBranch:Qt.string().optional(),platform:Qt.string().optional(),runtime:Qt.string().optional(),date:Qt.string().optional(),model:Qt.string().optional(),provider:Qt.string().optional()});l(mb,"detectRuntime");l(gb,"normalizePlatform");l(Xm,"buildEnvironmentBlock")});function Zm(r){let e=r.getAllocationFor("injection");return{...Qo,totalPrompt:e}}function Mr(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
729
- ... (truncated to ~${e} tokens)`}function Qm(r){return Math.ceil(r.length/4)}var Qo,Yo,eg=S(()=>{"use strict";ho();Qo={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Zm,"budgetsFromCoordinator");l(Mr,"truncateToTokenBudget");l(Qm,"estimateTokens");Yo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Qo,...e}}addSection(e,t){let s=Mr(e,t),n=Qm(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Mr(s,o);return this.used+=Qm(i),i}return this.used+=n,s}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});var og={};Ot(og,{AgentAssignmentSchema:()=>tg,OUTPUT_SCHEMAS:()=>ng,SubtaskBreakdownSchema:()=>sg,TaskClassificationSchema:()=>jn,renderSchemaForPrompt:()=>fb});import{z as Ye}from"zod";function fb(r){let e=ng[r];return e?`## OUTPUT FORMAT
857
+ `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],h=a-m,S=Math.floor(h/86400),w=Math.floor(h/3600),E=Math.max(0,1-S/14),D=p/c,V=E*.5+D*.5,F;w<1?F="just now":w<24?F=`${w}h ago`:F=`${S}d ago`,o.push({path:g,changes:p,heatScore:Math.round(V*100)/100,lastChanged:F,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function ck(r){let e=r.split("/").pop()||"";for(let t of ok)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var ok,Xm=v(()=>{"use strict";Ue();ok=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Km,"getRecentFiles");l(ik,"getHotFilesFromCommits");l(ak,"getBranchOnlyFiles");l(ck,"shouldIgnore")});function Pc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Ym(r,e){let t=lk[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function dk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Zm(r,e){let t=Pc(r),s=Pc(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=Ym(n,uk),a=Qm.map(c=>({model:c,...Ym(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:dk(i.total),byModel:a}}}function Fo(r){let e=Pc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Qm.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var lk,uk,Qm,ep=v(()=>{"use strict";mo();lk={"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}},uk="claude-sonnet-4.5";l(Pc,"countTokens");Qm=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Ym,"calculateModelCost");l(dk,"formatCostSaved");l(Zm,"measureCompression");l(Fo,"noCompression")});import mk from"node:fs/promises";import En from"node:path";async function np(r,e=process.cwd()){let t=En.isAbsolute(r)?r:En.join(e,r),s=En.resolve(e),n=En.resolve(t);if(!n.startsWith(s+En.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Fo("")};let o;try{o=await mk.readFile(t,"utf-8")}catch(p){if(A(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Fo("")};throw p}let i=En.extname(r).toLowerCase(),a=pk[i]||"unknown",c=yk[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Fo(o)};let u=wk(o,c),d=u.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
858
+ `);return{file:r,language:a,signatures:u,fallback:!1,metrics:Zm(o,d)}}function wk(r,e){let t=[],s=r.split(`
859
+ `),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(`
860
+ `).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:kk(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function kk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var pk,tp,gk,fk,hk,sp,yk,rp=v(()=>{"use strict";H();ep();pk={".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"},tp=[{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}],gk=[{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}],fk=[{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}],hk=[{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}],sp=[{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}],yk={typescript:tp,javascript:tp,python:gk,go:fk,rust:hk,java:sp,csharp:sp,php:[],ruby:[],unknown:[]};l(np,"extractSignatures");l(wk,"extractFromContent");l(kk,"cleanSignature")});import Cc from"node:path";var Sk,bk,xc,Tk,mt,Pn=v(()=>{"use strict";fe();xt();z();J();Sk="outcomes",bk="outcomes.jsonl",xc=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=R.getGlobalProjectPath(e);return Cc.join(t,Sk)}getOutcomesPath(e){return Cc.join(this.getOutcomesDir(e),bk)}async record(e,t){let s={...t,id:pe()},n=this.getOutcomesPath(e);return await We(Cc.dirname(n)),await Ll(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await x(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 Ae(t);if(!a.trim())return[];let c=a.trim().split(`
861
+ `).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await Ae(t);return s.trim()?s.trim().split(`
862
+ `).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=tn(n.variance),i=ft(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},Tk=new xc,mt=Tk});import{z as $e}from"zod";var Uo,Cn,vk,Y0,Rc,op,Ho=v(()=>{"use strict";Uo=$e.string(),Cn=$e.object({primaryDomain:Uo,secondaryDomains:$e.array(Uo),confidence:$e.number().min(0).max(1),filePatterns:$e.array($e.string()),relevantAgents:$e.array($e.string())}),vk=$e.object({classification:Cn,classifiedAt:$e.string(),source:$e.enum(["cache","history","llm","heuristic"]),descriptionHash:$e.string(),projectId:$e.string()}),Y0=$e.object({entries:$e.record($e.string(),vk),confirmedPatterns:$e.array($e.object({descriptionHash:$e.string(),classification:Cn,confirmedAt:$e.string(),taskDescription:$e.string()}))}),Rc={entries:{},confirmedPatterns:[]},op={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import Pk from"node:fs/promises";import cp from"node:path";function ip(r){return As(r.toLowerCase().trim())}async function ap(r){try{let e=cp.join(r,"storage","classification-cache.json"),t=await Pk.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return A(e)?Rc:(console.warn("[classifier] Failed to load cache:",y(e)),Rc)}}async function Ck(r,e){try{let t=cp.join(r,"storage","classification-cache.json");await ce(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function xk(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||ls(s.classifiedAt,36e5)?null:s.classification}function Rk(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Ac,Ak,lp,up=v(()=>{"use strict";nr();Ho();H();Ps();J();Ds();l(ip,"hashDescription");l(ap,"loadCache");l(Ck,"saveCache");l(xk,"lookupCache");l(Rk,"lookupPatterns");Ac=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=ip(e),o=await ap(s),i=xk(o,n,t);if(i)return{classification:i,source:"cache"};let a=Rk(o,n);return a?{classification:a,source:"history"}:{classification:op,source:"heuristic"}}async confirmClassification(e,t,s){let n=ip(e),o=await ap(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Ck(s,o))}},Ak=new Ac,lp=Ak});import Dk from"node:fs/promises";import jk from"node:path";var Dc,Ik,Go,jc=v(()=>{"use strict";vc();De();fe();gr();pn();ur();wt();Lo();Xm();rp();H();Ue();Pn();up();Dc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await M.getProjectId(s),o=R.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=u.map((F,k)=>{if(F.status==="fulfilled")return F.value;p.push(d[k]),console.warn(`Context tool "${d[k]}" failed: ${y(F.reason)}`)}),[g,h,S]=m,w={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},E=this.shouldFragment(a,t),D=null;E&&e==="task"&&(D=await this.createSubtasks(t,a,[],n));let V=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:E,subtasks:D,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:h??null,velocityContext:S??null,contextDegradation:w,rpiContext:V}}resolveRpiPhase(e){try{let{prjctDb:t}=(ee(),ot(Kr)),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),vn(e,t,{maxFiles:10,minScore:.15}),Km(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await np(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
863
+ `);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([N("git branch --show-current",{cwd:e}),N("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
864
+ `).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Mt.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 Je.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 mt.getAll(e);if(t.length===0)return null;let s=Oo(t,fs);return s.sprints.length===0?null:qm(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=jk.join(e,"analysis","repo-analysis.json"),s=await Dk.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return A(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,s){let n=R.getGlobalProjectPath(t),{classification:o}=await lp.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=o.map((a,c)=>{let u=`${a}.md`,d=o.slice(0,c).map((p,m)=>`subtask-${m+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:u,status:c===0?"in_progress":"pending",dependsOn:d,order:c+1}});return await _.createSubtasks(n,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Ik=new Dc,Go=Ik});function $k(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 Ic,Mk,Fe,dp=v(()=>{"use strict";xt();z();_s();_s();l($k,"generateApprovalPrompt");Ic=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return xa.includes(e)}isDestructive(e){return Ra.includes(e)}isToolAllowedInPlanning(e){return ko.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>ko.includes(s)):t}startPlanning(e,t,s){let n={id:pe(),projectId:e,command:t,params:s,status:ne.GATHERING,startedAt:b(),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?[ne.GATHERING,ne.ANALYZING,ne.PROPOSING,ne.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===ne.APPROVED?s.approvedAt=b():t===ne.EXECUTING?s.executionStartedAt=b():(t===ne.COMPLETED||t===ne.ABORTED)&&(s.completedAt=b()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=ne.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=ne.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!==ne.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=ne.APPROVED,s.approvedAt=b(),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=ne.REJECTED,s.userFeedback=t,s.completedAt=b(),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!==ne.APPROVED?null:(t.status=ne.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==ne.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!==ne.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=b(),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=ne.COMPLETED,t.completedAt=b();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=ne.ABORTED,s.completedAt=b(),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 $k(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[ne.GATHERING]:"\u{1F50D}",[ne.ANALYZING]:"\u{1F9E0}",[ne.PROPOSING]:"\u{1F4DD}",[ne.PENDING_APPROVAL]:"\u23F3",[ne.APPROVED]:"\u2705",[ne.EXECUTING]:"\u26A1",[ne.COMPLETED]:"\u{1F389}",[ne.REJECTED]:"\u274C",[ne.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===ne.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
865
+ `)}_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`}},Mk=new Ic,Fe=Mk});var $c,_k,mp,pp=v(()=>{"use strict";z();Pn();$c=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await mt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((p,m)=>p+m.qualityScore,0)/t.length,n=await mt.getEstimateAccuracy(e),o=new Map;for(let p of t)for(let m of p.blockers||[])o.set(m,(o.get(m)||0)+1);let i=[...o.entries()].sort((p,m)=>m[1]-p[1]).slice(0,5).map(([p])=>p),c=(await this.getAgentMetrics(e)).sort((p,m)=>m.successRate-p.successRate).slice(0,3).map(p=>p.agent),d=(await this.detectPatterns(e)).map(p=>p.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await mt.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(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,w)=>S+w.qualityScore,0)/a,p=i.filter(S=>{if(!S.variance)return!1;let w=tn(S.variance),E=ft(S.estimatedDuration);return E===0?!1:Math.abs(w)/E<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let S of i.filter(w=>w.completedAsPlanned))for(let w of S.tags||[])g.set(w,(g.get(w)||0)+1);let h=[...g.entries()].sort((S,w)=>w[1]-S[1]).slice(0,3).map(([S])=>S);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:h})}return n}async detectPatterns(e){let t=await mt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>tn(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=>tn(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 mt.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}},_k=new $c,mp=_k});var wp={};Bt(wp,{AgentAssignmentSchema:()=>gp,OUTPUT_SCHEMAS:()=>hp,SubtaskBreakdownSchema:()=>fp,TaskClassificationSchema:()=>Cn,renderSchemaForPrompt:()=>Ok});import{z as ze}from"zod";function Ok(r){let e=hp[r];return e?`## OUTPUT FORMAT
730
866
 
731
867
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
732
868
 
@@ -735,163 +871,175 @@ ${e.example}
735
871
  \`\`\`
736
872
 
737
873
  Fields:
738
- ${hb(e.schema)}`:null}function hb(r){if(r instanceof Ye.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${rg(s)}`).join(`
739
- `)}return"(see example above)"}function rg(r){return r instanceof Ye.ZodString?"string":r instanceof Ye.ZodNumber?"number":r instanceof Ye.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ye.ZodArray?`array of ${rg(r.element)}`:r instanceof Ye.ZodObject?"object":"any"}var tg,sg,ng,ig=S(()=>{"use strict";qo();qo();tg=Ye.object({agentName:Ye.string(),reasoning:Ye.string(),confidence:Ye.number().min(0).max(1)}),sg=Ye.object({subtasks:Ye.array(Ye.object({description:Ye.string(),domain:Jo,agent:Ye.string(),dependsOn:Ye.array(Ye.number())})),effort:Ye.enum(["low","medium","high"])}),ng={classification:{schema:jn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:tg,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:sg,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(fb,"renderSchemaForPrompt");l(hb,"describeSchema");l(rg,"describeField")});import ag from"node:fs/promises";import Qs from"node:path";var Qc,yb,cg,lg=S(()=>{"use strict";Xt();Pt();W();K();Ct();Lm();Um();Km();Ym();eg();Kc();Hs();Qc=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;_coordinator=null;_healthMonitor=null;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 P(e)){let n=await ag.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){R(n)||console.error(`Template loading warning: ${w(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}setHealthMonitor(e){this._healthMonitor=e}getHealthMonitor(){return this._healthMonitor}getEffectiveBudgets(){return this._coordinator?Zm(this._coordinator):Qo}resetContext(){}setContext(e){}async loadModule(e){let t=wt(`global/modules/${e}`);if(t)return t;let s=Qs.join(Ze,"templates/global/modules",e);return this.getTemplate(s)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=fn("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=wt(n);if(o){let i=Qs.basename(n,".md");t[i]=o}}}else{let n=Qs.join(Ze,"templates","checklists");if(await P(n)){let o=(await ag.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Qs.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){R(s)||console.error(`Checklist loading warning: ${w(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([_.read(e),be.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(R(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 Nm.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){!R(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}s.push("---"),s.push("");let n=s.join(`
740
- `);return Mr(n,this.getEffectiveBudgets().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=Qs.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 p=await this.build(e,t,s,n,o,i,a,c);return u.push(p),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,p){let m=p?.skipNativeContext??!1,d=[],g=e.frontmatter?.name?.replace("p:","")||"",h;try{let E=await zm();h=qm(E,g,e).entry}catch{h={agents:!0,patterns:!0,checklist:!1,modules:[]}}let k=h.agents;n&&k&&(d.push(`# AGENT: ${n.name}
741
- `),n.role&&d.push(`Role: ${n.role}
742
- `),n.skills?.length&&d.push(`Skills: ${n.skills.join(", ")}
743
- `),d.push(`
874
+ ${Nk(e.schema)}`:null}function Nk(r){if(r instanceof ze.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${yp(s)}`).join(`
875
+ `)}return"(see example above)"}function yp(r){return r instanceof ze.ZodString?"string":r instanceof ze.ZodNumber?"number":r instanceof ze.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ze.ZodArray?`array of ${yp(r.element)}`:r instanceof ze.ZodObject?"object":"any"}var gp,fp,hp,kp=v(()=>{"use strict";Ho();Ho();gp=ze.object({agentName:ze.string(),reasoning:ze.string(),confidence:ze.number().min(0).max(1)}),fp=ze.object({subtasks:ze.array(ze.object({description:ze.string(),domain:Uo,agent:ze.string(),dependsOn:ze.array(ze.number())})),effort:ze.enum(["low","medium","high"])}),hp={classification:{schema:Cn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:gp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:fp,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(Ok,"renderSchemaForPrompt");l(Nk,"describeSchema");l(yp,"describeField")});import Sp from"node:fs/promises";import xn from"node:path";function Wo(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
876
+ ... (truncated to ~${e} tokens)`}function bp(r){return Math.ceil(r.length/4)}var Mc,_c,Oc,Lk,Tp,vp=v(()=>{"use strict";mo();Wt();wt();H();J();Pt();pp();Is();Mc={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Wo,"truncateToTokenBudget");l(bp,"estimateTokens");_c=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Mc,...e}}addSection(e,t){let s=Wo(e,t),n=bp(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Wo(s,o);return this.used+=bp(i),i}return this.used+=n,s}},Oc=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 x(e)){let n=await Sp.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){A(n)||console.error(`Template loading warning: ${y(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=dt(`global/modules/${e}`);if(t)return t;let s=xn.join(at,"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=un("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=dt(n);if(o){let i=xn.basename(n,".md");t[i]=o}}}else{let n=xn.join(at,"templates","checklists");if(await x(n)){let o=(await Sp.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=xn.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){A(s)||console.error(`Checklist loading warning: ${y(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([_.read(e),we.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(A(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 mp.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){!A(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}s.push("---"),s.push("");let n=s.join(`
877
+ `);return Wo(n,Mc.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=xn.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&u.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let p=d?.skipNativeContext??!1,m=d?.mcpActive??!1,g=[],h=e.frontmatter?.name?.replace("p:","")||"",S={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&S.agents&&(g.push(`# AGENT: ${n.name}
878
+ `),n.role&&g.push(`Role: ${n.role}
879
+ `),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
880
+ `),g.push(`
744
881
  Apply specialized expertise. Read agent file for details if needed.
745
882
 
746
- `)),d.push(`TASK: ${e.frontmatter.description}
747
- `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
748
- `);let y=t;(y.params?.task||y.params?.description)&&d.push(`INPUT: ${y.params.task||y.params.description}
749
- `);let v=t.projectPath;if(v){let E=u?.project?.id?Qs.basename(v):Qs.basename(v),M=Xm({projectName:E,projectPath:v,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
750
- ${M}
751
- `)}if(u){let E=u.sealedAnalysis;if(d.push(`
883
+ `)),g.push(`TASK: ${e.frontmatter.description}
884
+ `),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
885
+ `);let w=t;(w.params?.task||w.params?.description)&&g.push(`INPUT: ${w.params.task||w.params.description}
886
+ `);let E=t.projectPath;if(E){let $=[`project: ${xn.basename(E)}`,`path: ${E}`,"git: true"];u?.realContext?.gitBranch&&$.push(`branch: ${u.realContext.gitBranch}`),$.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
887
+ <env>
888
+ ${$.join(`
889
+ `)}
890
+ </env>
891
+ `)}if(u){let k=u.sealedAnalysis;if(g.push(`
752
892
  ## PROJECT ANALYSIS (Sealed)
753
- `),d.push(`**Ecosystem**: ${u.project.ecosystem}
754
- `),d.push(`**Primary Domain**: ${u.primaryDomain}
755
- `),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
756
- `),E&&(E.languages?.length>0&&d.push(`**Languages**: ${E.languages.join(", ")}
757
- `),E.frameworks?.length>0&&d.push(`**Frameworks**: ${E.frameworks.join(", ")}
758
- `),E.packageManager&&d.push(`**Package Manager**: ${E.packageManager}
759
- `),E.sourceDir&&d.push(`**Source Dir**: ${E.sourceDir}
760
- `),E.testDir&&d.push(`**Test Dir**: ${E.testDir}
761
- `),d.push(`**Files Analyzed**: ${E.fileCount}
762
- `),d.push(`**Analysis Status**: ${E.status}${E.commitHash?` (commit: ${E.commitHash.slice(0,8)})`:""}
763
- `),!m)){if(E.patterns?.length>0){d.push(`
893
+ `),g.push(`**Ecosystem**: ${u.project.ecosystem}
894
+ `),g.push(`**Primary Domain**: ${u.primaryDomain}
895
+ `),g.push(`**Domains**: ${u.detectedDomains.join(", ")}
896
+ `),k&&(k.languages?.length>0&&g.push(`**Languages**: ${k.languages.join(", ")}
897
+ `),k.frameworks?.length>0&&g.push(`**Frameworks**: ${k.frameworks.join(", ")}
898
+ `),k.packageManager&&g.push(`**Package Manager**: ${k.packageManager}
899
+ `),k.sourceDir&&g.push(`**Source Dir**: ${k.sourceDir}
900
+ `),k.testDir&&g.push(`**Test Dir**: ${k.testDir}
901
+ `),g.push(`**Files Analyzed**: ${k.fileCount}
902
+ `),g.push(`**Analysis Status**: ${k.status}${k.commitHash?` (commit: ${k.commitHash.slice(0,8)})`:""}
903
+ `),!p)){if(k.patterns?.length>0){g.push(`
764
904
  ### Code Patterns (Follow These)
765
- `);for(let M of E.patterns)d.push(`- **${M.name}**: ${M.description}${M.location?` (${M.location})`:""}
766
- `)}if(E.antiPatterns?.length>0){d.push(`
905
+ `);for(let $ of k.patterns)g.push(`- **${$.name}**: ${$.description}${$.location?` (${$.location})`:""}
906
+ `)}if(k.antiPatterns?.length>0){g.push(`
767
907
  ### Anti-Patterns (Avoid These)
768
- `);for(let M of E.antiPatterns)d.push(`- **${M.issue}** in \`${M.file}\` \u2014 ${M.suggestion}
769
- `)}}d.push(`
770
- `)}if(!m){let E=h.patterns,M=s?.codePatterns||"";if(E&&M&&M.trim()){let Me=this.extractPatternSummary(M);Me&&(d.push(`## CODE PATTERNS
771
- `),d.push(Me),d.push(`
908
+ `);for(let $ of k.antiPatterns)g.push(`- **${$.issue}** in \`${$.file}\` \u2014 ${$.suggestion}
909
+ `)}}g.push(`
910
+ `)}if(!p){let k=s?.codePatterns||"";if(S.patterns&&k&&k.trim()){let O=this.extractPatternSummary(k);O&&(g.push(`## CODE PATTERNS
911
+ `),g.push(O),g.push(`
772
912
  Full patterns: Read analysis/patterns.md
773
- `))}let se=s?.analysis||"";if(E&&se&&se.trim()){let Me=se.match(/Stack[:\s]+([^\n]+)/i)||se.match(/Technology[:\s]+([^\n]+)/i),q=Me?Me[1].trim():"detected";d.push(`
913
+ `))}let $=s?.analysis||"";if(S.patterns&&$&&$.trim()){let O=$.match(/Stack[:\s]+([^\n]+)/i)||$.match(/Technology[:\s]+([^\n]+)/i),ge=O?O[1].trim():"detected";g.push(`
774
914
  ## STACK
775
- Stack: ${q}
776
- `),M||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
777
- `)}}let D=this.getModulesForCommand(g,h);if(D.length>0)for(let E of D){let M=await this.loadModule(E);M&&(d.push(`
778
- `),d.push(M))}if(c?.isPlanning&&(d.push(`
915
+ Stack: ${ge}
916
+ `),k||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
917
+ `)}}if(S.modules.length>0)for(let k of S.modules){let $=await this.loadModule(k);$&&(g.push(`
918
+ `),g.push($))}if(c?.isPlanning&&(g.push(`
779
919
  ## PLAN MODE
780
920
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
781
- `),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
782
- `)),c?.requiresApproval&&d.push(`
921
+ `),c.allowedTools&&g.push(`Tools: ${c.allowedTools.join(", ")}
922
+ `)),c?.requiresApproval&&g.push(`
783
923
  ## APPROVAL REQUIRED
784
924
  Show changes, list affected files, ask for confirmation.
785
- `),v){let E=u?.sealedAnalysis,M=[...E?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],se={projectPath:v,language:u?.project?.ecosystem,framework:E?.frameworks?.[0],techStack:Xo(M),domains:this.extractDomains(s),fileCount:t.files?.length||t.filteredSize||0,analysisLanguages:E?.languages||[],analysisFrameworks:E?.frameworks||[],analysisPackageManager:E?.packageManager};d.push(`
786
- ${Fm(se)}
787
- `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let E=u.contextDegradation;d.push(`
925
+ `),E){g.push(`
926
+ ## CONSTRAINTS
927
+ SCOPE: Only files in \`${E}\` are accessible.
928
+ `);let k=u?.sealedAnalysis;if(k){let $=[...k.languages||[],...k.frameworks||[]].filter(Boolean);$.length>0&&g.push(`AVAILABLE: ${$.join(", ")}
929
+ `),k.packageManager&&g.push(`PACKAGE MANAGER: ${k.packageManager}
930
+ `)}}if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let k=u.contextDegradation;g.push(`
788
931
  ### CONTEXT DEGRADATION NOTICE
789
932
 
790
- `),d.push(`**Level**: ${E.level}
791
- `),d.push(`**Unavailable**: ${E.failedTools.join(", ")}
792
- `),d.push(`Some context tools failed. Explore the codebase manually for missing context.
933
+ `),g.push(`**Level**: ${k.level}
934
+ `),g.push(`**Unavailable**: ${k.failedTools.join(", ")}
935
+ `),g.push(`Some context tools failed. Explore the codebase manually for missing context.
793
936
 
794
- `)}if(u?.realContext){let E=u.realContext;if(d.push(`
937
+ `)}if(u?.realContext){let k=u.realContext;if(g.push(`
795
938
  ### CODEBASE CONTEXT
796
939
 
797
- `),d.push(`**Git State**: Branch \`${E.gitBranch}\` | ${E.gitStatus}
798
-
799
- `),E.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
800
- `),d.push(`| Score | File | Why |
801
- `),d.push(`|-------|------|-----|
802
- `);for(let M of E.relevantFiles.slice(0,8))d.push(`| ${M.score} | ${M.path} | ${M.reason} |
803
- `);d.push(`
804
- `)}if(E.signatures.length>0){d.push(`**Code Signatures** (top files):
805
- `);for(let M of E.signatures)d.push(`\`\`\`typescript
806
- // ${M.path}
807
- ${M.content}
940
+ `),g.push(`**Git State**: Branch \`${k.gitBranch}\` | ${k.gitStatus}
941
+
942
+ `),k.relevantFiles.length>0){g.push(`**Relevant Files** (scored by task relevance):
943
+ `),g.push(`| Score | File | Why |
944
+ `),g.push(`|-------|------|-----|
945
+ `);for(let $ of k.relevantFiles.slice(0,8))g.push(`| ${$.score} | ${$.path} | ${$.reason} |
946
+ `);g.push(`
947
+ `)}if(k.signatures.length>0){g.push(`**Code Signatures** (top files):
948
+ `);for(let $ of k.signatures)g.push(`\`\`\`typescript
949
+ // ${$.path}
950
+ ${$.content}
808
951
  \`\`\`
809
- `);d.push(`
810
- `)}if(E.recentFiles.length>0){d.push("**Recently Changed**: ");let M=E.recentFiles.slice(0,5).map(se=>`${se.path} (${se.lastChanged})`).join(", ");d.push(`${M}
952
+ `);g.push(`
953
+ `)}if(k.recentFiles.length>0){g.push("**Recently Changed**: ");let $=k.recentFiles.slice(0,5).map(O=>`${O.path} (${O.lastChanged})`).join(", ");g.push(`${$}
811
954
 
812
- `)}}let U=t.files||[];if(U.length>0){let E=U.slice(0,5).join(", ");d.push(`
813
- ## FILES: ${U.length} available. Top: ${E}
814
- `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
955
+ `)}}let D=t.files||[];if(D.length>0){let k=D.slice(0,5).join(", ");g.push(`
956
+ ## FILES: ${D.length} available. Top: ${k}
957
+ `),g.push(`Read BEFORE modifying. Use Glob/Grep to find more.
815
958
 
816
- `)}else v&&d.push(`
817
- ## PROJECT: ${v}
959
+ `)}else E&&g.push(`
960
+ ## PROJECT: ${E}
818
961
  Read files before modifying.
819
962
 
820
- `);let F=this.filterRelevantState(s);if(F&&(d.push(`
963
+ `);let V=this.filterRelevantState(s);if(V&&(g.push(`
821
964
  ## PRJCT STATE (Project Management Data)
822
- `),d.push(F),d.push(`
823
- `)),u?.velocityContext&&(d.push(`
965
+ `),g.push(V),g.push(`
966
+ `)),u?.velocityContext&&(g.push(`
824
967
  ### VELOCITY (Historical Estimation Data)
825
968
 
826
- `),d.push(u.velocityContext),d.push(`
969
+ `),g.push(u.velocityContext),g.push(`
827
970
 
828
- `)),o&&Object.keys(o).some(E=>o[E])){d.push(`
971
+ `)),o&&Object.keys(o).some(k=>o[k])){g.push(`
829
972
  ## PROJECT DEFAULTS (apply automatically)
830
- `);for(let[E,M]of Object.entries(o))M&&d.push(`- ${E}: ${M}
831
- `)}if(i?.plan&&i.plan.length>0){if(d.push(`
973
+ `);for(let[k,$]of Object.entries(o))$&&g.push(`- ${k}: ${$}
974
+ `)}if(i?.plan&&i.plan.length>0){if(g.push(`
832
975
  ## THINK FIRST (reasoning from analysis)
833
- `),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
834
- `);for(let E of i.conclusions)d.push(` \u2192 ${E}
835
- `)}d.push(`Plan:
836
- `);for(let E=0;E<i.plan.length;E++)d.push(` ${E+1}. ${i.plan[E]}
837
- `);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
838
- `)}if(a&&a.length>0){d.push(`
976
+ `),i.conclusions&&i.conclusions.length>0){g.push(`Conclusions:
977
+ `);for(let k of i.conclusions)g.push(` \u2192 ${k}
978
+ `)}g.push(`Plan:
979
+ `);for(let k=0;k<i.plan.length;k++)g.push(` ${k+1}. ${i.plan[k]}
980
+ `);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
981
+ `)}if(!m&&a&&a.length>0){g.push(`
839
982
  ## CONTEXT (apply these)
840
- `);for(let E of a)d.push(`- **${E.title}**: ${E.content}
841
- `),E.tags&&E.tags.length>0&&d.push(` Tags: ${E.tags.join(", ")}
842
- `)}if(u?.rpiContext){let E=u.rpiContext;switch(d.push(`
983
+ `);for(let k of a)g.push(`- **${k.title}**: ${k.content}
984
+ `),k.tags&&k.tags.length>0&&g.push(` Tags: ${k.tags.join(", ")}
985
+ `)}if(u?.rpiContext){let k=u.rpiContext;switch(g.push(`
843
986
  ### RPI PHASE
844
987
 
845
- `),E.phase){case"research":d.push(`**Phase: RESEARCH** \u2014 Explore the codebase. Produce a truth snapshot: exact files + lines, function call chains, test locations. Use sub-agents for broad exploration.
846
- `);break;case"plan":d.push(`**Phase: PLAN** \u2014 Create an implementation plan with real code snippets. Reference exact files and line numbers from research.
847
- `),E.researchDoc&&d.push(`
988
+ `),k.phase){case"research":g.push(`**Phase: RESEARCH** \u2014 Explore the codebase. Produce a truth snapshot: exact files + lines, function call chains, test locations. Use sub-agents for broad exploration.
989
+ `);break;case"plan":g.push(`**Phase: PLAN** \u2014 Create an implementation plan with real code snippets. Reference exact files and line numbers from research.
990
+ `),k.researchDoc&&g.push(`
848
991
  <research-context>
849
- ${E.researchDoc}
992
+ ${k.researchDoc}
850
993
  </research-context>
851
- `);break;case"implement":d.push(`**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration. Work only with the scoped files below.
852
- `),E.planDoc&&d.push(`
994
+ `);break;case"implement":g.push(`**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration. Work only with the scoped files below.
995
+ `),k.planDoc&&g.push(`
853
996
  <plan-context>
854
- ${E.planDoc}
997
+ ${k.planDoc}
855
998
  </plan-context>
856
- `),E.scopedFiles&&E.scopedFiles.length>0&&d.push(`
857
- **Scoped Files**: ${E.scopedFiles.map(M=>`\`${M}\``).join(", ")}
858
- `);break}d.push(`
859
- `)}if(d.push(`
999
+ `),k.scopedFiles&&k.scopedFiles.length>0&&g.push(`
1000
+ **Scoped Files**: ${k.scopedFiles.map($=>`\`${$}\``).join(", ")}
1001
+ `);break}g.push(`
1002
+ `)}if(g.push(`
860
1003
  ---
861
- `),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
1004
+ `),g.push(e.content),u?.requiresFragmentation&&u.subtasks){g.push(`
862
1005
  ### SUBTASKS (Execute in Order)
863
1006
 
864
- `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
865
- `),d.push(`|---|--------|-------------|--------|
866
- `);for(let M of u.subtasks){let se=M.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":M.status==="completed"?"\u2705 Done":M.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${M.order} | ${M.domain} | ${M.description} | ${se} |
867
- `)}let E=u.subtasks.find(M=>M.status==="in_progress");if(E&&(d.push(`
868
- **FOCUS ON SUBTASK #${E.order}**: ${E.description}
869
- `),d.push(`Agent: ${E.agent} | Domain: ${E.domain}
870
- `),E.dependsOn.length>0&&d.push(`Dependencies: ${E.dependsOn.join(", ")}
871
- `),E.handoff)){let M=E.handoff;d.push(`
1007
+ `),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
1008
+ `),g.push(`|---|--------|-------------|--------|
1009
+ `);for(let $ of u.subtasks){let O=$.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":$.status==="completed"?"\u2705 Done":$.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${$.order} | ${$.domain} | ${$.description} | ${O} |
1010
+ `)}let k=u.subtasks.find($=>$.status==="in_progress");if(k&&(g.push(`
1011
+ **FOCUS ON SUBTASK #${k.order}**: ${k.description}
1012
+ `),g.push(`Agent: ${k.agent} | Domain: ${k.domain}
1013
+ `),k.dependsOn.length>0&&g.push(`Dependencies: ${k.dependsOn.join(", ")}
1014
+ `),k.handoff)){let $=k.handoff;g.push(`
872
1015
  ### Previous Subtask Handoff
873
1016
 
874
- `),d.push(`**From:** ${M.fromSubtask}
1017
+ `),g.push(`**From:** ${$.fromSubtask}
875
1018
 
876
- `),d.push(`**What was done:**
877
- `);for(let se of M.whatWasDone)d.push(`- ${se}
878
- `);if(M.filesChanged.length>0){d.push(`
1019
+ `),g.push(`**What was done:**
1020
+ `);for(let O of $.whatWasDone)g.push(`- ${O}
1021
+ `);if($.filesChanged.length>0){g.push(`
879
1022
  **Files changed:**
880
- `);for(let se of M.filesChanged)d.push(`- \`${se.path}\` (${se.action})
881
- `)}d.push(`
1023
+ `);for(let O of $.filesChanged)g.push(`- \`${O.path}\` (${O.action})
1024
+ `)}g.push(`
882
1025
  **Context for this subtask:**
883
- ${M.outputForNextAgent}
884
- `)}d.push(`
885
- `)}let j=this.getSchemaTypeForCommand(g);if(j){let{renderSchemaForPrompt:E}=await Promise.resolve().then(()=>(ig(),og)),M=E(j);M&&d.push(`
886
- ${M}
887
- `)}if(h.checklist){let E=await this.loadChecklistRouting(),M=await this.loadChecklists();E&&Object.keys(M).length>0&&(d.push(`
1026
+ ${$.outputForNextAgent}
1027
+ `)}g.push(`
1028
+ `)}let F=this.getSchemaTypeForCommand(h);if(F){let{renderSchemaForPrompt:k}=await Promise.resolve().then(()=>(kp(),wp)),$=k(F);$&&g.push(`
1029
+ ${$}
1030
+ `)}if(S.checklist){let k=await this.loadChecklistRouting(),$=await this.loadChecklists();k&&Object.keys($).length>0&&(g.push(`
888
1031
  ## QUALITY CHECKLISTS
889
- `),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
890
- `),d.push(`Available: ${Object.keys(M).join(", ")}
891
- `),d.push(`Path: templates/checklists/{name}.md
892
- `),d.push(`Use Read tool to load checklists you determine are relevant.
893
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),s=new Yo({totalPrompt:t.stateData}),n=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=n.includes(i)?500:250,u=s.addSection(`### ${i}
894
- ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
1032
+ `),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
1033
+ `),g.push(`Available: ${Object.keys($).join(", ")}
1034
+ `),g.push(`Path: templates/checklists/{name}.md
1035
+ `),g.push(`Use Read tool to load checklists you determine are relevant.
1036
+ `))}return g.push(`
1037
+ ## EFFICIENCY
1038
+ `),g.push(`- Be concise. No preamble, no filler.
1039
+ `),g.push(`- Use sub-agents for exploration that produces >5 file reads.
1040
+ `),g.push(`- Prefer file:line references over dumping full file contents.
1041
+ `),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new _c({totalPrompt:Mc.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}
1042
+ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
895
1043
 
896
1044
  `):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
897
1045
 
@@ -907,52 +1055,13 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
907
1055
  `);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
908
1056
  Avoid:
909
1057
  ${a}`)}let o=t.join(`
910
- `);return Mr(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return""}buildEfficiencyDirective(){let e=[];if(e.push(`
911
- ## EFFICIENCY
912
- `),e.push(`- Be concise. No preamble, no filler.
913
- `),e.push(`- Use sub-agents for exploration that produces >5 file reads.
914
- `),e.push(`- Prefer file:line references over dumping full file contents.
915
- `),this._healthMonitor){let t=this._healthMonitor.getStatus();t.zone==="warning"?e.push(`
916
- **CONTEXT WARNING** (${Math.round(t.usagePercent)}% used): Use sub-agents for all exploration. Consider compacting conversation.
917
- `):t.zone==="dumb"&&e.push(`
918
- **CONTEXT CRITICAL** (${Math.round(t.usagePercent)}% used): STOP expanding context. Work only with referenced files. Compact now.
919
- `),this._healthMonitor.checkTransition()}return e.join("")}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let s=t.domains;return{hasFrontend:s.hasFrontend??!1,hasBackend:s.hasBackend??!1,hasDatabase:s.hasDatabase??!1,hasTesting:s.hasTesting??!1,hasDocker:s.hasDocker??!1}}}},yb=new Qc,cg=yb});import Ps from"node:path";var Zc,wb,Zo,ug=S(()=>{"use strict";Ac();Et();Te();Zc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Ps.dirname(bt.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,s){let n=await this.getProjectId(s),o=A.getGlobalProjectPath(n),a=await(at(),ot(vt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Ps.join(u,"templates")}catch{c=Ps.join(__dirname,"..","..","templates")}return{projectPath:s,projectId:n,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:Ps.join(c,"agentic","orchestrator.md"),taskFragmentation:Ps.join(c,"agentic","task-fragmentation.md"),commandTemplate:Ps.join(c,"commands",`${e}.md`),repoAnalysis:Ps.join(o,"analysis","repo-analysis.json"),skillsDir:a.skillsDir,stateJson:Ps.join(o,"storage","state.json")}}}requiresOrchestration(e){return em.includes(e)?!0:!tm.includes(e)}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
920
- ## Agentic Execution Mode
921
-
922
- You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
923
-
924
- ### Context
925
- - Command: ${e.command}
926
- - Args: ${e.args}
927
- - Project: ${e.projectPath}
928
- - Project ID: ${e.projectId}
929
-
930
- ### Paths (Read as needed)
931
- - Command Template: ${e.paths.commandTemplate}
932
- - Repo Analysis: ${e.paths.repoAnalysis}
933
- - Skills Directory: ${e.paths.skillsDir}
934
- - State JSON: ${e.paths.stateJson}
935
-
936
- ### Instructions
937
-
938
- 1. **Read the command template** (${e.paths.commandTemplate})
939
- ${t?`
940
- 2. **Orchestration:**
941
- - Read: ${e.paths.repoAnalysis} to understand project technologies
942
- - Analyze the task: "${e.args}"
943
- - Determine which domains are relevant
944
- - Check if task should be fragmented into subtasks
945
- `:`
946
- 2. **Execute the command template directly**
947
- `}
948
- 3. **Return results**
949
- `,context:e,requiresOrchestration:t}}},wb=new Zc,Zo=wb});function _r(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&kb.has(e.code))return!0;if(e.code&&pg.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 ti(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&pg.has(e.code))}function dg(r,e,t){let s=Es.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Es.delete(r),!1):!0:!1}function el(r,e){let t=Es.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Es.set(r,t)}function Sb(r){Es.delete(r)}var kb,pg,Es,ei,mg,si,tl=S(()=>{"use strict";kb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),pg=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(_r,"isTransientError");l(ti,"isPermanentError");Es=new Map;l(dg,"isCircuitOpen");l(el,"recordFailure");l(Sb,"recordSuccess");ei=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(dg(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 Sb(t),o}catch(o){if(s=o,n++,ti(o))throw el(t,this.options.circuitBreakerThreshold),o;if(!(_r(o)&&n<this.options.maxAttempts))throw el(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 el(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return _r(e)}isCircuitOpen(e){return dg(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Es.get(e)}resetCircuit(e){Es.delete(e)}resetAllCircuits(){Es.clear()}},mg=new ei({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),si=new ei({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});import gg from"node:fs/promises";var Zs,nt,sl=S(()=>{"use strict";He();tl();Zs={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};Zs.register("Read",async r=>{try{return await si.execute(async()=>await gg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ti(e)||_r(e),null}});Zs.register("Write",async(r,e)=>{try{return await si.execute(async()=>await gg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ti(t)||_r(t),!1}});Zs.register("Bash",async r=>{try{return await si.execute(async()=>await O(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Zs.register("GetTimestamp",async()=>new Date().toISOString());Zs.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Zs.register("GetDateTime",async()=>new Date().toISOString());nt=Zs});import nl from"node:fs/promises";import bb from"node:os";import rl from"node:path";function fg(){let r=process.env.PRJCT_CLI_HOME?.trim()||rl.join(bb.homedir(),".prjct-cli");return rl.join(r,".running")}async function Tb(r){try{let e=fg(),t=rl.dirname(e);await P(t)||await nl.mkdir(t,{recursive:!0}),await nl.writeFile(e,`/p:${r}`)}catch{}}async function vb(){try{let r=fg();await P(r)&&await nl.unlink(r)}catch{}}var ol,Cb,ni,il=S(()=>{"use strict";W();Xp();K();Zp();sm();jc();gm();fm();mr();zc();Om();lg();ug();Hs();sl();l(fg,"getRunningFilePath");l(Tb,"signalStart");l(vb,"signalEnd");ol=class{static{l(this,"CommandExecutor")}async signalStart(e){await Tb(e)}async signalEnd(){await vb()}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Rn.shouldEscalate(e,n)){let o=Rn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await oa.load(e),i=await Wt.build(s,t),a=We.requiresPlanning(e),c=We.isDestructive(e),u=We.isInPlanningMode(i.projectId),p=null;a&&!u&&!t.skipPlanning?p=We.startPlanning(i.projectId,e,t):u&&(p=We.getActivePlan(i.projectId));let m=null;if(Wo.requiresVerification(e)){let q=await Wt.loadStateForCommand(i,e);m=await Wo.verify(e,i,q),!m.verified&&m.warnings.length>0&&console.log(Wo.formatWarnings(m))}let d=null;if(Ho.requiresReasoning(e)){let q=await Wt.loadStateForCommand(i,e);d=await Ho.reason(e,i,q),d.reasoning&&!d.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ho.formatPlan(d)))}let g=t.task||t.description||"",h=await Zo.buildContext(e,g,s),k=Zo.buildAgenticPrompt(h),y=null;if(Zo.requiresOrchestration(e)&&g)try{if(y=await Ko.execute(e,g,s),y.detectedDomains.length>0&&Kp.orchestrate(y.detectedDomains),y.requiresFragmentation&&y.subtasks){let q=y.subtasks.map(mt=>({id:mt.id,domain:mt.domain,description:mt.description,status:mt.status}));Qp(q)}}catch(q){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(q)}`)}let v={...i,orchestratorPath:h.paths.orchestrator,taskFragmentationPath:h.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},D=await Wt.loadState(i),U=null,F=null;i.projectId&&(U={commit_footer:await ct.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await ct.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await ct.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await ct.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await ct.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let j={isPlanning:a||u,requiresApproval:c&&!t.approved,active:p,allowedTools:We.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},se=(await(at(),ot(vt)).getActiveProvider()).name==="claude",Me=await cg.build(o,v,D,null,U,null,F,j,y,{skipNativeContext:se});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${h.paths.orchestrator}`),Rn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:v,state:D,prompt:Me,agenticDelegation:!0,agenticMode:!0,agenticExecContext:h,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,orchestratorPath:h.paths.orchestrator,taskFragmentationPath:h.paths.taskFragmentation,reasoning:d,groundTruth:m,learnedPatterns:U,relevantMemories:F,orchestratorContext:y,memory:{create:l(q=>ct.createMemory(i.projectId,q),"create"),autoRemember:l((q,mt,ms)=>ct.autoRemember(i.projectId,q,mt,ms),"autoRemember"),search:l(q=>ct.searchMemories(i.projectId,q),"search"),findByTags:l(q=>ct.findByTags(i.projectId,q),"findByTags"),getStats:l(()=>ct.getMemoryStats(i.projectId),"getStats")},plan:{active:p,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(q=>We.recordGatheredInfo(i.projectId,q),"recordInfo"),setAnalysis:l(q=>We.setAnalysis(i.projectId,q),"setAnalysis"),propose:l(q=>We.proposePlan(i.projectId,q),"propose"),approve:l(q=>We.approvePlan(i.projectId,q),"approve"),reject:l(q=>We.rejectPlan(i.projectId,q),"reject"),getApprovalPrompt:l(()=>We.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>We.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>We.getNextStep(i.projectId),"getNextStep"),completeStep:l(q=>We.completeStep(i.projectId,q),"completeStep"),failStep:l(q=>We.failStep(i.projectId,q),"failStep"),abort:l(q=>We.abortPlan(i.projectId,q),"abort"),getStatus:l(()=>We.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>We.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rn.recordAttempt(e,n,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Rn.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,s){if(!nt.isAllowed(e,s))throw new Error(`Tool ${e} not allowed for this command`);let n=nt.get(e);if(!n)throw new Error(`Tool ${e} not found`);return await n(...t)}async executeSimple(e,t,s){try{let o=(await oa.load(e)).frontmatter["allowed-tools"]||[],i=await Wt.build(s);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,p)=>this.executeTool("Write",[u,p],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(n){return{success:!1,error:w(n)}}}},Cb=new ol,ni=Cb});import Pb from"node:https";import Eb from"node:os";import al from"node:path";import Bt from"chalk";var cl,ri,ll=S(()=>{"use strict";W();K();cl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=al.join(Eb.homedir(),".prjct-cli","config"),this.cacheFile=al.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=al.join(__dirname,"..","..","package.json");return(await xe(e))?.version??null}catch(e){return console.error("Error reading package version:",w(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=Pb.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 P(this.cacheFile))return await xe(this.cacheFile)}catch{}return null}async writeCache(e){try{await le(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:`
950
- `+Bt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
951
- `+Bt.yellow("\u2502")+" "+Bt.bold("Update available!")+" "+Bt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Bt.yellow("\u2502")+`
952
- `+Bt.yellow("\u2502")+" "+Bt.yellow("\u2502")+`
953
- `+Bt.yellow("\u2502")+" Run: "+Bt.cyan("npm update -g prjct-cli")+" "+Bt.yellow("\u2502")+`
954
- `+Bt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
955
- `}},ri=cl});import hg from"node:path";async function Ab(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(hg.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(hg.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Db(){return{...xb}}function jb(){return{...Rb}}async function yg(){return oi||(oi=await Ab()?Db():jb(),oi)}var oi,xb,Rb,wg=S(()=>{"use strict";K();oi=null,xb={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}},Rb={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(Ab,"isClaudeEnvironment");l(Db,"getClaudeAgent");l(jb,"getTerminalAgent");l(yg,"detect")});import ii from"node:fs/promises";var ul,kg,Sg=S(()=>{"use strict";W();K();ul=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: ${w(t)}`)}return await ii.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: ${w(s)}`)}await ii.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${w(t)}`)}return await ii.readdir(e)}async fileExists(e){return P(e)}async createDirectory(e){await ii.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1058
+ `);return Wo(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},Lk=new Oc,Tp=Lk});import Nc from"node:fs/promises";import Fk from"node:os";import Lc from"node:path";function Ep(){let r=process.env.PRJCT_CLI_HOME?.trim()||Lc.join(Fk.homedir(),".prjct-cli");return Lc.join(r,".running")}async function Uk(r){try{let e=Ep(),t=Lc.dirname(e);await x(t)||await Nc.mkdir(t,{recursive:!0}),await Nc.writeFile(e,`/p:${r}`)}catch{}}async function Hk(){try{let r=Ep();await x(r)&&await Nc.unlink(r)}catch{}}var Fc,Gk,Vo,Uc=v(()=>{"use strict";Mm();H();Nm();J();_o();Vm();zr();Bm();to();jc();dp();vp();Is();l(Ep,"getRunningFilePath");l(Uk,"signalStart");l(Hk,"signalEnd");Fc=class{static{l(this,"CommandExecutor")}async signalStart(e){await Uk(e)}async signalEnd(){await Hk()}requiresOrchestration(e){return Im.includes(e)?!0:!$m.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Tn.shouldEscalate(e,n)){let o=Tn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await du.load(e),i=await xs.build(s,t),a=Fe.requiresPlanning(e),c=Fe.isDestructive(e),u=Fe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Fe.startPlanning(i.projectId,e,t):u&&(d=Fe.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await Go.execute(e,p,s),m.detectedDomains.length>0&&Om.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let O=m.subtasks.map(ge=>({id:ge.id,domain:ge.domain,description:ge.description,status:ge.status}));Wm(O)}}catch(O){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(O)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},h=await xs.loadState(i),S=await Ws("prjct"),w=null,E=null;i.projectId&&(w={commit_footer:await Ze.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ze.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ze.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ze.getSmartDecision(i.projectId,`preferred_agent_${e}`)},S||(E=await Ze.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let D={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},k=(await(lt(),ot(Ct)).getActiveProvider()).name==="claude",$=await Tp.build(o,g,h,null,w,null,E,D,m,{skipNativeContext:k,mcpActive:S});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),Tn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:h,prompt:$,agenticDelegation:!0,agenticMode:!0,learnedPatterns:w,relevantMemories:E,orchestratorContext:m,memory:{create:l(O=>Ze.createMemory(i.projectId,O),"create"),autoRemember:l((O,ge,rt)=>Ze.autoRemember(i.projectId,O,ge,rt),"autoRemember"),search:l(O=>Ze.searchMemories(i.projectId,O),"search"),findByTags:l(O=>Ze.findByTags(i.projectId,O),"findByTags"),getStats:l(()=>Ze.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(O=>Fe.recordGatheredInfo(i.projectId,O),"recordInfo"),setAnalysis:l(O=>Fe.setAnalysis(i.projectId,O),"setAnalysis"),propose:l(O=>Fe.proposePlan(i.projectId,O),"propose"),approve:l(O=>Fe.approvePlan(i.projectId,O),"approve"),reject:l(O=>Fe.rejectPlan(i.projectId,O),"reject"),getApprovalPrompt:l(()=>Fe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Fe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Fe.getNextStep(i.projectId),"getNextStep"),completeStep:l(O=>Fe.completeStep(i.projectId,O),"completeStep"),failStep:l(O=>Fe.failStep(i.projectId,O),"failStep"),abort:l(O=>Fe.abortPlan(i.projectId,O),"abort"),getStatus:l(()=>Fe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Tn.recordAttempt(e,n,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Tn.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},Gk=new Fc,Vo=Gk});import Wk from"node:https";import Vk from"node:os";import Hc from"node:path";import Ft from"chalk";var Gc,Bo,Wc=v(()=>{"use strict";H();J();Gc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Hc.join(Vk.homedir(),".prjct-cli","config"),this.cacheFile=Hc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Hc.join(__dirname,"..","..","package.json");return(await Ee(e))?.version??null}catch(e){return console.error("Error reading package version:",y(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=Wk.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 x(this.cacheFile))return await Ee(this.cacheFile)}catch{}return null}async writeCache(e){try{await ce(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:`
1059
+ `+Ft.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")+`
1060
+ `+Ft.yellow("\u2502")+" "+Ft.bold("Update available!")+" "+Ft.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Ft.yellow("\u2502")+`
1061
+ `+Ft.yellow("\u2502")+" "+Ft.yellow("\u2502")+`
1062
+ `+Ft.yellow("\u2502")+" Run: "+Ft.cyan("npm update -g prjct-cli")+" "+Ft.yellow("\u2502")+`
1063
+ `+Ft.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")+`
1064
+ `}},Bo=Gc});import Pp from"node:path";async function zk(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await x(Pp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await x(Pp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function qk(){return{...Bk}}function Kk(){return{...Jk}}async function Cp(){return Jo||(Jo=await zk()?qk():Kk(),Jo)}var Jo,Bk,Jk,xp=v(()=>{"use strict";J();Jo=null,Bk={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}},Jk={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(zk,"isClaudeEnvironment");l(qk,"getClaudeAgent");l(Kk,"getTerminalAgent");l(Cp,"detect")});import zo from"node:fs/promises";var Vc,Rp,Ap=v(()=>{"use strict";H();J();Vc=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: ${y(t)}`)}return await zo.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: ${y(s)}`)}await zo.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: ${y(t)}`)}return await zo.readdir(e)}async fileExists(e){return x(e)}async createDirectory(e){await zo.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
956
1065
  ${e.map((t,s)=>`${s+1}. ${t}`).join(`
957
1066
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
958
1067
 
@@ -997,10 +1106,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
997
1106
 
998
1107
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
999
1108
 
1000
- 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}}},kg=ul});var $b,dl,ai,bg=S(()=>{"use strict";ss();wg();Sg();tl();$b=["claude"],dl=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await mg.execute(async()=>{if(this.agentInfo=await yg(),!this.agentInfo?.isSupported)throw gr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!$b.includes(e))throw gr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new kg,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},ai=new dl});var pl,In,ml=S(()=>{"use strict";pl=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},In=new pl});var gl,rt,fl=S(()=>{"use strict";re();gl=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)
1001
- 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}}},rt=new gl});function hl(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 yl,je,ci=S(()=>{"use strict";fl();re();l(hl,"rowToRule");yl=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=C.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return C.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
1002
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),C.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return C.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(C.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!C.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 p=o[c];if(!p)continue;i.push(`${p.column} = ?`);let m=u;a.push(p.transform?p.transform(m):m)}return i.length===0||(a.push(t),C.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=C.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?hl(s):null}getRulesForCommand(e,t){let s=rt.getWorkflow(e,t);return!s||!s.enabled?[]:C.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(hl)}getAllRules(e){return C.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(hl)}resetRules(e){let t=C.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return C.run(e,"DELETE FROM workflow_rules"),t?.c??0}},je=new yl});import ut from"node:path";async function Mb(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await P(ut.join(r,"pnpm-lock.yaml"))?"pnpm":await P(ut.join(r,"yarn.lock"))?"yarn":await P(ut.join(r,"bun.lockb"))||await P(ut.join(r,"bun.lock"))?"bun":(await P(ut.join(r,"package-lock.json")),"npm")}function Tg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function _b(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function $n(r,e){for(let n of Ob)if(await P(ut.join(r,n)))return n;let s=(e??await ts(r)).find(n=>n.endsWith(Nb));if(s)return s}async function us(r){for(let e of Lb)if(await P(ut.join(r,e)))return e}async function li(r){let e=ut.join(r,"package.json"),t=await xe(e,null);if(t){let a=await Mb(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Tg(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Tg(a,"typecheck")}),c.test&&(u.test={tool:a,command:_b(a)}),u.versionFile=await $n(r),u.changelogFile=await us(r),u}if(await P(ut.join(r,"pytest.ini"))){let a=await $n(r),c=await us(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await it(ut.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await $n(r),c=await us(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await P(ut.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 P(ut.join(r,"go.mod"))){let a=await $n(r),c=await us(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await ts(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await $n(r,n),c=await us(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await P(ut.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 P(ut.join(r,"gradlew"))&&(await P(ut.join(r,"build.gradle"))||await P(ut.join(r,"build.gradle.kts")))){let a=await us(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await $n(r),i=await us(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var Ob,Nb,Lb,wl=S(()=>{"use strict";K();l(Mb,"detectPackageManager");l(Tg,"pmRun");l(_b,"pmTest");Ob=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Nb=".csproj",Lb=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l($n,"detectVersionFile");l(us,"detectChangelogFile");l(li,"detectProjectCommands")});import*as pe from"@clack/prompts";import en from"chalk";var ui,vg,Or,Cg=S(()=>{"use strict";K();vs();ui=[{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."}],vg=[{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"}],Or=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(){pe.intro(en.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 pe.outro(en.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=ui.findIndex(s=>s.value===this.detectedType),t=await pe.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ui.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?ui[e].value:void 0});return pe.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await pe.multiselect({message:"Which AI agents do you use?",options:vg.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return pe.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);pe.note(e,"Detected stack");let t=await pe.confirm({message:"Is this stack correct?",initialValue:!0});if(pe.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await pe.group({language:l(()=>pe.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>pe.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 pe.group({verbosity:l(()=>pe.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(()=>pe.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=[`${en.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${en.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${en.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${en.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${en.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1003
- `);pe.note(e,"Configuration Summary");let t=await pe.confirm({message:"Generate configuration with these settings?",initialValue:!0});return pe.isCancel(t)||!t?(pe.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 es(e.join(t.homedir(),".claude"))&&s.push("claude"),await P(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await P(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await P(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await es(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(He(),uu));await n("which codex"),s.push("codex")}catch{await es(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,pe.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ui.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return vg.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 Pg={};Ot(Pg,{PlanningCommands:()=>sn});import tn from"node:path";async function Fb(){if(!kl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(pi(),Eg));kl=new r}return kl}var kl,sn,di=S(()=>{"use strict";So();os();It();ks();Xt();ci();W();Ks();En();wl();Cg();dt();kl=null;l(Fb,"getAnalysisCommands");sn=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 Or(t).runNonInteractive());else if(a=await new Or(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Tn(),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 d=A.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
1109
+ 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}}},Rp=Vc});function Dp(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Yk.has(e.code))return!0;if(e.code&&Ip.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 Qk(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Ip.has(e.code))}function jp(r,e,t){let s=ys.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(ys.delete(r),!1):!0:!1}function Bc(r,e){let t=ys.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),ys.set(r,t)}function Zk(r){ys.delete(r)}var Yk,Ip,ys,qo,$p,$I,Mp=v(()=>{"use strict";Yk=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Ip=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Dp,"isTransientError");l(Qk,"isPermanentError");ys=new Map;l(jp,"isCircuitOpen");l(Bc,"recordFailure");l(Zk,"recordSuccess");qo=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(jp(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 Zk(t),o}catch(o){if(s=o,n++,Qk(o))throw Bc(t,this.options.circuitBreakerThreshold),o;if(!(Dp(o)&&n<this.options.maxAttempts))throw Bc(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 Bc(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return Dp(e)}isCircuitOpen(e){return jp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return ys.get(e)}resetCircuit(e){ys.delete(e)}resetAllCircuits(){ys.clear()}},$p=new qo({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),$I=new qo({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var eS,Jc,Ko,_p=v(()=>{"use strict";Jt();xp();Ap();Mp();eS=["claude"],Jc=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await $p.execute(async()=>{if(this.agentInfo=await Cp(),!this.agentInfo?.isSupported)throw er.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!eS.includes(e))throw er.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Rp,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Ko=new Jc});var zc,Rn,qc=v(()=>{"use strict";zc=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Rn=new zc});var Kc,Qe,Xc=v(()=>{"use strict";ee();Kc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();I.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1110
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=I.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=I.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 I.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),I.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 I.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}}},Qe=new Kc});function Yc(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 Qc,Ce,Xo=v(()=>{"use strict";Xc();ee();l(Yc,"rowToRule");Qc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=P.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return P.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
1111
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),P.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(P.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),P.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=P.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Yc(s):null}getRulesForCommand(e,t){let s=Qe.getWorkflow(e,t);return!s||!s.enabled?[]:P.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Yc)}getAllRules(e){return P.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Yc)}resetRules(e){let t=P.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return P.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Ce=new Qc});import st from"node:path";async function tS(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 x(st.join(r,"pnpm-lock.yaml"))?"pnpm":await x(st.join(r,"yarn.lock"))?"yarn":await x(st.join(r,"bun.lockb"))||await x(st.join(r,"bun.lock"))?"bun":(await x(st.join(r,"package-lock.json")),"npm")}function Op(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function sS(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function An(r,e){for(let n of nS)if(await x(st.join(r,n)))return n;let s=(e??await cs(r)).find(n=>n.endsWith(rS));if(s)return s}async function ns(r){for(let e of oS)if(await x(st.join(r,e)))return e}async function Yo(r){let e=st.join(r,"package.json"),t=await Ee(e,null);if(t){let a=await tS(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Op(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Op(a,"typecheck")}),c.test&&(u.test={tool:a,command:sS(a)}),u.versionFile=await An(r),u.changelogFile=await ns(r),u}if(await x(st.join(r,"pytest.ini"))){let a=await An(r),c=await ns(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await Ae(st.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await An(r),c=await ns(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await x(st.join(r,"Cargo.toml"))){let a=await ns(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await x(st.join(r,"go.mod"))){let a=await An(r),c=await ns(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 An(r,n),c=await ns(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await x(st.join(r,"pom.xml"))){let a=await ns(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await x(st.join(r,"gradlew"))&&(await x(st.join(r,"build.gradle"))||await x(st.join(r,"build.gradle.kts")))){let a=await ns(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await An(r),i=await ns(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var nS,rS,oS,Zc=v(()=>{"use strict";J();l(tS,"detectPackageManager");l(Op,"pmRun");l(sS,"pmTest");nS=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],rS=".csproj",oS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(An,"detectVersionFile");l(ns,"detectChangelogFile");l(Yo,"detectProjectCommands")});import*as ae from"@clack/prompts";import Vs from"chalk";var Qo,Np,Er,Lp=v(()=>{"use strict";J();tt();Qo=[{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."}],Np=[{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"}],Er=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(){ae.intro(Vs.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 ae.outro(Vs.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=Qo.findIndex(s=>s.value===this.detectedType),t=await ae.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Qo.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?Qo[e].value:void 0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ae.multiselect({message:"Which AI agents do you use?",options:Np.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ae.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);ae.note(e,"Detected stack");let t=await ae.confirm({message:"Is this stack correct?",initialValue:!0});if(ae.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ae.group({language:l(()=>ae.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ae.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 ae.group({verbosity:l(()=>ae.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(()=>ae.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=[`${Vs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Vs.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${Vs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Vs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Vs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1112
+ `);ae.note(e,"Configuration Summary");let t=await ae.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ae.isCancel(t)||!t?(ae.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 as(e.join(t.homedir(),".claude"))&&s.push("claude"),await x(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await x(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await x(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await as(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Ue(),Hl));await n("which codex"),s.push("codex")}catch{await as(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,ae.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Qo.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Np.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 Fp={};Bt(Fp,{PlanningCommands:()=>Js});import Zo from"node:fs/promises";import Bs from"node:path";async function iS(){if(!el){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(ti(),Up));el=new r}return el}var el,Js,ei=v(()=>{"use strict";Fr();Yt();De();fe();xt();ps();Wt();Xo();H();z();J();Us();kn();tt();Zc();Lp();Dt();el=null;l(iS,"getAnalysisCommands");Js=class extends Se{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 M.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 Er(t).runNonInteractive());else if(a=await new Er(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await rn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await M.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await R.ensureProjectStructure(p);let m=R.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
1004
1113
 
1005
1114
  No current task. Use \`/p:now\` to set focus.
1006
1115
  `,"core/next.md":`# NEXT
@@ -1020,29 +1129,29 @@ No current task. Use \`/p:now\` to set focus.
1020
1129
  `,"planning/roadmap.md":`# ROADMAP
1021
1130
 
1022
1131
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
1023
- `,"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[v,D]of Object.entries(g))await nt.get("Write")(tn.join(d,v),D);let h=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!h){f.step(3,4,"Analyzing project...");let v=await Fb();if((await v.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await v.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let y=s.idea;if(h&&!k){if(!y)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 v=tn.join(d,"planning","architect-session.md"),D=`# Architect Session
1132
+ `,"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[E,D]of Object.entries(g))await Zo.writeFile(Bs.join(m,E),D);let h=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!h){f.step(3,4,"Analyzing project...");let E=await iS();if((await E.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await E.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let w=s.idea;if(h&&!S){if(!w)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let E=Bs.join(m,"planning","architect-session.md"),D=`# Architect Session
1024
1133
 
1025
1134
  ## Idea
1026
- ${y}
1135
+ ${w}
1027
1136
 
1028
1137
  ## Status
1029
1138
  Initialized - awaiting stack recommendation
1030
1139
 
1031
1140
  Generated: ${new Date().toLocaleString()}
1032
- `;return await nt.get("Write")(v,D),await De.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:y,wizard:a}}return await De.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(s){return f.fail(w(s)),{success:!1,error:w(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=ye();return await be.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:J.getTimestamp()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(w(s)),{success:!1,error:w(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 be.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:J.getTimestamp()}),s.md?console.log(L(Q("Bug Reported",e),lt({Severity:i,Priority:c}),ge([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),At("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(w(n)),{success:!1,error:w(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
1033
- `);let n=await this.getGlobalProjectPath(t),o=tn.join(n,"planning","architect-session.md"),i;try{i=await Re.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1141
+ `;return await Zo.writeFile(E,D),await Pe.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:w,wizard:a}}return await Pe.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(s){return f.fail(y(s)),{success:!1,error:y(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 M.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=pe();return await we.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:b()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(y(s)),{success:!1,error:y(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 M.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 we.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:b()}),s.md?console.log(L(X("Bug Reported",e),et({Severity:i,Priority:c}),ue([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),bt("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(y(n)),{success:!1,error:y(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
1142
+ `);let n=await this.getGlobalProjectPath(t),o=Bs.join(n,"planning","architect-session.md"),i;try{i=await Ae(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1034
1143
 
1035
1144
  Create a plan first:
1036
1145
  1. Run /p:init in an empty directory
1037
1146
  2. Answer the discovery questions
1038
1147
  3. Plan will be auto-generated
1039
1148
  4. Then run /p:architect execute`}}if(!i||i.trim()==="")return{success:!1,message:"\u274C Architect plan is empty"};console.log(`\u{1F4CB} Reading architect plan...
1040
- `);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),p=a?a[1].split(`
1041
- `)[0].trim():"Unknown project",m=c?c[1]:"Not specified",d=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${p}`),console.log(`
1149
+ `);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),d=a?a[1].split(`
1150
+ `)[0].trim():"Unknown project",p=c?c[1]:"Not specified",m=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
1042
1151
  \u{1F527} Stack:
1043
- ${m}`),console.log(`
1152
+ ${p}`),console.log(`
1044
1153
  \u{1F4CB} Implementation Steps:
1045
- ${d}`),console.log(`
1154
+ ${m}`),console.log(`
1046
1155
  ${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
1047
1156
  The architect plan is ready. Claude will now:
1048
1157
  1. Read the architectural plan
@@ -1051,7 +1160,7 @@ The architect plan is ready. Claude will now:
1051
1160
  4. Create starter files with boilerplate
1052
1161
  `),console.log(`
1053
1162
  \u{1F4A1} This command shows the plan.`),console.log(" For code generation, Claude Code will read this plan"),console.log(` and generate the structure automatically.
1054
- `),await this.logToMemory(t,"architect_executed",{timestamp:J.getTimestamp(),idea:p}),{success:!0,plan:i,idea:p}}catch(s){return console.error("\u274C Error:",w(s)),{success:!1,error:w(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=tn.join(c,"planning","architect-session.md"),p=`# Architect Session
1163
+ `),await this.logToMemory(t,"architect_executed",{timestamp:b(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await M.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=R.getGlobalProjectPath(o),u=Bs.join(c,"planning","architect-session.md"),d=`# Architect Session
1055
1164
 
1056
1165
  ## Idea
1057
1166
  ${e}
@@ -1066,14 +1175,14 @@ Initialized - awaiting architecture design
1066
1175
  4. Generate roadmap
1067
1176
 
1068
1177
  Generated: ${new Date().toLocaleString()}
1069
- `;return await nt.get("Write")(u,p),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:J.getTimestamp()}),s.md?console.log(L(Q("Idea Captured",e),lt({Mode:"architecture"}),ge([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1178
+ `;return await Zo.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:b()}),s.md?console.log(L(X("Idea Captured",e),et({Mode:"architecture"}),ue([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1070
1179
  \u{1F4A1} Use /p:architect execute to continue planning
1071
- `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Ge.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:J.getTimestamp()}),s.md?console.log(L(Q("Idea Captured",e),lt({Mode:"capture"}),ge([{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)}`),At("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(w(n)),{success:!1,error:w(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 p=A.getGlobalProjectPath(n),m=tn.join(p,"planning","specs");try{let h=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return h.length===0?(f.warn("no specs yet"),console.log(`
1180
+ `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Le.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:b()}),s.md?console.log(L(X("Idea Captured",e),et({Mode:"capture"}),ue([{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)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(y(n)),{success:!1,error:y(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await M.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=R.getGlobalProjectPath(n),p=Bs.join(d,"planning","specs");try{let h=(await(await import("node:fs/promises")).readdir(p)).filter(S=>S.endsWith(".md")&&S!==".gitkeep");return h.length===0?(f.warn("no specs yet"),console.log(`
1072
1181
  \u{1F4A1} Create one with /p:spec "feature name"
1073
1182
  `),{success:!0,specs:[]}):(console.log(`
1074
1183
  \u{1F4CB} SPECIFICATIONS
1075
- `),console.log("\u2550".repeat(50)),h.forEach((k,y)=>{let v=k.replace(".md","").replace(/-/g," ");console.log(` ${y+1}. ${v}`)}),console.log(`${"\u2550".repeat(50)}
1076
- `),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=tn.join(o,"planning","specs");await Re.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=tn.join(i,`${a}.md`),u=`# Specification: ${e}
1184
+ `),console.log("\u2550".repeat(50)),h.forEach((S,w)=>{let E=S.replace(".md","").replace(/-/g," ");console.log(` ${w+1}. ${E}`)}),console.log(`${"\u2550".repeat(50)}
1185
+ `),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=R.getGlobalProjectPath(n),i=Bs.join(o,"planning","specs");await We(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Bs.join(i,`${a}.md`),u=`# Specification: ${e}
1077
1186
 
1078
1187
  ## Overview
1079
1188
  [Brief description of the feature]
@@ -1103,64 +1212,45 @@ Generated: ${new Date().toLocaleString()}
1103
1212
  ---
1104
1213
  Created: ${new Date().toLocaleString()}
1105
1214
  Status: Draft
1106
- `;return await nt.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:J.getTimestamp()}),f.done(`spec created: ${a}.md`),console.log(`
1215
+ `;return await Zo.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:b()}),f.done(`spec created: ${a}.md`),console.log(`
1107
1216
  \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
1108
- `),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}async _seedShipWorkflow(e,t){let s=await li(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 Sl,nn,xg=S(()=>{"use strict";ss();So();Et();Te();W();K();vs();Sl=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(()=>(di(),Pg)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw to.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 Tn();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 ts(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return R(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ts(e)).some(n=>t.includes(n))}catch(t){return R(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},nn=new Sl});var Ce,dt=S(()=>{"use strict";il();jc();sl();Et();Te();ll();bg();ml();Js();xg();ie();K();vs();Ce=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new ri,this.updateNotificationShown=!1,this.commandExecutor=ni}get agent(){return ai.getAgent()}get agentInfo(){return ai.getInfo()}get currentAuthor(){return nn.getCurrentAuthor()}async initializeAgent(){return ai.initialize()}async ensureProjectInit(e){return nn.ensureInit(e)}async ensureAuthor(){return nn.ensureAuthor()}async getGlobalProjectPath(e){return nn.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return xt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return nn.isEmptyDirectory(e)}async _detectExistingCode(e){return nn.hasExistingCode(e)}_breakdownFeatureTasks(e){return In.breakdownFeature(e)}_detectBugSeverity(e){return In.detectBugSeverity(e)}}});import Ub from"node:path";async function bl(r,e){let t=Date.now()-e;await De.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: ${Mn(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
1109
- `));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 At("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function Rg(r){try{let e=await xt.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(p=>new Date(p.timestamp||p.ts).getTime()).filter(p=>!Number.isNaN(p)).sort((p,m)=>p-m);if(u.length>=2){let p=u[u.length-1]-u[0];n=J.formatDuration(p)}}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 p of u.subagents)a.set(p,(a.get(p)||0)+1);let c=Array.from(a.entries()).map(([u,p])=>({name:u,count:p})).sort((u,p)=>p.count-u.count);return{sessionDuration:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Mn(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Tl(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Ag(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 Dg(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 | ${Mn(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${lo(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Tl(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: ${Mn(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(`
1110
- `)}function jg(r,e){let t=[];t.push(`# Repository Analysis
1111
- `),t.push(`Generated: ${new Date().toLocaleString()}
1112
- `);let s=Ub.basename(e);if(t.push(`## Project: ${s}
1113
- `),t.push(`## Stack Detected
1114
- `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
1115
- `),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
1116
- `),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
1117
- `)),r.goMod&&(t.push(`### Go
1118
- `),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
1119
- `)),r.requirements&&(t.push(`### Python
1120
- `),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
1121
- `));let n=r.directories;t.push(`## Structure
1122
- `),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${n?.slice(0,15).join(", ")||"none"}${(n?.length||0)>15?` (+${(n?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
1123
- `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
1124
- `),r.gitLog.split(`
1125
- `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,p]=a.split("|");t.push(`- \`${c}\` ${p} (${u})`)}}),t.push("")),t.push(`## Recommendations
1126
- `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1127
- `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1128
- `)}var Ig=S(()=>{"use strict";os();uo();Js();En();vs();dt();l(bl,"showSyncResult");l(Rg,"getSessionActivity");l(Mn,"formatTokens");l(Tl,"formatDuration");l(Ag,"generateSparkline");l(Dg,"generateStatsMarkdown");l(jg,"generateAnalysisSummary")});var Eg={};Ot(Eg,{AnalysisCommands:()=>on});import vl from"node:fs/promises";import $g from"node:path";import*as rn from"@clack/prompts";var on,pi=S(()=>{"use strict";mr();Pu();os();uo();ca();ad();md();Ra();bc();kn();re();kr();Ya();W();Ks();En();vs();Ig();dt();on=class extends Ce{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1129
- `),Je.init(t);let s=await Wt.build(t,e),n={packageJson:await Je.readPackageJson(),cargoToml:await Je.readCargoToml(),goMod:await Je.readGoMod(),requirements:await Je.readRequirements(),directories:await Je.listDirectories(),fileCount:await Je.countFiles(),gitStats:await Je.getGitStats(),gitLog:await Je.getGitLog(20),hasDockerfile:await Je.fileExists("Dockerfile"),hasDockerCompose:await Je.fileExists("docker-compose.yml"),hasReadme:await Je.fileExists("README.md"),hasTsconfig:await Je.fileExists("tsconfig.json"),hasViteConfig:await Je.fileExists("vite.config.ts")||await Je.fileExists("vite.config.js"),hasNextConfig:await Je.fileExists("next.config.js")||await Je.fileExists("next.config.mjs")},o=jg(n,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await nt.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:J.getTimestamp(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(at(),ot(vt)).getActiveProvider(),p=await De.installGlobalConfig();return p.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(p.path)}`),console.log(`\u2705 Analysis complete!
1130
- `),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1131
- `),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:",w(s)),{success:!1,error:w(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 d=m.packages.find(h=>h.name===t.package||h.relativePath===t.package);if(!d){let h=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${h}`}}let g=await qs.sync(e,{packagePath:d.path,packageName:d.name});return t.json?console.log(JSON.stringify({success:g.success,package:d.name,path:d.relativePath})):t.md?console.log(L(ke(`Synced package: ${d.name}`))):f.done(`Synced package: ${d.name}`),{success:g.success}}let a=$g.join(o,"context","CLAUDE.md"),c=null;try{c=await vl.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 qs.sync(e,{full:t.full});if(!m.success)return t.md?(console.log(L("## 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 d;try{d=await vl.readFile(a,"utf-8")}catch{d=""}let g=ud(c,d);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(L(ke("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 h=l(async()=>{c!=null&&await vl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let y=[];for(let D of g.added)y.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)y.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)y.push(`Removed: ${D.name} (${D.lineCount} lines)`);let v=L("## Sync Preview",y.length>0?Q("Changes",Oe(y)):"No section changes.",lt({"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(v),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await h();let y={added:g.added.map(v=>({name:v.name,lineCount:v.lineCount})),modified:g.modified.map(v=>({name:v.name,lineCount:v.lineCount})),removed:g.removed.map(v=>({name:v.name,lineCount:v.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:y,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(dd(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await rn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(rn.isCancel(k)||k==="cancel")return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
1132
- ${pd(g)}`);let y=await rn.confirm({message:"Apply these changes?",initialValue:!0});if(rn.isCancel(y)||!y)return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),bl(m,i)}t.md||f.spin("Syncing project...");let p=await qs.sync(e,{full:t.full});if(!p.success)return t.md?console.log(L("## Sync Failed",`> ${p.error||"Unknown error"}`)):f.fail(p.error||"Sync failed"),{success:!1,error:p.error};if(t.md||f.stop(),t.md){let m=Date.now()-i,d=p.generatedSkills?.generated?.length??0,g=null;try{let j=await Ke.diff(n);j?.hasChanges&&(g=aa(j))}catch{}let h=p.git.recentCommits[0]?.hash??null,y=h&&Lt.isCurrent(n,h)?null:"### Next: Run `prjct analysis-payload --md` to update project analysis",v=Uo("sync",!0),D=p.syncMetrics?.indexes,U={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${d} generated`,"Files indexed":p.stats.fileCount};if(D?.bm25Files){let j=D.bm25Files*(D.bm25AvgTokens||0);U["Tokens indexed"]=`${Math.round(j/1e3)}K`,U["Import edges"]=D.importEdges||0,U["Co-change commits"]=D.cochangeCommits||0}let F=L(ke("Sync Complete"),lt(U),g,p.git.hasChanges?Wp("Uncommitted changes detected"):null,y,ge(v.map(j=>({label:j.desc,command:j.cmd}))));return console.log(F),{success:!0,data:p,metrics:{elapsed:m,skillCount:d,fileCount:p.stats.fileCount}}}return bl(p,i)}catch(s){return t.md?console.log(L("## Sync Failed",`> ${w(s)}`)):f.fail(w(s)),{success:!1,error:w(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 qs.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&&Lt.isCurrent(n,i))return t.md?console.log(L(ke("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 id(n,e,o.git,o.stats);return t.md?console.log(L("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:w(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."}:(Lt.save(o,i),s.md?console.log(L(ke("LLM Analysis Saved"),lt({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:w(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=Lt.getActive(n);if(!o)return t.md?console.log(L("## 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=[ke(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Q("Architecture Insights",Oe(o.architecture.insights))),o.patterns.length>0&&i.push(Q("Patterns",Oe(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Q("Anti-Patterns",Oe(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Q("Tech Debt",Oe(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Q("Conventions",Oe(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:w(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 Pn.getSummary(n),i=await Pn.getDailyStats(n,30),a=await Rg(n),c=await ct.getPatternsSummary(n);if(t.json){let d={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(d,null,2)),{success:!0,data:d}}let u="Unknown";try{u=C.getDoc(n,"project")?.name||"Unknown"}catch{}let p=await Pn.read(n),m=p.firstSync?new Date(p.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 d=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${d}`)}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: ${Mn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${lo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Tl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let d=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=d>0?(g.usageCount/d*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${h}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let d=Ag(i);if(console.log(` ${d} ${Mn(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${g} ${h}${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 d=Dg(o,i,u,m,a,c);return console.log(d),{success:!0,data:{markdown:d}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",w(s)),{success:!1,error:w(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=yo(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Ke.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=$g.basename(e),p=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",d=[];c.hasSealed&&d.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&d.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&d.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,lt({Staleness:p,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),d.length>0?Q("Analysis",Oe(d)):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=w(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 Ke.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(L("## 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(L(aa(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Lu(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=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## 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 Ke.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=w(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 Ke.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(L(ke("Analysis Rolled Back"),lt({"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(L("## 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=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## 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 Ke.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=w(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=C.getDoc(n,"project")?.repoPath||e}catch{}let i=await Ke.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=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});function Vn(r){return Buffer.from(`${JSON.stringify(r)}
1133
- `)}var Le,Qg,Zg,Hl=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")},Qg=1800*1e3,Zg=1024*1024;l(Vn,"encodeMessage")});var sf={};Ot(sf,{executeViaDaemon:()=>gT,forceKillDaemon:()=>hT,getDaemonStatus:()=>mT,isDaemonRunning:()=>ef,sendRequest:()=>Fr,spawnDaemon:()=>tf,stopDaemon:()=>fT});import Ti from"node:crypto";import Qe from"node:fs";import{connect as pT}from"node:net";async function ef(){let r=Le.socket();if(!Qe.existsSync(r))return!1;try{return(await Fr({id:Ti.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Qe.unlinkSync(r)}catch{}return!1}}async function mT(){let r=Le.socket(),e=Le.pid();if(!Qe.existsSync(r))return{running:!1};try{let t=await Fr({id:Ti.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Qe.existsSync(e)?{running:!1,pid:parseInt(Qe.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Fr(r){return new Promise((e,t)=>{let s=Le.socket(),n=pT(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(Vn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
1134
- `);if(u!==-1){let p=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(p);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 gT(r,e,t,s,n,o=!0){let i=Le.socket();if(!Qe.existsSync(i))return o&&tf().catch(()=>{}),null;try{return await Fr({id:Ti.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function fT(){try{return(await Fr({id:Ti.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function hT(){let r=Le.pid(),e=Le.socket(),t=!1;if(Qe.existsSync(r)){let s=parseInt(Qe.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Qe.existsSync(r)&&Qe.unlinkSync(r)}catch{}try{Qe.existsSync(e)&&Qe.unlinkSync(e)}catch{}return t}async function tf(){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(Qe.existsSync(t))o=t,i="bun";else if(Qe.existsSync(s))o=s,i=zi()?"bun":"node";else if(Qe.existsSync(n))o=n,i=zi()?"bun":"node";else return!1;let a=Le.runDir();Qe.mkdirSync(a,{recursive:!0});let c=Le.log(),u=Qe.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Qe.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(d=>setTimeout(d,300)),await ef())return!0;return!1}var nf=S(()=>{"use strict";ar();Hl();l(ef,"isDaemonRunning");l(mT,"getDaemonStatus");l(Fr,"sendRequest");l(gT,"executeViaDaemon");l(fT,"stopDaemon");l(hT,"forceKillDaemon");l(tf,"spawnDaemon")});import Fe from"node:fs";import{createServer as lv}from"node:net";pi();Ra();import Hb from"node:path";re();var Cl=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){C.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
1135
- VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){C.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
1136
- VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return C.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=C.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
1217
+ `),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async _seedShipWorkflow(e,t){let s=await Yo(t),n=0;Ce.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&&Ce.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&&Ce.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 tl,zs,Hp=v(()=>{"use strict";Jt();Fr();De();fe();H();J();tt();tl=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await M.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ei(),Fp)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await M.getProjectId(e);if(!t)throw Mr.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await R.ensureProjectStructure(t),R.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await rn();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 A(t)||console.error(`Directory check error: ${y(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 A(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await M.isConfigured(e)}async needsMigration(e){return await M.needsMigration(e)}},zs=new tl});var Se,Dt=v(()=>{"use strict";Uc();Wc();_p();qc();Ls();Hp();Se=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Bo,this.updateNotificationShown=!1,this.commandExecutor=Vo}get agent(){return Ko.getAgent()}get agentInfo(){return Ko.getInfo()}get currentAuthor(){return zs.getCurrentAuthor()}async initializeAgent(){return Ko.initialize()}async ensureProjectInit(e){return zs.ensureInit(e)}async ensureAuthor(){return zs.ensureAuthor()}async getGlobalProjectPath(e){return zs.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return kt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return zs.isEmptyDirectory(e)}async _detectExistingCode(e){return zs.hasExistingCode(e)}_breakdownFeatureTasks(e){return Rn.breakdownFeature(e)}_detectBugSeverity(e){return Rn.detectBugSeverity(e)}}});var Up={};Bt(Up,{AnalysisCommands:()=>Ks});import si from"node:fs/promises";import Gp from"node:path";import*as qs from"@clack/prompts";var Ks,ti=v(()=>{"use strict";zr();to();au();Yt();De();fe();ao();Xi();Uu();Ju();ya();cc();pn();ee();ur();Oa();H();z();Us();kn();tt();jm();Dt();Ks=class extends Se{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1218
+ `),Ve.init(t);let s=await xs.build(t,e),n={packageJson:await Ve.readPackageJson(),cargoToml:await Ve.readCargoToml(),goMod:await Ve.readGoMod(),requirements:await Ve.readRequirements(),directories:await Ve.listDirectories(),fileCount:await Ve.countFiles(),gitStats:await Ve.getGitStats(),gitLog:await Ve.getGitLog(20),hasDockerfile:await Ve.fileExists("Dockerfile"),hasDockerCompose:await Ve.fileExists("docker-compose.yml"),hasReadme:await Ve.fileExists("README.md"),hasTsconfig:await Ve.fileExists("tsconfig.json"),hasViteConfig:await Ve.fileExists("vite.config.ts")||await Ve.fileExists("vite.config.js"),hasNextConfig:await Ve.fileExists("next.config.js")||await Ve.fileExists("next.config.mjs")},o=Dm(n,t),i=await M.getProjectId(t),a=s.paths.analysis||R.getFilePath(i,"analysis","repo-summary.md");await si.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:b(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(lt(),ot(Ct)).getActiveProvider(),d=await Pe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${R.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1219
+ `),console.log(`\u{1F4C4} Full report: ${R.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1220
+ `),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:",y(s)),{success:!1,error:y(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=R.getGlobalProjectPath(n),i=Date.now();if(t.package){let p=await R.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(h=>h.name===t.package||h.relativePath===t.package);if(!m){let h=p.packages.map(S=>S.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${h}`}}let g=await Fs.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:g.success,package:m.name,path:m.relativePath})):t.md?console.log(L(he(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=Gp.join(o,"context","CLAUDE.md"),c=null;try{c=await si.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let p=await Fs.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(L("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(f.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await si.readFile(a,"utf-8")}catch{m=""}let g=Wu(c,m);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(L(he("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 h=l(async()=>{c!=null&&await si.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let w=[];for(let D of g.added)w.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)w.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)w.push(`Removed: ${D.name} (${D.lineCount} lines)`);let E=L("## Sync Preview",w.length>0?X("Changes",Ie(w)):"No section changes.",et({"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(E),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await h();let w={added:g.added.map(E=>({name:E.name,lineCount:E.lineCount})),modified:g.modified.map(E=>({name:E.name,lineCount:E.lineCount})),removed:g.removed.map(E=>({name:E.name,lineCount:E.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:w,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(Vu(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await qs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(qs.isCancel(S)||S==="cancel")return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(S==="diff"){console.log(`
1221
+ ${Bu(g)}`);let w=await qs.confirm({message:"Apply these changes?",initialValue:!0});if(qs.isCancel(w)||!w)return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),gc(p,i)}t.md||f.spin("Syncing project...");let d=await Fs.sync(e,{full:t.full});if(!d.success)return t.md?console.log(L("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,g=null;try{let k=await Je.diff(n);k?.hasChanges&&(g=Ki(k))}catch{}let h=d.git.recentCommits[0]?.hash??null,S=h&&Mt.isCurrent(n,h),w=null;if(!S)try{let k=await pa(n,e,d.git,d.stats);w=["## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(k,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1222
+ `)}catch{w="### Next: Run `prjct analysis-payload --md` to update project analysis"}let E=jo("sync",!0),D=d.syncMetrics?.indexes,V={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(D?.bm25Files){let k=D.bm25Files*(D.bm25AvgTokens||0);V["Tokens indexed"]=`${Math.round(k/1e3)}K`,V["Import edges"]=D.importEdges||0,V["Co-change commits"]=D.cochangeCommits||0}let F=L(he("Sync Complete"),et(V),g,d.git.hasChanges?Tm("Uncommitted changes detected"):null,w,ue(E.map(k=>({label:k.desc,command:k.cmd}))));return console.log(F),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return gc(d,i)}catch(s){return t.md?console.log(L("## Sync Failed",`> ${y(s)}`)):f.fail(y(s)),{success:!1,error:y(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Fs.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&&Mt.isCurrent(n,i))return t.md?console.log(L(he("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 pa(n,e,o.git,o.stats);return t.md?console.log(L("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.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."}:(Mt.save(o,i),s.md?console.log(L(he("LLM Analysis Saved"),et({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:y(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Mt.getActive(n);if(!o)return t.md?console.log(L("## 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=[he(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(X("Architecture Insights",Ie(o.architecture.insights))),o.patterns.length>0&&i.push(X("Patterns",Ie(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(X("Anti-Patterns",Ie(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(X("Tech Debt",Ie(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(X("Conventions",Ie(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await wn.getSummary(n),i=await wn.getDailyStats(n,30),a=await xm(n),c=await Ze.getPatternsSummary(n);if(t.json){let m={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(m,null,2)),{success:!0,data:m}}let u="Unknown";try{u=P.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await wn.read(n),p=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${bn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${io(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${fc(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${h}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=Rm(i);if(console.log(` ${m} ${bn(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${g} ${h}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let m=Am(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.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=po(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Je.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=Gp.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,et({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?X("Analysis",Ie(m)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=y(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 M.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 Je.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(L("## 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(L(Ki(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Su(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=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## 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 M.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 Je.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=y(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 M.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 Je.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(L(he("Analysis Rolled Back"),et({"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(L("## 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=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## 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 M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Je.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=y(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 M.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=P.getDoc(n,"project")?.repoPath||e}catch{}let i=await Je.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=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});function Fn(r){return Buffer.from(`${JSON.stringify(r)}
1223
+ `)}var Me,ng,rg,hl=v(()=>{"use strict";Me={runDir:l(()=>`${process.env.HOME||gt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Me.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Me.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Me.runDir()}/daemon.log`,"log")},ng=1800*1e3,rg=1024*1024;l(Fn,"encodeMessage")});var ag={};Bt(ag,{executeViaDaemon:()=>IS,forceKillDaemon:()=>MS,getDaemonStatus:()=>jS,isDaemonRunning:()=>og,sendRequest:()=>Cr,spawnDaemon:()=>ig,stopDaemon:()=>$S});import ui from"node:crypto";import qe from"node:fs";import{connect as DS}from"node:net";async function og(){let r=Me.socket();if(!qe.existsSync(r))return!1;try{return(await Cr({id:ui.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{qe.unlinkSync(r)}catch{}return!1}}async function jS(){let r=Me.socket(),e=Me.pid();if(!qe.existsSync(r))return{running:!1};try{let t=await Cr({id:ui.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return qe.existsSync(e)?{running:!1,pid:parseInt(qe.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Cr(r){return new Promise((e,t)=>{let s=Me.socket(),n=DS(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(Fn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
1224
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function IS(r,e,t,s,n,o=!0){let i=Me.socket();if(!qe.existsSync(i))return o&&ig().catch(()=>{}),null;try{return await Cr({id:ui.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function $S(){try{return(await Cr({id:ui.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function MS(){let r=Me.pid(),e=Me.socket(),t=!1;if(qe.existsSync(r)){let s=parseInt(qe.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{qe.existsSync(r)&&qe.unlinkSync(r)}catch{}try{qe.existsSync(e)&&qe.unlinkSync(e)}catch{}return t}async function ig(){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(qe.existsSync(t))o=t,i="bun";else if(qe.existsSync(s))o=s,i=Fi()?"bun":"node";else if(qe.existsSync(n))o=n,i=Fi()?"bun":"node";else return!1;let a=Me.runDir();qe.mkdirSync(a,{recursive:!0});let c=Me.log(),u=qe.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),qe.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await og())return!0;return!1}var cg=v(()=>{"use strict";or();hl();l(og,"isDaemonRunning");l(jS,"getDaemonStatus");l(Cr,"sendRequest");l(IS,"executeViaDaemon");l($S,"stopDaemon");l(MS,"forceKillDaemon");l(ig,"spawnDaemon")});import _e from"node:fs";import{createServer as Rb}from"node:net";ti();zr();De();ya();import aS from"node:fs/promises";import cS from"node:path";ee();var sl=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){P.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
1225
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){P.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
1226
+ VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return P.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=P.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
1137
1227
  WHERE project_id = ? AND timestamp >= ?
1138
- 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=C.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
1139
- 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}}},Mg=new Cl;re();ks();Xt();zs();Pt();W();Ks();dt();Et();Te();W();ie();var Pl=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:T()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:T()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:T()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:T()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},G=new Pl;var _n=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=Hb.basename(t),a=await _.getCurrentTask(o),c=await be.getActiveTasks(o),u=await tt.getRecent(o,5),p=await Ge.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",d=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${m} | ${d} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,d=J.getDaysAgo(m),g=[];try{let y=d.toISOString();g=C.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",y).map(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let h={tasksCompleted:g.filter(y=>y.action==="task_completed").length,featuresShipped:g.filter(y=>y.action==="feature_shipped").length,totalActions:g.length};console.log(`
1228
+ 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=P.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
1229
+ 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}}},Wp=new sl;ee();ps();Wt();Ns();wt();H();z();Us();tt();Dt();De();fe();H();z();var nl=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 M.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:R.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:b()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:y(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:b()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},U=new nl;var Dn=class extends Se{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 M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=cS.basename(t),a=await _.getCurrentTask(o),c=await we.getActiveTasks(o),u=await Xe.getRecent(o,5),d=await Le.getPending(o);if(e==="compact"){let p=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",m=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=is(p),g=[];try{let w=m.toISOString();g=P.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",w).map(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let h={tasksCompleted:g.filter(w=>w.action==="task_completed").length,featuresShipped:g.filter(w=>w.action==="feature_shipped").length,totalActions:g.length};console.log(`
1140
1230
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1141
- `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${h.tasksCompleted}`),console.log(` Features shipped: ${h.featuresShipped}`),console.log(` Total actions: ${h.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
1142
- Activity: ${k}
1143
- `),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let m=await Wt.build(t),d=await nt.get("Read")(m.paths.roadmap);if(console.log(`
1231
+ `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${h.tasksCompleted}`),console.log(` Features shipped: ${h.featuresShipped}`),console.log(` Total actions: ${h.totalActions}`),console.log("\u2550".repeat(50));let S=this._generateSparkline(g,p);return console.log(`
1232
+ Activity: ${S}
1233
+ `),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let p=await xs.build(t),m=null;try{m=await aS.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
1144
1234
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1145
- `),console.log("\u2550".repeat(50)),!d||d.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1146
- `);else{let g=d.split("##").filter(h=>h.trim()&&!h.includes("ROADMAP"));g.slice(0,5).forEach((h,k)=>{let y=h.split(`
1147
- `)[0].trim();console.log(` ${k+1}. ${y}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1148
- `),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${J.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",d=c.length>0?c.slice(0,5).map(y=>{let v=y.priority?` [${y.priority}]`:"";return`${y.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${v}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(y=>{let v=y.shippedAt?new Date(y.shippedAt).toLocaleDateString():"";return`${y.name}${v?` (${v})`:""}`}):["Nothing shipped yet"],h=null;try{let y=Mg.getSummary(o,7);(y.smartPercent<100||y.compactions>0)&&(h=`### Context Health (7d)
1149
- `+Rr(["Zone","%"],[["Smart",`${y.smartPercent}%`],["Warning",`${y.warningPercent}%`],["Dumb",`${y.dumbPercent}%`],["Compactions",`${y.compactions}`]]))}catch{}let k=L(`## Dashboard: ${i}`,Q("Current Focus",m),Q(`Queue (${c.length})`,Oe(d,!0)),Q("Recent Ships",Oe(g)),Q("Ideas",`${p.length} pending`),h,ge([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(k)}else{console.log(`
1235
+ `),console.log("\u2550".repeat(50)),!m||m.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1236
+ `);else{let g=m.split("##").filter(h=>h.trim()&&!h.includes("ROADMAP"));g.slice(0,5).forEach((h,S)=>{let w=h.split(`
1237
+ `)[0].trim();console.log(` ${S+1}. ${w}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1238
+ `),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${zt(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(w=>{let E=w.priority?` [${w.priority}]`:"";return`${w.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${E}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(w=>{let E=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";return`${w.name}${E?` (${E})`:""}`}):["Nothing shipped yet"],h=null;try{let w=Wp.getSummary(o,7);(w.smartPercent<100||w.compactions>0)&&(h=`### Context Health (7d)
1239
+ `+kr(["Zone","%"],[["Smart",`${w.smartPercent}%`],["Warning",`${w.warningPercent}%`],["Dumb",`${w.dumbPercent}%`],["Compactions",`${w.compactions}`]]))}catch{}let S=L(`## Dashboard: ${i}`,X("Current Focus",p),X(`Queue (${c.length})`,Ie(m,!0)),X("Recent Ships",Ie(g)),X("Ideas",`${d.length} pending`),h,ue([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(S)}else{console.log(`
1150
1240
  \u{1F4CA} DASHBOARD - ${i}
1151
- `),console.log("\u2550".repeat(50));let m=yo(t),d=await m.check(o),g=m.getWarning(d);if(g&&console.log(`
1241
+ `),console.log("\u2550".repeat(50));let p=po(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
1152
1242
  ${g}`),console.log(`
1153
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=J.calculateDuration(new Date(a.startedAt));console.log(` Started: ${h} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1154
- \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,k)=>{let y=h.priority?`[${h.priority}]`:"";console.log(` ${k+1}. ${h.description.slice(0,40)} ${y}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1155
- \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let k=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${h.name} ${k?`(${k})`:""}`)}),console.log(`
1156
- \u{1F4A1} IDEAS`),console.log(` ${p.length} pending ideas`),console.log(`
1243
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=zt(new Date(a.startedAt));console.log(` Started: ${h} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1244
+ \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,S)=>{let w=h.priority?`[${h.priority}]`:"";console.log(` ${S+1}. ${h.description.slice(0,40)} ${w}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1245
+ \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let S=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${h.name} ${S?`(${S})`:""}`)}),console.log(`
1246
+ \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1157
1247
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1158
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:J.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:p.length}}}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1248
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:b()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1159
1249
  PRJCT COMMANDS
1160
- `),console.log("=".repeat(50));let i=G.getAllCategories(),a=G.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,p])=>{let m=i.get(u);console.log(`
1161
- ${m?.title||u}:`),p.forEach(d=>{let g=d.params?` ${d.params}`:"";console.log(` ${d.name}${g}`),console.log(` ${d.description}`)})}),console.log(`
1250
+ `),console.log("=".repeat(50));let i=U.getAllCategories(),a=U.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let p=i.get(u);console.log(`
1251
+ ${p?.title||u}:`),d.forEach(m=>{let g=m.params?` ${m.params}`:"";console.log(` ${m.name}${g}`),console.log(` ${m.description}`)})}),console.log(`
1162
1252
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1163
- `),{success:!0,topic:"overview"}}let s=G.getByName(e);if(s){if(console.log(`
1253
+ `),{success:!0,topic:"overview"}}let s=U.getByName(e);if(s){if(console.log(`
1164
1254
  \u{1F4DA} HELP: /p:${s.name}
1165
1255
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
1166
1256
  Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
@@ -1170,9 +1260,9 @@ ${"\u2550".repeat(50)}
1170
1260
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1171
1261
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1172
1262
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1173
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(w(s)),{success:!1,error:w(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)),p=new Date(c.setHours(23,59,59,999)),m=e.filter(d=>{let g=new Date(d.timestamp);return g>=u&&g<=p}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}};zc();Et();Te();Pt();W();Ks();import Gb from"node:fs/promises";import Wb from"node:path";var 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:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=A.getGlobalProjectPath(c),p=await _.read(c),m=p?.currentTask?{id:p.currentTask.id,description:p.currentTask.description,startedAt:p.currentTask.startedAt,subtasks:p.currentTask.subtasks?.map(k=>({id:k.id,description:k.description,status:k.status,domain:k.domain})),currentSubtaskIndex:p.currentTask.currentSubtaskIndex}:null,d=null;if(i)try{d=await Ko.execute(o,i,t)}catch(k){console.error(`Warning: Orchestrator failed: ${w(k)}`)}let g=await this.loadRepoAnalysis(u),h={projectId:c,globalPath:u,currentTask:m,domains:d?.detectedDomains||[],primaryDomain:d?.primaryDomain||null,subtasks:d?.subtasks?.map(k=>({id:k.id,description:k.description,domain:k.domain,agent:k.agent,status:k.status,order:k.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(h)):console.log(JSON.stringify(h,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}formatContextMd(e){let t=[];if(t.push(Q("Project",Cc(Tc("ID",e.projectId),Tc("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(Ar({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(`
1174
- `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(Q("Stack",lt({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),L(...t)}async loadRepoAnalysis(e){try{let t=Wb.join(e,"analysis","repo-analysis.json"),s=await Gb.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 R(t),null}}},iN=new an;zo();dt();Te();Js();re();ks();Xt();W();dt();import El from"node:fs";import _g from"node:path";async function mi(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}}l(mi,"cleanupMemory");async function gi(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)}}l(gi,"cleanupMemoryInternal");async function xl(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await mi(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 Ge.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 - ${w(a)}`)}try{let c=(await be.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 - ${w(a)}`)}return await gi(e),await xt.log(e,"cleanup_performed",{items:n.length,timestamp:J.getTimestamp()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(w(t)),{success:!1,error:w(t)}}}l(xl,"cleanup");var Vb=[/^qa-/,/^nonexistent-/,/^test-/];async function Og(r){let e=A.getGlobalBasePath(),t=_g.join(e,"projects");if(!El.existsSync(t))return{success:!0,message:"No projects directory found"};let s=El.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=_g.join(t,a);if(!Vb.some(p=>p.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),El.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(`
1175
- `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(Og,"cleanupProjects");Js();W();dt();import Ng from"node:path";async function Rl(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=Ng.join(A.getGlobalProjectPath(i),"planning","designs");await Re.ensureDir(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1263
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}};jc();De();fe();wt();H();Us();import lS from"node:fs/promises";import uS from"node:path";var Xs=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 M.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:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=R.getGlobalProjectPath(c),d=await _.read(c),p=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(S=>({id:S.id,description:S.description,status:S.status,domain:S.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,m=null;if(i)try{m=await Go.execute(o,i,t)}catch(S){console.error(`Warning: Orchestrator failed: ${y(S)}`)}let g=await this.loadRepoAnalysis(u),h={projectId:c,globalPath:u,currentTask:p,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,subtasks:m?.subtasks?.map(S=>({id:S.id,description:S.description,domain:S.domain,agent:S.agent,status:S.status,order:S.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(h)):console.log(JSON.stringify(h,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}formatContextMd(e){let t=[];if(t.push(X("Project",dc(lc("ID",e.projectId),lc("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(Sr({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(`
1264
+ `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(X("Stack",et({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),L(...t)}async loadRepoAnalysis(e){try{let t=uS.join(e,"analysis","repo-analysis.json"),s=await lS.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 A(t),null}}},GM=new Xs;Lo();Dt();De();fe();Ls();ee();ps();Wt();H();z();tt();import rl from"node:fs";import Vp from"node:path";async function ni(r){let e=await M.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=I.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;I.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}}l(ni,"cleanupMemory");async function ri(r){let e=await M.getProjectId(r);if(!e)return;let s=I.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;I.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}l(ri,"cleanupMemoryInternal");async function ol(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await ni(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await M.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=I.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;I.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 Le.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 - ${y(a)}`)}try{let c=(await we.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 - ${y(a)}`)}return await ri(e),await kt.log(e,"cleanup_performed",{items:n.length,timestamp:b()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(y(t)),{success:!1,error:y(t)}}}l(ol,"cleanup");var dS=[/^qa-/,/^nonexistent-/,/^test-/];async function Bp(r){let e=R.getGlobalBasePath(),t=Vp.join(e,"projects");if(!rl.existsSync(t))return{success:!0,message:"No projects directory found"};let s=rl.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=Vp.join(t,a);if(!dS.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{I.close(a),rl.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(`
1265
+ `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(Bp,"cleanupProjects");De();fe();Ls();H();z();J();tt();import Jp from"node:path";async function il(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 M.getProjectId(t),a=Jp.join(R.getGlobalProjectPath(i),"planning","designs");await We(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1176
1266
 
1177
1267
  *Use templates/design/architecture.md for full design*
1178
1268
  `;break;case"api":c=`# API Design: ${o}
@@ -1187,14 +1277,14 @@ ${"\u2550".repeat(50)}
1187
1277
  `;break;case"flow":c=`# Flow Design: ${o}
1188
1278
 
1189
1279
  *Use templates/design/flow.md for full design*
1190
- `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,p=Ng.join(a,u);return await Re.writeFile(p,c),await xt.log(t,"design_created",{type:s,target:o,timestamp:J.getTimestamp()}),f.done(`${s} design created`),{success:!0,designPath:p,type:s,target:o}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}l(Rl,"design");Js();import On from"node:path";ss();re();var ze={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:"*"};Vs();ns();var Al=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Hd.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(ze.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(ze.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{C.appendEvent(this.projectId,e.type,e)}catch(t){V.debug("Failed to log event:",ue(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())}},pt=new Al,Nr={sessionStarted:l(r=>pt.emit(ze.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>pt.emit(ze.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>pt.emit(ze.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>pt.emit(ze.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>pt.emit(ze.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>pt.emit(ze.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>pt.emit(ze.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>pt.emit(ze.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>pt.emit(ze.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>pt.emit(ze.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>pt.emit(ze.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>pt.emit(ze.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>pt.emit(ze.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>pt.emit(ze.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>pt.emit(ze.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>pt.emit(ze.ANALYSIS_COMPLETED,r),"analysisCompleted")};Et();re();W();He();It();ie();var Lg=ye;function fi(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)}l(fi,"calculateDuration");function Fg(r){return ht(r*1e3)}l(Fg,"formatDuration");function Ug(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)}}l(Ug,"rowToSession");var hi=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.");C.getDb(this.projectId),this.initialized=!0}generateId(){return Lg()}async getCurrent(){this.initialized||await this.initialize();let e=C.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?Ug(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 Nr.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 Nr.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=fi(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Nr.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=fi(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 Nr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return fi(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await O(`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 O(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1191
- `),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){R(s)||console.error(`Metrics calculation warning: ${w(s)}`)}return t}saveSession(e){C.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1192
- 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(),C.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Ug)}async logEvent(e,t){try{C.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Fg(e)}};W();dt();async function Dl(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 hi(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(`
1280
+ `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Jp.join(a,u);return await yt(d,c),await kt.log(t,"design_created",{type:s,target:o,timestamp:b()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}l(il,"design");De();fe();Ls();import jn from"node:path";Jt();ee();var Ge={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:"*"};_s();Kt();var al=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Sd.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"&&G.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(Ge.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(Ge.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 G.error("Event callback error:",s),s}}async logEvent(e){try{P.appendEvent(this.projectId,e.type,e)}catch(t){G.debug("Failed to log event:",oe(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())}},nt=new al,Pr={sessionStarted:l(r=>nt.emit(Ge.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>nt.emit(Ge.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>nt.emit(Ge.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>nt.emit(Ge.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>nt.emit(Ge.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>nt.emit(Ge.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>nt.emit(Ge.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>nt.emit(Ge.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>nt.emit(Ge.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>nt.emit(Ge.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>nt.emit(Ge.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>nt.emit(Ge.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>nt.emit(Ge.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>nt.emit(Ge.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>nt.emit(Ge.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>nt.emit(Ge.ANALYSIS_COMPLETED,r),"analysisCompleted")};De();ee();H();Ue();xt();z();var zp=pe;function oi(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)}l(oi,"calculateDuration");function qp(r){return it(r*1e3)}l(qp,"formatDuration");function Kp(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)}}l(Kp,"rowToSession");var ii=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 M.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");P.getDb(this.projectId),this.initialized=!0}generateId(){return zp()}async getCurrent(){this.initialized||await this.initialize();let e=P.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?Kp(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 Pr.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 Pr.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=oi(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Pr.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=oi(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 Pr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return oi(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await N(`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 N(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1281
+ `),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){A(s)||console.error(`Metrics calculation warning: ${y(s)}`)}return t}saveSession(e){P.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1282
+ 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(),P.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Kp)}async logEvent(e,t){try{P.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return qp(e)}};H();z();J();tt();async function cl(r=process.cwd()){try{if(!await M.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 ii(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(`
1193
1283
  Found abandoned session:
1194
- `),console.log(` Task: ${n.task}`),n.startedAt){let o=J.calculateDuration(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1284
+ `),console.log(` Task: ${n.task}`),n.startedAt){let o=zt(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1195
1285
  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
1196
- `),{success:!0,session:n}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}l(Dl,"recover");async function jl(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=On.join(A.getGlobalProjectPath(e),"snapshots");await Re.ensureDir(t);let{execSync:s}=await import("node:child_process");try{if(!s("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 i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=On.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await Re.readFile(a);c=JSON.parse(u)}catch(u){if(!R(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await Re.writeFile(a,JSON.stringify(c,null,2)),await xt.log(r,"undo_performed",{snapshotId:i,timestamp:J.getTimestamp()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(n){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(n)}}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}l(jl,"undo");async function Il(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=On.join(A.getGlobalProjectPath(e),"snapshots"),s=On.join(t,"history.json"),n;try{let i=await Re.readFile(s);n=JSON.parse(i)}catch(i){if(R(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(`
1197
- `).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 Re.writeFile(s,JSON.stringify(n,null,2)),await xt.log(r,"redo_performed",{timestamp:J.getTimestamp()}),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:w(i)}}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}l(Il,"redo");async function $l(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=On.join(A.getGlobalProjectPath(e),"snapshots"),s=On.join(t,"history.json"),n;try{let o=await Re.readFile(s);n=JSON.parse(o)}catch(o){if(R(o)||o instanceof SyntaxError)return console.log(`
1286
+ `),{success:!0,session:n}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(cl,"recover");async function ll(r=process.cwd()){try{f.spin("creating undo point...");let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jn.join(R.getGlobalProjectPath(e),"snapshots");await We(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=jn.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await Ae(c);u=JSON.parse(d)}catch(d){if(!A(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 yt(c,JSON.stringify(u,null,2)),await kt.log(r,"undo_performed",{snapshotId:a,timestamp:b()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(o)}}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(ll,"undo");async function ul(r=process.cwd()){try{f.spin("restoring changes...");let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jn.join(R.getGlobalProjectPath(e),"snapshots"),s=jn.join(t,"history.json"),n;try{let i=await Ae(s);n=JSON.parse(i)}catch(i){if(A(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(`
1287
+ `).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 yt(s,JSON.stringify(n,null,2)),await kt.log(r,"redo_performed",{timestamp:b()}),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:y(i)}}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(ul,"redo");async function dl(r=process.cwd()){try{let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jn.join(R.getGlobalProjectPath(e),"snapshots"),s=jn.join(t,"history.json"),n;try{let o=await Ae(s);n=JSON.parse(o)}catch(o){if(A(o)||o instanceof SyntaxError)return console.log(`
1198
1288
  SNAPSHOT HISTORY
1199
1289
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1200
1290
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1202,56 +1292,35 @@ ${"\u2550".repeat(50)}
1202
1292
  `),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1203
1293
  `)):(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
1204
1294
  `)),console.log(`${"=".repeat(50)}
1205
- `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}l($l,"history");var Nn=class extends Ce{static{l(this,"MaintenanceCommands")}_cleanupMemory=mi;_cleanupMemoryInternal=gi;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?xl(e,t):s}async cleanupProjects(e={}){return Og(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Rl(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Dl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?jl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Il(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$l(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 An(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,null,2)),{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 p of c.files)u.push(`- \`${p.path}\` (${p.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(`
1206
- `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};import Ie from"chalk";re();var Bb=BigInt(300*1e9),Ml=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>Bb&&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(d=>"metric"in d&&d.metric==="startup_time");if(i.length>0){let d=i.map(g=>g.value);o.startup={avg:Math.round(d.reduce((g,h)=>g+h,0)/d.length),min:Math.min(...d),max:Math.max(...d),count:d.length,unit:"ms"}}let a=n.filter(d=>"metric"in d&&d.metric==="heap_used"),c=n.filter(d=>"metric"in d&&d.metric==="rss");if(a.length>0){let d=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),h=c.map(k=>k.value);o.memory={avgHeapMB:d(g.reduce((k,y)=>k+y,0)/g.length),peakHeapMB:d(Math.max(...g)),avgRssMB:h.length>0?d(h.reduce((k,y)=>k+y,0)/h.length):0}}let u=n.filter(d=>"metric"in d&&d.metric==="context_correctness");if(u.length>0){let d=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:d,rate:Math.round(d/u.length*100)}}let p=n.filter(d=>"metric"in d&&d.metric==="subtask_handoff");if(p.length>0){let d=p.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:p.length,outputPopulated:d,rate:Math.round(d/p.length*100)}}let m=n.filter(d=>"metric"in d&&d.metric==="command_duration");if(m.length>0){let d={};for(let g of m){let h=g.context?.command||"unknown";d[h]||(d[h]=[]),d[h].push(g.value)}o.commandDurations={};for(let[g,h]of Object.entries(d))o.commandDurations[g]={avg:Math.round(h.reduce((k,y)=>k+y,0)/h.length),min:Math.min(...h),max:Math.max(...h),count:h.length,unit:"ms"}}return o}},zb=new Ml,Hg=zb;W();dt();var xs={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function yi(r,e,t){return t==="below"?r<=e?Ie.green("\u2713"):Ie.yellow("\u26A0"):r>=e?Ie.green("\u2713"):Ie.yellow("\u26A0")}l(yi,"statusIcon");var Ln=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 Hg.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1207
- ${Ie.dim("No performance data yet.")}`),console.log(`${Ie.dim("Metrics are collected automatically as you use the CLI.")}
1295
+ `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(dl,"history");var In=class extends Se{static{l(this,"MaintenanceCommands")}_cleanupMemory=ni;_cleanupMemoryInternal=ri;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?ol(e,t):s}async cleanupProjects(e={}){return Bp(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?il(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?cl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ll(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ul(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?dl(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 vn(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,null,2)),{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(`
1296
+ `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};De();import xe from"chalk";ee();var mS=BigInt(300*1e9),ml=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>mS&&this.marks.delete(t)}recordTiming(e,t,s,n){I.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)I.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){I.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){I.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 I.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,h)=>g+h,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),h=c.map(S=>S.value);o.memory={avgHeapMB:m(g.reduce((S,w)=>S+w,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:h.length>0?m(h.reduce((S,w)=>S+w,0)/h.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let h=g.context?.command||"unknown";m[h]||(m[h]=[]),m[h].push(g.value)}o.commandDurations={};for(let[g,h]of Object.entries(m))o.commandDurations[g]={avg:Math.round(h.reduce((S,w)=>S+w,0)/h.length),min:Math.min(...h),max:Math.max(...h),count:h.length,unit:"ms"}}return o}},pS=new ml,Xp=pS;H();tt();Dt();var ws={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function ai(r,e,t){return t==="below"?r<=e?xe.green("\u2713"):xe.yellow("\u26A0"):r>=e?xe.green("\u2713"):xe.yellow("\u26A0")}l(ai,"statusIcon");var $n=class extends Se{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 M.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 Xp.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1297
+ ${xe.dim("No performance data yet.")}`),console.log(`${xe.dim("Metrics are collected automatically as you use the CLI.")}
1208
1298
  `),{success:!0,message:"No data"};if(console.log(`
1209
- ${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=yi(i.startup.avg,xs.startup.max,"below");console.log(` Startup: avg ${Ie.bold(`${i.startup.avg}ms`)} ${Ie.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ie.dim(`target: <${xs.startup.max}ms`)}`)}if(i.memory){let c=yi(i.memory.peakHeapMB,xs.heapMB.max,"below");console.log(` Memory: avg ${Ie.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ie.dim(`target: <${xs.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=yi(i.contextCorrectness.rate,xs.contextRate.min,"above");console.log(` Context: ${Ie.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ie.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ie.dim(`target: ${xs.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=yi(i.subtaskHandoff.rate,xs.handoffRate.min,"above");console.log(` Handoff: ${Ie.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ie.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ie.dim(`target: ${xs.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1210
- ${Ie.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ie.bold(`${u.avg}ms`)} ${Ie.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(w(s)),{success:!1,error:w(s)}}}};di();os();Et();Te();br();import rT from"node:fs/promises";import oT from"node:http";import iT from"node:path";import ne from"chalk";Te();K();import Jb from"node:path";var Wg="https://api.prjct.app",Gg={apiKey:null,apiUrl:Wg,userId:null,email:null,lastAuth:null},_l=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 xe(this.configPath);return this.cachedConfig=e??{...Gg},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await Tt(Jb.dirname(this.configPath)),await le(this.configPath,s),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||Wg}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Gg},await le(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}},qb=new _l,ft=qb;Vs();var Kb={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function Xb(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}l(Xb,"camelToSnake");function Yb(r){let e={};for(let[t,s]of Object.entries(r))e[Xb(t)]=s;return e}l(Yb,"snakeCaseKeys");function Qb(r,e){let[t,s]=e.type.split("."),n=Kb[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=Yb(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}l(Qb,"mapCliEventToWebFormat");function Vg(r,e){return e.map(t=>Qb(r,t)).filter(t=>t!==null)}l(Vg,"mapCliEventsToWebFormat");var Ol=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=Vg(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(),Cn("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 ft.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([ft.getApiUrl(),ft.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),Cn("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: ${Cn("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))}},Fn=new Ol;fa();ks();Xt();zs();Pt();var Nl=class{static{l(this,"SyncManager")}async hasAuth(){return await ft.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Fn.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 ws.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 Fn.pushEvents(e,n);if(o.success)return await ws.clearPending(e),await ws.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 ws.getLastSync(e))?.timestamp,n=await Fn.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 ws.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 _.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 _.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await be.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Ge.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Ge.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await tt.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await be.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}}},Zb=new Nl,Bg=Zb;W();He();K();import sT from"node:fs/promises";import Jg from"node:os";import qg from"node:path";ar();import zg from"node:fs";import wi from"node:path";function eT(r){if(Os()){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}l(eT,"openDatabase");var Ll=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?wi.resolve(e):wi.join(bt("node:os").homedir(),".prjct-cli");this.dbPath=wi.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=wi.dirname(this.dbPath);zg.existsSync(e)||zg.mkdirSync(e,{recursive:!0});let t=eT(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(`
1211
- CREATE TABLE IF NOT EXISTS _system_migrations (
1212
- version INTEGER PRIMARY KEY,
1213
- name TEXT NOT NULL,
1214
- applied_at TEXT NOT NULL
1215
- )
1216
- `);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(n=>n.version)),s=[{version:1,name:"mcp-health-table",up:l(n=>{n.run(`
1217
- CREATE TABLE mcp_health (
1218
- provider TEXT PRIMARY KEY,
1219
- status TEXT NOT NULL,
1220
- last_checked TEXT NOT NULL,
1221
- last_error TEXT,
1222
- token_version TEXT,
1223
- config_valid INTEGER NOT NULL DEFAULT 0,
1224
- oauth_valid INTEGER NOT NULL DEFAULT 0,
1225
- updated_at TEXT NOT NULL
1226
- )
1227
- `)},"up")}];for(let n of s)t.has(n.version)||(n.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let s=this.getDb(),n=new Date().toISOString();s.prepare(`
1228
- INSERT OR REPLACE INTO mcp_health
1229
- (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
1230
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1231
- `).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)}},tT=new Ll;W();K();var ki="mcp-remote@0.1.38",Fl={linear:{command:"npx",args:["-y",ki,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",ki,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},KL={linear:`npx -y ${ki} https://mcp.linear.app/mcp`,jira:`npx -y ${ki} https://mcp.atlassian.com/v1/mcp`};function ds(){return process.env.PRJCT_TEST_MODE==="1"?qg.join(Jg.tmpdir(),"prjct-context7-test","mcp.json"):qg.join(Jg.homedir(),".claude","mcp.json")}l(ds,"getClaudeMcpConfigPath");async function Kg(r=ds()){try{let e=await sT.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${w(e)}`)}}l(Kg,"readMcpConfig");async function nT(r,e=ds()){await le(e,r)}l(nT,"writeMcpConfig");async function Ul(r,e,t=ds()){let s=await Kg(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await nT(s,t),{path:t,changed:i}}l(Ul,"upsertMcpServer");async function Lr(r,e=ds()){return!!(await Kg(e)).mcpServers?.[r]}l(Lr,"hasMcpServer");vs();Ct();dt();var Un=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 ft.write({apiKey:o,...i?{apiUrl:i}:{}}),await Fn.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ne.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1299
+ ${xe.cyan("Performance Report")} ${xe.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ai(i.startup.avg,ws.startup.max,"below");console.log(` Startup: avg ${xe.bold(`${i.startup.avg}ms`)} ${xe.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${xe.dim(`target: <${ws.startup.max}ms`)}`)}if(i.memory){let c=ai(i.memory.peakHeapMB,ws.heapMB.max,"below");console.log(` Memory: avg ${xe.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${xe.dim(`target: <${ws.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ai(i.contextCorrectness.rate,ws.contextRate.min,"above");console.log(` Context: ${xe.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${xe.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${xe.dim(`target: ${ws.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ai(i.subtaskHandoff.rate,ws.handoffRate.min,"above");console.log(` Handoff: ${xe.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${xe.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${xe.dim(`target: ${ws.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1300
+ ${xe.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${xe.bold(`${u.avg}ms`)} ${xe.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(y(s)),{success:!1,error:y(s)}}}};ei();Yt();De();fe();mr();import TS from"node:fs/promises";import vS from"node:http";import ES from"node:path";import te from"chalk";fe();J();import gS from"node:fs/promises";import fS from"node:path";var Qp="https://api.prjct.app",Yp={apiKey:null,apiUrl:Qp,userId:null,email:null,lastAuth:null},pl=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=R.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ee(this.configPath);return this.cachedConfig=e??{...Yp},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await We(fS.dirname(this.configPath)),await ce(this.configPath,s),await gS.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||Qp}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Yp},await ce(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}},hS=new pl,ut=hS;_s();var yS={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function wS(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}l(wS,"camelToSnake");function kS(r){let e={};for(let[t,s]of Object.entries(r))e[wS(t)]=s;return e}l(kS,"snakeCaseKeys");function SS(r,e){let[t,s]=e.type.split("."),n=yS[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=kS(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}l(SS,"mapCliEventToWebFormat");function Zp(r,e){return e.map(t=>SS(r,t)).filter(t=>t!==null)}l(Zp,"mapCliEventsToWebFormat");var gl=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=Zp(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(),yn("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 ut.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([ut.getApiUrl(),ut.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),yn("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: ${yn("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))}},Mn=new gl;na();ps();Wt();Ns();wt();var fl=class{static{l(this,"SyncManager")}async hasAuth(){return await ut.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Mn.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 ms.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 Mn.pushEvents(e,n);if(o.success)return await ms.clearPending(e),await ms.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 ms.getLastSync(e))?.timestamp,n=await Mn.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 ms.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 _.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 _.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await we.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Le.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Le.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await Xe.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await we.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}}},bS=new fl,eg=bS;H();Ue();J();_o();tt();Pt();Dt();var _n=class extends Se{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 ut.write({apiKey:o,...i?{apiUrl:i}:{}}),await Mn.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(te.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1232
1301
  - **Status**: Connected
1233
1302
  - **Key**: \`${o.substring(0,12)}...\`
1234
- - **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(ne.dim(`Key: ${o.substring(0,12)}...`)),f.info(ne.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
1303
+ - **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(te.dim(`Key: ${o.substring(0,12)}...`)),f.info(te.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
1235
1304
  - **Status**: Key saved (server unreachable)
1236
- - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await ft.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1237
- - **Status**: Logged out`:""};default:{let o=await ft.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1305
+ - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await ut.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1306
+ - **Status**: Logged out`:""};default:{let o=await ut.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1238
1307
  - **Authenticated**: Yes
1239
1308
  - **Email**: ${o.email||"N/A"}
1240
1309
  - **Key**: \`${o.apiKeyPrefix}\`
1241
1310
  - **Last auth**: ${o.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(o.authenticated?f.box("Auth Status",`Email: ${o.email||"N/A"}
1242
1311
  Key: ${o.apiKeyPrefix}
1243
- Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${ne.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await ft.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
1244
- Key: ${t.apiKeyPrefix}`),f.info(`Run ${ne.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1312
+ Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${te.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await ut.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
1313
+ Key: ${t.apiKeyPrefix}`),f.info(`Run ${te.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1245
1314
  - **Email**: ${t.email}
1246
1315
  - **Key**: \`${t.apiKeyPrefix}\`
1247
1316
 
1248
- 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=oT.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"),p=c.searchParams.get("email"),m=c.searchParams.get("user_id");if(u){await ft.saveAuth(u,m||"",p||"");let d=`${s}/api`;await ft.write({apiUrl:d}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(p||"",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: ${p}
1317
+ 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=vS.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(u){await ut.saveAuth(u,p||"",d||"");let m=`${s}/api`;await ut.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
1249
1318
  Key: ${u.substring(0,12)}...
1250
1319
  Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
1251
- - **Email**: ${p}
1320
+ - **Email**: ${d}
1252
1321
  - **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
1253
1322
  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
1254
- 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(ne.dim(c));let u=process.platform,p=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await O(p)}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 ${ne.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 ft.getStatus()).authenticated?(await ft.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 Bg.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>
1323
+ 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(te.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await N(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 ${te.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 ut.getStatus()).authenticated?(await ut.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await M.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await eg.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>
1255
1324
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
1256
1325
  <title>prjct CLI Connected</title>
1257
1326
  <style>
@@ -1306,31 +1375,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
1306
1375
  <h1>Authentication Failed</h1>
1307
1376
  <div class="msg">${e}</div>
1308
1377
  <p class="hint">Return to your terminal and try again.</p>
1309
- </div></body></html>`}async start(){let e=await De.checkInstallation(),t=(at(),ot(vt)),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}...
1378
+ </div></body></html>`}async start(){let e=await Pe.checkInstallation(),t=(lt(),ot(Ct)),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}...
1310
1379
  `),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1311
1380
 
1312
1381
  Please install one first:
1313
1382
  - Claude Code: https://docs.anthropic.com/claude-code
1314
1383
  - Gemini CLI: https://geminicli.com/docs
1315
- - OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await De.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1384
+ - OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Pe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1316
1385
  \u2705 Installed ${a.installed?.length??0} commands to:
1317
- ${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1318
- \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(()=>(jo(),qa));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): ${w(a)}`)}return await this.setupMcpServers(),console.log(`
1386
+ ${R.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1387
+ \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(()=>(vo(),$a));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): ${y(a)}`)}return await this.setupMcpServers(),console.log(`
1319
1388
  \u{1F389} Setup complete!`),console.log(`
1320
1389
  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...
1321
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await De.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await De.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1390
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Pe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Pe.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1322
1391
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1323
1392
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1324
- \u{1F4DD} Installing global configuration...`);let s=await De.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=(at(),ot(vt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1325
- \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(()=>(jo(),qa));await c();let p=await u({autoRepair:!0});p.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${p.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): ${w(c)}`)}return await this.setupMcpServers(),console.log(`
1393
+ \u{1F4DD} Installing global configuration...`);let s=await Pe.installGlobalConfig(),n=s.path?R.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(),ot(Ct)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1394
+ \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(()=>(vo(),$a));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): ${y(c)}`)}return await this.setupMcpServers(),console.log(`
1326
1395
  \u{1F389} Setup complete!
1327
1396
  `),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
1328
- \u{1F50C} Configuring MCP servers...`);try{await ls.install();let e=await ls.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: ${w(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=ds();await Lr("linear",e)?console.log("\u2705 Linear MCP already configured"):(await Ul("linear",Fl.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: ${w(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=ds();await Lr("jira",e)?console.log("\u2705 Jira MCP already configured"):(await Ul("jira",Fl.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: ${w(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),s=iT.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1397
+ \u{1F50C} Configuring MCP servers...`);try{await ts.install();let e=await ts.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: ${y(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=ss();await Ws("linear",e)?console.log("\u2705 Linear MCP already configured"):(await kc("linear",wc.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: ${y(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=ss();await Ws("jira",e)?console.log("\u2705 Jira MCP already configured"):(await kc("jira",wc.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: ${y(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=R.getClaudeDir(),t=R.getClaudeSettingsPath(),s=ES.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1329
1398
  # prjct Status Line for Claude Code
1330
1399
  # Shows version update notifications and current task
1331
1400
 
1332
1401
  # Current CLI version (embedded at install time)
1333
- CLI_VERSION="${Ae}"
1402
+ CLI_VERSION="${ve}"
1334
1403
 
1335
1404
  # Read JSON context from stdin (provided by Claude Code)
1336
1405
  read -r json
@@ -1381,14 +1450,14 @@ fi
1381
1450
 
1382
1451
  # Default: show prjct branding
1383
1452
  echo "\u26A1 prjct"
1384
- `;await rT.writeFile(s,n,{mode:493});let o={};if(await P(t))try{o=await xe(t)??{}}catch{}return o.statusLine={type:"command",command:s},await le(t,o),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ne.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(ne.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(ne.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(ne.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(ne.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(ne.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(ne.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(` ${ne.bold.cyan("prjct")}${ne.magenta("/")}${ne.green("cli")} ${ne.dim.white(`v${Ae} installed`)}`),console.log(""),console.log(` ${ne.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ne.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ne.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ne.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(ne.bold.cyan("\u{1F680} Quick Start")),console.log(ne.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(` ${ne.bold("1.")} Initialize your project:`),console.log(` ${ne.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ne.bold("2.")} Start your first task:`),console.log(` ${ne.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ne.bold("3.")} Ship & celebrate:`),console.log(` ${ne.green('prjct ship "user login"')}`),console.log(""),console.log(ne.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(` ${ne.dim("Documentation:")} ${ne.cyan("https://prjct.app")}`),console.log(` ${ne.dim("Report issues:")} ${ne.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ne.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};mr();ie();K();import Xg from"node:path";var aT=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],cT=`# Changelog
1453
+ `;await TS.writeFile(s,n,{mode:493});let o={};if(await x(t))try{o=await Ee(t)??{}}catch{}return o.statusLine={type:"command",command:s},await ce(t,o),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(te.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(te.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(te.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(te.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(te.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(te.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(te.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(` ${te.bold.cyan("prjct")}${te.magenta("/")}${te.green("cli")} ${te.dim.white(`v${ve} installed`)}`),console.log(""),console.log(` ${te.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${te.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${te.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(te.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(te.bold.cyan("\u{1F680} Quick Start")),console.log(te.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(` ${te.bold("1.")} Initialize your project:`),console.log(` ${te.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${te.bold("2.")} Start your first task:`),console.log(` ${te.green('prjct task "build auth"')}`),console.log(""),console.log(` ${te.bold("3.")} Ship & celebrate:`),console.log(` ${te.green('prjct ship "user login"')}`),console.log(""),console.log(te.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(` ${te.dim("Documentation:")} ${te.cyan("https://prjct.app")}`),console.log(` ${te.dim("Report issues:")} ${te.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(te.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};to();De();z();J();import tg from"node:path";var PS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],CS=`# Changelog
1385
1454
 
1386
1455
  All notable changes to this project will be documented in this file.
1387
1456
 
1388
1457
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
1389
1458
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1390
- `,Si=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of aT){let n=Xg.join(this.projectPath,s);if(await P(n)){let o=await it(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=Xg.join(this.projectPath,e);return await Jt(t,`${cT}
1391
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await it(t.filePath),n=e.date||ln(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Jt(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}
1459
+ `,ci=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of PS){let n=tg.join(this.projectPath,s);if(await x(n)){let o=await Ae(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=tg.join(this.projectPath,e);return await yt(t,`${CS}
1460
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await Ae(t.filePath),n=e.date||Rl(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await yt(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}
1392
1461
  ${a}`}return`${e.trimEnd()}
1393
1462
 
1394
1463
  ${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
@@ -1398,31 +1467,31 @@ ${a}`}return`${n}
1398
1467
 
1399
1468
  ${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(`
1400
1469
  `)}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(`
1401
- `)}};bc();He();K();import Hn from"node:path";var bi=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=Hn.join(this.projectPath,"package.json"),t=await xe(e,null);return t?.version?{current:t.version,next:Gn(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Hn.join(this.projectPath,"Cargo.toml"),t=await it(e,"");if(!t)return null;let s=lT(t);return s?{current:s,next:Gn(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Hn.join(this.projectPath,"pyproject.toml"),t=await it(e,"");if(!t)return null;let s=uT(t);return s?{current:s,next:Gn(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await ts(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Hn.join(this.projectPath,e[0]),s=await it(t,"");if(!s)return null;let n=dT(s);return n?{current:n,next:Gn(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Hn.join(this.projectPath,e),s=await it(t,"");if(!s)return null;let n=s.trim();return Yg(n)?{current:n,next:Gn(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await O("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1402
- `);for(let s of t){let n=s.trim().replace(/^v/,"");if(Yg(n))return{current:n,next:Gn(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Hn.join(this.projectPath,"VERSION");return await Jt(e,`0.1.0
1403
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await O(`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 Jt(e.file,`${e.next}
1404
- `);break}}async writeJsonVersion(e,t){let s=await xe(e,{});s&&(s.version=t,await le(e,s))}async writeTomlVersion(e,t){let s=await it(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Jt(e,n)}async writeXmlVersion(e,t){let s=await it(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Jt(e,n)}};function Yg(r){return/^\d+\.\d+\.\d+/.test(r)}l(Yg,"isSemver");function Gn(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}l(Gn,"bumpPatch");function lT(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(lT,"parseTomlVersion");function uT(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}l(uT,"parsePyprojectVersion");function dT(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(dT,"parseCsprojVersion");zs();Pt();W();Ks();En();ci();W();He();import jt from"chalk";async function zt(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 d=m.description||m.action;console.log(`
1405
- ${jt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await O(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let h=Date.now()-g,k=h>1e3?`${(h/1e3).toFixed(1)}s`:`${h}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`gate passed (${k})`)}`)}catch(g){return console.log(`${jt.red("\u2717")} gate failed: ${d}`),n.gatesFailed.push(d),n.success=!1,n.output+=`Gate failed: ${d}
1406
- ${w(g)}
1407
- `,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let d=m.description||m.action;console.log(`
1408
- ${jt.dim(`[instruction] ${t}-${e}: ${d}`)}`),n.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
1409
- ${jt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let d=Date.now();await O(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-d,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`(${h})`)}`)}catch(d){console.log(`${jt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),n.hooksFailed.push(m.description||m.action),n.output+=`Hook failed: ${m.action}
1410
- ${w(d)}
1411
- `}}let p=i.filter(m=>m.type==="step");for(let m of p){console.log(`
1412
- ${jt.dim(`[step] ${e}: ${m.action}`)}`);try{let d=Date.now();await O(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-d,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${jt.green("\u2713")} ${jt.dim(`step passed (${h})`)}`),n.stepsRun.push(m.description||m.action)}catch(d){return console.log(`${jt.red("\u2717")} step failed: ${m.action}`),n.gatesFailed.push(m.description||m.action),n.success=!1,n.output+=`Step failed: ${m.action}
1413
- ${w(d)}
1414
- `,n}}return n}l(zt,"executeWorkflowRules");dt();var Wn=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 _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await zt(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 p=await new bi(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new Si(t).addFeature(p,i),s.md||f.step(3,4,"Committing...");let d=await this._createShipCommit(i,t),g="skipped";if(d.success){let y=await this._gitPush(t);g=y.success?"pushed":y.message}await tt.addShipped(o,{name:i,version:p}),await this.logToMemory(t,"feature_shipped",{feature:i,version:p,timestamp:J.getTimestamp()}),await ct.learnDecision(o,"commit_footer","prjct","ship"),await ct.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:p});let h=await zt(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),k=[...c.instructions,...h.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await qs.sync(t),s.md||f.done("\u2713 AI context updated")}catch(y){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(y))}if(s.md){let y=Uo("ship",!0),v=L(ke(`Shipped: ${i}`,`Version: ${p}`),Q("Results",Oe([`Version: ${p}`,`Commit: ${d.success?"created":d.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),k.length>0?Q("Agent Instructions",Oe(k)):null,ge(y.map(D=>({label:D.desc,command:D.cmd}))));console.log(v)}else f.done(`v${p} shipped`),At("ship");return{success:!0,feature:i,version:p}}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}async _createShipCommit(e,t){try{await nt.get("Bash")("git add .");let s=`feat: ${e}
1415
-
1416
- Generated with [p/](https://www.prjct.app/)`;return await nt.get("Bash")(`git commit -m "${s.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(s){return R(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await nt.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return R(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};os();za();Te();ll();tc();W();vs();Ct();dt();import{execSync as Hr}from"node:child_process";import vi from"node:fs/promises";import Ur from"node:path";import Bn from"chalk";function rf(){try{return!!Hr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(rf,"isHomebrewInstall");function of(){try{let e=Hr("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}}l(of,"getCurrentVersion");var zn=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 Ro.updateVersion(Ae)}catch{}try{await new ri().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(w(i)),{success:!1,error:w(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=of();if(e)return rf()?(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(rf()){try{Hr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=of();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(w(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 Io(i),c=await $o(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)}: ${w(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 rs().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${w(n)}`)}try{let o=await new rs().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${w(n)}`)}try{await new rs().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${w(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(at(),vt)),o=await n(),i=Ur.join(bt("node:os").homedir());if(o.gemini.installed){let a=Ur.join(i,".gemini","GEMINI.md");try{let c=await vi.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",p="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(p)){let m=Ur.join(Ur.dirname(bt.resolve("../../package.json")),"templates","global","GEMINI.md"),d=await vi.readFile(m,"utf-8"),g=d.substring(d.indexOf(u),d.indexOf(p)+p.length),h=c.substring(0,c.indexOf(u)),k=c.substring(c.indexOf(p)+p.length),y=h+g+k,v="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",D="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(y.includes(v)&&y.includes(D)){let U=y.substring(0,y.indexOf(v)),F=y.substring(y.indexOf(D)+D.length);y=`${(U+F).replace(/\n{3,}/g,`
1470
+ `)}};cc();Ue();J();import On from"node:path";var li=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=On.join(this.projectPath,"package.json"),t=await Ee(e,null);return t?.version?{current:t.version,next:Nn(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=On.join(this.projectPath,"Cargo.toml"),t=await Ae(e,"");if(!t)return null;let s=xS(t);return s?{current:s,next:Nn(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=On.join(this.projectPath,"pyproject.toml"),t=await Ae(e,"");if(!t)return null;let s=RS(t);return s?{current:s,next:Nn(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await cs(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=On.join(this.projectPath,e[0]),s=await Ae(t,"");if(!s)return null;let n=AS(s);return n?{current:n,next:Nn(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=On.join(this.projectPath,e),s=await Ae(t,"");if(!s)return null;let n=s.trim();return sg(n)?{current:n,next:Nn(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await N("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1471
+ `);for(let s of t){let n=s.trim().replace(/^v/,"");if(sg(n))return{current:n,next:Nn(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=On.join(this.projectPath,"VERSION");return await yt(e,`0.1.0
1472
+ `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Es("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 yt(e.file,`${e.next}
1473
+ `);break}}async writeJsonVersion(e,t){let s=await Ee(e,{});s&&(s.version=t,await ce(e,s))}async writeTomlVersion(e,t){let s=await Ae(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await yt(e,n)}async writeXmlVersion(e,t){let s=await Ae(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await yt(e,n)}};function sg(r){return/^\d+\.\d+\.\d+/.test(r)}l(sg,"isSemver");function Nn(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}l(Nn,"bumpPatch");function xS(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(xS,"parseTomlVersion");function RS(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}l(RS,"parsePyprojectVersion");function AS(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(AS,"parseCsprojVersion");Ns();wt();H();z();Ue();Us();kn();tt();Xo();H();Ue();import vt from"chalk";async function Ut(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=Ce.getRulesForCommand(r,e).filter(p=>p.position===t),a=i.filter(p=>p.type==="gate");for(let p of a){let m=p.description||p.action;console.log(`
1474
+ ${vt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await N(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let h=Date.now()-g,S=h>1e3?`${(h/1e3).toFixed(1)}s`:`${h}ms`;console.log(`${vt.green("\u2713")} ${vt.dim(`gate passed (${S})`)}`)}catch(g){return console.log(`${vt.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
1475
+ ${y(g)}
1476
+ `,n}}let c=i.filter(p=>p.type==="instruction");for(let p of c){let m=p.description||p.action;console.log(`
1477
+ ${vt.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let u=i.filter(p=>p.type==="hook");for(let p of u){console.log(`
1478
+ ${vt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await N(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${vt.green("\u2713")} ${vt.dim(`(${h})`)}`)}catch(m){console.log(`${vt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
1479
+ ${y(m)}
1480
+ `}}let d=i.filter(p=>p.type==="step");for(let p of d){console.log(`
1481
+ ${vt.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await N(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${vt.green("\u2713")} ${vt.dim(`step passed (${h})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${vt.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
1482
+ ${y(m)}
1483
+ `,n}}return n}l(Ut,"executeWorkflowRules");Dt();var Ln=class extends Se{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 M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Ut(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 li(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new ci(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let w=await this._gitPush(t);g=w.success?"pushed":w.message}await Xe.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:b()}),await Ze.learnDecision(o,"commit_footer","prjct","ship"),await Ze.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let h=await Ut(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),S=[...c.instructions,...h.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Fs.sync(t),s.md||f.done("\u2713 AI context updated")}catch(w){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(w))}if(s.md){let w=jo("ship",!0),E=L(he(`Shipped: ${i}`,`Version: ${d}`),X("Results",Ie([`Version: ${d}`,`Commit: ${m.success?"created":m.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),S.length>0?X("Agent Instructions",Ie(S)):null,ue(w.map(D=>({label:D.desc,command:D.cmd}))));console.log(E)}else f.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async _createShipCommit(e,t){try{await N("git add .");let s=`feat: ${e}
1484
+
1485
+ Generated with [p/](https://www.prjct.app/)`;return await Es("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return A(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await N("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return A(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};Yt();ja();fe();Wc();Ua();H();tt();Pt();Dt();import{execSync as Rr}from"node:child_process";import di from"node:fs/promises";import xr from"node:path";import Un from"chalk";function lg(){try{return!!Rr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(lg,"isHomebrewInstall");function ug(){try{let e=Rr("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}}l(ug,"getCurrentVersion");var Hn=class extends Se{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 So.updateVersion(ve)}catch{}try{await new Bo().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=ug();if(e)return lg()?(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(lg()){try{Rr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Rr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Rr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=ug();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(y(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 Eo(i),c=await Po(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)}: ${y(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 Xt().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${y(n)}`)}try{let o=await new Xt().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${y(n)}`)}try{await new Xt().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${y(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(lt(),Ct)),o=await n(),i=xr.join(gt("node:os").homedir());if(o.gemini.installed){let a=xr.join(i,".gemini","GEMINI.md");try{let c=await di.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 p=xr.join(xr.dirname(gt.resolve("../../package.json")),"templates","global","GEMINI.md"),m=await di.readFile(p,"utf-8"),g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),h=c.substring(0,c.indexOf(u)),S=c.substring(c.indexOf(d)+d.length),w=h+g+S,E="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",D="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(w.includes(E)&&w.includes(D)){let V=w.substring(0,w.indexOf(E)),F=w.substring(w.indexOf(D)+D.length);w=`${(V+F).replace(/\n{3,}/g,`
1417
1486
 
1418
1487
  `).trim()}
1419
- `}await vi.writeFile(a,y,"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(()=>(nf(),sf));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(w(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?Bn.green("\u2713"):c?Bn.red("\u2717"):Bn.yellow("\u26A0");console.log(` ${u} ${Bn.bold(i)}`);for(let p of a.details)console.log(` ${Bn.dim(p)}`);for(let p of a.errors)console.log(` ${Bn.yellow("\u26A0")} ${p}`)}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 p of a.details)n.push(`- ${p}`);for(let p of a.errors)n.push(`- WARNING: ${p}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1420
- `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=Ur.join(A.getGlobalBasePath(),"projects");try{return(await vi.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Oc();vr();oc();W();Dn();dt();import $e from"chalk";var Jn=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 kt.getAll(n);if(i.length===0)return console.log(`
1421
- ${$e.dim("No velocity data yet.")}`),console.log(`${$e.dim("Complete tasks with estimates to build velocity history.")}
1422
- `),{success:!0,message:"No data"};let a=Vo(i,o);await _o.saveMetrics(n,a),console.log(`
1423
- ${$e.cyan("Sprint Velocity")} ${$e.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 d=m.estimationAccuracy>=80?$e.green:m.estimationAccuracy>=60?$e.yellow:$e.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${$e.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${d(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?$e.green("\u2191"):a.velocityTrend==="declining"?$e.red("\u2193"):$e.dim("\u2192");if(console.log(` Average: ${$e.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${$e.bold(`${a.estimationAccuracy}%`)} ${$e.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1424
- ${$e.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${$e.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${$e.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${$e.green("\u2713")} ${m.category} tasks estimated within ${$e.bold(`${m.avgVariance}%`)}`)}let p=parseInt(e,10);if(p>0&&a.averageVelocity>0){let m=ym(p,a.averageVelocity,o),d=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1425
- ${$e.dim("Projection:")}`),console.log(` Backlog: ${$e.bold(`${p} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${$e.bold(d)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}async loadVelocityConfig(e){try{let s=await $.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...bs,...s.velocity}}catch{}return bs}};il();import vT from"node:fs/promises";import CT from"node:path";yr();ie();Dn();var cf=l(r=>la.includes(r),"isValidPoint"),cn=l(r=>ua[r],"pointsToMinutes"),af=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"),lf=l(r=>{let e=cn(r);return`${af(e.min)}\u2013${af(e.max)}`},"pointsToTimeRange"),uf=l(async(r,e)=>{let s=(await kt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+yt(c.actualDuration),0)/s.length;return{points:yT(o),basedOn:s.length}},"suggestFromHistory"),yT=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of la){let n=Math.abs(ua[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint");Te();W();K();import Gl from"node:fs/promises";import wT from"node:os";import Ci from"node:path";var Wl=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ci.join(wT.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Gl.mkdir(this.commandsPath,{recursive:!0});let s=Ci.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await Gl.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:w(s)}}}async deleteWorkflowTemplate(e){try{let t=Ci.join(this.commandsPath,`${e}.md`);return await Gl.unlink(t),{success:!0}}catch(t){return R(t)?{success:!0}:{success:!1,error:w(t)}}}async templateExists(e){let t=Ci.join(this.commandsPath,`${e}.md`);return P(t)}buildTemplateContent(e,t){return`---
1488
+ `}await di.writeFile(a,w,"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(()=>(cg(),ag));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(y(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?Un.green("\u2713"):c?Un.red("\u2717"):Un.yellow("\u26A0");console.log(` ${u} ${Un.bold(i)}`);for(let d of a.details)console.log(` ${Un.dim(d)}`);for(let d of a.errors)console.log(` ${Un.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(`
1489
+ `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=xr.join(R.getGlobalBasePath(),"projects");try{return(await di.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};vc();De();gr();Ja();H();tt();Pn();Dt();import Re from"chalk";var Gn=class extends Se{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 M.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 mt.getAll(n);if(i.length===0)return console.log(`
1490
+ ${Re.dim("No velocity data yet.")}`),console.log(`${Re.dim("Complete tasks with estimates to build velocity history.")}
1491
+ `),{success:!0,message:"No data"};let a=Oo(i,o);await Co.saveMetrics(n,a),console.log(`
1492
+ ${Re.cyan("Sprint Velocity")} ${Re.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let p of c){let m=p.estimationAccuracy>=80?Re.green:p.estimationAccuracy>=60?Re.yellow:Re.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${Re.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Re.green("\u2191"):a.velocityTrend==="declining"?Re.red("\u2193"):Re.dim("\u2192");if(console.log(` Average: ${Re.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Re.bold(`${a.estimationAccuracy}%`)} ${Re.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1493
+ ${Re.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${Re.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${Re.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${Re.green("\u2713")} ${p.category} tasks estimated within ${Re.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=zm(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1494
+ ${Re.dim("Projection:")}`),console.log(` Backlog: ${Re.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Re.bold(m)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async loadVelocityConfig(e){try{let s=await M.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...fs,...s.velocity}}catch{}return fs}};Uc();import HS from"node:fs/promises";import GS from"node:path";lr();z();Pn();var mg=l(r=>Yi.includes(r),"isValidPoint"),Ys=l(r=>Qi[r],"pointsToMinutes"),dg=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"),pg=l(r=>{let e=Ys(r);return`${dg(e.min)}\u2013${dg(e.max)}`},"pointsToTimeRange"),gg=l(async(r,e)=>{let s=(await mt.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:_S(o),basedOn:s.length}},"suggestFromHistory"),_S=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Yi){let n=Math.abs(Qi[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint");De();fe();H();J();import yl from"node:fs/promises";import OS from"node:os";import mi from"node:path";var wl=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=mi.join(OS.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await yl.mkdir(this.commandsPath,{recursive:!0});let s=mi.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await yl.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=mi.join(this.commandsPath,`${e}.md`);return await yl.unlink(t),{success:!0}}catch(t){return A(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){let t=mi.join(this.commandsPath,`${e}.md`);return x(t)}buildTemplateContent(e,t){return`---
1426
1495
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1427
1496
  ---
1428
1497
 
@@ -1458,46 +1527,46 @@ Suggest relevant actions based on the workflow results:
1458
1527
  - View rules: \`prjct workflow ${e} --md\`
1459
1528
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1460
1529
  - Run again: \`p. ${e}\`
1461
- `}},Vl=new Wl;It();br();ml();function kT(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}l(kT,"complexityToPoints");async function ST(r,e){let t=In.detectTaskType(e),s=await uf(r,t);if(s){let a=cn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=In.estimateComplexity(e),o=kT(n.level),i=cn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(ST,"estimateTaskForStart");var Bl=ST;He();async function Pi(r){try{let{stdout:e}=await O("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}l(Pi,"getGitBranch");async function df(r,e=20){try{let{stdout:t}=await O("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
1462
- `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(df,"getModifiedFiles");Te();re();ie();var qn="session-snapshot",bT=30,zl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Pi(t),o=await df(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:T(),resumeHint:c};return C.setDoc(e,qn,u),u}getSnapshot(e){try{return C.getDoc(e,qn)}catch{return null}}clearSnapshot(e){try{C.deleteDoc(e,qn)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!C.exists(s))continue;let n=C.getDoc(s,qn);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=bT){let t=await A.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!C.exists(o))continue;let i=C.getDoc(o,qn);i&&new Date(i.timestamp).getTime()<s&&(C.deleteDoc(o,qn),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${ht(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: ${ht(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1463
- `)}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 ${ht(t*1e3)} of work`),s.join(" ")}},Rs=new zl;kn();re();var Jl=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){C.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1464
- VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=C.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(p=>i.has(p)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;C.run(e,`UPDATE context_feedback
1530
+ `}},kl=new wl;xt();mr();qc();function NS(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}l(NS,"complexityToPoints");async function LS(r,e){let t=Rn.detectTaskType(e),s=await gg(r,t);if(s){let a=Ys(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=Rn.estimateComplexity(e),o=NS(n.level),i=Ys(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(LS,"estimateTaskForStart");var Sl=LS;Ue();async function pi(r){try{let{stdout:e}=await N("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}l(pi,"getGitBranch");async function fg(r,e=20){try{let{stdout:t}=await N("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
1531
+ `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(fg,"getModifiedFiles");fe();ee();z();var Wn="session-snapshot",FS=30,bl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await pi(t),o=await fg(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:b(),resumeHint:c};return P.setDoc(e,Wn,u),u}getSnapshot(e){try{return P.getDoc(e,Wn)}catch{return null}}clearSnapshot(e){try{P.deleteDoc(e,Wn)}catch{}}async listAllSnapshots(){let e=await R.listProjects(),t=[];for(let s of e)try{if(!P.exists(s))continue;let n=P.getDoc(s,Wn);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=FS){let t=await R.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!P.exists(o))continue;let i=P.getDoc(o,Wn);i&&new Date(i.timestamp).getTime()<s&&(P.deleteDoc(o,Wn),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${it(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: ${it(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1532
+ `)}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 ${it(t*1e3)} of work`),s.join(" ")}},ks=new bl;pn();ee();var Tl=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){P.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1533
+ VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=P.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;P.run(e,`UPDATE context_feedback
1465
1534
  SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
1466
- WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=C.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=C.query(e,`SELECT * FROM context_feedback
1535
+ WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=P.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=P.query(e,`SELECT * FROM context_feedback
1467
1536
  WHERE actual_files IS NOT NULL
1468
- 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),p=new Set(u),m=[...o].filter(y=>p.has(y)).length,d=new Set([...o,...p]).size,g=d>0?m/d:0;if(g===0)continue;let h=new Set(JSON.parse(c.suggested_files)),k=new Set(JSON.parse(c.actual_files));for(let y of k){let v=i.get(y)??0;i.set(y,v+g)}for(let y of h)if(!k.has(y)){let v=i.get(y)??0;i.set(y,v-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}},Gr=new Jl;fl();Xt();Pt();ci();zo();W();Ks();En();wl();Dn();dt();Te();W();ie();wn();re();import Ei from"node:fs/promises";import pf from"node:path";var Kn="1.0.0";function TT(){return{version:Kn,lastUpdated:"",checksums:{}}}l(TT,"getDefaultChecksums");var ql=class{static{l(this,"IndexStorage")}getIndexPath(e){return pf.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Ei.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Kn?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 TT()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Ei.readFile(e);return Ku(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:Kn,lastUpdated:T(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{C.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await Ei.readdir(t);await Promise.all(s.map(n=>Ei.unlink(pf.join(t,n))))}catch(s){if(!R(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!==Kn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Kn)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!==Kn?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=C.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=C.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)}},mf=new ql;function gf(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(p=>t.some(m=>m.toLowerCase().includes(p)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}l(gf,"rankPatterns");function ff(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=mf.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"]}l(ff,"detectDomainsFromTask");function Kl(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=gf(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1537
+ ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(w=>d.has(w)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let h=new Set(JSON.parse(c.suggested_files)),S=new Set(JSON.parse(c.actual_files));for(let w of S){let E=i.get(w)??0;i.set(w,E+g)}for(let w of h)if(!S.has(w)){let E=i.get(w)??0;i.set(w,E-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}},Ar=new Tl;Xc();Wt();wt();Xo();Lo();H();z();_o();Us();kn();tt();Zc();Pn();Dt();fe();H();z();Ds();ee();import gi from"node:fs/promises";import hg from"node:path";var Vn="1.0.0";function US(){return{version:Vn,lastUpdated:"",checksums:{}}}l(US,"getDefaultChecksums");var vl=class{static{l(this,"IndexStorage")}getIndexPath(e){return hg.join(R.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!==Vn?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 US()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return iu(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:Vn,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{P.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(hg.join(t,n))))}catch(s){if(!A(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!==Vn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Vn)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!==Vn?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=P.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=P.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)}},yg=new vl;function wg(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(p=>p.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}l(wg,"rankPatterns");function kg(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=yg.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"]}l(kg,"detectDomainsFromTask");function El(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=wg(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1469
1538
 
1470
- ${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",p=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(h=>h.length>2),d;if(Array.isArray(s))for(let h=0;h<s.length;h++){if(o.has(h))continue;let k=`${s[h].issue} ${s[h].suggestion}`.toLowerCase();if(m.some(y=>k.includes(y))){d=s[h],o.add(h);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${p}`];return d&&g.push(` - VIOLATION: ${d.issue} \u2014 ${d.suggestion}`),g.join(`
1539
+ ${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(h=>h.length>2),m;if(Array.isArray(s))for(let h=0;h<s.length;h++){if(o.has(h))continue;let S=`${s[h].issue} ${s[h].suggestion}`.toLowerCase();if(p.some(w=>S.includes(w))){m=s[h],o.add(h);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
1471
1540
  `)}).join(`
1472
1541
 
1473
- `)}`}l(Kl,"buildPatternBriefing");function Xl(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(`
1474
- `)}l(Xl,"buildContextContract");var PT=[{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}],Xn=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 zt(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 ls.ensureReady()}catch(Ue){return Rt("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:w(Ue)}),{success:!1,error:w(Ue)}}let d=await Bl(o,c),g=await _.getCurrentTask(o);if(g)return Rt("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g};await _.startTask(o,{id:ye(),description:c,sessionId:ye(),linearId:a,type:d.taskType,estimatedPoints:d.estimatedPoints,estimatedMinutes:d.estimatedMinutes});let h=A.getGlobalProjectPath(o),k=Nc(c),y;try{y=Gr.getHistoricalBoosts(o,k),y.size===0&&(y=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[d.taskType]??80)>=80?15:10,[U,F,,j]=await Promise.all([Pi(t),Ke.getActive(o).catch(()=>null),RT(h),An(c,t,{maxFiles:D,minScore:.15,historicalBoosts:y}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),E=null;try{let Ue=Rs.getSnapshot(o);Ue&&(E=Rs.formatContinuityContext(Ue),Rs.clearSnapshot(o))}catch{}let M=null;if(F?.analyzedAt){let Ue=new Date(F.analyzedAt),_t=Math.floor((Date.now()-Ue.getTime())/(1e3*60*60*24));_t>7&&(M=vc("warn",`Analysis is ${_t} days old. Run \`p. sync\` to refresh patterns and file index.`))}else F||(M=vc("info","No project analysis found. Run `p. sync` for better context targeting."));let se=null;if(y&&y.size>0){let Ue=[...y.entries()].filter(([,_t])=>_t>.3).sort((_t,rr)=>rr[1]-_t[1]).slice(0,5);Ue.length>0&&(se=`### Previously Useful Files
1475
- ${Ue.map(([rr])=>`\`${rr}\``).join(", ")}`)}let Me=ff(c,o),q=Ar({description:c,branch:U,linearId:a,type:d.taskType,estimatedPoints:d.estimatedPoints,estimatedMinutes:d.estimatedMinutes,estimateSource:d.source,domains:Me}),mt=Gp(j.files.map(Ue=>({path:Ue.path,description:Ue.reasons.join(", ")}))),ms=j.files.map(Ue=>Ue.path),nr=Kl(F,ms),Ii=Xl(j.files,F),$i=ge([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),Mi=ET(),_i=xT(o);console.log(L(E,M,q,Ii,mt,se,nr,_i,Mi,$i));try{let Ue=await _.getCurrentTask(o);Ue&&Gr.recordSuggestions(o,Ue.id,k,j.files.map(_t=>_t.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:J.getTimestamp()}),await zt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let p=await ni.execute("task",{task:e},t);if(!p.success)return f.fail(p.error||"Failed to execute task"),{success:!1,error:p.error};let m=await Bl(o,c);return await _.startTask(o,{id:ye(),description:c,sessionId:ye(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes}),f.done(`${e}`),jr("working"),At("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:p.orchestratorContext,timestamp:J.getTimestamp()}),await zt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...p,success:!0,task:e,fibonacci:{isValidPoint:cf,pointsToMinutes:cn,pointsToTimeRange:lf,storeEstimate:l(async d=>{let g=cn(d);return await _.updateCurrentTask(o,{estimatedPoints:d,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return s.md?Rt("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?J.calculateDuration(new Date(i.startedAt)):void 0,c=Ar({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],p=i.currentSubtaskIndex,m=u.length>0?Hp(u,p):"",d=ge([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,m,d))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=w(n);return s.md?o.includes("Cannot run")||o.includes("working state")?Rt("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 o=await _.getCurrentTask(n);if(!o)return t.md?Rt("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 i=await zt(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let F=new Date(o.startedAt);c=J.calculateDuration(F),u=Math.round((Date.now()-F.getTime())/6e4)}let p=o.estimatedMinutes,m=o.estimatedPoints,d=o.type||"feature",g=o.linearId;try{await kt.record(n,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:J.getTimestamp(),estimatedDuration:p?hf(p):"0m",actualDuration:c||"0m",variance:p?jT(u-p):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[d,g].filter(Boolean)})}catch{}let h="";if(m&&p){let F=u-p,j=p>0?Math.round((u-p)/p*100):0,E=F>=0?"+":"";h=` | est: ${m}pt (${hf(p)}) \u2192 ${E}${j}%`}let k=[],y=null,v=null;try{if(k=await DT(e,o.startedAt),k.length>0){Gr.completeFeedback(n,o.id,k);let F=Gr.getFeedback(n,o.id);F&&(y=F.precision,v=F.recall)}}catch{}await _.completeTask(n,t.feedback);try{Rs.clearSnapshot(n)}catch{}let D=o.linearId,U=D!=null?await Lr("linear",ds()).catch(()=>!1):!1;if(t.md){let F=c?` (${c})`:"",j=null;if(k.length>0){let se=k.slice(0,20).map(Me=>`\`${Me}\``);j=`### Files Modified (${k.length})
1476
- ${se.join(", ")}`}let E=null;if(y!==null&&v!==null){let se=Math.round(y*100),Me=Math.round(v*100);E=`### Context Accuracy
1542
+ `)}`}l(El,"buildPatternBriefing");function Pl(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(`
1543
+ `)}l(Pl,"buildContextContract");var WS=[{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}],Bn=class extends Se{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 M.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 Ut(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 ts.ensureReady()}catch(Oe){return St("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(Oe)}),{success:!1,error:y(Oe)}}let m=await Sl(o,c),g=await _.getCurrentTask(o);if(g)return St("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g};await _.startTask(o,{id:pe(),description:c,sessionId:pe(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let h=R.getGlobalProjectPath(o),S=Ec(c),w;try{w=Ar.getHistoricalBoosts(o,S),w.size===0&&(w=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[V,F,,k]=await Promise.all([pi(t),Je.getActive(o).catch(()=>null),JS(h),vn(c,t,{maxFiles:D,minScore:.15,historicalBoosts:w}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),$=null;try{let Oe=ks.getSnapshot(o);Oe&&($=ks.formatContinuityContext(Oe),ks.clearSnapshot(o))}catch{}let O=null;if(F?.analyzedAt){let Oe=new Date(F.analyzedAt),jt=Math.floor((Date.now()-Oe.getTime())/(1e3*60*60*24));jt>7&&(O=uc("warn",`Analysis is ${jt} days old. Run \`p. sync\` to refresh patterns and file index.`))}else F||(O=uc("info","No project analysis found. Run `p. sync` for better context targeting."));let ge=null;if(w&&w.size>0){let Oe=[...w.entries()].filter(([,jt])=>jt>.3).sort((jt,Zn)=>Zn[1]-jt[1]).slice(0,5);Oe.length>0&&(ge=`### Previously Useful Files
1544
+ ${Oe.map(([Zn])=>`\`${Zn}\``).join(", ")}`)}let rt=kg(c,o),Ts=Sr({description:c,branch:V,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:rt}),os=bm(k.files.map(Oe=>({path:Oe.path,description:Oe.reasons.join(", ")}))),Qs=k.files.map(Oe=>Oe.path),Qn=El(F,Qs),Si=Pl(k.files,F),bi=ue([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),Ti=VS(),vi=BS(o);console.log(L($,O,Ts,Si,os,ge,Qn,vi,Ti,bi));try{let Oe=await _.getCurrentTask(o);Oe&&Ar.recordSuggestions(o,Oe.id,S,k.files.map(jt=>jt.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:b()}),await Ut(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Vo.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let p=await Sl(o,c);return await _.startTask(o,{id:pe(),description:c,sessionId:pe(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),Tr("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:b()}),await Ut(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:mg,pointsToMinutes:Ys,pointsToTimeRange:pg,storeEstimate:l(async m=>{let g=Ys(m);return await _.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return s.md?St("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?zt(new Date(i.startedAt)):void 0,c=Sr({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,p=u.length>0?Sm(u,d):"",m=ue([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,p,m))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=y(n);return s.md?o.includes("Cannot run")||o.includes("working state")?St("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 M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(n);if(!o)return t.md?St("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 i=await Ut(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let F=new Date(o.startedAt);c=zt(F),u=Math.round((Date.now()-F.getTime())/6e4)}let d=o.estimatedMinutes,p=o.estimatedPoints,m=o.type||"feature",g=o.linearId;try{await mt.record(n,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:b(),estimatedDuration:d?Sg(d):"0m",actualDuration:c||"0m",variance:d?KS(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[m,g].filter(Boolean)})}catch{}let h="";if(p&&d){let F=u-d,k=d>0?Math.round((u-d)/d*100):0,$=F>=0?"+":"";h=` | est: ${p}pt (${Sg(d)}) \u2192 ${$}${k}%`}let S=[],w=null,E=null;try{if(S=await qS(e,o.startedAt),S.length>0){Ar.completeFeedback(n,o.id,S);let F=Ar.getFeedback(n,o.id);F&&(w=F.precision,E=F.recall)}}catch{}await _.completeTask(n,t.feedback);try{ks.clearSnapshot(n)}catch{}let D=o.linearId,V=D!=null?await Ws("linear",ss()).catch(()=>!1):!1;if(t.md){let F=c?` (${c})`:"",k=null;if(S.length>0){let ge=S.slice(0,20).map(rt=>`\`${rt}\``);k=`### Files Modified (${S.length})
1545
+ ${ge.join(", ")}`}let $=null;if(w!==null&&E!==null){let ge=Math.round(w*100),rt=Math.round(E*100);$=`### Context Accuracy
1477
1546
  | Metric | Value |
1478
1547
  |--------|-------|
1479
- | Precision | ${se}% of suggested files were used |
1480
- | Recall | ${Me}% of modified files were suggested |`}let M=null;try{let{prjctDb:se}=(re(),ot(Zr)),Me=se.getDoc(n,"rpi:current:research"),q=se.getDoc(n,"rpi:current:plan");Me?q||(M=`### RPI Phase: Plan Ready
1481
- Research is available. Create your implementation plan next.`):M="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(ke("Completed",`${a}${F}`),lt({Duration:c||"unknown",...h?{Variance:h.replace(" | ","")}:{}}),j,E,M,ge([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let F=c?` (${c}${h})`:"";D&&U?f.done(`${a}${F} \u2192 Linear linked (update via MCP)`):f.done(`${a}${F}`),jr("completed"),At("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:p,actualMinutes:u,timestamp:J.getTimestamp()}),await zt(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return f.fail(w(s)),{success:!1,error:w(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 be.getActiveTasks(n);if(o.length===0)return t.md?Rt("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 i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(L(Q("Queue",`${o.length} task${o.length!==1?"s":""}`),Oe(i,!0),ge([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),At("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(w(s)),{success:!1,error:w(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 _.getCurrentTask(o);if(!i)return s.md?Rt("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=J.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await Rs.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(L(ke("Task Paused",`**Paused:** ${i.description}`),lt({Reason:e||void 0,"Duration worked":a||void 0}),ge([{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})`:""}`),jr("paused"),At("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:J.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(w(n)),{success:!1,error:w(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 _.getCurrentTask(o);if(i)return s.md?Rt("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 _.resumeTask(o);return a?(s.md?console.log(L(ke("Task Resumed",`**Resumed:** ${a.description}`),ge([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),jr("working"),At("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:J.getTimestamp()}),{success:!0,task:a.description}):(s.md?Rt("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(w(n)),{success:!1,error:w(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: ${w(n)}`):f.fail(w(n)),{success:!1,error:w(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of PT){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=rt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let d=rt.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${d}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=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(L(ke("Rule Added",`#${p} [hook] ${a} ${c} \u2192 \`${n}\``),ge([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):f.done(`rule #${p} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:p}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=rt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=rt.getAllWorkflows(t).map(g=>g.name).join(", "),d=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let p='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}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(L(ke("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ge([{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=rt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=rt.getAllWorkflows(t).map(y=>y.name).join(", "),k=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${k}`):f.warn(k),{success:!1,error:k}}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(),p=a.slice(c[0].length).trim(),[m]=this._parseAction(p);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 d=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(L(ke("Instruction Added",`#${d} [instruction] ${u} ${o} \u2192 \`${m}\``),ge([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`instruction #${d} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:d}}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(L(ke("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(L(ke("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 c=je.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return je.updateRule(t,o,{enabled:!1}),s.md?console.log(L(ke("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ge([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=je.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return je.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(ke("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(Q("Multiple matches",`${a.length} rules match "${n}"`),Oe(c),ge(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(L(Q("Workflow Help","Manage hooks, gates, and steps for your workflow"),Q("Commands",Oe(["`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"])),Q("Natural Language (EN/ES)",Oe(['`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(L(Q("Workflow Rules","No rules configured"),ge([{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 p of i){let m=o.filter(d=>d.command===p);m.length!==0&&a.push(AT(p,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(Q(c,u),a.length>0?Up(a.join(`
1482
-
1483
- `),""):null,ge([{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 li(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(L(ke("Workflow Initialized",`Added ${a.length} default ship rules`),Oe(a),ge([{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(!rt.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(rt.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(rt.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=rt.createWorkflow(t,{name:i,description:a}),p=await Vl.generateWorkflowTemplate(i,a);if(!p.success){rt.deleteWorkflow(t,i);let m=`Failed to generate template: ${p.error}`;return n.md?console.log(`> Error: ${m}`):f.fail(m),{success:!1,error:m}}return n.md?console.log(L(ke("Workflow Created",`Created workflow: ${i}`),Q("Description",a),Q("Template",`Installed at ${p.path}`),ge([{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: ${p.path}`),console.log(`
1484
- Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:p.path}}catch(u){let p=w(u);return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}}async _workflowList(e,t){let s=rt.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(Q("Built-in Workflows",a.join(`
1485
- `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Q("Custom Workflows",a.join(`
1486
- `)))}console.log(L(...i,ge([{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(`
1548
+ | Precision | ${ge}% of suggested files were used |
1549
+ | Recall | ${rt}% of modified files were suggested |`}let O=null;try{let{prjctDb:ge}=(ee(),ot(Kr)),rt=ge.getDoc(n,"rpi:current:research"),Ts=ge.getDoc(n,"rpi:current:plan");rt?Ts||(O=`### RPI Phase: Plan Ready
1550
+ Research is available. Create your implementation plan next.`):O="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(he("Completed",`${a}${F}`),et({Duration:c||"unknown",...h?{Variance:h.replace(" | ","")}:{}}),k,$,O,ue([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let F=c?` (${c}${h})`:"";D&&V?f.done(`${a}${F} \u2192 Linear linked (update via MCP)`):f.done(`${a}${F}`),Tr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:p,estimatedMinutes:d,actualMinutes:u,timestamp:b()}),await Ut(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await we.getActiveTasks(n);if(o.length===0)return t.md?St("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 i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(L(X("Queue",`${o.length} task${o.length!==1?"s":""}`),Ie(i,!0),ue([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return s.md?St("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=zt(new Date(i.startedAt))),await _.pauseTask(o,e);try{await ks.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(L(he("Task Paused",`**Paused:** ${i.description}`),et({Reason:e||void 0,"Duration worked":a||void 0}),ue([{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})`:""}`),Tr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:b()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return s.md?St("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 _.resumeTask(o);return a?(s.md?console.log(L(he("Task Resumed",`**Resumed:** ${a.description}`),ue([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Tr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:b()}),{success:!0,task:a.description}):(s.md?St("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(y(n)),{success:!1,error:y(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.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: ${y(n)}`):f.fail(y(n)),{success:!1,error:y(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of WS){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=Qe.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=Qe.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=Ce.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(L(he("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),ue([{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=Qe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=Qe.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=Ce.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(L(he("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ue([{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=Qe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=Qe.getAllWorkflows(t).map(w=>w.name).join(", "),S=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${S}`):f.warn(S),{success:!1,error:S}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=Ce.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(he("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!Ce.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(L(he("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=Ce.resetRules(e);return t.md?console.log(L(he("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 c=Ce.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return Ce.updateRule(t,o,{enabled:!1}),s.md?console.log(L(he("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ue([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Ce.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Ce.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(he("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(X("Multiple matches",`${a.length} rules match "${n}"`),Ie(c),ue(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(L(X("Workflow Help","Manage hooks, gates, and steps for your workflow"),X("Commands",Ie(["`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"])),X("Natural Language (EN/ES)",Ie(['`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=Ce.getRulesForCommand(t,e):o=Ce.getAllRules(t),o.length===0)return s.md?console.log(L(X("Workflow Rules","No rules configured"),ue([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(zS(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(X(c,u),a.length>0?km(a.join(`
1551
+
1552
+ `),""):null,ue([{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=Ce.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 Yo(t),i=0,a=[],c=Ce.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=Ce.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=Ce.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(L(he("Workflow Initialized",`Added ${a.length} default ship rules`),Ie(a),ue([{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(!Qe.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(Qe.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Qe.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=Qe.createWorkflow(t,{name:i,description:a}),d=await kl.generateWorkflowTemplate(i,a);if(!d.success){Qe.deleteWorkflow(t,i);let p=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}return n.md?console.log(L(he("Workflow Created",`Created workflow: ${i}`),X("Description",a),X("Template",`Installed at ${d.path}`),ue([{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(`
1553
+ Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Qe.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(X("Built-in Workflows",a.join(`
1554
+ `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(X("Custom Workflows",a.join(`
1555
+ `)))}console.log(L(...i,ue([{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(`
1487
1556
  Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1488
- 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(!rt.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Vl.deleteWorkflowTemplate(n),s.md?console.log(L(ke("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=w(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=rt.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 zt(o,i,"before",{projectPath:t});if(!c.success){if(s.md)Rt("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 zt(o,i,"after",{projectPath:t}),s.md?console.log(L(ke(`Workflow: ${i}`,a.description||""),ge([{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=w(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 Rs.cleanup();return t.md?console.log(ke("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await Rs.listAllSnapshots();if(s.length===0)return t.md?Rt("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 n=s.map(o=>{let i=J.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(L(Q("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Oe(n),ge([{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=J.formatDuration(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(w(s)),{success:!1,error:w(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 _.getCurrentTask(o);if(!i)return s.md?Rt("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(L(Q("Tokens",m))):f.fail(m),{success:!1,error:m}}let p=await _.addTokens(o,c,u);return p?(s.md?console.log(L(Q("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),lt({"Total In":p.tokensIn.toLocaleString(),"Total Out":p.tokensOut.toLocaleString(),Total:(p.tokensIn+p.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${p.tokensIn.toLocaleString()} in / ${p.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:p.tokensIn,tokensOut:p.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}};function ET(){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(`
1489
- `)}l(ET,"buildEfficiencySection");function xT(r){try{let{prjctDb:e}=(re(),ot(Zr)),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(`
1490
- `)}catch{return null}}l(xT,"buildRpiSection");function hf(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`}l(hf,"formatMinutesToDuration");async function RT(r){try{let e=CT.join(r,"analysis","repo-analysis.json"),t=await vT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return R(e),null}}l(RT,"loadRepoAnalysis");function AT(r,e){let t=e.filter(d=>d.type==="gate"&&d.position==="before"),s=e.filter(d=>d.type==="instruction"&&d.position==="before"),n=e.filter(d=>d.type==="hook"&&d.position==="before"),o=e.filter(d=>d.type==="step"&&d.position==="before"),i=e.filter(d=>d.type==="instruction"&&d.position==="after"),a=e.filter(d=>d.type==="hook"&&d.position==="after"),c=e.filter(d=>d.type==="step"&&d.position==="after"),u=[],p=l((d,g,h)=>{let k=g.map(U=>` ${U.enabled?h:"o"} #${U.id} ${U.action}`),y=[d,...k],D=Math.max(...y.map(U=>U.length))+2;u.push(`+${"-".repeat(D)}+`);for(let U of y)u.push(`| ${U.padEnd(D-1)}|`);u.push(`+${"-".repeat(D)}+`)},"drawBox"),m=l(d=>{d.push(" |"),d.push(" v")},"arrow");return t.length>0&&(p("GATES (must pass)",t,"#"),m(u)),s.length>0&&(p("INSTRUCTIONS (before)",s,"\u{1F4CB}"),m(u)),n.length>0&&(p("HOOKS (before)",n,">"),m(u)),o.length>0&&(p("STEPS (before)",o,">"),m(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(m(u),p("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(m(u),p("HOOKS (after)",a,">")),c.length>0&&(m(u),p("STEPS (after)",c,">")),u.join(`
1491
- `)}l(AT,"buildFlowDiagram");async function DT(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(`
1557
+ 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(!Qe.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await kl.deleteWorkflowTemplate(n),s.md?console.log(L(he("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=y(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 M.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=Qe.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 Ut(o,i,"before",{projectPath:t});if(!c.success){if(s.md)St("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 Ut(o,i,"after",{projectPath:t}),s.md?console.log(L(he(`Workflow: ${i}`,a.description||""),ue([{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=y(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 ks.cleanup();return t.md?console.log(he("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await ks.listAllSnapshots();if(s.length===0)return t.md?St("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 n=s.map(o=>{let i=it(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(L(X("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Ie(n),ue([{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=it(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(y(s)),{success:!1,error:y(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return s.md?St("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(L(X("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await _.addTokens(o,c,u);return d?(s.md?console.log(L(X("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),et({"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(y(n)),{success:!1,error:y(n)}}}};function VS(){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(`
1558
+ `)}l(VS,"buildEfficiencySection");function BS(r){try{let{prjctDb:e}=(ee(),ot(Kr)),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(`
1559
+ `)}catch{return null}}l(BS,"buildRpiSection");function Sg(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`}l(Sg,"formatMinutesToDuration");async function JS(r){try{let e=GS.join(r,"analysis","repo-analysis.json"),t=await HS.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return A(e),null}}l(JS,"loadRepoAnalysis");function zS(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),s=e.filter(m=>m.type==="instruction"&&m.position==="before"),n=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),c=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=l((m,g,h)=>{let S=g.map(V=>` ${V.enabled?h:"o"} #${V.id} ${V.action}`),w=[m,...S],D=Math.max(...w.map(V=>V.length))+2;u.push(`+${"-".repeat(D)}+`);for(let V of w)u.push(`| ${V.padEnd(D-1)}|`);u.push(`+${"-".repeat(D)}+`)},"drawBox"),p=l(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(u)),n.length>0&&(d("HOOKS (before)",n,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),c.length>0&&(p(u),d("STEPS (after)",c,">")),u.join(`
1560
+ `)}l(zS,"buildFlowDiagram");async function qS(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(`
1492
1561
  `)){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(`
1493
1562
  `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
1494
- `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(DT,"getFilesModifiedSinceTaskStart");function jT(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`}l(jT,"formatVariance");var Yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Xn,this.planning=new sn,this.shipping=new Wn,this.analytics=new _n,this.performanceCmds=new Ln,this.maintenance=new Nn,this.analysis=new on,this.setupCmds=new Un,this.updateCmds=new zn,this.velocityCmds=new Jn,this.contextCmds=new an,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 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)}},X1=new Yn;pi();var yf={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}},wf=[{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:"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"]}];di();os();Te();W();K();dt();import{execSync as xi}from"node:child_process";import St from"node:fs/promises";import IT from"node:os";import ps from"node:path";import $T from"node:readline";import Pe from"chalk";var Ri="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Wr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Sf(r){let e=0;try{let t=await St.readdir(r,{withFileTypes:!0});for(let s of t){let n=ps.join(r,s.name);if(s.isDirectory())e+=await Sf(n);else try{let o=await St.stat(n);e+=o.size}catch{}}}catch{}return e}l(Sf,"getDirectorySize");function kf(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]}`}l(kf,"formatSize");async function MT(r){try{return(await St.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(MT,"countDirectoryItems");function _T(){let r={homebrew:!1,npm:!1};try{xi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{xi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(_T,"detectInstallation");async function OT(){let r=[],e=Iu(),t=A.getGlobalBasePath(),s=await P(t),n=s?await MT(ps.join(t,"projects")):0,o=s?await Sf(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=ps.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let D=await St.readFile(i,"utf-8");c=D.includes(Ri)&&D.includes(Wr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,p=await P(u);r.push({path:u,type:"file",description:"Claude router",exists:p});let m=ps.join(e.claude.config,"prjct-statusline.sh"),d=await P(m);r.push({path:m,type:"file",description:"Status line script",exists:d});let g=e.gemini.router,h=await P(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let k=ps.join(e.gemini.config,"GEMINI.md"),y=await P(k),v=!1;if(y)try{let D=await St.readFile(k,"utf-8");v=D.includes(Ri)&&D.includes(Wr)}catch{}return y&&v&&r.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(OT,"gatherUninstallItems");async function NT(r){try{let e=await St.readFile(r,"utf-8");if(!e.includes(Ri)||!e.includes(Wr))return!1;let t=e.indexOf(Ri),s=e.indexOf(Wr)+Wr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1495
-
1496
- `).trim(),!n||n.trim().length===0?await St.unlink(r):await St.writeFile(r,`${n}
1497
- `,"utf-8"),!0}catch{return!1}}l(NT,"removePrjctSection");async function LT(){let r=IT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ps.join(r,`.prjct-backup-${e}`);try{await St.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await P(s)&&await bf(s,ps.join(t,".prjct-cli")),t}catch{return null}}l(LT,"createBackup");async function bf(r,e){await St.mkdir(e,{recursive:!0});let t=await St.readdir(r,{withFileTypes:!0});for(let s of t){let n=ps.join(r,s.name),o=ps.join(e,s.name);s.isDirectory()?await bf(n,o):await St.copyFile(n,o)}}l(bf,"copyDirectory");async function FT(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await NT(o.path)&&s.push(o.path):o.type==="directory"?(await St.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await St.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${w(i)}`)}try{await new rs().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||xi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||xi("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${w(o)}`)}}return{deleted:s,errors:n}}l(FT,"performUninstall");async function UT(r){let e=$T.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l(UT,"promptConfirmation");async function HT(r={},e=process.cwd()){let t=await OT(),s=_T(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Pe.yellow(`
1498
- 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(Pe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Pe.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=A.getDisplayPath(c.path),p="";c.type==="section"?p=Pe.dim("(section only)"):c.size&&(p=Pe.dim(`(${kf(c.size)})`)),console.log(` ${Pe.cyan(u.padEnd(35))} ${p}`),console.log(` ${Pe.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Pe.cyan("Homebrew".padEnd(35))} ${Pe.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Pe.cyan("npm global".padEnd(35))} ${Pe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Pe.dim(` Total size: ${kf(o)}`)),console.log("")),r.dryRun)return console.log(Pe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Pe.blue("Creating backup..."));let c=await LT();c?(console.log(Pe.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Pe.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Pe.yellow('Type "uninstall" to confirm:')),!await UT("> ")))return console.log(Pe.yellow(`
1499
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Pe.blue("Removing prjct..."));let{deleted:i,errors:a}=await FT(t,s,r);if(console.log(""),i.length>0&&console.log(Pe.green(`Removed ${i.length} items`)),a.length>0){console.log(Pe.yellow(`
1500
- ${a.length} errors:`));for(let c of a)console.log(Pe.red(` - ${c}`))}return console.log(""),console.log(Pe.green("prjct has been uninstalled.")),console.log(Pe.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}}l(HT,"uninstall");var Ai=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return HT(e,t)}};var As=new Xn,Di=new sn,GT=new Wn,Tf=new _n,WT=new Ln,Ds=new Nn,Qn=new on,Vr=new Un,VT=new an,BT=new Jn,zT=new Ai,JT=new zn;function qT(){for(let[r,e]of Object.entries(yf))G.registerCategory(r,e)}l(qT,"registerCategories");function KT(){if(G.has("work"))return;qT();let r=l(e=>wf.find(t=>t.name===e),"getMeta");G.registerMethod("task",As,"now",r("task")),G.registerMethod("done",As,"done",r("done")),G.registerMethod("next",As,"next",r("next")),G.registerMethod("pause",As,"pause",r("pause")),G.registerMethod("resume",As,"resume",r("resume")),G.registerMethod("workflow",As,"workflow",r("workflow")),G.registerMethod("tokens",As,"tokens",r("tokens")),G.registerMethod("sessions",As,"sessions",r("sessions")),G.registerMethod("init",Di,"init",r("init")),G.registerMethod("bug",Di,"bug",r("bug")),G.registerMethod("idea",Di,"idea",r("idea")),G.registerMethod("spec",Di,"spec",r("spec")),G.registerMethod("ship",GT,"ship",r("ship")),G.registerMethod("dash",Tf,"dash",r("dash")),G.registerMethod("help",Tf,"help",r("help")),G.registerMethod("perf",WT,"perf",r("perf")),G.registerMethod("velocity",BT,"velocity",r("velocity")),G.registerMethod("cleanup",Ds,"cleanup",r("cleanup")),G.registerMethod("cleanup-projects",Ds,"cleanupProjects",r("cleanup-projects")),G.registerMethod("design",Ds,"design",r("design")),G.registerMethod("recover",Ds,"recover",r("recover")),G.registerMethod("undo",Ds,"undo",r("undo")),G.registerMethod("redo",Ds,"redo",r("redo")),G.registerMethod("history",Ds,"history",r("history")),G.registerMethod("enrich",Ds,"enrich",r("enrich")),G.registerMethod("analyze",Qn,"analyze",r("analyze")),G.registerMethod("sync",Qn,"sync",r("sync")),G.registerMethod("stats",Qn,"stats",r("stats")),G.registerMethod("status",Qn,"status",r("status")),G.registerMethod("seal",Qn,"seal",r("seal")),G.registerMethod("verify",Qn,"verify",r("verify")),G.registerMethod("start",Vr,"start",r("start")),G.registerMethod("setup",Vr,"setup",r("setup")),G.registerMethod("login",Vr,"login",r("login")),G.registerMethod("logout",Vr,"logout",r("logout")),G.registerMethod("auth",Vr,"auth",r("auth")),G.registerMethod("uninstall",zT,"uninstall",r("uninstall")),G.registerMethod("update",JT,"update",r("update")),G.registerMethod("context",VT,"context",r("context"))}l(KT,"registerAllCommands");KT();Et();ar();Ct();import{Hono as iv}from"hono";import{cors as av}from"hono/cors";import{logger as cv}from"hono/logger";Te();re();ks();Xt();zs();Pt();W();ns();import XT from"node:fs/promises";import YT from"node:path";import{Hono as QT}from"hono";function ZT(r){return A.getGlobalProjectPath(r)}l(ZT,"getProjectDataPath");function vf(r,e){let t=new QT,s=ZT(r);return t.get("/state",async n=>{let o=await _.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await be.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Ge.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=C.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await tt.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([_.read(r),be.read(r),Ge.read(r),tt.read(r)]),u=C.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();return await _.write(r,o),n.json({success:!0})}catch(o){return n.json({success:!1,error:String(o)},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=YT.join(s,"context",`${o}.md`),c=await XT.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return R(a)||V.error(`Context read error: ${w(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(vf,"createRoutes");Te();re();ks();Xt();zs();Pt();import Zn from"node:fs/promises";import ev from"node:path";import{Hono as tv}from"hono";var sv=A.getGlobalBasePath(),er=ev.join(sv,"projects");function ji(r){return C.getDoc(r,"project")}l(ji,"getProjectConfig");async function Yl(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`}l(Yl,"calculateDuration");function Cf(){let r=new tv;return r.get("/projects",async e=>{try{await Zn.mkdir(er,{recursive:!0});let s=(await Zn.readdir(er,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ji(o),a=await _.read(o),c=await be.read(o),u=await Ge.read(o),p=await tt.read(o),m=a?.currentTask,d=await Yl(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:d}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:p?.shipped?.length||0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(ji(t)),_.read(t),be.read(t),Ge.read(t),tt.read(t)]),c=C.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Yl(n.currentTask.startedAt));let u=new Date,p=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(p);m.setDate(m.getDate()-m.getDay());let d=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=p)?.length||0,g=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=m)?.length||0;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:""},stats:{tasksToday:d,tasksThisWeek:g,queueCount:o?.tasks?.filter(h=>!h.completed)?.length||0,ideasCount:i?.ideas?.filter(h=>h.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(s){return e.json({error:String(s)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await _.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 _.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let n=(await e.req.json().catch(()=>({}))).reason,o=await _.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 _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await _.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 _.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch(s){return e.json({success:!1,error:String(s)},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)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),be.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(p=>p.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 _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(s){return e.json({success:!1,error:String(s)},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)return e.json({success:!1,error:"text required"},400);let a=await Ge.addIdea(t,n,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${n.slice(0,50)}...`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/stats/global",async e=>{try{await Zn.mkdir(er,{recursive:!0});let s=(await Zn.readdir(er,{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 _.read(c),p=await be.read(c),m=await Ge.read(c),d=await tt.read(c);u?.currentTask&&a++,n+=p?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=d?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Zn.mkdir(er,{recursive:!0});let n=(await Zn.readdir(er,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name),o=null;if(t)for(let p of n){let m=ji(p),d=m?.repoPath||m?.path;if(d&&t.startsWith(d)){o=p;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let p of u){let m=await _.read(p),d=ji(p);if(m?.currentTask){i={id:p,name:d?.name||p,path:d?.repoPath||d?.path},a={...m.currentTask,duration:await Yl(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:p,name:d?.name||p,path:d?.repoPath||d?.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(t){return e.json({error:String(t)},500)}}),r}l(Cf,"createExtendedRoutes");import{streamSSE as nv}from"hono/streaming";var Pf=3600*1e3,rv=300*1e3,ov=3e4;function Ef(){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()>Pf&&t(i)},rv),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 nv(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,p={id:a,connectedAt:c,send:l((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"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)}},ov),d=setTimeout(()=>{t(a)},Pf);typeof m=="object"&&"unref"in m&&m.unref(),typeof d=="object"&&"unref"in d&&d.unref(),r.set(a,{client:p,heartbeatInterval:m,ttlTimeout:d,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)}}}l(Ef,"createSSEManager");function xf(r){let e=new iv,t=Ef();r.enableCors!==!1&&e.use("*",av({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",cv()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Ae,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=vf(r.projectId,r.projectPath);e.route("/api",s);let n=Cf();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Os())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Os()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(xf,"createServer");var Rf=3478;re();Hl();var uv=50,tr=null,Br=null,he=null,Ee=null;async function Af(r){let e=Le.socket(),t=Le.pid(),s=Le.runDir();if(Fe.mkdirSync(s,{recursive:!0}),Fe.existsSync(t)){let i=parseInt(Fe.readFileSync(t,"utf-8").trim(),10);fv(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Fe.unlinkSync(t)}Fe.existsSync(e)&&Fe.unlinkSync(e),wv();let n=hv(),o=null;if(n)try{o=Fe.statSync(n).mtimeMs}catch{}if(Ee={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Qg,idleTimer:null,entryPath:n,entryMtime:o},he=new Yn,tr=lv(i=>dv(i)),tr.listen(e,()=>{Fe.chmodSync(e,384),Fe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Df()}),tr.on("error",i=>{console.error("Daemon socket error:",i.message),sr(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||Rf;Br=xf({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Br.start()}}catch{}if(process.on("SIGTERM",()=>sr(0)),process.on("SIGINT",()=>sr(0)),process.on("SIGHUP",()=>{he=new Yn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Af,"startDaemon");function dv(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Zg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Vn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1501
- `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await pv(o);r.write(Vn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Vn(i))}}}),r.on("error",()=>{})}l(dv,"handleConnection");async function pv(r){if(!Ee||!he)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Df(),Ee.commandsServed++,Ee.lastActivity=Date.now(),Ee.commandsServed%uv===0&&N.checkpointAll(),jf()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),sr(0)},200)),r.command==="daemon")return gv(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 mv(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1563
+ `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(qS,"getFilesModifiedSinceTaskStart");function KS(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`}l(KS,"formatVariance");var Jn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Bn,this.planning=new Js,this.shipping=new Ln,this.analytics=new Dn,this.performanceCmds=new $n,this.maintenance=new In,this.analysis=new Ks,this.setupCmds=new _n,this.updateCmds=new Hn,this.velocityCmds=new Gn,this.contextCmds=new Xs,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 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)}},$F=new Jn;ti();var bg={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}},Tg=[{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:"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"]}];ei();Yt();fe();H();J();Dt();import{execSync as fi}from"node:child_process";import pt from"node:fs/promises";import XS from"node:os";import rs from"node:path";import YS from"node:readline";import be from"chalk";var hi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Dr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Eg(r){let e=0;try{let t=await pt.readdir(r,{withFileTypes:!0});for(let s of t){let n=rs.join(r,s.name);if(s.isDirectory())e+=await Eg(n);else try{let o=await pt.stat(n);e+=o.size}catch{}}}catch{}return e}l(Eg,"getDirectorySize");function vg(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]}`}l(vg,"formatSize");async function QS(r){try{return(await pt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(QS,"countDirectoryItems");function ZS(){let r={homebrew:!1,npm:!1};try{fi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(ZS,"detectInstallation");async function eb(){let r=[],e=gu(),t=R.getGlobalBasePath(),s=await x(t),n=s?await QS(rs.join(t,"projects")):0,o=s?await Eg(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=rs.join(e.claude.config,"CLAUDE.md"),a=await x(i),c=!1;if(a)try{let D=await pt.readFile(i,"utf-8");c=D.includes(hi)&&D.includes(Dr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await x(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=rs.join(e.claude.config,"prjct-statusline.sh"),m=await x(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,h=await x(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let S=rs.join(e.gemini.config,"GEMINI.md"),w=await x(S),E=!1;if(w)try{let D=await pt.readFile(S,"utf-8");E=D.includes(hi)&&D.includes(Dr)}catch{}return w&&E&&r.push({path:S,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(eb,"gatherUninstallItems");async function tb(r){try{let e=await pt.readFile(r,"utf-8");if(!e.includes(hi)||!e.includes(Dr))return!1;let t=e.indexOf(hi),s=e.indexOf(Dr)+Dr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1564
+
1565
+ `).trim(),!n||n.trim().length===0?await pt.unlink(r):await pt.writeFile(r,`${n}
1566
+ `,"utf-8"),!0}catch{return!1}}l(tb,"removePrjctSection");async function sb(){let r=XS.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=rs.join(r,`.prjct-backup-${e}`);try{await pt.mkdir(t,{recursive:!0});let s=R.getGlobalBasePath();return await x(s)&&await Pg(s,rs.join(t,".prjct-cli")),t}catch{return null}}l(sb,"createBackup");async function Pg(r,e){await pt.mkdir(e,{recursive:!0});let t=await pt.readdir(r,{withFileTypes:!0});for(let s of t){let n=rs.join(r,s.name),o=rs.join(e,s.name);s.isDirectory()?await Pg(n,o):await pt.copyFile(n,o)}}l(Pg,"copyDirectory");async function nb(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await tb(o.path)&&s.push(o.path):o.type==="directory"?(await pt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await pt.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${y(i)}`)}try{await new Xt().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||fi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||fi("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${y(o)}`)}}return{deleted:s,errors:n}}l(nb,"performUninstall");async function rb(r){let e=YS.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l(rb,"promptConfirmation");async function ob(r={},e=process.cwd()){let t=await eb(),s=ZS(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(be.yellow(`
1567
+ 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(be.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(be.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=R.getDisplayPath(c.path),d="";c.type==="section"?d=be.dim("(section only)"):c.size&&(d=be.dim(`(${vg(c.size)})`)),console.log(` ${be.cyan(u.padEnd(35))} ${d}`),console.log(` ${be.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${be.cyan("Homebrew".padEnd(35))} ${be.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${be.cyan("npm global".padEnd(35))} ${be.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(be.dim(` Total size: ${vg(o)}`)),console.log("")),r.dryRun)return console.log(be.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(be.blue("Creating backup..."));let c=await sb();c?(console.log(be.green(`Backup created: ${R.getDisplayPath(c)}`)),console.log("")):console.log(be.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(be.yellow('Type "uninstall" to confirm:')),!await rb("> ")))return console.log(be.yellow(`
1568
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(be.blue("Removing prjct..."));let{deleted:i,errors:a}=await nb(t,s,r);if(console.log(""),i.length>0&&console.log(be.green(`Removed ${i.length} items`)),a.length>0){console.log(be.yellow(`
1569
+ ${a.length} errors:`));for(let c of a)console.log(be.red(` - ${c}`))}return console.log(""),console.log(be.green("prjct has been uninstalled.")),console.log(be.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(ob,"uninstall");var yi=class extends Se{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return ob(e,t)}};var Ss=new Bn,wi=new Js,ib=new Ln,Cg=new Dn,ab=new $n,bs=new In,zn=new Ks,jr=new _n,cb=new Xs,lb=new Gn,ub=new yi,db=new Hn;function mb(){for(let[r,e]of Object.entries(bg))U.registerCategory(r,e)}l(mb,"registerCategories");function pb(){if(U.has("work"))return;mb();let r=l(e=>Tg.find(t=>t.name===e),"getMeta");U.registerMethod("task",Ss,"now",r("task")),U.registerMethod("done",Ss,"done",r("done")),U.registerMethod("next",Ss,"next",r("next")),U.registerMethod("pause",Ss,"pause",r("pause")),U.registerMethod("resume",Ss,"resume",r("resume")),U.registerMethod("workflow",Ss,"workflow",r("workflow")),U.registerMethod("tokens",Ss,"tokens",r("tokens")),U.registerMethod("sessions",Ss,"sessions",r("sessions")),U.registerMethod("init",wi,"init",r("init")),U.registerMethod("bug",wi,"bug",r("bug")),U.registerMethod("idea",wi,"idea",r("idea")),U.registerMethod("spec",wi,"spec",r("spec")),U.registerMethod("ship",ib,"ship",r("ship")),U.registerMethod("dash",Cg,"dash",r("dash")),U.registerMethod("help",Cg,"help",r("help")),U.registerMethod("perf",ab,"perf",r("perf")),U.registerMethod("velocity",lb,"velocity",r("velocity")),U.registerMethod("cleanup",bs,"cleanup",r("cleanup")),U.registerMethod("cleanup-projects",bs,"cleanupProjects",r("cleanup-projects")),U.registerMethod("design",bs,"design",r("design")),U.registerMethod("recover",bs,"recover",r("recover")),U.registerMethod("undo",bs,"undo",r("undo")),U.registerMethod("redo",bs,"redo",r("redo")),U.registerMethod("history",bs,"history",r("history")),U.registerMethod("enrich",bs,"enrich",r("enrich")),U.registerMethod("analyze",zn,"analyze",r("analyze")),U.registerMethod("sync",zn,"sync",r("sync")),U.registerMethod("stats",zn,"stats",r("stats")),U.registerMethod("status",zn,"status",r("status")),U.registerMethod("seal",zn,"seal",r("seal")),U.registerMethod("verify",zn,"verify",r("verify")),U.registerMethod("start",jr,"start",r("start")),U.registerMethod("setup",jr,"setup",r("setup")),U.registerMethod("login",jr,"login",r("login")),U.registerMethod("logout",jr,"logout",r("logout")),U.registerMethod("auth",jr,"auth",r("auth")),U.registerMethod("uninstall",ub,"uninstall",r("uninstall")),U.registerMethod("update",db,"update",r("update")),U.registerMethod("context",cb,"context",r("context"))}l(pb,"registerAllCommands");pb();De();or();Pt();import{Hono as Eb}from"hono";import{cors as Pb}from"hono/cors";import{logger as Cb}from"hono/logger";import{secureHeaders as xb}from"hono/secure-headers";fe();ee();ps();Wt();Ns();wt();H();Kt();import gb from"node:fs/promises";import fb from"node:path";import{Hono as hb}from"hono";function yb(r){return R.getGlobalProjectPath(r)}l(yb,"getProjectDataPath");function xg(r,e){let t=new hb,s=yb(r);return t.get("/state",async n=>{let o=await _.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await we.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Le.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=P.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await Xe.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([_.read(r),we.read(r),Le.read(r),Xe.read(r)]),u=P.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 _.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=fb.join(s,"context",`${o}.md`),c=await gb.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return A(a)||G.error(`Context read error: ${y(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(xg,"createRoutes");fe();ee();ps();Wt();Ns();wt();import qn from"node:fs/promises";import wb from"node:path";import{Hono as kb}from"hono";var Sb=R.getGlobalBasePath(),Kn=wb.join(Sb,"projects");function ki(r){return P.getDoc(r,"project")}l(ki,"getProjectConfig");async function Cl(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`}l(Cl,"calculateDuration");function Rg(){let r=new kb;return r.get("/projects",async e=>{try{await qn.mkdir(Kn,{recursive:!0});let s=(await qn.readdir(Kn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ki(o),a=await _.read(o),c=await we.read(o),u=await Le.read(o),d=await Xe.read(o),p=a?.currentTask,m=await Cl(p?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:p?{...p,duration:m}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(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(ki(t)),_.read(t),we.read(t),Le.read(t),Xe.read(t)]),c=P.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Cl(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=d)?.length||0,g=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=p)?.length||0;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:""},stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(h=>!h.completed)?.length||0,ideasCount:i?.ideas?.filter(h=>h.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 _.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 _.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 _.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 _.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 _.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 _.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([_.read(t),we.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 _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await Le.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 qn.mkdir(Kn,{recursive:!0});let s=(await qn.readdir(Kn,{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 _.read(c),d=await we.read(c),p=await Le.read(c),m=await Xe.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await qn.mkdir(Kn,{recursive:!0});let n=(await qn.readdir(Kn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=ki(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await _.read(d),m=ki(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await Cl(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}l(Rg,"createExtendedRoutes");import{streamSSE as bb}from"hono/streaming";var Ag=3600*1e3,Tb=300*1e3,vb=3e4;function Dg(){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()>Ag&&t(i)},Tb),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 bb(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},vb),m=setTimeout(()=>{t(a)},Ag);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}l(Dg,"createSSEManager");function jg(r){let e=new Eb,t=Dg();e.use("*",xb()),r.enableCors!==!1&&e.use("*",Pb({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",Cb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:ve,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=xg(r.projectId,r.projectPath);e.route("/api",s);let n=Rg();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Rs())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Rs()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(jg,"createServer");var Ig=3478;ee();hl();var Ab=50,Xn=null,Ir=null,me=null,Te=null;async function $g(r){let e=Me.socket(),t=Me.pid(),s=Me.runDir();if(_e.mkdirSync(s,{recursive:!0}),_e.existsSync(t)){let i=parseInt(_e.readFileSync(t,"utf-8").trim(),10);Mb(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),_e.unlinkSync(t)}_e.existsSync(e)&&_e.unlinkSync(e),Nb();let n=_b(),o=null;if(n)try{o=_e.statSync(n).mtimeMs}catch{}if(Te={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:ng,idleTimer:null,entryPath:n,entryMtime:o},me=new Jn,Xn=Rb(i=>Db(i)),Xn.listen(e,()=>{_e.chmodSync(e,384),_e.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Mg()}),Xn.on("error",i=>{console.error("Daemon socket error:",i.message),Yn(1)}),!r.noHttp)try{let i=process.cwd(),a=await M.getProjectId(i);if(a){let c=r.port||Ig;Ir=jg({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Ir.start()}}catch{}if(process.on("SIGTERM",()=>Yn(0)),process.on("SIGINT",()=>Yn(0)),process.on("SIGHUP",()=>{me=new Jn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l($g,"startDaemon");function Db(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>rg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Fn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1570
+ `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await jb(o);r.write(Fn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Fn(i))}}}),r.on("error",()=>{})}l(Db,"handleConnection");async function jb(r){if(!Te||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Mg(),Te.commandsServed++,Te.lastActivity=Date.now(),Te.commandsServed%Ab===0&&I.checkpointAll(),_g()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),Yn(0)},200)),r.command==="daemon")return $b(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 Ib(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1502
1571
  `)||o.message||void 0,stderr:t.join(`
1503
- `)||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}}}l(pv,"handleRequest");async function mv(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return he.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 he.status(r.cwd,{json:t.json===!0,md:s});case"stats":return he.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return he.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return he.seal(r.cwd,{json:t.json===!0});case"rollback":return he.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return he.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return he.task(e,r.cwd,{md:s});case"done":return he.done(r.cwd,{md:s});case"next":return he.next(r.cwd,{md:s});case"pause":return he.pause(e||"",r.cwd,{md:s});case"resume":return he.resume(e,r.cwd,{md:s});case"bug":return he.bug(e||"",r.cwd,{md:s});case"idea":return he.idea(e||"",r.cwd,{md:s});case"ship":return he.ship(e,r.cwd,{md:s});case"dash":return he.dash(e||"default",r.cwd,{md:s});case"workflow":return he.workflowPrefs(e,r.cwd,{md:s});case"sessions":return he.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return he.design(e||"",t,r.cwd);case"analysis-payload":return he.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return he.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return he.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return he.analyze(t,r.cwd);case"cleanup":return he.cleanup(t,r.cwd);case"cleanup-projects":return he.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return G.execute(r.command,e,r.cwd)}}l(mv,"executeCommand");function gv(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:Ee?Date.now()-Ee.startedAt:0,commandsServed:Ee?.commandsServed??0,lastActivity:Ee?new Date(Ee.lastActivity).toISOString():null,registeredCommands:G.list().length,stale:jf()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>sr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(gv,"handleDaemonCommand");function Df(){Ee&&(Ee.idleTimer&&clearTimeout(Ee.idleTimer),Ee.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ee.idleTimeoutMs/1e3/60} minutes, shutting down`),sr(0)},Ee.idleTimeoutMs),Ee.idleTimer.unref&&Ee.idleTimer.unref())}l(Df,"resetIdleTimer");function sr(r){console.log("Daemon shutting down..."),Ee?.idleTimer&&clearTimeout(Ee.idleTimer),Br&&(Br.stop(),Br=null),tr&&(tr.close(),tr=null),N.close();let e=Le.socket(),t=Le.pid();try{Fe.existsSync(e)&&Fe.unlinkSync(e)}catch{}try{Fe.existsSync(t)&&Fe.unlinkSync(t)}catch{}process.exit(r)}l(sr,"shutdown");function fv(r){try{return process.kill(r,0),!0}catch{return!1}}l(fv,"isProcessRunning");function hv(){let r=bt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Fe.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Fe.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(Fe.existsSync(n))return n;let s=process.argv[1];return s&&Fe.existsSync(s)?s:null}l(hv,"resolveEntryPath");var yv=1024*1024;function wv(){let r=Le.log();try{if(Fe.statSync(r).size>yv){let t=`${r}.1`;try{Fe.unlinkSync(t)}catch{}Fe.renameSync(r,t)}}catch{}}l(wv,"rotateLog");function jf(){if(!Ee?.entryPath||Ee.entryMtime===null)return!1;try{return Fe.statSync(Ee.entryPath).mtimeMs!==Ee.entryMtime}catch{return!1}}l(jf,"isCodeStale");var Ql=process.argv.slice(2),kv=parseInt(Ql.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,Sv=Ql.includes("--no-http"),bv=Ql.includes("--foreground");Af({port:kv,noHttp:Sv,foreground:bv}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1572
+ `)||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}}}l(jb,"handleRequest");async function Ib(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return me.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 me.status(r.cwd,{json:t.json===!0,md:s});case"stats":return me.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return me.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return me.seal(r.cwd,{json:t.json===!0});case"rollback":return me.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return me.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return me.task(e,r.cwd,{md:s});case"done":return me.done(r.cwd,{md:s});case"next":return me.next(r.cwd,{md:s});case"pause":return me.pause(e||"",r.cwd,{md:s});case"resume":return me.resume(e,r.cwd,{md:s});case"bug":return me.bug(e||"",r.cwd,{md:s});case"idea":return me.idea(e||"",r.cwd,{md:s});case"ship":return me.ship(e,r.cwd,{md:s});case"dash":return me.dash(e||"default",r.cwd,{md:s});case"workflow":return me.workflowPrefs(e,r.cwd,{md:s});case"sessions":return me.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return me.design(e||"",t,r.cwd);case"analysis-payload":return me.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return me.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return me.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return me.analyze(t,r.cwd);case"cleanup":return me.cleanup(t,r.cwd);case"cleanup-projects":return me.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return U.execute(r.command,e,r.cwd)}}l(Ib,"executeCommand");function $b(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Me.socket(),uptime:Te?Date.now()-Te.startedAt:0,commandsServed:Te?.commandsServed??0,lastActivity:Te?new Date(Te.lastActivity).toISOString():null,registeredCommands:U.list().length,stale:_g()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Yn(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l($b,"handleDaemonCommand");function Mg(){Te&&(Te.idleTimer&&clearTimeout(Te.idleTimer),Te.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Te.idleTimeoutMs/1e3/60} minutes, shutting down`),Yn(0)},Te.idleTimeoutMs),Te.idleTimer.unref&&Te.idleTimer.unref())}l(Mg,"resetIdleTimer");function Yn(r){console.log("Daemon shutting down..."),Te?.idleTimer&&clearTimeout(Te.idleTimer),Ir&&(Ir.stop(),Ir=null),Xn&&(Xn.close(),Xn=null),I.close();let e=Me.socket(),t=Me.pid();try{_e.existsSync(e)&&_e.unlinkSync(e)}catch{}try{_e.existsSync(t)&&_e.unlinkSync(t)}catch{}process.exit(r)}l(Yn,"shutdown");function Mb(r){try{return process.kill(r,0),!0}catch{return!1}}l(Mb,"isProcessRunning");function _b(){let r=gt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(_e.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(_e.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(_e.existsSync(n))return n;let s=process.argv[1];return s&&_e.existsSync(s)?s:null}l(_b,"resolveEntryPath");var Ob=1024*1024;function Nb(){let r=Me.log();try{if(_e.statSync(r).size>Ob){let t=`${r}.1`;try{_e.unlinkSync(t)}catch{}_e.renameSync(r,t)}}catch{}}l(Nb,"rotateLog");function _g(){if(!Te?.entryPath||Te.entryMtime===null)return!1;try{return _e.statSync(Te.entryPath).mtimeMs!==Te.entryMtime}catch{return!1}}l(_g,"isCodeStale");var xl=process.argv.slice(2),Lb=parseInt(xl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,Fb=xl.includes("--no-http"),Ub=xl.includes("--foreground");$g({port:Lb,noHttp:Fb,foreground:Ub}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});